diff --git a/domain/requirements/Requirement.ts b/domain/requirements/Requirement.ts index 0a5a7328..c9af235e 100644 --- a/domain/requirements/Requirement.ts +++ b/domain/requirements/Requirement.ts @@ -21,6 +21,7 @@ export abstract class Requirement extends BaseEntity { this.lastModified = props.lastModified; this.modifiedBy = props.modifiedBy; this.isSilence = props.isSilence; + this.createdBy = props.createdBy; } // This fixes the issue with em.create not honoring the constructor signature @@ -73,11 +74,15 @@ export abstract class Requirement extends BaseEntity { /** * The user who last modified the requirement */ - // System Admin is the default user for the initial migration - // This can be removed in v0.14.0 or later - @ManyToOne({ entity: () => AppUser, default: 'ac594919-50e3-438a-b9bc-efb8a8654243' }) + @ManyToOne({ entity: () => AppUser }) modifiedBy!: AppUser; + /** + * The user who created the requirement + */ + @ManyToOne({ entity: () => AppUser }) + createdBy!: AppUser; + /** * Whether the requirement is a silence requirement. * (i.e. a requirement that is not included in the solution) diff --git a/migrations/.snapshot-cathedral.json b/migrations/.snapshot-cathedral.json index 810d91e6..b9c9a78d 100644 --- a/migrations/.snapshot-cathedral.json +++ b/migrations/.snapshot-cathedral.json @@ -274,7 +274,15 @@ "autoincrement": false, "primary": false, "nullable": false, - "default": "'ac594919-50e3-438a-b9bc-efb8a8654243'", + "mappedType": "uuid" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, "mappedType": "uuid" }, "is_silence": { @@ -514,6 +522,18 @@ "referencedTableName": "public.app_user", "updateRule": "cascade" }, + "requirement_created_by_id_foreign": { + "constraintName": "requirement_created_by_id_foreign", + "columnNames": [ + "created_by_id" + ], + "localTableName": "public.requirement", + "referencedColumnNames": [ + "id" + ], + "referencedTableName": "public.app_user", + "updateRule": "cascade" + }, "requirement_primary_actor_id_foreign": { "constraintName": "requirement_primary_actor_id_foreign", "columnNames": [ diff --git a/migrations/Migration20241105190126.ts b/migrations/Migration20241105190126.ts new file mode 100644 index 00000000..8ee3faf0 --- /dev/null +++ b/migrations/Migration20241105190126.ts @@ -0,0 +1,23 @@ +import { Migration } from '@mikro-orm/migrations'; + +export class Migration20241105190126 extends Migration { + override async up(): Promise { + this.addSql(`alter table "requirement" add column "created_by_id" uuid not null default '00000000-0000-0000-0000-000000000000';`); + this.addSql(`update "requirement" set "created_by_id" = "modified_by_id";`); + this.addSql(`alter table "requirement" alter column "created_by_id" drop default;`); + this.addSql(`alter table "requirement" alter column "modified_by_id" drop default;`); + this.addSql(`alter table "requirement" alter column "modified_by_id" drop default;`); + this.addSql(`alter table "requirement" alter column "modified_by_id" type uuid using ("modified_by_id"::text::uuid);`); + this.addSql(`alter table "requirement" add constraint "requirement_created_by_id_foreign" foreign key ("created_by_id") references "app_user" ("id") on update cascade;`); + } + + override async down(): Promise { + this.addSql(`alter table "requirement" drop constraint "requirement_created_by_id_foreign";`); + + this.addSql(`alter table "requirement" drop column "created_by_id";`); + + this.addSql(`alter table "requirement" alter column "modified_by_id" drop default;`); + this.addSql(`alter table "requirement" alter column "modified_by_id" type uuid using ("modified_by_id"::text::uuid);`); + this.addSql(`alter table "requirement" alter column "modified_by_id" set default 'ac594919-50e3-438a-b9bc-efb8a8654243';`); + } +} diff --git a/package-lock.json b/package-lock.json index f4559778..1e892f04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@final-hill/cathedral", - "version": "0.18.1", + "version": "0.19.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@final-hill/cathedral", - "version": "0.18.1", + "version": "0.19.0", "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { diff --git a/package.json b/package.json index 46045130..dccbc433 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@final-hill/cathedral", - "version": "0.18.1", + "version": "0.19.0", "description": "Requirements management system", "keywords": [], "private": true, @@ -77,4 +77,4 @@ "vitest": "^2.1.4", "vue-tsc": "^2.1.8" } -} +} \ No newline at end of file diff --git a/server/api/assumption/index.post.ts b/server/api/assumption/index.post.ts index 15a7ff62..5b40cce8 100644 --- a/server/api/assumption/index.post.ts +++ b/server/api/assumption/index.post.ts @@ -23,6 +23,7 @@ export default defineEventHandler(async (event) => { reqId: await getNextReqId(assumptionReqIdPrefix, em, solution) as Assumption['reqId'], name, description, + createdBy: sessionUser, modifiedBy: sessionUser, lastModified: new Date(), isSilence diff --git a/server/api/constraint/index.post.ts b/server/api/constraint/index.post.ts index b0b18be7..8a79907b 100644 --- a/server/api/constraint/index.post.ts +++ b/server/api/constraint/index.post.ts @@ -25,6 +25,7 @@ export default defineEventHandler(async (event) => { name, description, category, + createdBy: sessionUser, lastModified: new Date(), modifiedBy: sessionUser, isSilence diff --git a/server/api/effect/index.post.ts b/server/api/effect/index.post.ts index 9a2ce34c..c08381d6 100644 --- a/server/api/effect/index.post.ts +++ b/server/api/effect/index.post.ts @@ -23,6 +23,7 @@ export default defineEventHandler(async (event) => { reqId: await getNextReqId('E.5.', em, solution) as Effect['reqId'], name, description, + createdBy: sessionUser, modifiedBy: sessionUser, lastModified: new Date(), isSilence diff --git a/server/api/environment-component/index.post.ts b/server/api/environment-component/index.post.ts index 380bf40e..a88334f2 100644 --- a/server/api/environment-component/index.post.ts +++ b/server/api/environment-component/index.post.ts @@ -25,6 +25,7 @@ export default defineEventHandler(async (event) => { name, description, lastModified: new Date(), + createdBy: sessionUser, modifiedBy: sessionUser, isSilence }) diff --git a/server/api/epic/index.post.ts b/server/api/epic/index.post.ts index 1b47c8c1..c8d3362c 100644 --- a/server/api/epic/index.post.ts +++ b/server/api/epic/index.post.ts @@ -24,6 +24,7 @@ export default defineEventHandler(async (event) => { reqId: await getNextReqId('G.5.', em, solution) as Epic['reqId'], name, description, + createdBy: sessionUser, modifiedBy: sessionUser, lastModified: new Date(), priority, diff --git a/server/api/functional-behavior/index.post.ts b/server/api/functional-behavior/index.post.ts index 74bd21f3..83b6e417 100644 --- a/server/api/functional-behavior/index.post.ts +++ b/server/api/functional-behavior/index.post.ts @@ -26,6 +26,7 @@ export default defineEventHandler(async (event) => { description, priority, lastModified: new Date(), + createdBy: sessionUser, modifiedBy: sessionUser, isSilence }) diff --git a/server/api/glossary-term/index.post.ts b/server/api/glossary-term/index.post.ts index 9c00b6f8..50f158cd 100644 --- a/server/api/glossary-term/index.post.ts +++ b/server/api/glossary-term/index.post.ts @@ -25,6 +25,7 @@ export default defineEventHandler(async (event) => { name, description, lastModified: new Date(), + createdBy: sessionUser, modifiedBy: sessionUser, isSilence }) diff --git a/server/api/invariant/index.post.ts b/server/api/invariant/index.post.ts index dcaa8e85..2cecf727 100644 --- a/server/api/invariant/index.post.ts +++ b/server/api/invariant/index.post.ts @@ -24,6 +24,7 @@ export default defineEventHandler(async (event) => { name, description, modifiedBy: sessionUser, + createdBy: sessionUser, lastModified: new Date(), isSilence }) diff --git a/server/api/justification/index.post.ts b/server/api/justification/index.post.ts index 88cadb23..e199338a 100644 --- a/server/api/justification/index.post.ts +++ b/server/api/justification/index.post.ts @@ -22,6 +22,7 @@ export default defineEventHandler(async (event) => { reqId: undefined, // Should there be a Documentation category (D)? name, description, + createdBy: sessionUser, modifiedBy: sessionUser, lastModified: new Date(), isSilence diff --git a/server/api/limit/index.post.ts b/server/api/limit/index.post.ts index 1584f419..99dbbb41 100644 --- a/server/api/limit/index.post.ts +++ b/server/api/limit/index.post.ts @@ -24,6 +24,7 @@ export default defineEventHandler(async (event) => { name, description, modifiedBy: sessionUser, + createdBy: sessionUser, lastModified: new Date(), isSilence }) diff --git a/server/api/non-functional-behavior/index.post.ts b/server/api/non-functional-behavior/index.post.ts index 9a9d8f6d..1ba5a523 100644 --- a/server/api/non-functional-behavior/index.post.ts +++ b/server/api/non-functional-behavior/index.post.ts @@ -27,6 +27,7 @@ export default defineEventHandler(async (event) => { priority, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, isSilence }) diff --git a/server/api/obstacle/index.post.ts b/server/api/obstacle/index.post.ts index e45640e3..32eccab2 100644 --- a/server/api/obstacle/index.post.ts +++ b/server/api/obstacle/index.post.ts @@ -24,6 +24,7 @@ export default defineEventHandler(async (event) => { name, description, modifiedBy: sessionUser, + createdBy: sessionUser, lastModified: new Date(), isSilence }) diff --git a/server/api/organization/index.post.ts b/server/api/organization/index.post.ts index fa7fe5cb..ed2fdaff 100644 --- a/server/api/organization/index.post.ts +++ b/server/api/organization/index.post.ts @@ -25,6 +25,7 @@ export default defineEventHandler(async (event) => { description, slug: slugify(name), lastModified: new Date(), + createdBy: sessionUser, modifiedBy: sessionUser, isSilence: false }) diff --git a/server/api/outcome/index.post.ts b/server/api/outcome/index.post.ts index 56d5cbdb..731b761b 100644 --- a/server/api/outcome/index.post.ts +++ b/server/api/outcome/index.post.ts @@ -24,6 +24,7 @@ export default defineEventHandler(async (event) => { name, description, modifiedBy: sessionUser, + createdBy: sessionUser, lastModified: new Date(), isSilence }) diff --git a/server/api/parse-requirement/index.post.ts b/server/api/parse-requirement/index.post.ts index 7fa08d4f..74f40513 100644 --- a/server/api/parse-requirement/index.post.ts +++ b/server/api/parse-requirement/index.post.ts @@ -78,6 +78,7 @@ export default defineEventHandler(async (event) => { const parsedRequirement = em.create(ParsedRequirement, { name: '{LLM Parsed Requirement}', description: statement, + createdBy: sessionUser, modifiedBy: sessionUser, lastModified: new Date(), isSilence: true @@ -90,6 +91,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -101,6 +103,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description, category: item.category as ConstraintCategory @@ -113,6 +116,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -124,6 +128,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -135,6 +140,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description, priority: item.moscowPriority as MoscowPriority ?? MoscowPriority.MUST @@ -147,6 +153,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -158,6 +165,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -169,6 +177,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -180,6 +189,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -191,6 +201,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description, priority: item.moscowPriority as MoscowPriority ?? MoscowPriority.MUST @@ -203,6 +214,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -214,6 +226,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -225,6 +238,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description, email: item.email @@ -237,6 +251,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, availability: item.availability, influence: item.influence, @@ -252,6 +267,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.description }) @@ -266,6 +282,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.outcome }), @@ -274,6 +291,7 @@ export default defineEventHandler(async (event) => { scope: item.scope, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: '', priority: item.moscowPriority as MoscowPriority ?? MoscowPriority.MUST, @@ -282,6 +300,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.precondition }), @@ -289,6 +308,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: item.successGuarantee }), @@ -296,6 +316,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.primaryActor, availability: 50, influence: 50, @@ -317,6 +338,7 @@ export default defineEventHandler(async (event) => { priority: item.moscowPriority as MoscowPriority ?? MoscowPriority.MUST, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.name, description: '', functionalBehavior: em.create(FunctionalBehavior, { @@ -324,6 +346,7 @@ export default defineEventHandler(async (event) => { priority: item.moscowPriority as MoscowPriority ?? MoscowPriority.MUST, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.functionalBehavior, description: item.functionalBehavior }), @@ -331,6 +354,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.outcome, description: item.outcome }), @@ -338,6 +362,7 @@ export default defineEventHandler(async (event) => { isSilence: true, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, name: item.role, availability: 50, influence: 50, diff --git a/server/api/person/index.post.ts b/server/api/person/index.post.ts index 759ed106..591b7d9e 100644 --- a/server/api/person/index.post.ts +++ b/server/api/person/index.post.ts @@ -25,6 +25,7 @@ export default defineEventHandler(async (event) => { name, description, email, + createdBy: sessionUser, modifiedBy: sessionUser, lastModified: new Date(), isSilence diff --git a/server/api/solution/index.post.ts b/server/api/solution/index.post.ts index 4e3d5902..d739ffb7 100644 --- a/server/api/solution/index.post.ts +++ b/server/api/solution/index.post.ts @@ -22,6 +22,7 @@ export default defineEventHandler(async (event) => { name, description, lastModified: new Date(), + createdBy: sessionUser, modifiedBy: sessionUser, isSilence: false, slug: slugify(name) @@ -36,6 +37,7 @@ export default defineEventHandler(async (event) => { description: '', lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, isSilence: false }) diff --git a/server/api/stakeholder/index.post.ts b/server/api/stakeholder/index.post.ts index 0c236e9d..16a457fc 100644 --- a/server/api/stakeholder/index.post.ts +++ b/server/api/stakeholder/index.post.ts @@ -34,6 +34,7 @@ export default defineEventHandler(async (event) => { segmentation, category, lastModified: new Date(), + createdBy: sessionUser, modifiedBy: sessionUser, isSilence }) diff --git a/server/api/system-component/index.post.ts b/server/api/system-component/index.post.ts index 2ce169b9..ee754f17 100644 --- a/server/api/system-component/index.post.ts +++ b/server/api/system-component/index.post.ts @@ -26,6 +26,7 @@ export default defineEventHandler(async (event) => { description, lastModified: new Date(), modifiedBy: sessionUser, + createdBy: sessionUser, isSilence }) diff --git a/server/api/use-case/index.post.ts b/server/api/use-case/index.post.ts index fe2bfb0a..074b6169 100644 --- a/server/api/use-case/index.post.ts +++ b/server/api/use-case/index.post.ts @@ -44,6 +44,7 @@ export default defineEventHandler(async (event) => { mainSuccessScenario: body.mainSuccessScenario, successGuarantee: body.successGuarantee ? em.getReference(Effect, body.successGuarantee) : undefined, extensions: body.extensions, + createdBy: sessionUser, lastModified: new Date(), modifiedBy: sessionUser, isSilence: body.isSilence diff --git a/server/api/user-story/index.post.ts b/server/api/user-story/index.post.ts index 70b41b33..2b2800d9 100644 --- a/server/api/user-story/index.post.ts +++ b/server/api/user-story/index.post.ts @@ -32,6 +32,7 @@ export default defineEventHandler(async (event) => { primaryActor: body.primaryActor ? em.getReference(Stakeholder, body.primaryActor) : undefined, priority: body.priority, lastModified: new Date(), + createdBy: sessionUser, modifiedBy: sessionUser, isSilence: body.isSilence })