Persistent schema is defined in Prisma and stored in PostgreSQL.
The data model combines:
- relational ownership and foreign keys for core lineage
- JSON/JSONB-style fields for flexible metamodel/model/diagram structures
- explicit share records for cross-user collaboration
Represents authenticated users and role assignment.
Key fields:
id,email,passwordrole(ADMIN,DSL_DESIGNER,MODELER,VIEWER)isSuspended,lastLogin
Owns all primary resources through userId relations.
Maps owner resource access to recipient users.
Key fields:
resourceType,resourceIdpermission(VIEWER,EDITOR)ownerId,sharedWithId
Unique constraint prevents duplicate share rows per resource/user pair.
Meta-metamodel package (Ecore-like foundation).
Key fields:
name,nsURI,nsPrefixclasses(JSON)userId
User-defined modeling language.
Key fields:
name,uri,prefix, optionaleClassclasses(JSON)constraints(JSON)conformsToId(EPackage FK)userId
Instance-level data conforming to a metamodel.
Key fields:
namemetamodelId(duplicate convenience field)elements(JSON)connections(JSON)conformsToId(Metamodel FK)userId
Visual representation bound to a model.
Key fields:
namemodelId(Model FK)elements(JSON)gridSettings(JSON)userId
Transformation rule with embedded patterns.
Key fields:
name,description,priority,enabledlhs(JSON),rhs(JSON),nacs(JSON)conditions(JSON)- optional
diagramId userId
Project-level container for codegen templates.
Key fields:
name,description,isExample- optional
targetMetamodelId templates(JSON)userId
Model/metamodel testing definition and status tracking.
Key fields:
name,description,type,status- target class/property fields
- optional constraint fields
testValues(JSON)- optional
modelId userId
Binary file storage in database.
Key fields:
filename,mimetype,size,typedata(Bytes)metadata(JSON)userId
UserRole: ADMIN, DSL_DESIGNER, MODELER, VIEWERResourceType: METAMODEL, MODEL, DIAGRAM, TRANSFORMATION_RULE, CODEGEN_PROJECT, TEST_CASESharePermission: VIEWER, EDITORTestCaseType: attribute, reference, constraint, reference_attributeTestCaseStatus: pending, running, passed, failedConstraintType: ocl, javascriptFileType: image, model, other
Primary resources include userId ownership.
Isolation model:
- owners can fully manage owned resources
- cross-user access is only through sharing records
- cascade deletes on some relations enforce cleanup
Shared access is represented explicitly in SharedResource.
Semantics:
- owner defines recipient and permission
- effective access combines recipient role and share permission
- only one row per
(resourceType, resourceId, sharedWithId)
Main dependency chain:
EPackage->Metamodel->Model->Diagram
Additional dependency links:
CodeGenerationProject.targetMetamodelId(optional)- transformation and test resources linked by domain identifiers and ownership
JSON fields are used for flexible domain objects:
- class definitions
- model elements and connections
- diagram elements and grid config
- transformation patterns
- template collections
- test values and IO snapshots
Implications:
- rapid schema evolution for modeling payloads
- fewer SQL-level constraints inside nested structures
- validation and consistency logic moved to service layer
Current migration set:
20260123031348_init20260123055303_make_target_metamodel_id_optional20260223024320_add_rbac_sharing20260321071500_sync_user_schema_for_auth