Skip to content

Commit

Permalink
Update profile dialogs
Browse files Browse the repository at this point in the history
Fix change value detection, use raw values instead of
trusting input, #891, #850.
  • Loading branch information
skodapetr committed Jan 29, 2025
1 parent a62adab commit 0cfa5ff
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export function openEditAssociationProfileDialogAction(
entity: SemanticModelRelationshipUsage,
) {
const state = createEditAssociationProfileDialogState(
classes, graph, visualModel, options.language, model, entity);
classes, graph, visualModel, options.language, model, entity.id);

const onConfirm = (nextState: EditAssociationProfileDialogState) => {
updateSemanticAssociationProfile(notifications, graph.models, entity, state, nextState);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export function openEditAttributeProfileDialogAction(
entity: SemanticModelRelationshipUsage,
) {
const state = createEditAttributeProfileDialogState(
classes, graph, visualModel, options.language, model, entity);
classes, graph, visualModel, options.language, model, entity.id);

const onConfirm = (nextState: EditAttributeProfileDialogState) => {
updateSemanticAttributeProfile(notifications, graph.models, entity, state, nextState);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export function openEditClassProfileDialogAction(
entity: SemanticModelClassUsage,
) {
const state = createEditClassProfileDialogState(
classes, graph, visualModel, options.language, model, entity);
classes, graph, visualModel, options.language, model, entity.id);

const onConfirm = (nextState: EditClassProfileDialogState) => {
updateSemanticClassProfile(notifications, entity, graph.models, state, nextState);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@

import { VisualModel } from "@dataspecer/core-v2/visual-model";
import { InMemorySemanticModel } from "@dataspecer/core-v2/semantic-model/in-memory";
import { SemanticModelRelationshipUsage, isSemanticModelClassUsage, isSemanticModelRelationshipUsage } from "@dataspecer/core-v2/semantic-model/usage/concepts";
import { isSemanticModelClassUsage, isSemanticModelRelationshipUsage } from "@dataspecer/core-v2/semantic-model/usage/concepts";

import { ClassesContextType } from "../../context/classes-context";
import { ModelGraphContextType } from "../../context/model-context";
import { EditAssociationProfileDialogState } from "./edit-association-profile-dialog-controller";
import { getDomainAndRange } from "../../util/relationship-utils";
import { InvalidAggregation, MissingRelationshipEnds } from "../../application/error";
import { InvalidAggregation, MissingEntity, MissingRelationshipEnds } from "../../application/error";
import { createEntityProfileStateForEdit } from "../utilities/entity-profile-utilities";
import { createRelationshipProfileStateForEdit } from "../utilities/relationship-profile-utilities";
import { entityModelsMapToCmeVocabulary } from "../../dataspecer/semantic-model/semantic-model-adapter";
Expand All @@ -21,11 +21,16 @@ export function createEditAssociationProfileDialogState(
visualModel: VisualModel | null,
language: string,
model: InMemorySemanticModel,
entity: SemanticModelRelationshipUsage,
entityIdentifier: string,
): EditAssociationProfileDialogState {
const entities = graphContext.aggregatorView.getEntities();
const aggregated = entities[entity.id]?.aggregatedEntity;
if (!isSemanticModelRelationshipUsage(aggregated)) {
const aggregate = entities[entityIdentifier];
const entity = aggregate.rawEntity;
const aggregated = aggregate.aggregatedEntity;
if (entity === null) {
throw new MissingEntity(entityIdentifier);
}
if (!isSemanticModelRelationshipUsage(entity) || !isSemanticModelRelationshipUsage(aggregated)) {
throw new InvalidAggregation(entity, null);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

import { VisualModel } from "@dataspecer/core-v2/visual-model";
import { InMemorySemanticModel } from "@dataspecer/core-v2/semantic-model/in-memory";
import { SemanticModelRelationshipUsage, isSemanticModelClassUsage, isSemanticModelRelationshipUsage } from "@dataspecer/core-v2/semantic-model/usage/concepts";
import { isSemanticModelClassUsage, isSemanticModelRelationshipUsage } from "@dataspecer/core-v2/semantic-model/usage/concepts";

import { ClassesContextType } from "../../context/classes-context";
import { ModelGraphContextType } from "../../context/model-context";
Expand All @@ -10,31 +10,28 @@ import { EditAttributeProfileDialogState } from "./edit-attribute-profile-dialog
import { createRelationshipProfileStateForEdit } from "../utilities/relationship-profile-utilities";
import { createEntityProfileStateForEdit } from "../utilities/entity-profile-utilities";
import { entityModelsMapToCmeVocabulary } from "../../dataspecer/semantic-model/semantic-model-adapter";
import { InvalidAggregation, MissingRelationshipEnds } from "../../application/error";
import { InvalidAggregation, MissingEntity, MissingRelationshipEnds } from "../../application/error";
import { DialogWrapper } from "../dialog-api";
import { EditAttributeProfileDialog } from "./edit-attribute-profile-dialog";
import { representClassProfiles, representDataTypes, representOwlThing, representRelationshipProfiles, representRelationships, representUndefinedDataType } from "../utilities/dialog-utilities";

/**
* @param classesContext
* @param graphContext
* @param visualModel
* @param language
* @param entity Raw entity to create profile for.
* @returns
*/
export function createEditAttributeProfileDialogState(
classesContext: ClassesContextType,
graphContext: ModelGraphContextType,
visualModel: VisualModel | null,
language: string,
model: InMemorySemanticModel,
entity: SemanticModelRelationshipUsage,
entityIdentifier: string,
): EditAttributeProfileDialogState {

const entities = graphContext.aggregatorView.getEntities();
const aggregated = entities[entity.id]?.aggregatedEntity;
if (!isSemanticModelRelationshipUsage(aggregated)) {
const aggregate = entities[entityIdentifier];
const entity = aggregate.rawEntity;
const aggregated = aggregate.aggregatedEntity;
if (entity === null) {
throw new MissingEntity(entityIdentifier);
}
if (!isSemanticModelRelationshipUsage(entity) || !isSemanticModelRelationshipUsage(aggregated)) {
throw new InvalidAggregation(entity, null);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { VisualModel } from "@dataspecer/core-v2/visual-model";
import { InMemorySemanticModel } from "@dataspecer/core-v2/semantic-model/in-memory";
import { SemanticModelClassUsage, isSemanticModelClassUsage } from "@dataspecer/core-v2/semantic-model/usage/concepts";
import { isSemanticModelClassUsage } from "@dataspecer/core-v2/semantic-model/usage/concepts";

import { ClassesContextType } from "../../context/classes-context";
import { ModelGraphContextType } from "../../context/model-context";
import { EditClassProfileDialogState } from "./edit-class-profile-dialog-controller";
import { representClassProfiles, representClasses } from "../utilities/dialog-utilities";
import { DialogWrapper } from "../dialog-api";
import { EditClassProfileDialog } from "./edit-class-profile-dialog";
import { InvalidAggregation } from "../../application/error";
import { InvalidAggregation, MissingEntity } from "../../application/error";
import { entityModelsMapToCmeVocabulary } from "../../dataspecer/semantic-model/semantic-model-adapter";
import { createEntityProfileStateForEdit } from "../utilities/entity-profile-utilities";

Expand All @@ -18,12 +18,17 @@ export function createEditClassProfileDialogState(
visualModel: VisualModel | null,
language: string,
model: InMemorySemanticModel,
entity: SemanticModelClassUsage,
entityIdentifier: string,
): EditClassProfileDialogState {

const entities = graphContext.aggregatorView.getEntities();
const aggregated = entities[entity.id]?.aggregatedEntity;
if (!isSemanticModelClassUsage(aggregated)) {
const aggregate = entities[entityIdentifier];
const entity = aggregate.rawEntity;
const aggregated = aggregate.aggregatedEntity;
if (entity === null) {
throw new MissingEntity(entityIdentifier);
}
if (!isSemanticModelClassUsage(entity) || !isSemanticModelClassUsage(aggregated)) {
throw new InvalidAggregation(entity, null);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,20 +106,20 @@ export function createRelationshipProfileStateForEdit<RangeType extends { identi
return {
domain: initialDomain,
initialDomain,
overrideDomain: domain === null,
overrideDomain: domain !== null,
domainValidation: validationNoProblem(),
domainCardinality: initialDomainCardinality,
initialDomainCardinality,
overrideDomainCardinality: domainCardinality === null,
overrideDomainCardinality: domainCardinality !== null,
domainCardinalityValidation: validationNoProblem(),
availableDomainItems: domains,
range: initialRange,
initialRange,
overrideRange: range === null,
overrideRange: range !== null,
rangeValidation: validationNoProblem(),
rangeCardinality: initialRangeCardinality,
initialRangeCardinality,
overrideRangeCardinality: rangeCardinality === null,
overrideRangeCardinality: rangeCardinality !== null,
rangeCardinalityValidation: validationNoProblem(),
availableRangeItems: ranges,
availableCardinalities: cardinalities,
Expand Down

0 comments on commit 0cfa5ff

Please sign in to comment.