@api-client/core 0.19.28 → 0.19.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/modeling/DomainEntity.d.ts +12 -0
- package/build/src/modeling/DomainEntity.d.ts.map +1 -1
- package/build/src/modeling/DomainEntity.js +32 -0
- package/build/src/modeling/DomainEntity.js.map +1 -1
- package/build/src/modeling/validation/api_model_rules.d.ts +1 -1
- package/build/src/modeling/validation/api_model_rules.d.ts.map +1 -1
- package/build/src/modeling/validation/api_model_rules.js +44 -42
- package/build/src/modeling/validation/api_model_rules.js.map +1 -1
- package/build/src/modeling/validation/semantic_validation.d.ts +1 -1
- package/build/src/modeling/validation/semantic_validation.d.ts.map +1 -1
- package/build/src/modeling/validation/semantic_validation.js +66 -6
- package/build/src/modeling/validation/semantic_validation.js.map +1 -1
- package/build/src/runtime/http-engine/CoreEngine.d.ts.map +1 -1
- package/build/src/runtime/http-engine/CoreEngine.js +1 -1
- package/build/src/runtime/http-engine/CoreEngine.js.map +1 -1
- package/build/src/runtime/http-engine/connections/DirectConnection.d.ts.map +1 -1
- package/build/src/runtime/http-engine/connections/DirectConnection.js +8 -2
- package/build/src/runtime/http-engine/connections/DirectConnection.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/skills-lock.json +10 -0
- package/src/modeling/DomainEntity.ts +33 -0
- package/src/modeling/validation/api_model_rules.ts +45 -42
- package/src/modeling/validation/api_model_validation_rules.md +10 -3
- package/src/modeling/validation/semantic_validation.ts +65 -6
- package/src/runtime/http-engine/CoreEngine.ts +1 -2
- package/src/runtime/http-engine/connections/DirectConnection.ts +8 -4
- package/tests/unit/modeling/domain_validation.spec.ts +6 -0
- package/tests/unit/modeling/validation/semantic_validation.spec.ts +4 -1
- package/tests/unit/runtime/http-engine/core_engine.spec.ts +10 -7
|
@@ -215,6 +215,18 @@ export declare class DomainEntity extends DomainElement {
|
|
|
215
215
|
* ```
|
|
216
216
|
*/
|
|
217
217
|
listProperties(): Generator<DomainProperty>;
|
|
218
|
+
/**
|
|
219
|
+
* Collects a list of all properties that affect this entity,
|
|
220
|
+
* including all inherited from parents properties as well as
|
|
221
|
+
* this entity's properties.
|
|
222
|
+
*
|
|
223
|
+
* The resulting list already accounts for a property override.
|
|
224
|
+
* A property overrides another property if it is lower in the
|
|
225
|
+
* inheritance chain. As such, a property defined on this entity
|
|
226
|
+
* always overrides previously defined entities.
|
|
227
|
+
* @returns The iterator over the list of all properties.
|
|
228
|
+
*/
|
|
229
|
+
withInheritedProperties(): MapIterator<DomainProperty>;
|
|
218
230
|
/**
|
|
219
231
|
* Checks if this entity has any properties.
|
|
220
232
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DomainEntity.d.ts","sourceRoot":"","sources":["../../../src/modeling/DomainEntity.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DomainEntity.d.ts","sourceRoot":"","sources":["../../../src/modeling/DomainEntity.ts"],"names":[],"mappings":"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"}
|
|
@@ -334,6 +334,38 @@ let DomainEntity = (() => {
|
|
|
334
334
|
yield node;
|
|
335
335
|
}
|
|
336
336
|
}
|
|
337
|
+
/**
|
|
338
|
+
* Collects a list of all properties that affect this entity,
|
|
339
|
+
* including all inherited from parents properties as well as
|
|
340
|
+
* this entity's properties.
|
|
341
|
+
*
|
|
342
|
+
* The resulting list already accounts for a property override.
|
|
343
|
+
* A property overrides another property if it is lower in the
|
|
344
|
+
* inheritance chain. As such, a property defined on this entity
|
|
345
|
+
* always overrides previously defined entities.
|
|
346
|
+
* @returns The iterator over the list of all properties.
|
|
347
|
+
*/
|
|
348
|
+
withInheritedProperties() {
|
|
349
|
+
const cache = new Map();
|
|
350
|
+
const parents = this.listAllParents('up');
|
|
351
|
+
for (const parent of parents) {
|
|
352
|
+
for (const prop of parent.properties) {
|
|
353
|
+
if (!prop.info.name) {
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
// We want to override the previously set property
|
|
357
|
+
// so the last definition wins.
|
|
358
|
+
cache.set(prop.info.name, prop);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
for (const prop of this.properties) {
|
|
362
|
+
if (!prop.info.name) {
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
cache.set(prop.info.name, prop);
|
|
366
|
+
}
|
|
367
|
+
return cache.values();
|
|
368
|
+
}
|
|
337
369
|
/**
|
|
338
370
|
* Checks if this entity has any properties.
|
|
339
371
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DomainEntity.js","sourceRoot":"","sources":["../../../src/modeling/DomainEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataDomain } from './DataDomain.js'\nimport { DomainAssociationKind, DomainEntityKind, DomainPropertyKind } from '../models/kinds.js'\nimport { DomainElement, type DomainElementSchema } from './DomainElement.js'\nimport { nanoid } from '../nanoid.js'\nimport { type ThingSchema, Thing } from '../models/Thing.js'\nimport { observed, retargetChange, toRaw } from '../decorators/observed.js'\nimport type { Shapes, IShapeRenderOptions } from '@api-client/amf-core'\nimport { ApiSchemaGenerator } from '@api-client/amf-core'\nimport { DomainProperty, type DomainPropertySchema } from './DomainProperty.js'\nimport { RemovePropertyException } from '../exceptions/remove_property_exception.js'\nimport { DomainAssociation, DomainAssociationSchema } from './DomainAssociation.js'\nimport type { FileBreadcrumb } from '../models/store/File.js'\nimport type { DomainModel } from './DomainModel.js'\nimport type { DomainNamespace } from './DomainNamespace.js'\nimport { ValidationError } from '../exceptions/validation_error.js'\nimport { ShapeGenerator } from './amf/ShapeGenerator.js'\nimport { removeGraphNode } from './GraphUtils.js'\nimport { DataSemantics, isEntitySemantic, type SemanticType, type AppliedDataSemantic } from './Semantics.js'\n\nexport interface EntityOrderedItem {\n /**\n * The type of the ordered item.\n */\n type: 'property' | 'association'\n\n /**\n * The key of the ordered item.\n */\n key: string\n}\n\nexport interface DomainEntitySchema extends DomainElementSchema {\n kind: typeof DomainEntityKind\n /**\n * The domain entity description.\n */\n info: ThingSchema\n\n /**\n * Optional general purpose tags for the UI.\n */\n tags?: string[]\n\n /**\n * The semantics applied to this entity.\n * This is a list of applied semantics that can be used to\n * describe the entity in more detail.\n */\n semantics?: AppliedDataSemantic[]\n\n /**\n * The ordered list of fields (properties and associations) in the schema.\n * These only keep references to the properties and associations.\n * The order of the fields is important as it defines the order of the\n * properties in the schema.\n */\n fields?: EntityOrderedItem[]\n\n /**\n * Whether this entity is deprecated.\n */\n deprecated?: boolean\n}\n\n/**\n * Represents an entity within a data domain model.\n *\n * A `DomainEntity` defines a structured data type,\n * containing properties and associations. It's a\n * fundamental building block for modeling complex data\n * structures.\n *\n * **Key Features:**\n *\n * - **Properties:** Defines the data elements (fields) within the entity.\n * - **Associations:** Defines relationships to other entities.\n * - **Inheritance:** Supports inheriting properties and associations from parent entities.\n * - **Metadata:** Supports tags, semantics, and deprecation status.\n * - **AMF Shape Generation:** Can be serialized to an AMF (API Modeling Framework) shape.\n * - **Example Generation:** Can generate example databased on its schema.\n *\n * **Usage:**\n *\n * The preferred way to create a `DomainEntity` is through\n * the `DomainModel.addEntity()` method.\n *\n * **Example:**\n *\n * ```typescript\n * const dataDomain = new DataDomain();\n * const userModel = dataDomain.addModel({ key: 'userModel' });\n * const userEntity = userModel.addEntity({ key: 'user' });\n * ```\n *\n * Entity Validation Rules:\n *\n * - **Primary Key:** An entity must have a primary key selected. This can come from a parent\n * entity or be defined in the current entity.\n * - **Parent Entity:** The parent entity must exist in the graph.\n * - **Circular Dependency:** Adding a parent entity that creates a circular dependency is not allowed.\n * - **Unique Parent:** An entity cannot have the same parent more than once.\n * - **Property Shadowing:** A property can shadow a parent property. This means that if a property\n * with the same key exists in both the parent and child entity, the child property will take precedence.\n * - **Association Shadowing:** An association can shadow a parent association. This means that if an\n * association with the same key exists in both the parent and child entity,\n * the child association will take precedence.\n * - **Property Resolution:** When the same property exists more than one parent and the child entity,\n * doesn't explicitly define the property, then:\n * - The last parent entity (iterating from the first entity to the last) that has the property\n * will be used as the source of the property.\n * - **Association Resolution:** When the same association exists more than one parent and the child entity,\n * doesn't explicitly define the association, then:\n * - The last parent entity (iterating from the first entity to the last) that has the association\n * will be used as the source of the association.\n * - **Minimum Required Properties:** An entity must have at least one property defined. Entities without properties\n * are ignored in the system.\n * - **Entity Name**:\n * - An entity must have a name defined.\n * - The name has to follow the same rules as the names in a SQL database. This means that the name must be unique\n * within the data domain and cannot contain special characters.\n * - **Association Targets:** An association must have a target entity defined.\n * This means that the association must point to at least one entity.\n */\nexport class DomainEntity extends DomainElement {\n /**\n * The kind of the domain element.\n */\n override kind: typeof DomainEntityKind\n\n /**\n * The description of the domain entity.\n */\n @retargetChange() accessor info: Thing\n\n /**\n * Optional general purpose tags for the UI.\n */\n @observed({ deep: true }) accessor tags: string[]\n\n /**\n * Semantics applied to this property.\n */\n @observed({ deep: true }) accessor semantics: AppliedDataSemantic[] = []\n\n /**\n * The ordered list of fields (properties and associations) in the schema.\n * These only keep references to the properties and associations.\n * The order of the fields is important as it defines the order of the\n * properties in the schema.\n */\n accessor fields: EntityOrderedItem[]\n\n /**\n * Whether this entity is deprecated.\n */\n @observed() accessor deprecated: boolean | undefined\n\n /**\n * Creates a full data entity schema with defaults.\n *\n * @param input The partial data entity schema.\n * @returns The data entity schema.\n */\n static createSchema(input: Partial<DomainEntitySchema> = {}): DomainEntitySchema {\n const { key = nanoid(), tags, semantics, fields, deprecated } = input\n const info = Thing.fromJSON(input.info, { name: 'new_entity' }).toJSON()\n const result: DomainEntitySchema = {\n kind: DomainEntityKind,\n key,\n info,\n }\n if (Array.isArray(tags)) {\n result.tags = [...tags]\n }\n if (Array.isArray(semantics)) {\n result.semantics = [...semantics]\n }\n if (Array.isArray(fields)) {\n result.fields = [...fields]\n }\n if (typeof deprecated === 'boolean') {\n result.deprecated = deprecated\n }\n return result\n }\n\n /**\n * Creates a new domain entity instance.\n *\n * You probably want to use the `DomainModel.addEntity()`\n * method instead.\n *\n * @param root A reference to the root DataDomain instance.\n * @param input The partial domain entity schema.\n */\n constructor(root: DataDomain, input?: Partial<DomainEntitySchema>) {\n const init = DomainEntity.createSchema(input)\n super(root, init.key)\n this.kind = DomainEntityKind\n this.info = new Thing(init.info)\n if (Array.isArray(init.tags)) {\n this.tags = [...init.tags]\n } else {\n this.tags = []\n }\n if (Array.isArray(init.semantics)) {\n this.semantics = init.semantics.map((item) => structuredClone(item))\n } else {\n this.semantics = []\n }\n if (Array.isArray(init.fields)) {\n this.fields = [...init.fields]\n } else {\n this.fields = []\n }\n if (typeof init.deprecated === 'boolean') {\n this.deprecated = init.deprecated\n }\n }\n\n /**\n * Generates a JSON representation of the entity.\n *\n * @returns A plain object representation of the `DomainEntity`.\n */\n toJSON(): DomainEntitySchema {\n const result: DomainEntitySchema = {\n kind: this.kind,\n key: this.key,\n info: this.info.toJSON(),\n }\n if (Array.isArray(this.fields) && this.fields.length) {\n result.fields = [...this.fields]\n }\n if (Array.isArray(this.semantics) && this.semantics.length) {\n result.semantics = toRaw(this, this.semantics)?.map((i) => structuredClone(i))\n }\n if (Array.isArray(this.tags) && this.tags.length) {\n result.tags = [...(toRaw(this, this.tags) as string[])]\n }\n if (typeof this.deprecated === 'boolean') {\n result.deprecated = this.deprecated\n }\n return result\n }\n\n /**\n * Returns a parent data entity where this data property\n * exist.\n *\n * @returns The parent `DomainModel` or undefined if not found.\n * @example\n * ```typescript\n * const parent = entity.getParentInstance();\n * if (parent) {\n * console.log(parent.key);\n * }\n * ```\n */\n getParentInstance(): DomainModel | undefined {\n const parentKey = this.root.graph.parent(this.key)\n if (!parentKey) {\n return undefined\n }\n return this.root.graph.node(parentKey) as DomainModel | undefined\n }\n\n /**\n * Adds a property to this entity.\n *\n * @param property The partial property schema.\n * @returns The created `DomainProperty` instance.\n * @example\n * ```typescript\n * const property = entity.addProperty({\n * key: 'name',\n * type: 'string',\n * required: true,\n * })\n * ```\n */\n addProperty(property?: Partial<DomainPropertySchema>): DomainProperty {\n if (property && property.key && this.root.graph.hasNode(property.key)) {\n throw new Error(`Trying to add a property ${property.key}, but it already exists`)\n }\n const instance = new DomainProperty(this.root, this.key, property)\n this.root.graph.setNode(instance.key, instance)\n this.root.graph.setEdge(this.key, instance.key, { type: 'property' })\n this.fields.push({\n type: 'property',\n key: instance.key,\n })\n this.root.notifyChange()\n return instance\n }\n\n /**\n * Removes a property from this entity.\n *\n * @param key The key of the property to remove.\n * @throws {RemovePropertyException} When the property does not exist.\n * @example\n * ```typescript\n * entity.removeProperty('name')\n * ```\n */\n removeProperty(key: string): void {\n if (!this.root.graph.hasNode(key)) {\n throw new RemovePropertyException(`Trying to remove the ${key} property, but it doesn't exist`)\n }\n const prop = this.root.graph.node(key) as DomainProperty\n if (prop.getParentInstance() !== this) {\n throw new RemovePropertyException(`Trying to remove the ${key} property, but it doesn't belong to this entity`)\n }\n removeGraphNode(this.root.graph, key)\n this.removeField(key)\n this.root.notifyChange()\n }\n\n /**\n * A shortcut to `listProperties()`.\n */\n get properties(): Generator<DomainProperty> {\n return this.listProperties()\n }\n\n /**\n * Lists all properties of this entity.\n *\n * Note, it accounts for the order of the properties as\n * defined in the `fields` array.\n *\n * @returns A generator that yields each `DomainProperty`.\n * @example\n * ```typescript\n * for (const property of entity.listProperties()) {\n * console.log(property.key);\n * }\n * ```\n */\n *listProperties(): Generator<DomainProperty> {\n for (const { key, type } of this.fields) {\n if (type !== 'property') {\n continue\n }\n const node = this.root.graph.node(key)\n if (!node || node.kind !== DomainPropertyKind) {\n continue\n }\n yield node\n }\n }\n\n /**\n * Checks if this entity has any properties.\n *\n * @returns True if the entity has properties.\n * @example\n * ```typescript\n * if (entity.hasProperties()) {\n * // ...\n * }\n * ```\n */\n hasProperties(): boolean {\n return this.fields.some((item) => item.type === 'property')\n }\n\n /**\n * A shortcut to `listParents()`.\n */\n get parents(): Generator<DomainEntity> {\n return this.listParents()\n }\n\n /**\n * Lists all parent entities of this entity (only the first level).\n *\n * @returns A generator that yields each parent `DomainEntity`.\n * @example\n * ```typescript\n * for (const parent of entity.listParents()) {\n * console.log(parent.key);\n * }\n * ```\n */\n *listParents(): Generator<DomainEntity> {\n for (const edge of this.root.graph.outEdges(this.key)) {\n const value = this.root.graph.edge(edge)\n if (!value || value.type !== 'parent') {\n continue\n }\n const parent = this.root.graph.node(edge.w) as DomainEntity\n if (parent) {\n yield parent\n }\n }\n }\n\n /**\n * Lists all parent entities recursively.\n *\n * @param direction The direction of the traversal. 'up' (default) lists from immediate parents up to the oldest.\n * 'down' lists from the oldest parents down to the immediate parents.\n * @returns An array of parent `DomainEntity` instances, ordered according to the requested traversal direction.\n */\n listAllParents(direction: 'up' | 'down' = 'up'): DomainEntity[] {\n const visited = new Set<string>()\n const parents: DomainEntity[] = []\n const queue: DomainEntity[] = [...this.listParents()]\n\n let index = 0\n while (index < queue.length) {\n const parent = queue[index++]\n if (!visited.has(parent.key)) {\n visited.add(parent.key)\n parents.push(parent)\n queue.push(...parent.listParents())\n }\n }\n\n if (direction === 'down') {\n parents.reverse()\n }\n\n return parents\n }\n\n /**\n * Adds a parent to this entity.\n *\n * @param key The key of the parent entity.\n * @param domain The key of the foreign domain the parent belongs to.\n * @returns `this` for chaining.\n * @throws ValidationError When the parent does not exist or a circular dependency is detected.\n * @example\n * ```typescript\n * entity.addParent('baseEntity');\n * ```\n */\n addParent(key: string, domain?: string): this {\n const effectiveKey = this.domain.buildReferenceKey(key, domain)\n // Prevent adding self as parent\n if (effectiveKey === this.key) {\n const message = 'Entity cannot be a parent of itself'\n throw new ValidationError(\n [\n {\n field: 'parents',\n message,\n rule: 'circular',\n },\n ],\n { message }\n )\n }\n const { graph } = this.root\n if (!graph.hasNode(effectiveKey)) {\n let message = `Entity with key \"${key}\" not found`\n if (domain) {\n message += ` in domain \"${domain}\"`\n }\n throw new ValidationError(\n [\n {\n field: 'parents',\n message,\n rule: 'required',\n },\n ],\n { message }\n )\n }\n // Check for circular inheritance\n if (this.hasCircularParent(effectiveKey)) {\n const message = `Circular inheritance detected. Cannot add ${key} as a parent`\n throw new ValidationError(\n [\n {\n field: 'parents',\n message,\n rule: 'circular',\n },\n ],\n { message }\n )\n }\n if (graph.outEdges(this.key, effectiveKey).next().value) {\n const message = `Parent ${key} already exists`\n throw new ValidationError(\n [\n {\n field: 'parents',\n message,\n rule: 'unique',\n },\n ],\n { message }\n )\n }\n // Parents are associated through graph edges.\n // Otherwise it would collide with the parent model.\n if (domain) {\n graph.setEdge(this.key, effectiveKey, { type: 'parent', domain, foreign: true })\n } else {\n graph.setEdge(this.key, effectiveKey, { type: 'parent' })\n }\n this.root.notifyChange()\n return this\n }\n\n /**\n * Removes a parent from this entity.\n *\n * @param key The key of the parent entity to remove.\n * @param domain Optional domain key if the parent belongs to a foreign domain.\n * @returns `this` for chaining.\n * @throws Error When the parent does not exist.\n * @example\n * ```typescript\n * // Remove local parent\n * entity.removeParent('baseEntity');\n *\n * // Remove foreign domain parent\n * entity.removeParent('baseEntity', 'externalDomain');\n * ```\n */\n removeParent(key: string, domain?: string): this {\n const { graph } = this.root\n const effectiveKey = this.domain.buildReferenceKey(key, domain)\n\n if (!graph.hasEdge(this.key, effectiveKey)) {\n let message = `Trying to remove a parent ${key} from ${this.key}, but it doesn't exist`\n if (domain) {\n message = `Trying to remove a foreign parent ${key} from domain \"${domain}\" from ${this.key}, but it doesn't exist`\n }\n throw new Error(message)\n }\n\n // Verify it's actually a parent edge\n const edge = graph.edge(this.key, effectiveKey)\n if (!edge || edge.type !== 'parent') {\n let message = `Edge between ${this.key} and ${key} exists but is not a parent relationship`\n if (domain) {\n message = `Edge between ${this.key} and ${key} in domain \"${domain}\" exists but is not a parent relationship`\n }\n throw new Error(message)\n }\n\n graph.removeEdge(this.key, effectiveKey)\n this.root.notifyChange()\n return this\n }\n\n /**\n * Checks if this entity has any parents.\n *\n * @returns True if the entity has parents.\n * @example\n * ```typescript\n * if (entity.hasParents()) {\n * // ...\n * }\n * ```\n */\n hasParents(): boolean {\n for (const edge of this.root.graph.outEdges(this.key)) {\n if (this.root.graph.edge(edge)?.type === 'parent') {\n return true\n }\n }\n return false\n }\n\n /**\n * Checks if the passed entity has a circular parent\n * relationship when attempting to add a new parent.\n *\n * @param key The key of the parent being added.\n * @returns True if adding this parent would create a\n * circular relationship.\n */\n hasCircularParent(key: string): boolean {\n const { graph } = this.root\n\n // Check if new parent is one of the children.\n for (const edge of graph.outEdges(key, this.key)) {\n if (graph.edge(edge)?.type === 'parent') {\n return true\n }\n }\n\n // check if this entity is in parents chain.\n let current: DomainEntity | undefined = graph.node(key) as DomainEntity | undefined\n while (current) {\n if (current.key === this.key) {\n return true\n }\n const parents = [...current.listParents()]\n if (parents.length === 0) {\n break\n }\n // Assuming single inheritance\n // TODO: Update this to check for multiple parents.\n current = parents[0]\n }\n\n return false\n }\n\n /**\n * Creates breadcrumbs from this entity to the root\n * namespace.\n *\n * @returns An array of `FileBreadcrumb` instances.\n * @example\n * ```typescript\n * const breadcrumbs = entity.breadcrumbs();\n * console.log(breadcrumbs);\n * ```\n */\n breadcrumbs(): FileBreadcrumb[] {\n const result: FileBreadcrumb[] = []\n result.push({\n key: this.key,\n name: this.info.getLabel('Unnamed entity'),\n kind: DomainEntityKind,\n })\n const model = this.getParentInstance()\n if (model) {\n result.push({\n key: model.key,\n kind: model.kind,\n name: model.info.getLabel('Unnamed model'),\n })\n let parent: DataDomain | DomainNamespace = model.getParentInstance()\n while (parent && parent !== this.root) {\n result.push({\n key: parent.key,\n kind: parent.kind,\n name: parent.info.getLabel('Unnamed namespace'),\n })\n const typed = parent as DomainNamespace\n parent = typed.getParentInstance()\n }\n }\n result.push({\n key: this.root.key,\n name: this.root.info.getLabel('Unnamed data domain'),\n kind: this.root.kind,\n })\n return result.reverse()\n }\n\n /**\n * Adds an association to this entity.\n *\n * Add rules:\n * - If the target is specified, it has to exist in the graph.\n * - The association targets can be local or foreign.\n *\n * Please note that you can't just add targets to the association schema.\n * This function manipulates the graph to insert the required metadata.\n *\n * @param input The partial association schema.\n * @returns The created `DomainAssociation` instance.\n * @throws Error When the target entity does not exist.\n * @example\n * ```typescript\n * const association = entity.addAssociation({ info: { name: 'Address' }, targets: [{ key: 'address' }] });\n * ```\n */\n addAssociation(input: Partial<DomainAssociationSchema> = {}): DomainAssociation {\n const { graph } = this.root\n\n // clean up any target information from the input\n // so we won't break the graph and the app.\n const inputCopy = { ...input }\n const targets = inputCopy.targets\n delete inputCopy.targets\n\n const hasTargets = Array.isArray(targets) && targets.length\n if (hasTargets) {\n for (const target of targets) {\n if (target.domain && target.key) {\n // target is foreign\n const foreignKey = `${target.domain}:${target.key}`\n if (!graph.hasNode(foreignKey)) {\n throw new Error(`Foreign entity ${foreignKey} not found`)\n }\n } else if (target.key) {\n if (!graph.hasNode(target.key)) {\n throw new Error(`Target entity ${target.key} not found`)\n }\n }\n }\n }\n\n const item = new DomainAssociation(this.root, this.key, inputCopy)\n graph.setNode(item.key, item)\n graph.setEdge(this.key, item.key, { type: 'association' })\n if (hasTargets) {\n for (const target of targets) {\n item.addTarget(target.key, target.domain)\n }\n }\n this.fields.push({ type: 'association', key: item.key })\n this.root.notifyChange()\n return item\n }\n\n /**\n * Removes an association from this entity.\n *\n * @param key The key of the association to remove.\n * @throws Error When the association does not exist.\n * @example\n * ```typescript\n * entity.removeAssociation('address');\n * ```\n */\n removeAssociation(key: string): void {\n if (!this.root.graph.hasEdge(this.key, key)) {\n throw new Error(`Unable to find a connection between this entity and the ${key} association`)\n }\n const edge = this.root.graph.edge(this.key, key)\n if (!edge || edge.type !== 'association') {\n throw new Error(`Association ${key} does not exist`)\n }\n removeGraphNode(this.root.graph, key)\n this.removeField(key)\n this.root.notifyChange()\n }\n\n /**\n * A shortcut to `listAssociations()`.\n */\n get associations(): Generator<DomainAssociation> {\n return this.listAssociations()\n }\n\n /**\n * Lists all associations of this entity.\n *\n * The order of the associations is defined in the `fields` array.\n *\n * @returns A generator that yields each\n * `DomainAssociation`.\n * @example\n * ```typescript\n * for (const association of entity.listAssociations()) {\n * console.log(association.key);\n * }\n * ```\n */\n *listAssociations(): Generator<DomainAssociation> {\n for (const { key, type } of this.fields) {\n if (type !== 'association') {\n continue\n }\n const node = this.root.graph.node(key)\n if (!node || node.kind !== DomainAssociationKind) {\n continue\n }\n yield node\n }\n }\n\n /**\n * Checks if this entity has any associations.\n *\n * @returns True if the entity has associations.\n * @example\n * ```typescript\n * if (entity.hasAssociations()) {\n * // ...\n * }\n * ```\n */\n hasAssociations(): boolean {\n return this.fields.some((item) => item.type === 'association')\n }\n\n /**\n * Lists all fields (properties and associations) of this entity.\n *\n * @returns A generator that yields each `DomainAssociation` or `DomainProperty`.\n * @example\n * ```typescript\n * for (const field of entity.listFields()) {\n * console.log(field.key);\n * }\n * ```\n */\n *listFields(): Generator<DomainAssociation | DomainProperty> {\n for (const { key } of this.fields) {\n const node = this.root.graph.node(key)\n if (!node) {\n continue\n }\n if (node.kind === DomainAssociationKind || node.kind === DomainPropertyKind) {\n yield node\n }\n }\n }\n\n /**\n * Checks if this entity has any fields (properties or associations).\n *\n * @returns True if the entity has fields.\n * @example\n * ```typescript\n * if (entity.hasFields()) {\n * // ...\n * }\n * ```\n */\n hasFields(): boolean {\n return this.fields.length > 0\n }\n\n private removeField(key: string): void {\n this.fields = this.fields.filter((item) => item.key !== key)\n }\n\n /**\n * Creates an AMF's data Shape.\n *\n * The property itself is auto-generated. If the `schema` is defined then it is used\n * as the `range` of the property. Otherwise basic shape is generated for the range.\n *\n * This is a preferred way of reading the AMF shape as this synchronizes changed\n * data properties with the shape definition.\n *\n * @returns AMF property shape definition.\n */\n toApiShape(): Shapes.IShapeUnion {\n const serializer = new ShapeGenerator()\n return serializer.entity(this)\n }\n\n /**\n * Reads the schema of the Entity and generates an example for it.\n *\n * @param mime The mime type of the example.\n * @param opts The example generation options.\n * @returns The generated example.\n * @example\n * ```typescript\n * const example = entity.toExample('application/json');\n * console.log(example);\n * ```\n */\n toExample(mime: string, opts: IShapeRenderOptions = {}): string | number | boolean | null | undefined {\n const shape = this.toApiShape()\n const generator = new ApiSchemaGenerator(mime, {\n renderExamples: opts.renderExamples ?? true,\n renderMocked: opts.renderMocked ?? true,\n renderOptional: opts.renderOptional ?? true,\n selectedUnions: opts.selectedUnions,\n })\n return generator.generate(shape)\n }\n\n /**\n * Checks whether the entity is a child of the given namespace or data model.\n * The relationship doesn't have to be direct, as long as the entity\n * is in the hierarchy it will return true.\n *\n * @param key The key of the parent to check.\n * @returns True if this entity is a child of the given namespace or data model.\n */\n isChildOf(key: string): boolean {\n if (this.key === key) {\n return false\n }\n const parent = this.getParentInstance()\n if (!parent) {\n return false\n }\n if (parent.key === key) {\n return true\n }\n return parent.isChildOf(key)\n }\n\n /**\n * Finds the primary key property of this entity.\n * @returns The primary key property of this entity or undefined if not found.\n */\n primaryKey(): DomainProperty | undefined {\n for (const property of this.properties) {\n if (property.primary) {\n return property\n }\n }\n let property: DomainProperty | undefined\n for (const parent of this.listParents()) {\n const prop = parent.primaryKey()\n if (prop) {\n // According to the validation rules, the last parent\n // that has the property will be used as the source of\n // the property.\n // In the future, we may add a schema definition to the entity that\n // will explicitly define which property to use.\n property = prop\n }\n }\n return property\n }\n\n /**\n * Adds or updates a semantic to the entity.\n * @param semantic The semantic to add to the entity.\n * @throws Error if the semantic is not an entity semantic.\n */\n addSemantic(semantic: AppliedDataSemantic): void {\n const sem = DataSemantics[semantic.id]\n if (!isEntitySemantic(sem)) {\n throw new Error(`Invalid semantic type: ${semantic.id}. Expected an entity semantic.`)\n }\n const index = this.semantics.findIndex((s) => s.id === semantic.id)\n if (index >= 0) {\n this.semantics[index] = semantic\n } else {\n this.semantics.push(semantic)\n }\n this.domain.notifyChange()\n }\n\n /**\n * Removes a semantic from the entity.\n * @param semanticId The ID of the semantic to remove.\n */\n removeSemantic(semanticId: SemanticType): void {\n const index = this.semantics.findIndex((s) => s.id === semanticId)\n if (index >= 0) {\n this.semantics.splice(index, 1)\n this.domain.notifyChange()\n }\n }\n\n /**\n * Checks if the entity has a specific semantic.\n * @param semanticId The ID of the semantic to check.\n * @returns True if the semantic is present, false otherwise.\n */\n hasSemantic(semanticId: SemanticType): boolean {\n return this.semantics.some((s) => s.id === semanticId)\n }\n\n /**\n * Generates a unique name by appending a number to the base name.\n * @param baseName The base name to make unique.\n * @returns A unique name within the current entity.\n */\n generateUniqueName(baseName: string): string {\n const existingNames = new Set<string>()\n for (const field of this.listFields()) {\n if (field.info.name) {\n existingNames.add(field.info.name)\n }\n }\n\n let counter = 2\n let newName = `${baseName}_copy`\n while (existingNames.has(newName)) {\n newName = `${baseName}_copy_${counter}`\n counter++\n }\n\n return newName\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DomainEntity.js","sourceRoot":"","sources":["../../../src/modeling/DomainEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataDomain } from './DataDomain.js'\nimport { DomainAssociationKind, DomainEntityKind, DomainPropertyKind } from '../models/kinds.js'\nimport { DomainElement, type DomainElementSchema } from './DomainElement.js'\nimport { nanoid } from '../nanoid.js'\nimport { type ThingSchema, Thing } from '../models/Thing.js'\nimport { observed, retargetChange, toRaw } from '../decorators/observed.js'\nimport type { Shapes, IShapeRenderOptions } from '@api-client/amf-core'\nimport { ApiSchemaGenerator } from '@api-client/amf-core'\nimport { DomainProperty, type DomainPropertySchema } from './DomainProperty.js'\nimport { RemovePropertyException } from '../exceptions/remove_property_exception.js'\nimport { DomainAssociation, DomainAssociationSchema } from './DomainAssociation.js'\nimport type { FileBreadcrumb } from '../models/store/File.js'\nimport type { DomainModel } from './DomainModel.js'\nimport type { DomainNamespace } from './DomainNamespace.js'\nimport { ValidationError } from '../exceptions/validation_error.js'\nimport { ShapeGenerator } from './amf/ShapeGenerator.js'\nimport { removeGraphNode } from './GraphUtils.js'\nimport { DataSemantics, isEntitySemantic, type SemanticType, type AppliedDataSemantic } from './Semantics.js'\n\nexport interface EntityOrderedItem {\n /**\n * The type of the ordered item.\n */\n type: 'property' | 'association'\n\n /**\n * The key of the ordered item.\n */\n key: string\n}\n\nexport interface DomainEntitySchema extends DomainElementSchema {\n kind: typeof DomainEntityKind\n /**\n * The domain entity description.\n */\n info: ThingSchema\n\n /**\n * Optional general purpose tags for the UI.\n */\n tags?: string[]\n\n /**\n * The semantics applied to this entity.\n * This is a list of applied semantics that can be used to\n * describe the entity in more detail.\n */\n semantics?: AppliedDataSemantic[]\n\n /**\n * The ordered list of fields (properties and associations) in the schema.\n * These only keep references to the properties and associations.\n * The order of the fields is important as it defines the order of the\n * properties in the schema.\n */\n fields?: EntityOrderedItem[]\n\n /**\n * Whether this entity is deprecated.\n */\n deprecated?: boolean\n}\n\n/**\n * Represents an entity within a data domain model.\n *\n * A `DomainEntity` defines a structured data type,\n * containing properties and associations. It's a\n * fundamental building block for modeling complex data\n * structures.\n *\n * **Key Features:**\n *\n * - **Properties:** Defines the data elements (fields) within the entity.\n * - **Associations:** Defines relationships to other entities.\n * - **Inheritance:** Supports inheriting properties and associations from parent entities.\n * - **Metadata:** Supports tags, semantics, and deprecation status.\n * - **AMF Shape Generation:** Can be serialized to an AMF (API Modeling Framework) shape.\n * - **Example Generation:** Can generate example databased on its schema.\n *\n * **Usage:**\n *\n * The preferred way to create a `DomainEntity` is through\n * the `DomainModel.addEntity()` method.\n *\n * **Example:**\n *\n * ```typescript\n * const dataDomain = new DataDomain();\n * const userModel = dataDomain.addModel({ key: 'userModel' });\n * const userEntity = userModel.addEntity({ key: 'user' });\n * ```\n *\n * Entity Validation Rules:\n *\n * - **Primary Key:** An entity must have a primary key selected. This can come from a parent\n * entity or be defined in the current entity.\n * - **Parent Entity:** The parent entity must exist in the graph.\n * - **Circular Dependency:** Adding a parent entity that creates a circular dependency is not allowed.\n * - **Unique Parent:** An entity cannot have the same parent more than once.\n * - **Property Shadowing:** A property can shadow a parent property. This means that if a property\n * with the same key exists in both the parent and child entity, the child property will take precedence.\n * - **Association Shadowing:** An association can shadow a parent association. This means that if an\n * association with the same key exists in both the parent and child entity,\n * the child association will take precedence.\n * - **Property Resolution:** When the same property exists more than one parent and the child entity,\n * doesn't explicitly define the property, then:\n * - The last parent entity (iterating from the first entity to the last) that has the property\n * will be used as the source of the property.\n * - **Association Resolution:** When the same association exists more than one parent and the child entity,\n * doesn't explicitly define the association, then:\n * - The last parent entity (iterating from the first entity to the last) that has the association\n * will be used as the source of the association.\n * - **Minimum Required Properties:** An entity must have at least one property defined. Entities without properties\n * are ignored in the system.\n * - **Entity Name**:\n * - An entity must have a name defined.\n * - The name has to follow the same rules as the names in a SQL database. This means that the name must be unique\n * within the data domain and cannot contain special characters.\n * - **Association Targets:** An association must have a target entity defined.\n * This means that the association must point to at least one entity.\n */\nexport class DomainEntity extends DomainElement {\n /**\n * The kind of the domain element.\n */\n override kind: typeof DomainEntityKind\n\n /**\n * The description of the domain entity.\n */\n @retargetChange() accessor info: Thing\n\n /**\n * Optional general purpose tags for the UI.\n */\n @observed({ deep: true }) accessor tags: string[]\n\n /**\n * Semantics applied to this property.\n */\n @observed({ deep: true }) accessor semantics: AppliedDataSemantic[] = []\n\n /**\n * The ordered list of fields (properties and associations) in the schema.\n * These only keep references to the properties and associations.\n * The order of the fields is important as it defines the order of the\n * properties in the schema.\n */\n accessor fields: EntityOrderedItem[]\n\n /**\n * Whether this entity is deprecated.\n */\n @observed() accessor deprecated: boolean | undefined\n\n /**\n * Creates a full data entity schema with defaults.\n *\n * @param input The partial data entity schema.\n * @returns The data entity schema.\n */\n static createSchema(input: Partial<DomainEntitySchema> = {}): DomainEntitySchema {\n const { key = nanoid(), tags, semantics, fields, deprecated } = input\n const info = Thing.fromJSON(input.info, { name: 'new_entity' }).toJSON()\n const result: DomainEntitySchema = {\n kind: DomainEntityKind,\n key,\n info,\n }\n if (Array.isArray(tags)) {\n result.tags = [...tags]\n }\n if (Array.isArray(semantics)) {\n result.semantics = [...semantics]\n }\n if (Array.isArray(fields)) {\n result.fields = [...fields]\n }\n if (typeof deprecated === 'boolean') {\n result.deprecated = deprecated\n }\n return result\n }\n\n /**\n * Creates a new domain entity instance.\n *\n * You probably want to use the `DomainModel.addEntity()`\n * method instead.\n *\n * @param root A reference to the root DataDomain instance.\n * @param input The partial domain entity schema.\n */\n constructor(root: DataDomain, input?: Partial<DomainEntitySchema>) {\n const init = DomainEntity.createSchema(input)\n super(root, init.key)\n this.kind = DomainEntityKind\n this.info = new Thing(init.info)\n if (Array.isArray(init.tags)) {\n this.tags = [...init.tags]\n } else {\n this.tags = []\n }\n if (Array.isArray(init.semantics)) {\n this.semantics = init.semantics.map((item) => structuredClone(item))\n } else {\n this.semantics = []\n }\n if (Array.isArray(init.fields)) {\n this.fields = [...init.fields]\n } else {\n this.fields = []\n }\n if (typeof init.deprecated === 'boolean') {\n this.deprecated = init.deprecated\n }\n }\n\n /**\n * Generates a JSON representation of the entity.\n *\n * @returns A plain object representation of the `DomainEntity`.\n */\n toJSON(): DomainEntitySchema {\n const result: DomainEntitySchema = {\n kind: this.kind,\n key: this.key,\n info: this.info.toJSON(),\n }\n if (Array.isArray(this.fields) && this.fields.length) {\n result.fields = [...this.fields]\n }\n if (Array.isArray(this.semantics) && this.semantics.length) {\n result.semantics = toRaw(this, this.semantics)?.map((i) => structuredClone(i))\n }\n if (Array.isArray(this.tags) && this.tags.length) {\n result.tags = [...(toRaw(this, this.tags) as string[])]\n }\n if (typeof this.deprecated === 'boolean') {\n result.deprecated = this.deprecated\n }\n return result\n }\n\n /**\n * Returns a parent data entity where this data property\n * exist.\n *\n * @returns The parent `DomainModel` or undefined if not found.\n * @example\n * ```typescript\n * const parent = entity.getParentInstance();\n * if (parent) {\n * console.log(parent.key);\n * }\n * ```\n */\n getParentInstance(): DomainModel | undefined {\n const parentKey = this.root.graph.parent(this.key)\n if (!parentKey) {\n return undefined\n }\n return this.root.graph.node(parentKey) as DomainModel | undefined\n }\n\n /**\n * Adds a property to this entity.\n *\n * @param property The partial property schema.\n * @returns The created `DomainProperty` instance.\n * @example\n * ```typescript\n * const property = entity.addProperty({\n * key: 'name',\n * type: 'string',\n * required: true,\n * })\n * ```\n */\n addProperty(property?: Partial<DomainPropertySchema>): DomainProperty {\n if (property && property.key && this.root.graph.hasNode(property.key)) {\n throw new Error(`Trying to add a property ${property.key}, but it already exists`)\n }\n const instance = new DomainProperty(this.root, this.key, property)\n this.root.graph.setNode(instance.key, instance)\n this.root.graph.setEdge(this.key, instance.key, { type: 'property' })\n this.fields.push({\n type: 'property',\n key: instance.key,\n })\n this.root.notifyChange()\n return instance\n }\n\n /**\n * Removes a property from this entity.\n *\n * @param key The key of the property to remove.\n * @throws {RemovePropertyException} When the property does not exist.\n * @example\n * ```typescript\n * entity.removeProperty('name')\n * ```\n */\n removeProperty(key: string): void {\n if (!this.root.graph.hasNode(key)) {\n throw new RemovePropertyException(`Trying to remove the ${key} property, but it doesn't exist`)\n }\n const prop = this.root.graph.node(key) as DomainProperty\n if (prop.getParentInstance() !== this) {\n throw new RemovePropertyException(`Trying to remove the ${key} property, but it doesn't belong to this entity`)\n }\n removeGraphNode(this.root.graph, key)\n this.removeField(key)\n this.root.notifyChange()\n }\n\n /**\n * A shortcut to `listProperties()`.\n */\n get properties(): Generator<DomainProperty> {\n return this.listProperties()\n }\n\n /**\n * Lists all properties of this entity.\n *\n * Note, it accounts for the order of the properties as\n * defined in the `fields` array.\n *\n * @returns A generator that yields each `DomainProperty`.\n * @example\n * ```typescript\n * for (const property of entity.listProperties()) {\n * console.log(property.key);\n * }\n * ```\n */\n *listProperties(): Generator<DomainProperty> {\n for (const { key, type } of this.fields) {\n if (type !== 'property') {\n continue\n }\n const node = this.root.graph.node(key)\n if (!node || node.kind !== DomainPropertyKind) {\n continue\n }\n yield node\n }\n }\n\n /**\n * Collects a list of all properties that affect this entity,\n * including all inherited from parents properties as well as\n * this entity's properties.\n *\n * The resulting list already accounts for a property override.\n * A property overrides another property if it is lower in the\n * inheritance chain. As such, a property defined on this entity\n * always overrides previously defined entities.\n * @returns The iterator over the list of all properties.\n */\n withInheritedProperties(): MapIterator<DomainProperty> {\n const cache = new Map<string, DomainProperty>()\n const parents = this.listAllParents('up')\n for (const parent of parents) {\n for (const prop of parent.properties) {\n if (!prop.info.name) {\n continue\n }\n // We want to override the previously set property\n // so the last definition wins.\n cache.set(prop.info.name, prop)\n }\n }\n for (const prop of this.properties) {\n if (!prop.info.name) {\n continue\n }\n cache.set(prop.info.name, prop)\n }\n return cache.values()\n }\n\n /**\n * Checks if this entity has any properties.\n *\n * @returns True if the entity has properties.\n * @example\n * ```typescript\n * if (entity.hasProperties()) {\n * // ...\n * }\n * ```\n */\n hasProperties(): boolean {\n return this.fields.some((item) => item.type === 'property')\n }\n\n /**\n * A shortcut to `listParents()`.\n */\n get parents(): Generator<DomainEntity> {\n return this.listParents()\n }\n\n /**\n * Lists all parent entities of this entity (only the first level).\n *\n * @returns A generator that yields each parent `DomainEntity`.\n * @example\n * ```typescript\n * for (const parent of entity.listParents()) {\n * console.log(parent.key);\n * }\n * ```\n */\n *listParents(): Generator<DomainEntity> {\n for (const edge of this.root.graph.outEdges(this.key)) {\n const value = this.root.graph.edge(edge)\n if (!value || value.type !== 'parent') {\n continue\n }\n const parent = this.root.graph.node(edge.w) as DomainEntity\n if (parent) {\n yield parent\n }\n }\n }\n\n /**\n * Lists all parent entities recursively.\n *\n * @param direction The direction of the traversal. 'up' (default) lists from immediate parents up to the oldest.\n * 'down' lists from the oldest parents down to the immediate parents.\n * @returns An array of parent `DomainEntity` instances, ordered according to the requested traversal direction.\n */\n listAllParents(direction: 'up' | 'down' = 'up'): DomainEntity[] {\n const visited = new Set<string>()\n const parents: DomainEntity[] = []\n const queue: DomainEntity[] = [...this.listParents()]\n\n let index = 0\n while (index < queue.length) {\n const parent = queue[index++]\n if (!visited.has(parent.key)) {\n visited.add(parent.key)\n parents.push(parent)\n queue.push(...parent.listParents())\n }\n }\n\n if (direction === 'down') {\n parents.reverse()\n }\n\n return parents\n }\n\n /**\n * Adds a parent to this entity.\n *\n * @param key The key of the parent entity.\n * @param domain The key of the foreign domain the parent belongs to.\n * @returns `this` for chaining.\n * @throws ValidationError When the parent does not exist or a circular dependency is detected.\n * @example\n * ```typescript\n * entity.addParent('baseEntity');\n * ```\n */\n addParent(key: string, domain?: string): this {\n const effectiveKey = this.domain.buildReferenceKey(key, domain)\n // Prevent adding self as parent\n if (effectiveKey === this.key) {\n const message = 'Entity cannot be a parent of itself'\n throw new ValidationError(\n [\n {\n field: 'parents',\n message,\n rule: 'circular',\n },\n ],\n { message }\n )\n }\n const { graph } = this.root\n if (!graph.hasNode(effectiveKey)) {\n let message = `Entity with key \"${key}\" not found`\n if (domain) {\n message += ` in domain \"${domain}\"`\n }\n throw new ValidationError(\n [\n {\n field: 'parents',\n message,\n rule: 'required',\n },\n ],\n { message }\n )\n }\n // Check for circular inheritance\n if (this.hasCircularParent(effectiveKey)) {\n const message = `Circular inheritance detected. Cannot add ${key} as a parent`\n throw new ValidationError(\n [\n {\n field: 'parents',\n message,\n rule: 'circular',\n },\n ],\n { message }\n )\n }\n if (graph.outEdges(this.key, effectiveKey).next().value) {\n const message = `Parent ${key} already exists`\n throw new ValidationError(\n [\n {\n field: 'parents',\n message,\n rule: 'unique',\n },\n ],\n { message }\n )\n }\n // Parents are associated through graph edges.\n // Otherwise it would collide with the parent model.\n if (domain) {\n graph.setEdge(this.key, effectiveKey, { type: 'parent', domain, foreign: true })\n } else {\n graph.setEdge(this.key, effectiveKey, { type: 'parent' })\n }\n this.root.notifyChange()\n return this\n }\n\n /**\n * Removes a parent from this entity.\n *\n * @param key The key of the parent entity to remove.\n * @param domain Optional domain key if the parent belongs to a foreign domain.\n * @returns `this` for chaining.\n * @throws Error When the parent does not exist.\n * @example\n * ```typescript\n * // Remove local parent\n * entity.removeParent('baseEntity');\n *\n * // Remove foreign domain parent\n * entity.removeParent('baseEntity', 'externalDomain');\n * ```\n */\n removeParent(key: string, domain?: string): this {\n const { graph } = this.root\n const effectiveKey = this.domain.buildReferenceKey(key, domain)\n\n if (!graph.hasEdge(this.key, effectiveKey)) {\n let message = `Trying to remove a parent ${key} from ${this.key}, but it doesn't exist`\n if (domain) {\n message = `Trying to remove a foreign parent ${key} from domain \"${domain}\" from ${this.key}, but it doesn't exist`\n }\n throw new Error(message)\n }\n\n // Verify it's actually a parent edge\n const edge = graph.edge(this.key, effectiveKey)\n if (!edge || edge.type !== 'parent') {\n let message = `Edge between ${this.key} and ${key} exists but is not a parent relationship`\n if (domain) {\n message = `Edge between ${this.key} and ${key} in domain \"${domain}\" exists but is not a parent relationship`\n }\n throw new Error(message)\n }\n\n graph.removeEdge(this.key, effectiveKey)\n this.root.notifyChange()\n return this\n }\n\n /**\n * Checks if this entity has any parents.\n *\n * @returns True if the entity has parents.\n * @example\n * ```typescript\n * if (entity.hasParents()) {\n * // ...\n * }\n * ```\n */\n hasParents(): boolean {\n for (const edge of this.root.graph.outEdges(this.key)) {\n if (this.root.graph.edge(edge)?.type === 'parent') {\n return true\n }\n }\n return false\n }\n\n /**\n * Checks if the passed entity has a circular parent\n * relationship when attempting to add a new parent.\n *\n * @param key The key of the parent being added.\n * @returns True if adding this parent would create a\n * circular relationship.\n */\n hasCircularParent(key: string): boolean {\n const { graph } = this.root\n\n // Check if new parent is one of the children.\n for (const edge of graph.outEdges(key, this.key)) {\n if (graph.edge(edge)?.type === 'parent') {\n return true\n }\n }\n\n // check if this entity is in parents chain.\n let current: DomainEntity | undefined = graph.node(key) as DomainEntity | undefined\n while (current) {\n if (current.key === this.key) {\n return true\n }\n const parents = [...current.listParents()]\n if (parents.length === 0) {\n break\n }\n // Assuming single inheritance\n // TODO: Update this to check for multiple parents.\n current = parents[0]\n }\n\n return false\n }\n\n /**\n * Creates breadcrumbs from this entity to the root\n * namespace.\n *\n * @returns An array of `FileBreadcrumb` instances.\n * @example\n * ```typescript\n * const breadcrumbs = entity.breadcrumbs();\n * console.log(breadcrumbs);\n * ```\n */\n breadcrumbs(): FileBreadcrumb[] {\n const result: FileBreadcrumb[] = []\n result.push({\n key: this.key,\n name: this.info.getLabel('Unnamed entity'),\n kind: DomainEntityKind,\n })\n const model = this.getParentInstance()\n if (model) {\n result.push({\n key: model.key,\n kind: model.kind,\n name: model.info.getLabel('Unnamed model'),\n })\n let parent: DataDomain | DomainNamespace = model.getParentInstance()\n while (parent && parent !== this.root) {\n result.push({\n key: parent.key,\n kind: parent.kind,\n name: parent.info.getLabel('Unnamed namespace'),\n })\n const typed = parent as DomainNamespace\n parent = typed.getParentInstance()\n }\n }\n result.push({\n key: this.root.key,\n name: this.root.info.getLabel('Unnamed data domain'),\n kind: this.root.kind,\n })\n return result.reverse()\n }\n\n /**\n * Adds an association to this entity.\n *\n * Add rules:\n * - If the target is specified, it has to exist in the graph.\n * - The association targets can be local or foreign.\n *\n * Please note that you can't just add targets to the association schema.\n * This function manipulates the graph to insert the required metadata.\n *\n * @param input The partial association schema.\n * @returns The created `DomainAssociation` instance.\n * @throws Error When the target entity does not exist.\n * @example\n * ```typescript\n * const association = entity.addAssociation({ info: { name: 'Address' }, targets: [{ key: 'address' }] });\n * ```\n */\n addAssociation(input: Partial<DomainAssociationSchema> = {}): DomainAssociation {\n const { graph } = this.root\n\n // clean up any target information from the input\n // so we won't break the graph and the app.\n const inputCopy = { ...input }\n const targets = inputCopy.targets\n delete inputCopy.targets\n\n const hasTargets = Array.isArray(targets) && targets.length\n if (hasTargets) {\n for (const target of targets) {\n if (target.domain && target.key) {\n // target is foreign\n const foreignKey = `${target.domain}:${target.key}`\n if (!graph.hasNode(foreignKey)) {\n throw new Error(`Foreign entity ${foreignKey} not found`)\n }\n } else if (target.key) {\n if (!graph.hasNode(target.key)) {\n throw new Error(`Target entity ${target.key} not found`)\n }\n }\n }\n }\n\n const item = new DomainAssociation(this.root, this.key, inputCopy)\n graph.setNode(item.key, item)\n graph.setEdge(this.key, item.key, { type: 'association' })\n if (hasTargets) {\n for (const target of targets) {\n item.addTarget(target.key, target.domain)\n }\n }\n this.fields.push({ type: 'association', key: item.key })\n this.root.notifyChange()\n return item\n }\n\n /**\n * Removes an association from this entity.\n *\n * @param key The key of the association to remove.\n * @throws Error When the association does not exist.\n * @example\n * ```typescript\n * entity.removeAssociation('address');\n * ```\n */\n removeAssociation(key: string): void {\n if (!this.root.graph.hasEdge(this.key, key)) {\n throw new Error(`Unable to find a connection between this entity and the ${key} association`)\n }\n const edge = this.root.graph.edge(this.key, key)\n if (!edge || edge.type !== 'association') {\n throw new Error(`Association ${key} does not exist`)\n }\n removeGraphNode(this.root.graph, key)\n this.removeField(key)\n this.root.notifyChange()\n }\n\n /**\n * A shortcut to `listAssociations()`.\n */\n get associations(): Generator<DomainAssociation> {\n return this.listAssociations()\n }\n\n /**\n * Lists all associations of this entity.\n *\n * The order of the associations is defined in the `fields` array.\n *\n * @returns A generator that yields each\n * `DomainAssociation`.\n * @example\n * ```typescript\n * for (const association of entity.listAssociations()) {\n * console.log(association.key);\n * }\n * ```\n */\n *listAssociations(): Generator<DomainAssociation> {\n for (const { key, type } of this.fields) {\n if (type !== 'association') {\n continue\n }\n const node = this.root.graph.node(key)\n if (!node || node.kind !== DomainAssociationKind) {\n continue\n }\n yield node\n }\n }\n\n /**\n * Checks if this entity has any associations.\n *\n * @returns True if the entity has associations.\n * @example\n * ```typescript\n * if (entity.hasAssociations()) {\n * // ...\n * }\n * ```\n */\n hasAssociations(): boolean {\n return this.fields.some((item) => item.type === 'association')\n }\n\n /**\n * Lists all fields (properties and associations) of this entity.\n *\n * @returns A generator that yields each `DomainAssociation` or `DomainProperty`.\n * @example\n * ```typescript\n * for (const field of entity.listFields()) {\n * console.log(field.key);\n * }\n * ```\n */\n *listFields(): Generator<DomainAssociation | DomainProperty> {\n for (const { key } of this.fields) {\n const node = this.root.graph.node(key)\n if (!node) {\n continue\n }\n if (node.kind === DomainAssociationKind || node.kind === DomainPropertyKind) {\n yield node\n }\n }\n }\n\n /**\n * Checks if this entity has any fields (properties or associations).\n *\n * @returns True if the entity has fields.\n * @example\n * ```typescript\n * if (entity.hasFields()) {\n * // ...\n * }\n * ```\n */\n hasFields(): boolean {\n return this.fields.length > 0\n }\n\n private removeField(key: string): void {\n this.fields = this.fields.filter((item) => item.key !== key)\n }\n\n /**\n * Creates an AMF's data Shape.\n *\n * The property itself is auto-generated. If the `schema` is defined then it is used\n * as the `range` of the property. Otherwise basic shape is generated for the range.\n *\n * This is a preferred way of reading the AMF shape as this synchronizes changed\n * data properties with the shape definition.\n *\n * @returns AMF property shape definition.\n */\n toApiShape(): Shapes.IShapeUnion {\n const serializer = new ShapeGenerator()\n return serializer.entity(this)\n }\n\n /**\n * Reads the schema of the Entity and generates an example for it.\n *\n * @param mime The mime type of the example.\n * @param opts The example generation options.\n * @returns The generated example.\n * @example\n * ```typescript\n * const example = entity.toExample('application/json');\n * console.log(example);\n * ```\n */\n toExample(mime: string, opts: IShapeRenderOptions = {}): string | number | boolean | null | undefined {\n const shape = this.toApiShape()\n const generator = new ApiSchemaGenerator(mime, {\n renderExamples: opts.renderExamples ?? true,\n renderMocked: opts.renderMocked ?? true,\n renderOptional: opts.renderOptional ?? true,\n selectedUnions: opts.selectedUnions,\n })\n return generator.generate(shape)\n }\n\n /**\n * Checks whether the entity is a child of the given namespace or data model.\n * The relationship doesn't have to be direct, as long as the entity\n * is in the hierarchy it will return true.\n *\n * @param key The key of the parent to check.\n * @returns True if this entity is a child of the given namespace or data model.\n */\n isChildOf(key: string): boolean {\n if (this.key === key) {\n return false\n }\n const parent = this.getParentInstance()\n if (!parent) {\n return false\n }\n if (parent.key === key) {\n return true\n }\n return parent.isChildOf(key)\n }\n\n /**\n * Finds the primary key property of this entity.\n * @returns The primary key property of this entity or undefined if not found.\n */\n primaryKey(): DomainProperty | undefined {\n for (const property of this.properties) {\n if (property.primary) {\n return property\n }\n }\n let property: DomainProperty | undefined\n for (const parent of this.listParents()) {\n const prop = parent.primaryKey()\n if (prop) {\n // According to the validation rules, the last parent\n // that has the property will be used as the source of\n // the property.\n // In the future, we may add a schema definition to the entity that\n // will explicitly define which property to use.\n property = prop\n }\n }\n return property\n }\n\n /**\n * Adds or updates a semantic to the entity.\n * @param semantic The semantic to add to the entity.\n * @throws Error if the semantic is not an entity semantic.\n */\n addSemantic(semantic: AppliedDataSemantic): void {\n const sem = DataSemantics[semantic.id]\n if (!isEntitySemantic(sem)) {\n throw new Error(`Invalid semantic type: ${semantic.id}. Expected an entity semantic.`)\n }\n const index = this.semantics.findIndex((s) => s.id === semantic.id)\n if (index >= 0) {\n this.semantics[index] = semantic\n } else {\n this.semantics.push(semantic)\n }\n this.domain.notifyChange()\n }\n\n /**\n * Removes a semantic from the entity.\n * @param semanticId The ID of the semantic to remove.\n */\n removeSemantic(semanticId: SemanticType): void {\n const index = this.semantics.findIndex((s) => s.id === semanticId)\n if (index >= 0) {\n this.semantics.splice(index, 1)\n this.domain.notifyChange()\n }\n }\n\n /**\n * Checks if the entity has a specific semantic.\n * @param semanticId The ID of the semantic to check.\n * @returns True if the semantic is present, false otherwise.\n */\n hasSemantic(semanticId: SemanticType): boolean {\n return this.semantics.some((s) => s.id === semanticId)\n }\n\n /**\n * Generates a unique name by appending a number to the base name.\n * @param baseName The base name to make unique.\n * @returns A unique name within the current entity.\n */\n generateUniqueName(baseName: string): string {\n const existingNames = new Set<string>()\n for (const field of this.listFields()) {\n if (field.info.name) {\n existingNames.add(field.info.name)\n }\n }\n\n let counter = 2\n let newName = `${baseName}_copy`\n while (existingNames.has(newName)) {\n newName = `${baseName}_copy_${counter}`\n counter++\n }\n\n return newName\n }\n}\n"]}
|
|
@@ -11,5 +11,5 @@ export declare function validateApiModelSecurity(model: ApiModel): ApiModelValid
|
|
|
11
11
|
export declare function validateApiModelMetadata(model: ApiModel): ApiModelValidationItem[];
|
|
12
12
|
export declare function validateApiPagination(model: ApiModel): ApiModelValidationItem[];
|
|
13
13
|
export declare function validateAction(action: Action, parent: ExposedEntity, apiModelKey: string): ApiModelValidationItem[];
|
|
14
|
-
export declare function validateExposedEntity(
|
|
14
|
+
export declare function validateExposedEntity(exposure: ExposedEntity, apiModel: ApiModel): ApiModelValidationItem[];
|
|
15
15
|
//# sourceMappingURL=api_model_rules.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api_model_rules.d.ts","sourceRoot":"","sources":["../../../../src/modeling/validation/api_model_rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAMlD,OAAO,KAAK,EAAE,sBAAsB,EAA6B,MAAM,aAAa,CAAA;AAapF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CAiD9E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CA+BpF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CAuKlF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CAuElF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CA+C/E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAuDnH;AAED,wBAAgB,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"api_model_rules.d.ts","sourceRoot":"","sources":["../../../../src/modeling/validation/api_model_rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAMlD,OAAO,KAAK,EAAE,sBAAsB,EAA6B,MAAM,aAAa,CAAA;AAapF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CAiD9E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CA+BpF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CAuKlF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CAuElF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CA+C/E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAuDnH;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CAoO3G"}
|
|
@@ -422,15 +422,17 @@ export function validateAction(action, parent, apiModelKey) {
|
|
|
422
422
|
}
|
|
423
423
|
return issues;
|
|
424
424
|
}
|
|
425
|
-
export function validateExposedEntity(
|
|
425
|
+
export function validateExposedEntity(exposure, apiModel) {
|
|
426
426
|
const issues = [];
|
|
427
427
|
const context = {
|
|
428
428
|
apiModelKey: apiModel.key,
|
|
429
429
|
kind: ExposedEntityKind,
|
|
430
|
-
key:
|
|
430
|
+
key: exposure.key,
|
|
431
431
|
};
|
|
432
|
+
const entity = exposure.entity ? apiModel.domain?.findEntity(exposure.entity.key, exposure.entity.domain) : undefined;
|
|
433
|
+
const entityName = entity?.info.getLabel() || entity?.key || 'unknown';
|
|
432
434
|
// Valid Entity Reference
|
|
433
|
-
if (!
|
|
435
|
+
if (!exposure.entity || !exposure.entity.key) {
|
|
434
436
|
issues.push({
|
|
435
437
|
code: createCode('EXPOSURE', 'MISSING_ENTITY_REF'),
|
|
436
438
|
message: 'This exposed endpoint does not point to a specific data model.',
|
|
@@ -439,7 +441,7 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
439
441
|
context: { ...context, property: 'entity' },
|
|
440
442
|
});
|
|
441
443
|
}
|
|
442
|
-
else if (
|
|
444
|
+
else if (!entity) {
|
|
443
445
|
issues.push({
|
|
444
446
|
code: createCode('EXPOSURE', 'INVALID_ENTITY_REF'),
|
|
445
447
|
message: 'This endpoint points to a data model that no longer exists.',
|
|
@@ -449,44 +451,44 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
449
451
|
});
|
|
450
452
|
}
|
|
451
453
|
// Path Integrity
|
|
452
|
-
if (
|
|
453
|
-
if (!
|
|
454
|
+
if (exposure.hasCollection) {
|
|
455
|
+
if (!exposure.collectionPath) {
|
|
454
456
|
issues.push({
|
|
455
457
|
code: createCode('EXPOSURE', 'MISSING_COLLECTION_PATH'),
|
|
456
|
-
message:
|
|
458
|
+
message: `[${entityName}]: When an endpoint exposes a collection, it must define what its base URL path is.`,
|
|
457
459
|
suggestion: 'Add a path (e.g., "/items").',
|
|
458
460
|
severity: 'error',
|
|
459
461
|
context: { ...context, property: 'collectionPath' },
|
|
460
462
|
});
|
|
461
463
|
}
|
|
462
464
|
else {
|
|
463
|
-
const parts =
|
|
464
|
-
if (parts.length !== 1 || !
|
|
465
|
+
const parts = exposure.collectionPath.split('/').filter(Boolean);
|
|
466
|
+
if (parts.length !== 1 || !exposure.collectionPath.startsWith('/')) {
|
|
465
467
|
issues.push({
|
|
466
468
|
code: createCode('EXPOSURE', 'INVALID_COLLECTION_PATH'),
|
|
467
|
-
message:
|
|
469
|
+
message: `[${entityName}]: The collection URL should start with "/" and have no extra slashes.`,
|
|
468
470
|
suggestion: `Ensure the path looks like exactly "/${parts[0] || 'subresource'}".`,
|
|
469
471
|
severity: 'error',
|
|
470
472
|
context: { ...context, property: 'collectionPath' },
|
|
471
473
|
});
|
|
472
474
|
}
|
|
473
475
|
}
|
|
474
|
-
if (!
|
|
476
|
+
if (!exposure.resourcePath) {
|
|
475
477
|
issues.push({
|
|
476
478
|
code: createCode('EXPOSURE', 'MISSING_RESOURCE_PATH'),
|
|
477
|
-
message:
|
|
479
|
+
message: `[${entityName}]: You need an identifier to locate single items.`,
|
|
478
480
|
suggestion: 'Specify the identification parameter format, like "{id}".',
|
|
479
481
|
severity: 'error',
|
|
480
482
|
context: { ...context, property: 'resourcePath' },
|
|
481
483
|
});
|
|
482
484
|
}
|
|
483
|
-
else if (
|
|
484
|
-
const colRegex = new RegExp(`^${
|
|
485
|
-
if (!colRegex.test(
|
|
485
|
+
else if (exposure.collectionPath) {
|
|
486
|
+
const colRegex = new RegExp(`^${exposure.collectionPath}/\\{[a-zA-Z0-9_]+\\}$`);
|
|
487
|
+
if (!colRegex.test(exposure.resourcePath)) {
|
|
486
488
|
issues.push({
|
|
487
489
|
code: createCode('EXPOSURE', 'INVALID_RESOURCE_PATH_FORMAT'),
|
|
488
|
-
message:
|
|
489
|
-
suggestion: `Make sure the item path is formatted exactly like "${
|
|
490
|
+
message: `[${entityName}]: The single item route should match exactly your collection path plus one identifier variable.`,
|
|
491
|
+
suggestion: `Make sure the item path is formatted exactly like "${exposure.collectionPath}/{id}".`,
|
|
490
492
|
severity: 'error',
|
|
491
493
|
context: { ...context, property: 'resourcePath' },
|
|
492
494
|
});
|
|
@@ -494,21 +496,21 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
494
496
|
}
|
|
495
497
|
}
|
|
496
498
|
else {
|
|
497
|
-
if (!
|
|
499
|
+
if (!exposure.resourcePath) {
|
|
498
500
|
issues.push({
|
|
499
501
|
code: createCode('EXPOSURE', 'MISSING_RESOURCE_PATH'),
|
|
500
|
-
message:
|
|
502
|
+
message: `[${entityName}]: Exposed entity representing a single item must declare their URL route.`,
|
|
501
503
|
suggestion: 'Set the URL path (such as "/profile").',
|
|
502
504
|
severity: 'error',
|
|
503
505
|
context: { ...context, property: 'resourcePath' },
|
|
504
506
|
});
|
|
505
507
|
}
|
|
506
508
|
else {
|
|
507
|
-
const parts =
|
|
508
|
-
if (parts.length !== 1 || !
|
|
509
|
+
const parts = exposure.resourcePath.split('/').filter(Boolean);
|
|
510
|
+
if (parts.length !== 1 || !exposure.resourcePath.startsWith('/')) {
|
|
509
511
|
issues.push({
|
|
510
512
|
code: createCode('EXPOSURE', 'INVALID_RESOURCE_PATH_FORMAT'),
|
|
511
|
-
message:
|
|
513
|
+
message: `[${entityName}]: The URL route ${exposure.resourcePath} must only contain one exact part or level.`,
|
|
512
514
|
suggestion: 'Simplify the endpoint URL to a single segment.',
|
|
513
515
|
severity: 'error',
|
|
514
516
|
context: { ...context, property: 'resourcePath' },
|
|
@@ -517,25 +519,25 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
517
519
|
}
|
|
518
520
|
}
|
|
519
521
|
// Path Collisions
|
|
520
|
-
if (
|
|
521
|
-
if (
|
|
522
|
-
const collectionCollision = apiModel.findCollectionPathCollision(
|
|
522
|
+
if (exposure.isRoot) {
|
|
523
|
+
if (exposure.collectionPath) {
|
|
524
|
+
const collectionCollision = apiModel.findCollectionPathCollision(exposure.collectionPath, exposure.key);
|
|
523
525
|
if (collectionCollision) {
|
|
524
526
|
issues.push({
|
|
525
527
|
code: createCode('EXPOSURE', 'ROOT_COLLECTION_COLLISION'),
|
|
526
|
-
message: `The route "${
|
|
528
|
+
message: `[${entityName}]: The route "${exposure.collectionPath}" is already used by another view.`,
|
|
527
529
|
suggestion: 'Give this resource a different path to avoid conflicts.',
|
|
528
530
|
severity: 'error',
|
|
529
531
|
context: { ...context, property: 'collectionPath' },
|
|
530
532
|
});
|
|
531
533
|
}
|
|
532
534
|
}
|
|
533
|
-
if (
|
|
534
|
-
const resourceCollision = apiModel.findResourcePathCollision(
|
|
535
|
+
if (exposure.resourcePath) {
|
|
536
|
+
const resourceCollision = apiModel.findResourcePathCollision(exposure.resourcePath, exposure.key);
|
|
535
537
|
if (resourceCollision) {
|
|
536
538
|
issues.push({
|
|
537
539
|
code: createCode('EXPOSURE', 'ROOT_RESOURCE_COLLISION'),
|
|
538
|
-
message: `The route "${
|
|
540
|
+
message: `[${entityName}]: The route "${exposure.resourcePath}" is already used by another one.`,
|
|
539
541
|
suggestion: 'Give this single-item resource a different path to avoid conflicts.',
|
|
540
542
|
severity: 'error',
|
|
541
543
|
context: { ...context, property: 'resourcePath' },
|
|
@@ -544,10 +546,10 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
544
546
|
}
|
|
545
547
|
}
|
|
546
548
|
// Minimum Actions
|
|
547
|
-
if (!
|
|
549
|
+
if (!exposure.actions || exposure.actions.length === 0) {
|
|
548
550
|
issues.push({
|
|
549
551
|
code: createCode('EXPOSURE', 'MISSING_ACTIONS'),
|
|
550
|
-
message:
|
|
552
|
+
message: `[${entityName}]: This exposed entity does not let users do anything.`,
|
|
551
553
|
suggestion: 'Enable at least one operation like Create, Read, or Update.',
|
|
552
554
|
severity: 'error',
|
|
553
555
|
context: { ...context, property: 'actions' },
|
|
@@ -556,8 +558,8 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
556
558
|
else {
|
|
557
559
|
let hasSearch = false;
|
|
558
560
|
let hasList = false;
|
|
559
|
-
for (const action of
|
|
560
|
-
issues.push(...validateAction(action,
|
|
561
|
+
for (const action of exposure.actions) {
|
|
562
|
+
issues.push(...validateAction(action, exposure, apiModel.key));
|
|
561
563
|
if (SearchAction.isSearchAction(action))
|
|
562
564
|
hasSearch = true;
|
|
563
565
|
if (ListAction.isListAction(action))
|
|
@@ -567,9 +569,9 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
567
569
|
let hasAuth = false;
|
|
568
570
|
if (action.accessRule && action.accessRule.length > 0)
|
|
569
571
|
hasAuth = true;
|
|
570
|
-
if (!hasAuth &&
|
|
572
|
+
if (!hasAuth && exposure.accessRule && exposure.accessRule.length > 0)
|
|
571
573
|
hasAuth = true;
|
|
572
|
-
let curr =
|
|
574
|
+
let curr = exposure.parent?.key;
|
|
573
575
|
while (curr && !hasAuth) {
|
|
574
576
|
const p = apiModel.exposes.get(curr);
|
|
575
577
|
if (p && p.accessRule && p.accessRule.length > 0) {
|
|
@@ -583,20 +585,20 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
583
585
|
if (!hasAuth) {
|
|
584
586
|
issues.push({
|
|
585
587
|
code: createCode('ACTION', 'MISSING_ACCESS_RULES'),
|
|
586
|
-
message: `The ${action.kind} action has no security rules attached, making it entirely inaccessible or open.`,
|
|
588
|
+
message: `[${entityName}]: The ${action.kind} action has no security rules attached, making it entirely inaccessible or open.`,
|
|
587
589
|
suggestion: 'Allow specific user roles to access this operation.',
|
|
588
590
|
severity: 'error',
|
|
589
591
|
// using action.kind as the key context equivalent
|
|
590
|
-
context: { ...context, kind: 'Action', key: action.kind, parentExposedEntityKey:
|
|
592
|
+
context: { ...context, kind: 'Action', key: action.kind, parentExposedEntityKey: exposure.key },
|
|
591
593
|
});
|
|
592
594
|
}
|
|
593
595
|
}
|
|
594
596
|
if (hasList || hasSearch) {
|
|
595
|
-
const contract =
|
|
597
|
+
const contract = exposure.paginationContract;
|
|
596
598
|
if (!contract) {
|
|
597
599
|
issues.push({
|
|
598
600
|
code: createCode('EXPOSURE', 'MISSING_PAGINATION_CONTRACT'),
|
|
599
|
-
message:
|
|
601
|
+
message: `[${entityName}]: The List or Search action needs a pagination contract.`,
|
|
600
602
|
suggestion: 'Add a pagination contract to the exposed entity.',
|
|
601
603
|
severity: 'error',
|
|
602
604
|
context,
|
|
@@ -607,7 +609,7 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
607
609
|
if (!contract.filterableFields || contract.filterableFields.length === 0) {
|
|
608
610
|
issues.push({
|
|
609
611
|
code: createCode('EXPOSURE', 'LIST_MISSING_FILTERS'),
|
|
610
|
-
message:
|
|
612
|
+
message: `[${entityName}]: Listing all elements without filters could be overwhelming for large tables.`,
|
|
611
613
|
suggestion: 'Select a few important fields to allow filtering.',
|
|
612
614
|
severity: 'warning',
|
|
613
615
|
context,
|
|
@@ -616,7 +618,7 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
616
618
|
if (!contract.sortableFields || contract.sortableFields.length === 0) {
|
|
617
619
|
issues.push({
|
|
618
620
|
code: createCode('EXPOSURE', 'LIST_MISSING_SORTING'),
|
|
619
|
-
message:
|
|
621
|
+
message: `[${entityName}]: Listing all elements without sorting could be overwhelming for large tables.`,
|
|
620
622
|
suggestion: 'Select a few important fields to allow sorting.',
|
|
621
623
|
severity: 'warning',
|
|
622
624
|
context,
|
|
@@ -635,7 +637,7 @@ export function validateExposedEntity(entity, apiModel) {
|
|
|
635
637
|
if (!all.length) {
|
|
636
638
|
issues.push({
|
|
637
639
|
code: createCode('EXPOSURE', 'SEARCH_MISSING_FIELDS'),
|
|
638
|
-
message:
|
|
640
|
+
message: `[${entityName}]: Search action needs to know which text fields to look in.`,
|
|
639
641
|
suggestion: 'Select a few important fields to allow searching or full-text search.',
|
|
640
642
|
severity: 'warning',
|
|
641
643
|
context,
|