From 8a2aa9f3cf02366e23c0f95f9e01948486ebd047 Mon Sep 17 00:00:00 2001 From: Michael Haufe Date: Thu, 5 Sep 2024 03:12:15 +0000 Subject: [PATCH] - Lifted APIs back to top level - Fixed errors with org/solution deletion --- migrations/.snapshot-cathedral.json | 8 +- migrations/Migration20240904172417.ts | 33 ++ migrations/Migration20240904183539.ts | 311 +++++++++++++++++ migrations/Migration20240905000351.ts | 313 ++++++++++++++++++ .../environment/assumptions.client.vue | 19 +- .../environment/components.client.vue | 20 +- .../environment/constraints.client.vue | 20 +- .../environment/effects.client.vue | 22 +- .../environment/glossary.client.vue | 26 +- .../environment/invariants.client.vue | 23 +- .../goals/functionality.client.vue | 16 +- .../goals/limitations.client.vue | 16 +- .../goals/obstacles.client.vue | 16 +- .../[solution-slug]/goals/outcomes.client.vue | 16 +- .../goals/rationale.client.vue | 11 +- .../goals/scenarios.client.vue | 26 +- .../goals/stakeholders.client.vue | 24 +- .../project/roles-personnel.client.vue | 22 +- .../system/components.client.vue | 23 +- .../system/functionality.client.vue | 14 +- .../system/scenarios.client.vue | 42 ++- .../assumptions/[id].delete.ts | 8 +- .../assumptions/[id].get.ts | 8 +- .../assumptions/[id].put.ts | 6 +- .../assumptions/index.get.ts | 12 +- .../assumptions/index.post.ts | 8 +- .../constraints/[id].delete.ts | 8 +- .../constraints/[id].get.ts | 8 +- .../constraints/[id].put.ts | 6 +- .../constraints/index.get.ts | 12 +- .../constraints/index.post.ts | 8 +- .../effects/[id].delete.ts | 8 +- .../{[solution-id] => }/effects/[id].get.ts | 8 +- .../{[solution-id] => }/effects/[id].put.ts | 6 +- .../{[solution-id] => }/effects/index.get.ts | 12 +- .../{[solution-id] => }/effects/index.post.ts | 8 +- .../environment-components/[id].delete.ts | 8 +- .../environment-components/[id].get.ts | 8 +- .../environment-components/[id].put.ts | 6 +- .../environment-components/index.get.ts | 12 +- .../environment-components/index.post.ts | 8 +- .../functional-behaviors/[id].delete.ts | 8 +- .../functional-behaviors/[id].get.ts | 8 +- .../functional-behaviors/[id].put.ts | 6 +- .../functional-behaviors/index.get.ts | 10 +- .../functional-behaviors/index.post.ts | 8 +- .../glossary-terms/[id].delete.ts | 8 +- .../glossary-terms/[id].get.ts | 8 +- .../glossary-terms/[id].put.ts | 6 +- .../glossary-terms/index.get.ts | 12 +- .../glossary-terms/index.post.ts | 8 +- .../invariants/[id].delete.ts | 8 +- .../invariants/[id].get.ts | 8 +- .../invariants/[id].put.ts | 6 +- .../invariants/index.get.ts | 12 +- .../invariants/index.post.ts | 8 +- .../justifications/[id].delete.ts | 8 +- .../justifications/[id].get.ts | 8 +- .../justifications/[id].put.ts | 5 +- .../justifications/index.get.ts | 12 +- .../justifications/index.post.ts | 8 +- .../{[solution-id] => }/limits/[id].delete.ts | 8 +- .../{[solution-id] => }/limits/[id].get.ts | 8 +- .../{[solution-id] => }/limits/[id].put.ts | 8 +- .../{[solution-id] => }/limits/index.get.ts | 10 +- .../{[solution-id] => }/limits/index.post.ts | 8 +- .../non-functional-behaviors/[id].delete.ts | 8 +- .../non-functional-behaviors/[id].get.ts | 8 +- .../non-functional-behaviors/[id].put.ts | 6 +- .../non-functional-behaviors/index.get.ts | 10 +- .../non-functional-behaviors/index.post.ts | 8 +- .../obstacles/[id].delete.ts | 8 +- .../{[solution-id] => }/obstacles/[id].get.ts | 8 +- .../{[solution-id] => }/obstacles/[id].put.ts | 6 +- .../obstacles/index.get.ts | 10 +- .../obstacles/index.post.ts | 8 +- server/api/organizations/[id].delete.ts | 27 +- server/api/organizations/index.get.ts | 2 +- .../outcomes/[id].delete.ts | 8 +- .../{[solution-id] => }/outcomes/[id].get.ts | 8 +- .../{[solution-id] => }/outcomes/[id].put.ts | 6 +- .../{[solution-id] => }/outcomes/index.get.ts | 12 +- .../outcomes/index.post.ts | 8 +- .../persons/[id].delete.ts | 8 +- .../{[solution-id] => }/persons/[id].get.ts | 8 +- .../{[solution-id] => }/persons/[id].put.ts | 6 +- .../{[solution-id] => }/persons/index.get.ts | 10 +- .../{[solution-id] => }/persons/index.post.ts | 8 +- server/api/solutions/[id].delete.ts | 9 +- server/api/solutions/index.get.ts | 2 +- .../stakeholders/[id].delete.ts | 8 +- .../stakeholders/[id].get.ts | 8 +- .../stakeholders/[id].put.ts | 8 +- .../stakeholders/index.get.ts | 12 +- .../stakeholders/index.post.ts | 10 +- .../system-components/[id].delete.ts | 8 +- .../system-components/[id].get.ts | 8 +- .../system-components/[id].put.ts | 6 +- .../system-components/index.get.ts | 12 +- .../system-components/index.post.ts | 8 +- .../use-cases/[id].delete.ts | 8 +- .../{[solution-id] => }/use-cases/[id].get.ts | 8 +- .../{[solution-id] => }/use-cases/[id].put.ts | 6 +- .../use-cases/index.get.ts | 10 +- .../use-cases/index.post.ts | 10 +- .../user-stories/[id].delete.ts | 8 +- .../user-stories/[id].get.ts | 8 +- .../user-stories/[id].put.ts | 6 +- .../user-stories/index.get.ts | 10 +- .../user-stories/index.post.ts | 10 +- .../models/AppUserOrganizationRoleSchema.ts | 8 +- .../data/models/EnvironmentComponentSchema.ts | 2 +- server/data/models/GlossaryTermSchema.ts | 2 +- server/data/models/RequirementSchema.ts | 6 +- server/data/models/ScenarioSchema.ts | 2 +- server/data/models/StakeholderSchema.ts | 2 +- server/data/models/SystemComponentSchema.ts | 2 +- server/utils/assertOrgAdmin.ts | 7 +- server/utils/assertOrgContributor.ts | 7 +- server/utils/assertOrgReader.ts | 8 +- server/utils/assertSolutionAdmin.ts | 7 +- server/utils/assertSolutionContributor.ts | 7 +- server/utils/assertSolutionReader.ts | 8 +- 123 files changed, 1322 insertions(+), 516 deletions(-) create mode 100644 migrations/Migration20240904172417.ts create mode 100644 migrations/Migration20240904183539.ts create mode 100644 migrations/Migration20240905000351.ts rename server/api/{[solution-id] => }/assumptions/[id].delete.ts (69%) rename server/api/{[solution-id] => }/assumptions/[id].get.ts (74%) rename server/api/{[solution-id] => }/assumptions/[id].put.ts (85%) rename server/api/{[solution-id] => }/assumptions/index.get.ts (67%) rename server/api/{[solution-id] => }/assumptions/index.post.ts (76%) rename server/api/{[solution-id] => }/constraints/[id].delete.ts (67%) rename server/api/{[solution-id] => }/constraints/[id].get.ts (74%) rename server/api/{[solution-id] => }/constraints/[id].put.ts (85%) rename server/api/{[solution-id] => }/constraints/index.get.ts (70%) rename server/api/{[solution-id] => }/constraints/index.post.ts (77%) rename server/api/{[solution-id] => }/effects/[id].delete.ts (67%) rename server/api/{[solution-id] => }/effects/[id].get.ts (77%) rename server/api/{[solution-id] => }/effects/[id].put.ts (84%) rename server/api/{[solution-id] => }/effects/index.get.ts (67%) rename server/api/{[solution-id] => }/effects/index.post.ts (75%) rename server/api/{[solution-id] => }/environment-components/[id].delete.ts (69%) rename server/api/{[solution-id] => }/environment-components/[id].get.ts (74%) rename server/api/{[solution-id] => }/environment-components/[id].put.ts (87%) rename server/api/{[solution-id] => }/environment-components/index.get.ts (69%) rename server/api/{[solution-id] => }/environment-components/index.post.ts (80%) rename server/api/{[solution-id] => }/functional-behaviors/[id].delete.ts (69%) rename server/api/{[solution-id] => }/functional-behaviors/[id].get.ts (74%) rename server/api/{[solution-id] => }/functional-behaviors/[id].put.ts (86%) rename server/api/{[solution-id] => }/functional-behaviors/index.get.ts (76%) rename server/api/{[solution-id] => }/functional-behaviors/index.post.ts (78%) rename server/api/{[solution-id] => }/glossary-terms/[id].delete.ts (73%) rename server/api/{[solution-id] => }/glossary-terms/[id].get.ts (74%) rename server/api/{[solution-id] => }/glossary-terms/[id].put.ts (86%) rename server/api/{[solution-id] => }/glossary-terms/index.get.ts (67%) rename server/api/{[solution-id] => }/glossary-terms/index.post.ts (76%) rename server/api/{[solution-id] => }/invariants/[id].delete.ts (67%) rename server/api/{[solution-id] => }/invariants/[id].get.ts (78%) rename server/api/{[solution-id] => }/invariants/[id].put.ts (84%) rename server/api/{[solution-id] => }/invariants/index.get.ts (67%) rename server/api/{[solution-id] => }/invariants/index.post.ts (75%) rename server/api/{[solution-id] => }/justifications/[id].delete.ts (68%) rename server/api/{[solution-id] => }/justifications/[id].get.ts (74%) rename server/api/{[solution-id] => }/justifications/[id].put.ts (87%) rename server/api/{[solution-id] => }/justifications/index.get.ts (67%) rename server/api/{[solution-id] => }/justifications/index.post.ts (76%) rename server/api/{[solution-id] => }/limits/[id].delete.ts (67%) rename server/api/{[solution-id] => }/limits/[id].get.ts (73%) rename server/api/{[solution-id] => }/limits/[id].put.ts (76%) rename server/api/{[solution-id] => }/limits/index.get.ts (73%) rename server/api/{[solution-id] => }/limits/index.post.ts (75%) rename server/api/{[solution-id] => }/non-functional-behaviors/[id].delete.ts (69%) rename server/api/{[solution-id] => }/non-functional-behaviors/[id].get.ts (75%) rename server/api/{[solution-id] => }/non-functional-behaviors/[id].put.ts (86%) rename server/api/{[solution-id] => }/non-functional-behaviors/index.get.ts (76%) rename server/api/{[solution-id] => }/non-functional-behaviors/index.post.ts (78%) rename server/api/{[solution-id] => }/obstacles/[id].delete.ts (67%) rename server/api/{[solution-id] => }/obstacles/[id].get.ts (78%) rename server/api/{[solution-id] => }/obstacles/[id].put.ts (84%) rename server/api/{[solution-id] => }/obstacles/index.get.ts (74%) rename server/api/{[solution-id] => }/obstacles/index.post.ts (75%) rename server/api/{[solution-id] => }/outcomes/[id].delete.ts (67%) rename server/api/{[solution-id] => }/outcomes/[id].get.ts (73%) rename server/api/{[solution-id] => }/outcomes/[id].put.ts (84%) rename server/api/{[solution-id] => }/outcomes/index.get.ts (67%) rename server/api/{[solution-id] => }/outcomes/index.post.ts (75%) rename server/api/{[solution-id] => }/persons/[id].delete.ts (67%) rename server/api/{[solution-id] => }/persons/[id].get.ts (77%) rename server/api/{[solution-id] => }/persons/[id].put.ts (84%) rename server/api/{[solution-id] => }/persons/index.get.ts (75%) rename server/api/{[solution-id] => }/persons/index.post.ts (75%) rename server/api/{[solution-id] => }/stakeholders/[id].delete.ts (68%) rename server/api/{[solution-id] => }/stakeholders/[id].get.ts (74%) rename server/api/{[solution-id] => }/stakeholders/[id].put.ts (93%) rename server/api/{[solution-id] => }/stakeholders/index.get.ts (76%) rename server/api/{[solution-id] => }/stakeholders/index.post.ts (80%) rename server/api/{[solution-id] => }/system-components/[id].delete.ts (68%) rename server/api/{[solution-id] => }/system-components/[id].get.ts (74%) rename server/api/{[solution-id] => }/system-components/[id].put.ts (86%) rename server/api/{[solution-id] => }/system-components/index.get.ts (69%) rename server/api/{[solution-id] => }/system-components/index.post.ts (79%) rename server/api/{[solution-id] => }/use-cases/[id].delete.ts (67%) rename server/api/{[solution-id] => }/use-cases/[id].get.ts (73%) rename server/api/{[solution-id] => }/use-cases/[id].put.ts (96%) rename server/api/{[solution-id] => }/use-cases/index.get.ts (83%) rename server/api/{[solution-id] => }/use-cases/index.post.ts (90%) rename server/api/{[solution-id] => }/user-stories/[id].delete.ts (67%) rename server/api/{[solution-id] => }/user-stories/[id].get.ts (73%) rename server/api/{[solution-id] => }/user-stories/[id].put.ts (95%) rename server/api/{[solution-id] => }/user-stories/index.get.ts (78%) rename server/api/{[solution-id] => }/user-stories/index.post.ts (88%) diff --git a/migrations/.snapshot-cathedral.json b/migrations/.snapshot-cathedral.json index 4b929d60..c29d5764 100644 --- a/migrations/.snapshot-cathedral.json +++ b/migrations/.snapshot-cathedral.json @@ -161,7 +161,7 @@ "unsigned": false, "autoincrement": false, "primary": false, - "nullable": true, + "nullable": false, "mappedType": "uuid" }, "organization_id": { @@ -170,7 +170,7 @@ "unsigned": false, "autoincrement": false, "primary": false, - "nullable": true, + "nullable": false, "mappedType": "uuid" }, "role": { @@ -217,7 +217,7 @@ "id" ], "referencedTableName": "public.app_user", - "deleteRule": "cascade" + "updateRule": "cascade" }, "app_user_organization_role_organization_id_foreign": { "constraintName": "app_user_organization_role_organization_id_foreign", @@ -229,7 +229,7 @@ "id" ], "referencedTableName": "public.organization", - "deleteRule": "cascade" + "updateRule": "cascade" } }, "nativeEnums": {} diff --git a/migrations/Migration20240904172417.ts b/migrations/Migration20240904172417.ts new file mode 100644 index 00000000..1cb2c770 --- /dev/null +++ b/migrations/Migration20240904172417.ts @@ -0,0 +1,33 @@ +import { Migration } from '@mikro-orm/migrations'; + +export class Migration20240904172417 extends Migration { + + override async up(): Promise { + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_app_user_id_foreign";'); + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_organization_id_foreign";'); + + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" type uuid using ("app_user_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" set not null;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" set not null;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_app_user_id_foreign" foreign key ("app_user_id") references "app_user" ("id") on update cascade;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on update cascade;'); + } + + override async down(): Promise { + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_app_user_id_foreign";'); + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_organization_id_foreign";'); + + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" type uuid using ("app_user_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" drop not null;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" drop not null;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_app_user_id_foreign" foreign key ("app_user_id") references "app_user" ("id") on delete cascade;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on delete cascade;'); + } + +} diff --git a/migrations/Migration20240904183539.ts b/migrations/Migration20240904183539.ts new file mode 100644 index 00000000..398585ee --- /dev/null +++ b/migrations/Migration20240904183539.ts @@ -0,0 +1,311 @@ +import { Migration } from '@mikro-orm/migrations'; + +export class Migration20240904183539 extends Migration { + + override async up(): Promise { + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_app_user_id_foreign";'); + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_organization_id_foreign";'); + + this.addSql('alter table "solution" drop constraint "solution_organization_id_foreign";'); + + this.addSql('alter table "product" drop constraint "product_solution_id_foreign";'); + + this.addSql('alter table "person" drop constraint "person_solution_id_foreign";'); + + this.addSql('alter table "outcome" drop constraint "outcome_solution_id_foreign";'); + + this.addSql('alter table "obstacle" drop constraint "obstacle_solution_id_foreign";'); + + this.addSql('alter table "non_functional_behavior" drop constraint "non_functional_behavior_solution_id_foreign";'); + + this.addSql('alter table "limit" drop constraint "limit_solution_id_foreign";'); + + this.addSql('alter table "justification" drop constraint "justification_solution_id_foreign";'); + + this.addSql('alter table "invariant" drop constraint "invariant_solution_id_foreign";'); + + this.addSql('alter table "hint" drop constraint "hint_solution_id_foreign";'); + + this.addSql('alter table "glossary_term" drop constraint "glossary_term_solution_id_foreign";'); + + this.addSql('alter table "functional_behavior" drop constraint "functional_behavior_solution_id_foreign";'); + + this.addSql('alter table "environment_component" drop constraint "environment_component_solution_id_foreign";'); + + this.addSql('alter table "effect" drop constraint "effect_solution_id_foreign";'); + + this.addSql('alter table "constraint" drop constraint "constraint_solution_id_foreign";'); + + this.addSql('alter table "assumption" drop constraint "assumption_solution_id_foreign";'); + + this.addSql('alter table "stakeholder" drop constraint "stakeholder_solution_id_foreign";'); + + this.addSql('alter table "system_component" drop constraint "system_component_solution_id_foreign";'); + + this.addSql('alter table "use_case" drop constraint "use_case_solution_id_foreign";'); + + this.addSql('alter table "user_story" drop constraint "user_story_solution_id_foreign";'); + + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" type uuid using ("app_user_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_app_user_id_foreign" foreign key ("app_user_id") references "app_user" ("id") on delete cascade;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on delete cascade;'); + + this.addSql('alter table "solution" alter column "organization_id" drop default;'); + this.addSql('alter table "solution" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "solution" alter column "organization_id" drop not null;'); + this.addSql('alter table "solution" add constraint "solution_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on delete cascade;'); + + this.addSql('alter table "product" alter column "solution_id" drop default;'); + this.addSql('alter table "product" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "product" alter column "solution_id" drop not null;'); + this.addSql('alter table "product" add constraint "product_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "person" alter column "solution_id" drop default;'); + this.addSql('alter table "person" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "person" alter column "solution_id" drop not null;'); + this.addSql('alter table "person" add constraint "person_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "outcome" alter column "solution_id" drop default;'); + this.addSql('alter table "outcome" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "outcome" alter column "solution_id" drop not null;'); + this.addSql('alter table "outcome" add constraint "outcome_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "obstacle" alter column "solution_id" drop default;'); + this.addSql('alter table "obstacle" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "obstacle" alter column "solution_id" drop not null;'); + this.addSql('alter table "obstacle" add constraint "obstacle_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "non_functional_behavior" alter column "solution_id" drop default;'); + this.addSql('alter table "non_functional_behavior" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "non_functional_behavior" alter column "solution_id" drop not null;'); + this.addSql('alter table "non_functional_behavior" add constraint "non_functional_behavior_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "limit" alter column "solution_id" drop default;'); + this.addSql('alter table "limit" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "limit" alter column "solution_id" drop not null;'); + this.addSql('alter table "limit" add constraint "limit_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "justification" alter column "solution_id" drop default;'); + this.addSql('alter table "justification" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "justification" alter column "solution_id" drop not null;'); + this.addSql('alter table "justification" add constraint "justification_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "invariant" alter column "solution_id" drop default;'); + this.addSql('alter table "invariant" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "invariant" alter column "solution_id" drop not null;'); + this.addSql('alter table "invariant" add constraint "invariant_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "hint" alter column "solution_id" drop default;'); + this.addSql('alter table "hint" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "hint" alter column "solution_id" drop not null;'); + this.addSql('alter table "hint" add constraint "hint_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "glossary_term" alter column "solution_id" drop default;'); + this.addSql('alter table "glossary_term" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "glossary_term" alter column "solution_id" drop not null;'); + this.addSql('alter table "glossary_term" add constraint "glossary_term_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "functional_behavior" alter column "solution_id" drop default;'); + this.addSql('alter table "functional_behavior" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "functional_behavior" alter column "solution_id" drop not null;'); + this.addSql('alter table "functional_behavior" add constraint "functional_behavior_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "environment_component" alter column "solution_id" drop default;'); + this.addSql('alter table "environment_component" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "environment_component" alter column "solution_id" drop not null;'); + this.addSql('alter table "environment_component" add constraint "environment_component_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "effect" alter column "solution_id" drop default;'); + this.addSql('alter table "effect" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "effect" alter column "solution_id" drop not null;'); + this.addSql('alter table "effect" add constraint "effect_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "constraint" alter column "solution_id" drop default;'); + this.addSql('alter table "constraint" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "constraint" alter column "solution_id" drop not null;'); + this.addSql('alter table "constraint" add constraint "constraint_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "assumption" alter column "solution_id" drop default;'); + this.addSql('alter table "assumption" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "assumption" alter column "solution_id" drop not null;'); + this.addSql('alter table "assumption" add constraint "assumption_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "stakeholder" alter column "solution_id" drop default;'); + this.addSql('alter table "stakeholder" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "stakeholder" alter column "solution_id" drop not null;'); + this.addSql('alter table "stakeholder" add constraint "stakeholder_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "system_component" alter column "solution_id" drop default;'); + this.addSql('alter table "system_component" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "system_component" alter column "solution_id" drop not null;'); + this.addSql('alter table "system_component" add constraint "system_component_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "use_case" alter column "solution_id" drop default;'); + this.addSql('alter table "use_case" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "use_case" alter column "solution_id" drop not null;'); + this.addSql('alter table "use_case" add constraint "use_case_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "user_story" alter column "solution_id" drop default;'); + this.addSql('alter table "user_story" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "user_story" alter column "solution_id" drop not null;'); + this.addSql('alter table "user_story" add constraint "user_story_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + } + + override async down(): Promise { + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_app_user_id_foreign";'); + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_organization_id_foreign";'); + + this.addSql('alter table "solution" drop constraint "solution_organization_id_foreign";'); + + this.addSql('alter table "product" drop constraint "product_solution_id_foreign";'); + + this.addSql('alter table "person" drop constraint "person_solution_id_foreign";'); + + this.addSql('alter table "outcome" drop constraint "outcome_solution_id_foreign";'); + + this.addSql('alter table "obstacle" drop constraint "obstacle_solution_id_foreign";'); + + this.addSql('alter table "non_functional_behavior" drop constraint "non_functional_behavior_solution_id_foreign";'); + + this.addSql('alter table "limit" drop constraint "limit_solution_id_foreign";'); + + this.addSql('alter table "justification" drop constraint "justification_solution_id_foreign";'); + + this.addSql('alter table "invariant" drop constraint "invariant_solution_id_foreign";'); + + this.addSql('alter table "hint" drop constraint "hint_solution_id_foreign";'); + + this.addSql('alter table "glossary_term" drop constraint "glossary_term_solution_id_foreign";'); + + this.addSql('alter table "functional_behavior" drop constraint "functional_behavior_solution_id_foreign";'); + + this.addSql('alter table "environment_component" drop constraint "environment_component_solution_id_foreign";'); + + this.addSql('alter table "effect" drop constraint "effect_solution_id_foreign";'); + + this.addSql('alter table "constraint" drop constraint "constraint_solution_id_foreign";'); + + this.addSql('alter table "assumption" drop constraint "assumption_solution_id_foreign";'); + + this.addSql('alter table "stakeholder" drop constraint "stakeholder_solution_id_foreign";'); + + this.addSql('alter table "system_component" drop constraint "system_component_solution_id_foreign";'); + + this.addSql('alter table "use_case" drop constraint "use_case_solution_id_foreign";'); + + this.addSql('alter table "user_story" drop constraint "user_story_solution_id_foreign";'); + + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" type uuid using ("app_user_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" set not null;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" set not null;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_app_user_id_foreign" foreign key ("app_user_id") references "app_user" ("id") on update cascade;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on update cascade;'); + + this.addSql('alter table "solution" alter column "organization_id" drop default;'); + this.addSql('alter table "solution" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "solution" alter column "organization_id" set not null;'); + this.addSql('alter table "solution" add constraint "solution_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on update cascade;'); + + this.addSql('alter table "product" alter column "solution_id" drop default;'); + this.addSql('alter table "product" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "product" alter column "solution_id" set not null;'); + this.addSql('alter table "product" add constraint "product_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "person" alter column "solution_id" drop default;'); + this.addSql('alter table "person" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "person" alter column "solution_id" set not null;'); + this.addSql('alter table "person" add constraint "person_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "outcome" alter column "solution_id" drop default;'); + this.addSql('alter table "outcome" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "outcome" alter column "solution_id" set not null;'); + this.addSql('alter table "outcome" add constraint "outcome_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "obstacle" alter column "solution_id" drop default;'); + this.addSql('alter table "obstacle" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "obstacle" alter column "solution_id" set not null;'); + this.addSql('alter table "obstacle" add constraint "obstacle_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "non_functional_behavior" alter column "solution_id" drop default;'); + this.addSql('alter table "non_functional_behavior" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "non_functional_behavior" alter column "solution_id" set not null;'); + this.addSql('alter table "non_functional_behavior" add constraint "non_functional_behavior_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "limit" alter column "solution_id" drop default;'); + this.addSql('alter table "limit" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "limit" alter column "solution_id" set not null;'); + this.addSql('alter table "limit" add constraint "limit_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "justification" alter column "solution_id" drop default;'); + this.addSql('alter table "justification" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "justification" alter column "solution_id" set not null;'); + this.addSql('alter table "justification" add constraint "justification_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "invariant" alter column "solution_id" drop default;'); + this.addSql('alter table "invariant" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "invariant" alter column "solution_id" set not null;'); + this.addSql('alter table "invariant" add constraint "invariant_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "hint" alter column "solution_id" drop default;'); + this.addSql('alter table "hint" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "hint" alter column "solution_id" set not null;'); + this.addSql('alter table "hint" add constraint "hint_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "glossary_term" alter column "solution_id" drop default;'); + this.addSql('alter table "glossary_term" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "glossary_term" alter column "solution_id" set not null;'); + this.addSql('alter table "glossary_term" add constraint "glossary_term_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "functional_behavior" alter column "solution_id" drop default;'); + this.addSql('alter table "functional_behavior" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "functional_behavior" alter column "solution_id" set not null;'); + this.addSql('alter table "functional_behavior" add constraint "functional_behavior_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "environment_component" alter column "solution_id" drop default;'); + this.addSql('alter table "environment_component" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "environment_component" alter column "solution_id" set not null;'); + this.addSql('alter table "environment_component" add constraint "environment_component_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "effect" alter column "solution_id" drop default;'); + this.addSql('alter table "effect" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "effect" alter column "solution_id" set not null;'); + this.addSql('alter table "effect" add constraint "effect_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "constraint" alter column "solution_id" drop default;'); + this.addSql('alter table "constraint" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "constraint" alter column "solution_id" set not null;'); + this.addSql('alter table "constraint" add constraint "constraint_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "assumption" alter column "solution_id" drop default;'); + this.addSql('alter table "assumption" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "assumption" alter column "solution_id" set not null;'); + this.addSql('alter table "assumption" add constraint "assumption_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "stakeholder" alter column "solution_id" drop default;'); + this.addSql('alter table "stakeholder" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "stakeholder" alter column "solution_id" set not null;'); + this.addSql('alter table "stakeholder" add constraint "stakeholder_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "system_component" alter column "solution_id" drop default;'); + this.addSql('alter table "system_component" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "system_component" alter column "solution_id" set not null;'); + this.addSql('alter table "system_component" add constraint "system_component_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "use_case" alter column "solution_id" drop default;'); + this.addSql('alter table "use_case" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "use_case" alter column "solution_id" set not null;'); + this.addSql('alter table "use_case" add constraint "use_case_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "user_story" alter column "solution_id" drop default;'); + this.addSql('alter table "user_story" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "user_story" alter column "solution_id" set not null;'); + this.addSql('alter table "user_story" add constraint "user_story_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + } + +} diff --git a/migrations/Migration20240905000351.ts b/migrations/Migration20240905000351.ts new file mode 100644 index 00000000..45aa8d20 --- /dev/null +++ b/migrations/Migration20240905000351.ts @@ -0,0 +1,313 @@ +import { Migration } from '@mikro-orm/migrations'; + +export class Migration20240905000351 extends Migration { + + override async up(): Promise { + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_app_user_id_foreign";'); + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_organization_id_foreign";'); + + this.addSql('alter table "solution" drop constraint "solution_organization_id_foreign";'); + + this.addSql('alter table "product" drop constraint "product_solution_id_foreign";'); + + this.addSql('alter table "person" drop constraint "person_solution_id_foreign";'); + + this.addSql('alter table "outcome" drop constraint "outcome_solution_id_foreign";'); + + this.addSql('alter table "obstacle" drop constraint "obstacle_solution_id_foreign";'); + + this.addSql('alter table "non_functional_behavior" drop constraint "non_functional_behavior_solution_id_foreign";'); + + this.addSql('alter table "limit" drop constraint "limit_solution_id_foreign";'); + + this.addSql('alter table "justification" drop constraint "justification_solution_id_foreign";'); + + this.addSql('alter table "invariant" drop constraint "invariant_solution_id_foreign";'); + + this.addSql('alter table "hint" drop constraint "hint_solution_id_foreign";'); + + this.addSql('alter table "glossary_term" drop constraint "glossary_term_solution_id_foreign";'); + + this.addSql('alter table "functional_behavior" drop constraint "functional_behavior_solution_id_foreign";'); + + this.addSql('alter table "environment_component" drop constraint "environment_component_solution_id_foreign";'); + + this.addSql('alter table "effect" drop constraint "effect_solution_id_foreign";'); + + this.addSql('alter table "constraint" drop constraint "constraint_solution_id_foreign";'); + + this.addSql('alter table "assumption" drop constraint "assumption_solution_id_foreign";'); + + this.addSql('alter table "stakeholder" drop constraint "stakeholder_solution_id_foreign";'); + + this.addSql('alter table "system_component" drop constraint "system_component_solution_id_foreign";'); + + this.addSql('alter table "use_case" drop constraint "use_case_solution_id_foreign";'); + + this.addSql('alter table "user_story" drop constraint "user_story_solution_id_foreign";'); + + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" type uuid using ("app_user_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" set not null;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" set not null;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_app_user_id_foreign" foreign key ("app_user_id") references "app_user" ("id") on update cascade;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on update cascade;'); + + this.addSql('alter table "solution" alter column "organization_id" drop default;'); + this.addSql('alter table "solution" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "solution" alter column "organization_id" set not null;'); + this.addSql('alter table "solution" add constraint "solution_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on update cascade;'); + + this.addSql('alter table "product" alter column "solution_id" drop default;'); + this.addSql('alter table "product" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "product" alter column "solution_id" set not null;'); + this.addSql('alter table "product" add constraint "product_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "person" alter column "solution_id" drop default;'); + this.addSql('alter table "person" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "person" alter column "solution_id" set not null;'); + this.addSql('alter table "person" add constraint "person_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "outcome" alter column "solution_id" drop default;'); + this.addSql('alter table "outcome" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "outcome" alter column "solution_id" set not null;'); + this.addSql('alter table "outcome" add constraint "outcome_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "obstacle" alter column "solution_id" drop default;'); + this.addSql('alter table "obstacle" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "obstacle" alter column "solution_id" set not null;'); + this.addSql('alter table "obstacle" add constraint "obstacle_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "non_functional_behavior" alter column "solution_id" drop default;'); + this.addSql('alter table "non_functional_behavior" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "non_functional_behavior" alter column "solution_id" set not null;'); + this.addSql('alter table "non_functional_behavior" add constraint "non_functional_behavior_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "limit" alter column "solution_id" drop default;'); + this.addSql('alter table "limit" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "limit" alter column "solution_id" set not null;'); + this.addSql('alter table "limit" add constraint "limit_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "justification" alter column "solution_id" drop default;'); + this.addSql('alter table "justification" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "justification" alter column "solution_id" set not null;'); + this.addSql('alter table "justification" add constraint "justification_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "invariant" alter column "solution_id" drop default;'); + this.addSql('alter table "invariant" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "invariant" alter column "solution_id" set not null;'); + this.addSql('alter table "invariant" add constraint "invariant_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "hint" alter column "solution_id" drop default;'); + this.addSql('alter table "hint" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "hint" alter column "solution_id" set not null;'); + this.addSql('alter table "hint" add constraint "hint_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "glossary_term" alter column "solution_id" drop default;'); + this.addSql('alter table "glossary_term" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "glossary_term" alter column "solution_id" set not null;'); + this.addSql('alter table "glossary_term" add constraint "glossary_term_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "functional_behavior" alter column "solution_id" drop default;'); + this.addSql('alter table "functional_behavior" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "functional_behavior" alter column "solution_id" set not null;'); + this.addSql('alter table "functional_behavior" add constraint "functional_behavior_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "environment_component" alter column "solution_id" drop default;'); + this.addSql('alter table "environment_component" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "environment_component" alter column "solution_id" set not null;'); + this.addSql('alter table "environment_component" add constraint "environment_component_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "effect" alter column "solution_id" drop default;'); + this.addSql('alter table "effect" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "effect" alter column "solution_id" set not null;'); + this.addSql('alter table "effect" add constraint "effect_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "constraint" alter column "solution_id" drop default;'); + this.addSql('alter table "constraint" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "constraint" alter column "solution_id" set not null;'); + this.addSql('alter table "constraint" add constraint "constraint_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "assumption" alter column "solution_id" drop default;'); + this.addSql('alter table "assumption" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "assumption" alter column "solution_id" set not null;'); + this.addSql('alter table "assumption" add constraint "assumption_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "stakeholder" alter column "solution_id" drop default;'); + this.addSql('alter table "stakeholder" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "stakeholder" alter column "solution_id" set not null;'); + this.addSql('alter table "stakeholder" add constraint "stakeholder_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "system_component" alter column "solution_id" drop default;'); + this.addSql('alter table "system_component" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "system_component" alter column "solution_id" set not null;'); + this.addSql('alter table "system_component" add constraint "system_component_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "use_case" alter column "solution_id" drop default;'); + this.addSql('alter table "use_case" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "use_case" alter column "solution_id" set not null;'); + this.addSql('alter table "use_case" add constraint "use_case_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + + this.addSql('alter table "user_story" alter column "solution_id" drop default;'); + this.addSql('alter table "user_story" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "user_story" alter column "solution_id" set not null;'); + this.addSql('alter table "user_story" add constraint "user_story_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on update cascade;'); + } + + override async down(): Promise { + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_app_user_id_foreign";'); + this.addSql('alter table "app_user_organization_role" drop constraint "app_user_organization_role_organization_id_foreign";'); + + this.addSql('alter table "solution" drop constraint "solution_organization_id_foreign";'); + + this.addSql('alter table "product" drop constraint "product_solution_id_foreign";'); + + this.addSql('alter table "person" drop constraint "person_solution_id_foreign";'); + + this.addSql('alter table "outcome" drop constraint "outcome_solution_id_foreign";'); + + this.addSql('alter table "obstacle" drop constraint "obstacle_solution_id_foreign";'); + + this.addSql('alter table "non_functional_behavior" drop constraint "non_functional_behavior_solution_id_foreign";'); + + this.addSql('alter table "limit" drop constraint "limit_solution_id_foreign";'); + + this.addSql('alter table "justification" drop constraint "justification_solution_id_foreign";'); + + this.addSql('alter table "invariant" drop constraint "invariant_solution_id_foreign";'); + + this.addSql('alter table "hint" drop constraint "hint_solution_id_foreign";'); + + this.addSql('alter table "glossary_term" drop constraint "glossary_term_solution_id_foreign";'); + + this.addSql('alter table "functional_behavior" drop constraint "functional_behavior_solution_id_foreign";'); + + this.addSql('alter table "environment_component" drop constraint "environment_component_solution_id_foreign";'); + + this.addSql('alter table "effect" drop constraint "effect_solution_id_foreign";'); + + this.addSql('alter table "constraint" drop constraint "constraint_solution_id_foreign";'); + + this.addSql('alter table "assumption" drop constraint "assumption_solution_id_foreign";'); + + this.addSql('alter table "stakeholder" drop constraint "stakeholder_solution_id_foreign";'); + + this.addSql('alter table "system_component" drop constraint "system_component_solution_id_foreign";'); + + this.addSql('alter table "use_case" drop constraint "use_case_solution_id_foreign";'); + + this.addSql('alter table "user_story" drop constraint "user_story_solution_id_foreign";'); + + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" type uuid using ("app_user_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "app_user_id" drop not null;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" drop default;'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "app_user_organization_role" alter column "organization_id" drop not null;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_app_user_id_foreign" foreign key ("app_user_id") references "app_user" ("id") on delete cascade;'); + this.addSql('alter table "app_user_organization_role" add constraint "app_user_organization_role_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on delete cascade;'); + + this.addSql('alter table "solution" alter column "organization_id" drop default;'); + this.addSql('alter table "solution" alter column "organization_id" type uuid using ("organization_id"::text::uuid);'); + this.addSql('alter table "solution" alter column "organization_id" drop not null;'); + this.addSql('alter table "solution" add constraint "solution_organization_id_foreign" foreign key ("organization_id") references "organization" ("id") on delete cascade;'); + + this.addSql('alter table "product" alter column "solution_id" drop default;'); + this.addSql('alter table "product" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "product" alter column "solution_id" drop not null;'); + this.addSql('alter table "product" add constraint "product_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "person" alter column "solution_id" drop default;'); + this.addSql('alter table "person" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "person" alter column "solution_id" drop not null;'); + this.addSql('alter table "person" add constraint "person_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "outcome" alter column "solution_id" drop default;'); + this.addSql('alter table "outcome" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "outcome" alter column "solution_id" drop not null;'); + this.addSql('alter table "outcome" add constraint "outcome_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "obstacle" alter column "solution_id" drop default;'); + this.addSql('alter table "obstacle" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "obstacle" alter column "solution_id" drop not null;'); + this.addSql('alter table "obstacle" add constraint "obstacle_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "non_functional_behavior" alter column "solution_id" drop default;'); + this.addSql('alter table "non_functional_behavior" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "non_functional_behavior" alter column "solution_id" drop not null;'); + this.addSql('alter table "non_functional_behavior" add constraint "non_functional_behavior_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "limit" alter column "solution_id" drop default;'); + this.addSql('alter table "limit" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "limit" alter column "solution_id" drop not null;'); + this.addSql('alter table "limit" add constraint "limit_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "justification" alter column "solution_id" drop default;'); + this.addSql('alter table "justification" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "justification" alter column "solution_id" drop not null;'); + this.addSql('alter table "justification" add constraint "justification_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "invariant" alter column "solution_id" drop default;'); + this.addSql('alter table "invariant" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "invariant" alter column "solution_id" drop not null;'); + this.addSql('alter table "invariant" add constraint "invariant_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "hint" alter column "solution_id" drop default;'); + this.addSql('alter table "hint" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "hint" alter column "solution_id" drop not null;'); + this.addSql('alter table "hint" add constraint "hint_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "glossary_term" alter column "solution_id" drop default;'); + this.addSql('alter table "glossary_term" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "glossary_term" alter column "solution_id" drop not null;'); + this.addSql('alter table "glossary_term" add constraint "glossary_term_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "functional_behavior" alter column "solution_id" drop default;'); + this.addSql('alter table "functional_behavior" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "functional_behavior" alter column "solution_id" drop not null;'); + this.addSql('alter table "functional_behavior" add constraint "functional_behavior_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "environment_component" alter column "solution_id" drop default;'); + this.addSql('alter table "environment_component" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "environment_component" alter column "solution_id" drop not null;'); + this.addSql('alter table "environment_component" add constraint "environment_component_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "effect" alter column "solution_id" drop default;'); + this.addSql('alter table "effect" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "effect" alter column "solution_id" drop not null;'); + this.addSql('alter table "effect" add constraint "effect_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "constraint" alter column "solution_id" drop default;'); + this.addSql('alter table "constraint" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "constraint" alter column "solution_id" drop not null;'); + this.addSql('alter table "constraint" add constraint "constraint_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "assumption" alter column "solution_id" drop default;'); + this.addSql('alter table "assumption" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "assumption" alter column "solution_id" drop not null;'); + this.addSql('alter table "assumption" add constraint "assumption_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "stakeholder" alter column "solution_id" drop default;'); + this.addSql('alter table "stakeholder" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "stakeholder" alter column "solution_id" drop not null;'); + this.addSql('alter table "stakeholder" add constraint "stakeholder_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "system_component" alter column "solution_id" drop default;'); + this.addSql('alter table "system_component" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "system_component" alter column "solution_id" drop not null;'); + this.addSql('alter table "system_component" add constraint "system_component_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "use_case" alter column "solution_id" drop default;'); + this.addSql('alter table "use_case" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "use_case" alter column "solution_id" drop not null;'); + this.addSql('alter table "use_case" add constraint "use_case_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + + this.addSql('alter table "user_story" alter column "solution_id" drop default;'); + this.addSql('alter table "user_story" alter column "solution_id" type uuid using ("solution_id"::text::uuid);'); + this.addSql('alter table "user_story" alter column "solution_id" drop not null;'); + this.addSql('alter table "user_story" add constraint "user_story_solution_id_foreign" foreign key ("solution_id") references "solution" ("id") on delete cascade;'); + } + +} diff --git a/pages/o/[organization-slug]/[solution-slug]/environment/assumptions.client.vue b/pages/o/[organization-slug]/[solution-slug]/environment/assumptions.client.vue index 2667831b..5be3593a 100644 --- a/pages/o/[organization-slug]/[solution-slug]/environment/assumptions.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/environment/assumptions.client.vue @@ -25,7 +25,9 @@ type AssumptionViewModel = { statement: string; } -const { data: assumptions, refresh, status, error: getAssumptionsError } = await useFetch(`/api/${solutionId}/assumptions`), +const { data: assumptions, refresh, status, error: getAssumptionsError } = await useFetch(`/api/assumptions`, { + query: { solutionId } +}), emptyAssumption = { id: emptyUuid, name: '', statement: '' }; if (getAssumptionsError.value) @@ -37,11 +39,12 @@ const filters = ref>({ }); const onCreate = async (data: AssumptionViewModel) => { - await $fetch(`/api/${solutionId}/assumptions`, { + await $fetch(`/api/assumptions`, { method: 'post', body: { name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -49,18 +52,22 @@ const onCreate = async (data: AssumptionViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/assumptions/${id}`, { method: 'delete' }) + await $fetch(`/api/assumptions/${id}`, { + method: 'delete', + body: { solutionId } + }) .catch((e) => $eventBus.$emit('page-error', e)) refresh() } const onUpdate = async (data: AssumptionViewModel) => { - await $fetch(`/api/${solutionId}/assumptions/${data.id}`, { + await $fetch(`/api/assumptions/${data.id}`, { method: 'put', body: { name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) diff --git a/pages/o/[organization-slug]/[solution-slug]/environment/components.client.vue b/pages/o/[organization-slug]/[solution-slug]/environment/components.client.vue index b5d649e9..e715a052 100644 --- a/pages/o/[organization-slug]/[solution-slug]/environment/components.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/environment/components.client.vue @@ -14,7 +14,9 @@ const { $eventBus } = useNuxtApp(), } }), solutionId = solutions.value?.[0].id, - { data: environmentComponents, status, refresh, error: getEnvironmentComponentsError } = await useFetch(`/api/${solutionId}/environment-components`), + { data: environmentComponents, status, refresh, error: getEnvironmentComponentsError } = await useFetch(`/api/environment-components`, { + query: { solutionId } + }), emptyComponent = { id: emptyUuid, name: '', statement: '' } if (getSolutionError.value) @@ -35,11 +37,12 @@ const filters = ref({ }); const onCreate = async (data: EnvironmentComponentViewModel) => { - await $fetch(`/api/${solutionId}/environment-components`, { + await $fetch(`/api/environment-components`, { method: 'POST', body: { name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -47,17 +50,20 @@ const onCreate = async (data: EnvironmentComponentViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/environment-components/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/environment-components/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } const onUpdate = async (data: EnvironmentComponentViewModel) => { - await $fetch(`/api/${solutionId}/environment-components/${data.id}`, { + await $fetch(`/api/environment-components/${data.id}`, { method: 'PUT', body: { name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) refresh() diff --git a/pages/o/[organization-slug]/[solution-slug]/environment/constraints.client.vue b/pages/o/[organization-slug]/[solution-slug]/environment/constraints.client.vue index 2c0bfe76..1f9abfdf 100644 --- a/pages/o/[organization-slug]/[solution-slug]/environment/constraints.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/environment/constraints.client.vue @@ -17,7 +17,9 @@ const { $eventBus } = useNuxtApp(), }), solution = (solutions.value ?? [])[0], solutionId = solution.id, - { data: constraints, status, refresh, error: getConstraintsError } = await useFetch(`/api/${solutionId}/constraints`); + { data: constraints, status, refresh, error: getConstraintsError } = await useFetch(`/api/constraints`, { + query: { solutionId } + }); if (getSolutionError.value) $eventBus.$emit('page-error', getSolutionError.value) @@ -44,12 +46,13 @@ const filters = ref({ }); const onCreate = async (data: ConstraintViewModel) => { - await $fetch(`/api/${solutionId}/constraints`, { + await $fetch(`/api/constraints`, { method: 'POST', body: { name: data.name, statement: data.statement, - category: data.category + category: data.category, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -57,18 +60,21 @@ const onCreate = async (data: ConstraintViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/constraints/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/constraints/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } const onUpdate = async (data: ConstraintViewModel) => { - await $fetch(`/api/${solutionId}/constraints/${data.id}`, { + await $fetch(`/api/constraints/${data.id}`, { method: 'PUT', body: { name: data.name, statement: data.statement, - category: data.category + category: data.category, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) refresh() diff --git a/pages/o/[organization-slug]/[solution-slug]/environment/effects.client.vue b/pages/o/[organization-slug]/[solution-slug]/environment/effects.client.vue index 5ddbb1dd..9013d331 100644 --- a/pages/o/[organization-slug]/[solution-slug]/environment/effects.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/environment/effects.client.vue @@ -24,7 +24,9 @@ type EffectViewModel = { statement: string; } -const { data: effects, refresh, status, error: getEffectsError } = await useFetch(`/api/${solutionId}/effects`), +const { data: effects, refresh, status, error: getEffectsError } = await useFetch(`/api/effects`, { + query: { solutionId } +}), emptyEffect: EffectViewModel = { id: emptyUuid, name: '', statement: '' } if (getEffectsError.value) @@ -36,21 +38,24 @@ const filters = ref({ }); const onCreate = async (data: EffectViewModel) => { - await $fetch(`/api/${solutionId}/effects`, { - method: 'POST', body: { + await $fetch(`/api/effects`, { + method: 'POST', + body: { name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } const onUpdate = async (data: EffectViewModel) => { - await $fetch(`/api/${solutionId}/effects/${data.id}`, { + await $fetch(`/api/effects/${data.id}`, { method: 'PUT', body: { name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -58,7 +63,10 @@ const onUpdate = async (data: EffectViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/effects/${id}`, { method: 'DELETE' }) + await $fetch(`/api/effects/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } diff --git a/pages/o/[organization-slug]/[solution-slug]/environment/glossary.client.vue b/pages/o/[organization-slug]/[solution-slug]/environment/glossary.client.vue index 6c37f79c..211725ca 100644 --- a/pages/o/[organization-slug]/[solution-slug]/environment/glossary.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/environment/glossary.client.vue @@ -24,7 +24,9 @@ type GlossaryTermViewModel = { statement: string; } -const { data: glossaryTerms, refresh, status, error: getGlossaryTermsError } = await useFetch(`/api/${solutionId}/glossary-terms`), +const { data: glossaryTerms, refresh, status, error: getGlossaryTermsError } = await useFetch(`/api/glossary-terms`, { + query: { solutionId } +}), emptyGlossaryTerm: GlossaryTermViewModel = { id: emptyUuid, name: '', statement: '' } if (getGlossaryTermsError.value) @@ -36,10 +38,12 @@ const filters = ref({ }); const onCreate = async (data: GlossaryTermViewModel) => { - await $fetch(`/api/${solutionId}/glossary-terms`, { - method: 'POST', body: { + await $fetch(`/api/glossary-terms`, { + method: 'POST', + body: { name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -47,11 +51,13 @@ const onCreate = async (data: GlossaryTermViewModel) => { } const onUpdate = async (data: GlossaryTermViewModel) => { - await $fetch(`/api/${solutionId}/glossary-terms/${data.id}`, { - method: 'PUT', body: { + await $fetch(`/api/glossary-terms/${data.id}`, { + method: 'PUT', + body: { id: data.id, name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -59,8 +65,10 @@ const onUpdate = async (data: GlossaryTermViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/glossary-terms/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/glossary-terms/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } diff --git a/pages/o/[organization-slug]/[solution-slug]/environment/invariants.client.vue b/pages/o/[organization-slug]/[solution-slug]/environment/invariants.client.vue index bac250e7..ccae3599 100644 --- a/pages/o/[organization-slug]/[solution-slug]/environment/invariants.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/environment/invariants.client.vue @@ -24,7 +24,9 @@ type InvariantViewModel = { statement: string; } -const { data: invariants, refresh, status, error: getInvariantsError } = await useFetch(`/api/${solutionId}/invariants`), +const { data: invariants, refresh, status, error: getInvariantsError } = await useFetch(`/api/invariants`, { + query: { solutionId } +}), emptyInvariant: InvariantViewModel = { id: emptyUuid, name: '', statement: '' }; if (getInvariantsError.value) @@ -36,10 +38,12 @@ const filters = ref({ }); const onCreate = async (data: InvariantViewModel) => { - await useFetch(`/api/${solutionId}/invariants`, { - method: 'POST', body: { + await useFetch(`/api/invariants`, { + method: 'POST', + body: { name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -47,11 +51,12 @@ const onCreate = async (data: InvariantViewModel) => { } const onUpdate = async (data: InvariantViewModel) => { - await useFetch(`/api/${solutionId}/invariants/${data.id}`, { + await useFetch(`/api/invariants/${data.id}`, { method: 'PUT', body: { id: data.id, name: data.name, - statement: data.statement + statement: data.statement, + solutionId } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -59,8 +64,10 @@ const onUpdate = async (data: InvariantViewModel) => { } const onDelete = async (id: string) => { - await useFetch(`/api/${solutionId}/invariants/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await useFetch(`/api/invariants/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } diff --git a/pages/o/[organization-slug]/[solution-slug]/goals/functionality.client.vue b/pages/o/[organization-slug]/[solution-slug]/goals/functionality.client.vue index bfe5c1e6..08bd604b 100644 --- a/pages/o/[organization-slug]/[solution-slug]/goals/functionality.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/goals/functionality.client.vue @@ -26,7 +26,9 @@ type FunctionalBehaviorViewModel = { priority: MoscowPriority; } -const { data: functionalBehaviors, refresh, status, error: getFunctionalBehaviorsError } = await useFetch(`/api/${solutionId}/functional-behaviors`), +const { data: functionalBehaviors, refresh, status, error: getFunctionalBehaviorsError } = await useFetch(`/api/functional-behaviors`, { + query: { solutionId } +}), emptyFunctionalBehavior: FunctionalBehaviorViewModel = { id: emptyUuid, name: '', @@ -43,9 +45,10 @@ const filters = ref({ }); const onCreate = async (data: FunctionalBehaviorViewModel) => { - await $fetch(`/api/${solutionId}/functional-behaviors`, { + await $fetch(`/api/functional-behaviors`, { method: 'POST', body: { + solutionId, name: data.name, statement: data.statement, priority: MoscowPriority.MUST @@ -56,9 +59,10 @@ const onCreate = async (data: FunctionalBehaviorViewModel) => { } const onUpdate = async (data: FunctionalBehaviorViewModel) => { - await $fetch(`/api/${solutionId}/functional-behaviors/${data.id}`, { + await $fetch(`/api/functional-behaviors/${data.id}`, { method: 'PUT', body: { + solutionId, id: data.id, name: data.name, statement: data.statement, @@ -70,8 +74,10 @@ const onUpdate = async (data: FunctionalBehaviorViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/functional-behaviors/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/functional-behaviors/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } diff --git a/pages/o/[organization-slug]/[solution-slug]/goals/limitations.client.vue b/pages/o/[organization-slug]/[solution-slug]/goals/limitations.client.vue index 6ac09ce9..8ccc9604 100644 --- a/pages/o/[organization-slug]/[solution-slug]/goals/limitations.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/goals/limitations.client.vue @@ -24,7 +24,9 @@ type LimitViewModel = { statement: string; } -const { data: limits, status, refresh, error: getLimitsError } = await useFetch(`/api/${solutionId}/limits`), +const { data: limits, status, refresh, error: getLimitsError } = await useFetch(`/api/limits`, { + query: { solutionId } +}), emptyLimit: LimitViewModel = { id: emptyUuid, name: '', statement: '' }; if (getLimitsError.value) @@ -36,9 +38,10 @@ const filters = ref({ }); const onCreate = async (data: LimitViewModel) => { - await $fetch(`/api/${solutionId}/limits`, { + await $fetch(`/api/limits`, { method: 'POST', body: { + solutionId, name: data.name, statement: data.statement } @@ -48,8 +51,9 @@ const onCreate = async (data: LimitViewModel) => { } const onUpdate = async (data: LimitViewModel) => { - await $fetch(`/api/${solutionId}/limits/${data.id}`, { + await $fetch(`/api/limits/${data.id}`, { method: 'PUT', body: { + solutionId, id: data.id, name: data.name, statement: data.statement @@ -60,8 +64,10 @@ const onUpdate = async (data: LimitViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/limits/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/limits/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } diff --git a/pages/o/[organization-slug]/[solution-slug]/goals/obstacles.client.vue b/pages/o/[organization-slug]/[solution-slug]/goals/obstacles.client.vue index 23eaae6d..1aacf9e7 100644 --- a/pages/o/[organization-slug]/[solution-slug]/goals/obstacles.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/goals/obstacles.client.vue @@ -24,7 +24,9 @@ type ObstacleViewModel = { statement: string; } -const { data: obstacles, refresh, status, error: getObstaclesError } = await useFetch(`/api/${solutionId}/obstacles`), +const { data: obstacles, refresh, status, error: getObstaclesError } = await useFetch(`/api/obstacles`, { + query: { solutionId } +}), emptyObstacle: ObstacleViewModel = { id: emptyUuid, name: '', statement: '' }; const filters = ref({ @@ -33,9 +35,10 @@ const filters = ref({ }); const onCreate = async (data: ObstacleViewModel) => { - await $fetch(`/api/${solutionId}/obstacles`, { + await $fetch(`/api/obstacles`, { method: 'POST', body: { + solutionId, name: data.name, statement: data.statement } @@ -45,9 +48,10 @@ const onCreate = async (data: ObstacleViewModel) => { } const onUpdate = async (data: ObstacleViewModel) => { - await $fetch(`/api/${solutionId}/obstacles/${data.id}`, { + await $fetch(`/api/obstacles/${data.id}`, { method: 'PUT', body: { + solutionId, name: data.name, statement: data.statement } @@ -57,8 +61,10 @@ const onUpdate = async (data: ObstacleViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/obstacles/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/obstacles/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } diff --git a/pages/o/[organization-slug]/[solution-slug]/goals/outcomes.client.vue b/pages/o/[organization-slug]/[solution-slug]/goals/outcomes.client.vue index 34a0e39a..cf63d042 100644 --- a/pages/o/[organization-slug]/[solution-slug]/goals/outcomes.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/goals/outcomes.client.vue @@ -24,7 +24,9 @@ type OutcomeViewModel = { statement: string; } -const { data: outcomes, refresh, status, error: getOutcomesError } = await useFetch(`/api/${solutionId}/outcomes`), +const { data: outcomes, refresh, status, error: getOutcomesError } = await useFetch(`/api/outcomes`, { + query: { solutionId } +}), emptyOutcome: OutcomeViewModel = { id: emptyUuid, name: '', statement: '' }; if (getOutcomesError.value) @@ -36,9 +38,10 @@ const filters = ref({ }); const onCreate = async (data: OutcomeViewModel) => { - await $fetch(`/api/${solutionId}/outcomes`, { + await $fetch(`/api/outcomes`, { method: 'POST', body: { + solutionId, name: data.name, statement: data.statement } @@ -48,9 +51,10 @@ const onCreate = async (data: OutcomeViewModel) => { } const onUpdate = async (data: OutcomeViewModel) => { - await $fetch(`/api/${solutionId}/outcomes/${data.id}`, { + await $fetch(`/api/outcomes/${data.id}`, { method: 'PUT', body: { + solutionId, name: data.name, statement: data.statement } @@ -60,8 +64,10 @@ const onUpdate = async (data: OutcomeViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/outcomes/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/outcomes/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } diff --git a/pages/o/[organization-slug]/[solution-slug]/goals/rationale.client.vue b/pages/o/[organization-slug]/[solution-slug]/goals/rationale.client.vue index e9b729ec..edeee7c5 100644 --- a/pages/o/[organization-slug]/[solution-slug]/goals/rationale.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/goals/rationale.client.vue @@ -27,10 +27,10 @@ const [ { data: situationJustifications, error: getSituationError }, { data: objectiveJustifications, error: getObjectiveError } ] = await Promise.all([ - useFetch(`/api/${solutionId}/justifications?name=Vision`), - useFetch(`/api/${solutionId}/justifications?name=Mission`), - useFetch(`/api/${solutionId}/justifications?name=Situation`), - useFetch(`/api/${solutionId}/justifications?name=Objective`) + useFetch(`/api/justifications`, { query: { name: 'Vision', solutionId } }), + useFetch(`/api/justifications`, { query: { name: 'Mission', solutionId } }), + useFetch(`/api/justifications`, { query: { name: 'Situation', solutionId } }), + useFetch(`/api/justifications`, { query: { name: 'Objective', solutionId } }) ]); if (getVisionError.value) @@ -57,9 +57,10 @@ const fieldTriple: [Ref, JustificationModel, string][] = [ fieldTriple.forEach(([goalStatement, justification, _name]) => { watch(goalStatement, debounce(() => { justification.statement = goalStatement.value; - $fetch(`/api/${solutionId}/justifications/${justification.id}`, { + $fetch(`/api/justifications/${justification.id}`, { method: 'PUT', body: { + solutionId, name: justification.name, statement: justification.statement } diff --git a/pages/o/[organization-slug]/[solution-slug]/goals/scenarios.client.vue b/pages/o/[organization-slug]/[solution-slug]/goals/scenarios.client.vue index 7d47af2a..47f111f1 100644 --- a/pages/o/[organization-slug]/[solution-slug]/goals/scenarios.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/goals/scenarios.client.vue @@ -34,10 +34,10 @@ const [ { data: functionalBehaviors, error: getFunctionalBehaviorsError }, { data: outcomes, error: getOutcomesError }, ] = await Promise.all([ - useFetch(`/api/${solutionId}/user-stories`), - useFetch(`/api/${solutionId}/stakeholders`), - useFetch(`/api/${solutionId}/functional-behaviors`), - useFetch(`/api/${solutionId}/outcomes`) + useFetch(`/api/user-stories`, { query: { solutionId } }), + useFetch(`/api/stakeholders`, { query: { solutionId } }), + useFetch(`/api/functional-behaviors`, { query: { solutionId } }), + useFetch(`/api/outcomes`, { query: { solutionId } }) ]), emptyUserStory: UserStoryViewModel = { id: emptyUuid, @@ -65,8 +65,10 @@ const userStoryfilters = ref({ }) const onUserStoryCreate = async (userStory: UserStoryViewModel) => { - await $fetch(`/api/${solutionId}/user-stories`, { - method: 'POST', body: { + await $fetch(`/api/user-stories`, { + method: 'POST', + body: { + solutionId, name: userStory.name, statement: '', primaryActorId: userStory.primaryActorId, @@ -80,8 +82,10 @@ const onUserStoryCreate = async (userStory: UserStoryViewModel) => { } const onUserStoryUpdate = async (userStory: UserStoryViewModel) => { - await $fetch(`/api/${solutionId}/user-stories/${userStory.id}`, { - method: 'PUT', body: { + await $fetch(`/api/user-stories/${userStory.id}`, { + method: 'PUT', + body: { + solutionId, name: userStory.name, statement: '', priority: MoscowPriority.MUST, @@ -95,8 +99,10 @@ const onUserStoryUpdate = async (userStory: UserStoryViewModel) => { } const onUserStoryDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/user-stories/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)); + await $fetch(`/api/user-stories/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)); refresh(); } diff --git a/pages/o/[organization-slug]/[solution-slug]/goals/stakeholders.client.vue b/pages/o/[organization-slug]/[solution-slug]/goals/stakeholders.client.vue index 88888808..82f54e08 100644 --- a/pages/o/[organization-slug]/[solution-slug]/goals/stakeholders.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/goals/stakeholders.client.vue @@ -31,7 +31,9 @@ type StakeHolderViewModel = { segmentation: StakeholderSegmentation; } -const { data: stakeholders, refresh, status, error: getStakeholdersError } = await useFetch(`/api/${solutionId}/stakeholders`), +const { data: stakeholders, refresh, status, error: getStakeholdersError } = await useFetch(`/api/stakeholders`, { + query: { solutionId } +}), categories = ref<{ id: string, description: string }[]>( Object.values(StakeholderCategory).map((value) => ({ id: value, description: value })) ), @@ -102,26 +104,34 @@ const clientMap = ref(), vendorMap = ref(); const onCreate = async (data: StakeHolderViewModel) => { - await $fetch(`/api/${solutionId}/stakeholders`, { + await $fetch(`/api/stakeholders`, { method: 'POST', - body: data + body: { + ...data, + solutionId + } }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } const onUpdate = async (data: StakeHolderViewModel) => { - await $fetch(`/api/${solutionId}/stakeholders/${data.id}`, { + await $fetch(`/api/stakeholders/${data.id}`, { method: 'PUT', - body: data + body: { + ...data, + solutionId + } }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/stakeholders/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/stakeholders/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } diff --git a/pages/o/[organization-slug]/[solution-slug]/project/roles-personnel.client.vue b/pages/o/[organization-slug]/[solution-slug]/project/roles-personnel.client.vue index 776433ab..ae38631a 100644 --- a/pages/o/[organization-slug]/[solution-slug]/project/roles-personnel.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/project/roles-personnel.client.vue @@ -24,7 +24,9 @@ type PersonViewModel = { email: string; } -const { data: personnel, refresh, status, error: getPersonnelError } = await useFetch(`/api/${solutionId}/persons`), +const { data: personnel, refresh, status, error: getPersonnelError } = await useFetch(`/api/persons`, { + query: { solutionId } +}), emptyPerson: PersonViewModel = { id: emptyUuid, name: '', email: '' }; if (getPersonnelError.value) @@ -36,9 +38,11 @@ const filters = ref({ }); const onCreate = async (data: PersonViewModel) => { - await $fetch(`/api/${solutionId}/persons`, { - method: 'POST', body: { + await $fetch(`/api/persons`, { + method: 'POST', + body: { ...data, + solutionId, statement: '' } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -47,9 +51,11 @@ const onCreate = async (data: PersonViewModel) => { } const onUpdate = async (data: PersonViewModel) => { - await $fetch(`/api/${solutionId}/persons/${data.id}`, { - method: 'PUT', body: { + await $fetch(`/api/persons/${data.id}`, { + method: 'PUT', + body: { ...data, + solutionId, statement: '' } }).catch((e) => $eventBus.$emit('page-error', e)) @@ -58,8 +64,10 @@ const onUpdate = async (data: PersonViewModel) => { } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/persons/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/persons/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)) refresh(); } diff --git a/pages/o/[organization-slug]/[solution-slug]/system/components.client.vue b/pages/o/[organization-slug]/[solution-slug]/system/components.client.vue index 986412bc..5d93686c 100644 --- a/pages/o/[organization-slug]/[solution-slug]/system/components.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/system/components.client.vue @@ -25,7 +25,9 @@ type SystemComponentViewModel = { parentComponentId?: string; } -const { data: systemComponents, refresh, status, error: getSystemComponentsError } = await useFetch(`/api/${solutionId}/system-components`), +const { data: systemComponents, refresh, status, error: getSystemComponentsError } = await useFetch(`/api/system-components`, { + query: { solutionId } +}), emptyComponent: SystemComponentViewModel = { id: emptyUuid, name: '', @@ -43,26 +45,33 @@ const filters = ref({ }) const onCreate = async (data: SystemComponentViewModel) => { - await $fetch(`/api/${solutionId}/system-components`, { + await $fetch(`/api/system-components`, { method: 'POST', - body: data + body: { + ...data, + solutionId + } }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } const onUpdate = async (data: SystemComponentViewModel) => { - await $fetch(`/api/${solutionId}/system-components/${data.id}`, { + await $fetch(`/api/system-components/${data.id}`, { method: 'PUT', - body: data + body: { + ...data, + solutionId + } }).catch((e) => $eventBus.$emit('page-error', e)) refresh() } const onDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/system-components/${id}`, { - method: 'DELETE' + await $fetch(`/api/system-components/${id}`, { + method: 'DELETE', + body: {solutionId} }).catch((e) => $eventBus.$emit('page-error', e)) refresh() diff --git a/pages/o/[organization-slug]/[solution-slug]/system/functionality.client.vue b/pages/o/[organization-slug]/[solution-slug]/system/functionality.client.vue index f98bb4a9..a1785d97 100644 --- a/pages/o/[organization-slug]/[solution-slug]/system/functionality.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/system/functionality.client.vue @@ -28,7 +28,9 @@ type BehaviorViewModel = { priority: MoscowPriority; } -const { data: components, status, refresh, error: getComponentsError } = await useFetch(`/api/${solutionId}/system-components`), +const { data: components, status, refresh, error: getComponentsError } = await useFetch(`/api/system-components`, { + query: { solutionId } +}), expandedRows = ref({}), emptyBehavior = (componentid: string): BehaviorViewModel => ({ id: emptyUuid, @@ -42,12 +44,14 @@ if (getComponentsError.value) $eventBus.$emit('page-error', getComponentsError.value) const fnFunctionalBehaviors = async (componentId: string) => - await $fetch(`/api/${solutionId}/functional-behaviors?componentId=${componentId}`) - .catch((e) => $eventBus.$emit('page-error', e)); + await $fetch(`/api/functional-behaviors`, { + query: { solutionId, componentId } + }).catch((e) => $eventBus.$emit('page-error', e)); const fnNonFunctionalBehaviors = async (componentId: string) => - await $fetch(`/api/${solutionId}/non-functional-behaviors?componentId=${componentId}`) - .catch((e) => $eventBus.$emit('page-error', e)) + await $fetch(`/api/non-functional-behaviors`, { + query: { solutionId, componentId } + }).catch((e) => $eventBus.$emit('page-error', e)) const componentSortField = ref('name') diff --git a/pages/o/[organization-slug]/[solution-slug]/system/scenarios.client.vue b/pages/o/[organization-slug]/[solution-slug]/system/scenarios.client.vue index 12a62db0..d2f87421 100644 --- a/pages/o/[organization-slug]/[solution-slug]/system/scenarios.client.vue +++ b/pages/o/[organization-slug]/[solution-slug]/system/scenarios.client.vue @@ -43,8 +43,12 @@ type UseCaseViewModel = { priority: MoscowPriority; } -const { data: userStories, refresh: refreshUserStories, error: getUserStoriesError } = await useFetch(`/api/${solutionId}/user-stories`), - { data: useCases, refresh: refreshUseCases, error: getUseCasesError } = await useFetch(`/api/${solutionId}/use-cases`), +const { data: userStories, refresh: refreshUserStories, error: getUserStoriesError } = await useFetch(`/api/user-stories`, { + query: { solutionId } +}), + { data: useCases, refresh: refreshUseCases, error: getUseCasesError } = await useFetch(`/api/use-cases`, { + query: { solutionId } + }), emptyUserStory: UserStoryViewModel = { id: emptyUuid, name: '', @@ -67,11 +71,11 @@ const { data: userStories, refresh: refreshUserStories, error: getUserStoriesErr triggerid: emptyUuid, priority: MoscowPriority.MUST }, - { data: roles, error: getRolesError } = await useFetch(`/api/${solutionId}/stakeholders`), - { data: functionalBehaviors, error: getFunctionalBehaviorsError } = await useFetch(`/api/${solutionId}/functional-behaviors`), - { data: outcomes, error: getOutcomesError } = await useFetch(`/api/${solutionId}/outcomes`), - { data: assumptions, error: getAssumptionsError } = await useFetch(`/api/${solutionId}/assumptions`), - { data: effects, error: getEffectsError } = await useFetch(`/api/${solutionId}/effects`), + { data: roles, error: getRolesError } = await useFetch(`/api/stakeholders`, { query: { solutionId } }), + { data: functionalBehaviors, error: getFunctionalBehaviorsError } = await useFetch(`/api/functional-behaviors`, { query: { solutionId } }), + { data: outcomes, error: getOutcomesError } = await useFetch(`/api/outcomes`, { query: { solutionId } }), + { data: assumptions, error: getAssumptionsError } = await useFetch(`/api/assumptions`, { query: { solutionId } }), + { data: effects, error: getEffectsError } = await useFetch(`/api/effects`, { query: { solutionId } }), triggers = ref([]) if (getUserStoriesError.value) @@ -108,10 +112,11 @@ const useCasefilters = ref({ }) const onUserStoryCreate = async (userStory: UserStoryViewModel) => { - await $fetch(`/api/${solutionId}/user-stories`, { + await $fetch(`/api/user-stories`, { method: 'POST', body: { ...userStory, + solutionId, statement: '', priority: MoscowPriority.MUST } @@ -121,10 +126,11 @@ const onUserStoryCreate = async (userStory: UserStoryViewModel) => { } const onUseCaseCreate = async (useCase: UseCaseViewModel) => { - await $fetch(`/api/${solutionId}/use-cases`, { + await $fetch(`/api/use-cases`, { method: 'POST', body: { ...useCase, + solutionId, statement: '', priority: MoscowPriority.MUST } @@ -134,10 +140,11 @@ const onUseCaseCreate = async (useCase: UseCaseViewModel) => { } const onUserStoryUpdate = async (userStory: UserStoryViewModel) => { - await $fetch(`/api/${solutionId}/user-stories/${userStory.id}`, { + await $fetch(`/api/user-stories/${userStory.id}`, { method: 'PUT', body: { ...userStory, + solutionId, statement: '', priority: userStory.priority } @@ -147,10 +154,11 @@ const onUserStoryUpdate = async (userStory: UserStoryViewModel) => { } const onUseCaseUpdate = async (useCase: UseCaseViewModel) => { - await $fetch(`/api/${solutionId}/use-cases/${useCase.id}`, { + await $fetch(`/api/use-cases/${useCase.id}`, { method: 'PUT', body: { ...useCase, + solutionId, statement: '' } }).catch((e) => $eventBus.$emit('page-error', e)); @@ -159,15 +167,19 @@ const onUseCaseUpdate = async (useCase: UseCaseViewModel) => { } const onUserStoryDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/user-stories/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)); + await $fetch(`/api/user-stories/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)); refreshUserStories(); } const onUseCaseDelete = async (id: string) => { - await $fetch(`/api/${solutionId}/use-cases/${id}`, { method: 'DELETE' }) - .catch((e) => $eventBus.$emit('page-error', e)); + await $fetch(`/api/use-cases/${id}`, { + method: 'DELETE', + body: { solutionId } + }).catch((e) => $eventBus.$emit('page-error', e)); refreshUseCases(); } diff --git a/server/api/[solution-id]/assumptions/[id].delete.ts b/server/api/assumptions/[id].delete.ts similarity index 69% rename from server/api/[solution-id]/assumptions/[id].delete.ts rename to server/api/assumptions/[id].delete.ts index 8fd16949..3351a66a 100644 --- a/server/api/[solution-id]/assumptions/[id].delete.ts +++ b/server/api/assumptions/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Assumption } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete an assumption associated with a solution */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/assumptions/[id].get.ts b/server/api/assumptions/[id].get.ts similarity index 74% rename from server/api/[solution-id]/assumptions/[id].get.ts rename to server/api/assumptions/[id].get.ts index 6a538143..b4700663 100644 --- a/server/api/[solution-id]/assumptions/[id].get.ts +++ b/server/api/assumptions/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Assumption } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns an assumption associated with a solution */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/assumptions/[id].put.ts b/server/api/assumptions/[id].put.ts similarity index 85% rename from server/api/[solution-id]/assumptions/[id].put.ts rename to server/api/assumptions/[id].put.ts index e1c7e315..fed023f3 100644 --- a/server/api/[solution-id]/assumptions/[id].put.ts +++ b/server/api/assumptions/[id].put.ts @@ -3,11 +3,11 @@ import { z } from "zod" import { Assumption } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -16,8 +16,8 @@ const bodySchema = z.object({ * Updates an assumption by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), - { name, statement } = await validateEventBody(event, bodySchema), + const { id } = await validateEventParams(event, paramSchema), + { name, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/assumptions/index.get.ts b/server/api/assumptions/index.get.ts similarity index 67% rename from server/api/[solution-id]/assumptions/index.get.ts rename to server/api/assumptions/index.get.ts index be78f685..6e21a34e 100644 --- a/server/api/[solution-id]/assumptions/index.get.ts +++ b/server/api/assumptions/index.get.ts @@ -2,24 +2,20 @@ import { z } from "zod" import { Assumption } from "~/server/domain/requirements/index.js" import { fork } from "~/server/data/orm" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional() }) /** - * Returns all assumptions that match the optional query parameters + * Returns all assumptions that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Assumption, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/assumptions/index.post.ts b/server/api/assumptions/index.post.ts similarity index 76% rename from server/api/[solution-id]/assumptions/index.post.ts rename to server/api/assumptions/index.post.ts index 7fa3518b..76dcf01f 100644 --- a/server/api/[solution-id]/assumptions/index.post.ts +++ b/server/api/assumptions/index.post.ts @@ -2,11 +2,8 @@ import { fork } from "~/server/data/orm" import { z } from "zod" import { Assumption } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -15,8 +12,7 @@ const bodySchema = z.object({ * Creates a new assumption and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement } = await validateEventBody(event, bodySchema), + const { name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId) const em = fork(), diff --git a/server/api/[solution-id]/constraints/[id].delete.ts b/server/api/constraints/[id].delete.ts similarity index 67% rename from server/api/[solution-id]/constraints/[id].delete.ts rename to server/api/constraints/[id].delete.ts index c8e27bfb..66cf42a9 100644 --- a/server/api/[solution-id]/constraints/[id].delete.ts +++ b/server/api/constraints/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Constraint } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete constraint by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/constraints/[id].get.ts b/server/api/constraints/[id].get.ts similarity index 74% rename from server/api/[solution-id]/constraints/[id].get.ts rename to server/api/constraints/[id].get.ts index 0c041838..1f1a7a8c 100644 --- a/server/api/[solution-id]/constraints/[id].get.ts +++ b/server/api/constraints/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Constraint } from "~/server/domain/requirements/Constraint.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns a constraint by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/constraints/[id].put.ts b/server/api/constraints/[id].put.ts similarity index 85% rename from server/api/[solution-id]/constraints/[id].put.ts rename to server/api/constraints/[id].put.ts index cdb79241..b55e3ff2 100644 --- a/server/api/[solution-id]/constraints/[id].put.ts +++ b/server/api/constraints/[id].put.ts @@ -3,11 +3,11 @@ import { Constraint, ConstraintCategory } from "~/server/domain/requirements/ind import { fork } from "~/server/data/orm" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string(), category: z.nativeEnum(ConstraintCategory) @@ -17,9 +17,9 @@ const bodySchema = z.object({ * Updates a constraint by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { category, name, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { category, name, statement } = await validateEventBody(event, bodySchema), em = fork() const constraint = await em.findOne(Constraint, id) diff --git a/server/api/[solution-id]/constraints/index.get.ts b/server/api/constraints/index.get.ts similarity index 70% rename from server/api/[solution-id]/constraints/index.get.ts rename to server/api/constraints/index.get.ts index 07d6d514..24a5e41b 100644 --- a/server/api/[solution-id]/constraints/index.get.ts +++ b/server/api/constraints/index.get.ts @@ -2,25 +2,21 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Constraint, ConstraintCategory } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional(), category: z.nativeEnum(ConstraintCategory).optional() }) /** - * Returns all constraints that match the optional query parameters + * Returns all constraints that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Constraint, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/constraints/index.post.ts b/server/api/constraints/index.post.ts similarity index 77% rename from server/api/[solution-id]/constraints/index.post.ts rename to server/api/constraints/index.post.ts index 0b3cb317..a637416c 100644 --- a/server/api/[solution-id]/constraints/index.post.ts +++ b/server/api/constraints/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Constraint, ConstraintCategory } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string(), category: z.nativeEnum(ConstraintCategory) @@ -16,8 +13,7 @@ const bodySchema = z.object({ * Creates a new constraint and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { category, name, statement } = await validateEventBody(event, bodySchema), + const { category, name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/effects/[id].delete.ts b/server/api/effects/[id].delete.ts similarity index 67% rename from server/api/[solution-id]/effects/[id].delete.ts rename to server/api/effects/[id].delete.ts index 995c4379..bebb23f6 100644 --- a/server/api/[solution-id]/effects/[id].delete.ts +++ b/server/api/effects/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Effect } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete an effect by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/effects/[id].get.ts b/server/api/effects/[id].get.ts similarity index 77% rename from server/api/[solution-id]/effects/[id].get.ts rename to server/api/effects/[id].get.ts index 9b230dc2..50a03a93 100644 --- a/server/api/[solution-id]/effects/[id].get.ts +++ b/server/api/effects/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Effect } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid(), +}) + /** * Returns an effect by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/effects/[id].put.ts b/server/api/effects/[id].put.ts similarity index 84% rename from server/api/[solution-id]/effects/[id].put.ts rename to server/api/effects/[id].put.ts index 094c8291..e536d41a 100644 --- a/server/api/[solution-id]/effects/[id].put.ts +++ b/server/api/effects/[id].put.ts @@ -3,11 +3,11 @@ import { z } from "zod" import { Effect } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -16,9 +16,9 @@ const bodySchema = z.object({ * Updates an effect by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { name, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { name, statement } = await validateEventBody(event, bodySchema), em = fork() const effect = await em.findOne(Effect, id) diff --git a/server/api/[solution-id]/effects/index.get.ts b/server/api/effects/index.get.ts similarity index 67% rename from server/api/[solution-id]/effects/index.get.ts rename to server/api/effects/index.get.ts index 7eba450a..6e707f83 100644 --- a/server/api/[solution-id]/effects/index.get.ts +++ b/server/api/effects/index.get.ts @@ -2,24 +2,20 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Effect } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional() }) /** - * Returns all effects that match the optional query parameters + * Returns all effects that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Effect, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/effects/index.post.ts b/server/api/effects/index.post.ts similarity index 75% rename from server/api/[solution-id]/effects/index.post.ts rename to server/api/effects/index.post.ts index da17e21d..a8ee1a4f 100644 --- a/server/api/[solution-id]/effects/index.post.ts +++ b/server/api/effects/index.post.ts @@ -2,11 +2,8 @@ import { fork } from "~/server/data/orm" import { z } from "zod" import { Effect } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -15,8 +12,7 @@ const bodySchema = z.object({ * Creates a new effect and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement } = await validateEventBody(event, bodySchema), + const { name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/environment-components/[id].delete.ts b/server/api/environment-components/[id].delete.ts similarity index 69% rename from server/api/[solution-id]/environment-components/[id].delete.ts rename to server/api/environment-components/[id].delete.ts index 33bc5253..cd712706 100644 --- a/server/api/[solution-id]/environment-components/[id].delete.ts +++ b/server/api/environment-components/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { EnvironmentComponent } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete an environment component by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/environment-components/[id].get.ts b/server/api/environment-components/[id].get.ts similarity index 74% rename from server/api/[solution-id]/environment-components/[id].get.ts rename to server/api/environment-components/[id].get.ts index 42945707..400ab380 100644 --- a/server/api/[solution-id]/environment-components/[id].get.ts +++ b/server/api/environment-components/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { EnvironmentComponent } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns an environment component by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/environment-components/[id].put.ts b/server/api/environment-components/[id].put.ts similarity index 87% rename from server/api/[solution-id]/environment-components/[id].put.ts rename to server/api/environment-components/[id].put.ts index 37c96385..d58578c8 100644 --- a/server/api/[solution-id]/environment-components/[id].put.ts +++ b/server/api/environment-components/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { EnvironmentComponent } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), parentComponentId: z.string().uuid().optional() @@ -17,9 +17,9 @@ const bodySchema = z.object({ * Updates an assumption by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { name, statement, parentComponentId, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { name, statement, parentComponentId } = await validateEventBody(event, bodySchema), em = fork() const environmentComponent = await em.findOne(EnvironmentComponent, id), diff --git a/server/api/[solution-id]/environment-components/index.get.ts b/server/api/environment-components/index.get.ts similarity index 69% rename from server/api/[solution-id]/environment-components/index.get.ts rename to server/api/environment-components/index.get.ts index 1b44db77..52bf29cd 100644 --- a/server/api/[solution-id]/environment-components/index.get.ts +++ b/server/api/environment-components/index.get.ts @@ -2,25 +2,21 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { EnvironmentComponent } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional(), parentComponentId: z.string().uuid().optional() }) /** - * Returns all environment-components that match the optional query parameters + * Returns all environment-components that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(EnvironmentComponent, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/environment-components/index.post.ts b/server/api/environment-components/index.post.ts similarity index 80% rename from server/api/[solution-id]/environment-components/index.post.ts rename to server/api/environment-components/index.post.ts index b30a9919..02c19150 100644 --- a/server/api/[solution-id]/environment-components/index.post.ts +++ b/server/api/environment-components/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { EnvironmentComponent } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), parentComponentId: z.string().uuid().optional() @@ -16,8 +13,7 @@ const bodySchema = z.object({ * Creates a new environment-component and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement, parentComponentId } = await validateEventBody(event, bodySchema), + const { name, statement, parentComponentId, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/functional-behaviors/[id].delete.ts b/server/api/functional-behaviors/[id].delete.ts similarity index 69% rename from server/api/[solution-id]/functional-behaviors/[id].delete.ts rename to server/api/functional-behaviors/[id].delete.ts index c598cab4..60417250 100644 --- a/server/api/[solution-id]/functional-behaviors/[id].delete.ts +++ b/server/api/functional-behaviors/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { FunctionalBehavior } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete an functional behavior by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/functional-behaviors/[id].get.ts b/server/api/functional-behaviors/[id].get.ts similarity index 74% rename from server/api/[solution-id]/functional-behaviors/[id].get.ts rename to server/api/functional-behaviors/[id].get.ts index 833464c2..ecc32b7d 100644 --- a/server/api/[solution-id]/functional-behaviors/[id].get.ts +++ b/server/api/functional-behaviors/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { FunctionalBehavior } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns a functional behavior by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/functional-behaviors/[id].put.ts b/server/api/functional-behaviors/[id].put.ts similarity index 86% rename from server/api/[solution-id]/functional-behaviors/[id].put.ts rename to server/api/functional-behaviors/[id].put.ts index a5a15005..13bdf43a 100644 --- a/server/api/[solution-id]/functional-behaviors/[id].put.ts +++ b/server/api/functional-behaviors/[id].put.ts @@ -3,11 +3,11 @@ import { FunctionalBehavior, MoscowPriority } from "~/server/domain/requirements import { fork } from "~/server/data/orm" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string(), priority: z.nativeEnum(MoscowPriority) @@ -17,9 +17,9 @@ const bodySchema = z.object({ * Updates a functional behavior by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { name, priority, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { name, priority, statement } = await validateEventBody(event, bodySchema), em = fork() const functionalBehavior = await em.findOne(FunctionalBehavior, id) diff --git a/server/api/[solution-id]/functional-behaviors/index.get.ts b/server/api/functional-behaviors/index.get.ts similarity index 76% rename from server/api/[solution-id]/functional-behaviors/index.get.ts rename to server/api/functional-behaviors/index.get.ts index a85c0aad..4457495e 100644 --- a/server/api/[solution-id]/functional-behaviors/index.get.ts +++ b/server/api/functional-behaviors/index.get.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { FunctionalBehavior, MoscowPriority } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional(), priority: z.nativeEnum(MoscowPriority).optional() @@ -16,11 +13,10 @@ const querySchema = z.object({ * Returns all functional behaviors that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(FunctionalBehavior, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/functional-behaviors/index.post.ts b/server/api/functional-behaviors/index.post.ts similarity index 78% rename from server/api/[solution-id]/functional-behaviors/index.post.ts rename to server/api/functional-behaviors/index.post.ts index 3f9b0f1b..d3e1ff96 100644 --- a/server/api/[solution-id]/functional-behaviors/index.post.ts +++ b/server/api/functional-behaviors/index.post.ts @@ -2,11 +2,8 @@ import { fork } from "~/server/data/orm" import { z } from "zod" import { MoscowPriority, FunctionalBehavior } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string(), priority: z.nativeEnum(MoscowPriority) @@ -16,8 +13,7 @@ const bodySchema = z.object({ * Creates a new functional behavior and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, priority, statement } = await validateEventBody(event, bodySchema), + const { name, priority, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/glossary-terms/[id].delete.ts b/server/api/glossary-terms/[id].delete.ts similarity index 73% rename from server/api/[solution-id]/glossary-terms/[id].delete.ts rename to server/api/glossary-terms/[id].delete.ts index ef05305f..0bc8ea03 100644 --- a/server/api/[solution-id]/glossary-terms/[id].delete.ts +++ b/server/api/glossary-terms/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { GlossaryTerm } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid(), +}) + /** * Delete glossary term by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/glossary-terms/[id].get.ts b/server/api/glossary-terms/[id].get.ts similarity index 74% rename from server/api/[solution-id]/glossary-terms/[id].get.ts rename to server/api/glossary-terms/[id].get.ts index b8f05330..92c85940 100644 --- a/server/api/[solution-id]/glossary-terms/[id].get.ts +++ b/server/api/glossary-terms/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { GlossaryTerm } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns a glossary term by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/glossary-terms/[id].put.ts b/server/api/glossary-terms/[id].put.ts similarity index 86% rename from server/api/[solution-id]/glossary-terms/[id].put.ts rename to server/api/glossary-terms/[id].put.ts index a488d166..cb68a53c 100644 --- a/server/api/[solution-id]/glossary-terms/[id].put.ts +++ b/server/api/glossary-terms/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { GlossaryTerm } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -16,9 +16,9 @@ const bodySchema = z.object({ * Updates a glossary term by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { name, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { name, statement } = await validateEventBody(event, bodySchema), em = fork() const glossaryTerm = await em.findOne(GlossaryTerm, id) diff --git a/server/api/[solution-id]/glossary-terms/index.get.ts b/server/api/glossary-terms/index.get.ts similarity index 67% rename from server/api/[solution-id]/glossary-terms/index.get.ts rename to server/api/glossary-terms/index.get.ts index 0ab491ea..6e9b2466 100644 --- a/server/api/[solution-id]/glossary-terms/index.get.ts +++ b/server/api/glossary-terms/index.get.ts @@ -2,24 +2,20 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { GlossaryTerm } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional() }) /** - * Returns all glossay terms that match the optional query parameters + * Returns all glossay terms that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(GlossaryTerm, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/glossary-terms/index.post.ts b/server/api/glossary-terms/index.post.ts similarity index 76% rename from server/api/[solution-id]/glossary-terms/index.post.ts rename to server/api/glossary-terms/index.post.ts index 4d6bced7..b890f025 100644 --- a/server/api/[solution-id]/glossary-terms/index.post.ts +++ b/server/api/glossary-terms/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { GlossaryTerm } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -15,8 +12,7 @@ const bodySchema = z.object({ * Creates a new glossary term and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement } = await validateEventBody(event, bodySchema), + const { name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/invariants/[id].delete.ts b/server/api/invariants/[id].delete.ts similarity index 67% rename from server/api/[solution-id]/invariants/[id].delete.ts rename to server/api/invariants/[id].delete.ts index e4270387..30460fd2 100644 --- a/server/api/[solution-id]/invariants/[id].delete.ts +++ b/server/api/invariants/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Invariant } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete invariant by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/invariants/[id].get.ts b/server/api/invariants/[id].get.ts similarity index 78% rename from server/api/[solution-id]/invariants/[id].get.ts rename to server/api/invariants/[id].get.ts index 1ad030ed..a7375b94 100644 --- a/server/api/[solution-id]/invariants/[id].get.ts +++ b/server/api/invariants/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Invariant } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid(), +}) + /** * Returns an invariant by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/invariants/[id].put.ts b/server/api/invariants/[id].put.ts similarity index 84% rename from server/api/[solution-id]/invariants/[id].put.ts rename to server/api/invariants/[id].put.ts index 24555a97..4bef46c7 100644 --- a/server/api/[solution-id]/invariants/[id].put.ts +++ b/server/api/invariants/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { Invariant } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -16,9 +16,9 @@ const bodySchema = z.object({ * Updates an invariant by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { name, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { name, statement } = await validateEventBody(event, bodySchema), em = fork() const invariant = await em.findOne(Invariant, id) diff --git a/server/api/[solution-id]/invariants/index.get.ts b/server/api/invariants/index.get.ts similarity index 67% rename from server/api/[solution-id]/invariants/index.get.ts rename to server/api/invariants/index.get.ts index fe470dc8..e929831c 100644 --- a/server/api/[solution-id]/invariants/index.get.ts +++ b/server/api/invariants/index.get.ts @@ -2,24 +2,20 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Invariant } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional() }) /** - * Returns all invariants that match the optional query parameters + * Returns all invariants that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Invariant, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/invariants/index.post.ts b/server/api/invariants/index.post.ts similarity index 75% rename from server/api/[solution-id]/invariants/index.post.ts rename to server/api/invariants/index.post.ts index 59dfa656..dcb9a189 100644 --- a/server/api/[solution-id]/invariants/index.post.ts +++ b/server/api/invariants/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Invariant } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -15,8 +12,7 @@ const bodySchema = z.object({ * Creates a new invariant and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement } = await validateEventBody(event, bodySchema), + const { name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/justifications/[id].delete.ts b/server/api/justifications/[id].delete.ts similarity index 68% rename from server/api/[solution-id]/justifications/[id].delete.ts rename to server/api/justifications/[id].delete.ts index 37704f70..8a7d1961 100644 --- a/server/api/[solution-id]/justifications/[id].delete.ts +++ b/server/api/justifications/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Justification } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete a justification by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/justifications/[id].get.ts b/server/api/justifications/[id].get.ts similarity index 74% rename from server/api/[solution-id]/justifications/[id].get.ts rename to server/api/justifications/[id].get.ts index 34c931f1..4c48ae09 100644 --- a/server/api/[solution-id]/justifications/[id].get.ts +++ b/server/api/justifications/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Justification } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns a justification by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/justifications/[id].put.ts b/server/api/justifications/[id].put.ts similarity index 87% rename from server/api/[solution-id]/justifications/[id].put.ts rename to server/api/justifications/[id].put.ts index 5922d52a..9f930e37 100644 --- a/server/api/[solution-id]/justifications/[id].put.ts +++ b/server/api/justifications/[id].put.ts @@ -3,11 +3,11 @@ import { z } from "zod" import { Justification } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -16,7 +16,8 @@ const bodySchema = z.object({ * Updates a Justification by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), { name, statement } = await validateEventBody(event, bodySchema), em = fork() diff --git a/server/api/[solution-id]/justifications/index.get.ts b/server/api/justifications/index.get.ts similarity index 67% rename from server/api/[solution-id]/justifications/index.get.ts rename to server/api/justifications/index.get.ts index 8d723356..2d1c960f 100644 --- a/server/api/[solution-id]/justifications/index.get.ts +++ b/server/api/justifications/index.get.ts @@ -2,24 +2,20 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Justification } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional() }) /** - * Returns all justifications that match the optional query parameters + * Returns all justifications that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Justification, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/justifications/index.post.ts b/server/api/justifications/index.post.ts similarity index 76% rename from server/api/[solution-id]/justifications/index.post.ts rename to server/api/justifications/index.post.ts index 9bf9f94d..bc37b0ea 100644 --- a/server/api/[solution-id]/justifications/index.post.ts +++ b/server/api/justifications/index.post.ts @@ -2,11 +2,8 @@ import { fork } from "~/server/data/orm" import { z } from "zod" import { Justification } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -15,8 +12,7 @@ const bodySchema = z.object({ * Creates a new justifications and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement } = await validateEventBody(event, bodySchema), + const { name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/limits/[id].delete.ts b/server/api/limits/[id].delete.ts similarity index 67% rename from server/api/[solution-id]/limits/[id].delete.ts rename to server/api/limits/[id].delete.ts index b227e67d..611f510e 100644 --- a/server/api/[solution-id]/limits/[id].delete.ts +++ b/server/api/limits/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Limit } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete limit by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/limits/[id].get.ts b/server/api/limits/[id].get.ts similarity index 73% rename from server/api/[solution-id]/limits/[id].get.ts rename to server/api/limits/[id].get.ts index a3cba9d0..ef13b359 100644 --- a/server/api/[solution-id]/limits/[id].get.ts +++ b/server/api/limits/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Limit } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns a limit by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/limits/[id].put.ts b/server/api/limits/[id].put.ts similarity index 76% rename from server/api/[solution-id]/limits/[id].put.ts rename to server/api/limits/[id].put.ts index 171b3f73..845b0bdb 100644 --- a/server/api/[solution-id]/limits/[id].put.ts +++ b/server/api/limits/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { Limit } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string() }) @@ -16,9 +16,9 @@ const bodySchema = z.object({ * Updates a limit by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), - { sessionUser } = await assertOrgContributor(event, solutionId), - { name, statement } = await validateEventBody(event, bodySchema), + const { id } = await validateEventParams(event, paramSchema), + { name, statement, solutionId } = await validateEventBody(event, bodySchema), + { sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() const limit = await em.findOne(Limit, id) diff --git a/server/api/[solution-id]/limits/index.get.ts b/server/api/limits/index.get.ts similarity index 73% rename from server/api/[solution-id]/limits/index.get.ts rename to server/api/limits/index.get.ts index 2b3856d6..8019b1a9 100644 --- a/server/api/[solution-id]/limits/index.get.ts +++ b/server/api/limits/index.get.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Limit } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional() }) @@ -15,11 +12,10 @@ const querySchema = z.object({ * Returns all limits that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Limit, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/limits/index.post.ts b/server/api/limits/index.post.ts similarity index 75% rename from server/api/[solution-id]/limits/index.post.ts rename to server/api/limits/index.post.ts index bed7136e..c799528f 100644 --- a/server/api/[solution-id]/limits/index.post.ts +++ b/server/api/limits/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Limit } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -15,8 +12,7 @@ const bodySchema = z.object({ * Creates a new limit and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement } = await validateEventBody(event, bodySchema), + const { name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/non-functional-behaviors/[id].delete.ts b/server/api/non-functional-behaviors/[id].delete.ts similarity index 69% rename from server/api/[solution-id]/non-functional-behaviors/[id].delete.ts rename to server/api/non-functional-behaviors/[id].delete.ts index 5ea0cc7c..8b8f5988 100644 --- a/server/api/[solution-id]/non-functional-behaviors/[id].delete.ts +++ b/server/api/non-functional-behaviors/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { NonFunctionalBehavior } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete non-functional behavior by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/non-functional-behaviors/[id].get.ts b/server/api/non-functional-behaviors/[id].get.ts similarity index 75% rename from server/api/[solution-id]/non-functional-behaviors/[id].get.ts rename to server/api/non-functional-behaviors/[id].get.ts index 7eb27d49..1de7d89f 100644 --- a/server/api/[solution-id]/non-functional-behaviors/[id].get.ts +++ b/server/api/non-functional-behaviors/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { NonFunctionalBehavior } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns a non-functional behavior by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/non-functional-behaviors/[id].put.ts b/server/api/non-functional-behaviors/[id].put.ts similarity index 86% rename from server/api/[solution-id]/non-functional-behaviors/[id].put.ts rename to server/api/non-functional-behaviors/[id].put.ts index 276b14c9..85826c9e 100644 --- a/server/api/[solution-id]/non-functional-behaviors/[id].put.ts +++ b/server/api/non-functional-behaviors/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { NonFunctionalBehavior, MoscowPriority } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string(), priority: z.nativeEnum(MoscowPriority) @@ -17,9 +17,9 @@ const bodySchema = z.object({ * Updates a non functional behavior by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { name, priority, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { name, priority, statement } = await validateEventBody(event, bodySchema), em = fork() const nonFunctionalBehavior = await em.findOne(NonFunctionalBehavior, id) diff --git a/server/api/[solution-id]/non-functional-behaviors/index.get.ts b/server/api/non-functional-behaviors/index.get.ts similarity index 76% rename from server/api/[solution-id]/non-functional-behaviors/index.get.ts rename to server/api/non-functional-behaviors/index.get.ts index b2f6f8ec..8251f26f 100644 --- a/server/api/[solution-id]/non-functional-behaviors/index.get.ts +++ b/server/api/non-functional-behaviors/index.get.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { MoscowPriority, NonFunctionalBehavior } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional(), priority: z.nativeEnum(MoscowPriority).optional() @@ -16,11 +13,10 @@ const querySchema = z.object({ * Returns all non functional behaviors that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(NonFunctionalBehavior, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/non-functional-behaviors/index.post.ts b/server/api/non-functional-behaviors/index.post.ts similarity index 78% rename from server/api/[solution-id]/non-functional-behaviors/index.post.ts rename to server/api/non-functional-behaviors/index.post.ts index 6f73077f..514113d3 100644 --- a/server/api/[solution-id]/non-functional-behaviors/index.post.ts +++ b/server/api/non-functional-behaviors/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { MoscowPriority, NonFunctionalBehavior } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string(), priority: z.nativeEnum(MoscowPriority) @@ -16,8 +13,7 @@ const bodySchema = z.object({ * Creates a new non functional behavior and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, priority, statement } = await validateEventBody(event, bodySchema), + const { name, priority, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/obstacles/[id].delete.ts b/server/api/obstacles/[id].delete.ts similarity index 67% rename from server/api/[solution-id]/obstacles/[id].delete.ts rename to server/api/obstacles/[id].delete.ts index 3e215f4b..cf5d06ca 100644 --- a/server/api/[solution-id]/obstacles/[id].delete.ts +++ b/server/api/obstacles/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Obstacle } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete obstacle by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/obstacles/[id].get.ts b/server/api/obstacles/[id].get.ts similarity index 78% rename from server/api/[solution-id]/obstacles/[id].get.ts rename to server/api/obstacles/[id].get.ts index 224969eb..55764bb8 100644 --- a/server/api/[solution-id]/obstacles/[id].get.ts +++ b/server/api/obstacles/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Obstacle } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid(), +}) + /** * Returns a obstacle by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/obstacles/[id].put.ts b/server/api/obstacles/[id].put.ts similarity index 84% rename from server/api/[solution-id]/obstacles/[id].put.ts rename to server/api/obstacles/[id].put.ts index 188c7edb..6a26444c 100644 --- a/server/api/[solution-id]/obstacles/[id].put.ts +++ b/server/api/obstacles/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { Obstacle } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string() }) @@ -16,9 +16,9 @@ const bodySchema = z.object({ * Updates an obstacle by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { name, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { name, statement } = await validateEventBody(event, bodySchema), em = fork() const obstacle = await em.findOne(Obstacle, id) diff --git a/server/api/[solution-id]/obstacles/index.get.ts b/server/api/obstacles/index.get.ts similarity index 74% rename from server/api/[solution-id]/obstacles/index.get.ts rename to server/api/obstacles/index.get.ts index adad65af..32f05c58 100644 --- a/server/api/[solution-id]/obstacles/index.get.ts +++ b/server/api/obstacles/index.get.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Obstacle } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional() }) @@ -15,11 +12,10 @@ const querySchema = z.object({ * Returns all obstacles that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Obstacle, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/obstacles/index.post.ts b/server/api/obstacles/index.post.ts similarity index 75% rename from server/api/[solution-id]/obstacles/index.post.ts rename to server/api/obstacles/index.post.ts index f59ce4a1..4a2a1633 100644 --- a/server/api/[solution-id]/obstacles/index.post.ts +++ b/server/api/obstacles/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Obstacle } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -15,8 +12,7 @@ const bodySchema = z.object({ * Creates a new obstacle and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement } = await validateEventBody(event, bodySchema), + const { name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/organizations/[id].delete.ts b/server/api/organizations/[id].delete.ts index 97f721ea..04b95c90 100644 --- a/server/api/organizations/[id].delete.ts +++ b/server/api/organizations/[id].delete.ts @@ -1,5 +1,7 @@ +import { Collection } from "@mikro-orm/core" import { z } from "zod" import { fork } from "~/server/data/orm" +import AppUserOrganizationRole from "~/server/domain/application/AppUserOrganizationRole" const paramSchema = z.object({ id: z.string().uuid() @@ -14,10 +16,31 @@ export default defineEventHandler(async (event) => { em = fork() const solutions = await organization.solutions.load() + + for (const solution of solutions) { + // for each property of the solution that is a collection, remove all items + for (const key in solution) { + const maybeCollection = Reflect.get(solution, key) as Collection + if (maybeCollection instanceof Collection) { + await maybeCollection.load() + maybeCollection.getItems().map(item => em.remove(item)) + maybeCollection.removeAll() + } + } + await em.flush() + await em.removeAndFlush(solution) + } + organization.solutions.removeAll() - await em.persistAndFlush(organization) + const appUserOrganizationRoles = await em.findAll(AppUserOrganizationRole, { + where: { organization } + }) + + for (const auor of appUserOrganizationRoles) + em.remove(auor) em.remove(organization) - await em.persistAndFlush(organization) + + await em.removeAndFlush(organization) }) diff --git a/server/api/organizations/index.get.ts b/server/api/organizations/index.get.ts index 8295f1a0..19d77b4a 100644 --- a/server/api/organizations/index.get.ts +++ b/server/api/organizations/index.get.ts @@ -11,7 +11,7 @@ const querySchema = z.object({ }) /** - * Returns all organizations that match the optional query parameters + * Returns all organizations that match the query parameters */ export default defineEventHandler(async (event) => { const { description, name, slug } = await validateEventParams(event, querySchema), diff --git a/server/api/[solution-id]/outcomes/[id].delete.ts b/server/api/outcomes/[id].delete.ts similarity index 67% rename from server/api/[solution-id]/outcomes/[id].delete.ts rename to server/api/outcomes/[id].delete.ts index 47be3250..b1f8ebc6 100644 --- a/server/api/[solution-id]/outcomes/[id].delete.ts +++ b/server/api/outcomes/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Outcome } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete outcome by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/outcomes/[id].get.ts b/server/api/outcomes/[id].get.ts similarity index 73% rename from server/api/[solution-id]/outcomes/[id].get.ts rename to server/api/outcomes/[id].get.ts index 676920b5..719aaf53 100644 --- a/server/api/[solution-id]/outcomes/[id].get.ts +++ b/server/api/outcomes/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Outcome } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns an outcome by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/outcomes/[id].put.ts b/server/api/outcomes/[id].put.ts similarity index 84% rename from server/api/[solution-id]/outcomes/[id].put.ts rename to server/api/outcomes/[id].put.ts index 65bcf59a..b347fad9 100644 --- a/server/api/[solution-id]/outcomes/[id].put.ts +++ b/server/api/outcomes/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { Outcome } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string() }) @@ -16,9 +16,9 @@ const bodySchema = z.object({ * Updates an outcome by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { name, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { name, statement } = await validateEventBody(event, bodySchema), em = fork() const outcome = await em.findOne(Outcome, id) diff --git a/server/api/[solution-id]/outcomes/index.get.ts b/server/api/outcomes/index.get.ts similarity index 67% rename from server/api/[solution-id]/outcomes/index.get.ts rename to server/api/outcomes/index.get.ts index a0ae4c53..0964c02a 100644 --- a/server/api/[solution-id]/outcomes/index.get.ts +++ b/server/api/outcomes/index.get.ts @@ -2,24 +2,20 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Outcome } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional() }) /** - * Returns all obstacles that match the optional query parameters + * Returns all obstacles that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Outcome, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/outcomes/index.post.ts b/server/api/outcomes/index.post.ts similarity index 75% rename from server/api/[solution-id]/outcomes/index.post.ts rename to server/api/outcomes/index.post.ts index 13da26a0..70cbb458 100644 --- a/server/api/[solution-id]/outcomes/index.post.ts +++ b/server/api/outcomes/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Outcome } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().min(1), statement: z.string() }) @@ -15,8 +12,7 @@ const bodySchema = z.object({ * Creates a new obstacle and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement } = await validateEventBody(event, bodySchema), + const { name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/persons/[id].delete.ts b/server/api/persons/[id].delete.ts similarity index 67% rename from server/api/[solution-id]/persons/[id].delete.ts rename to server/api/persons/[id].delete.ts index f96fc2c3..04661209 100644 --- a/server/api/[solution-id]/persons/[id].delete.ts +++ b/server/api/persons/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Person } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete Person by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/persons/[id].get.ts b/server/api/persons/[id].get.ts similarity index 77% rename from server/api/[solution-id]/persons/[id].get.ts rename to server/api/persons/[id].get.ts index 3b65a287..01afd3aa 100644 --- a/server/api/[solution-id]/persons/[id].get.ts +++ b/server/api/persons/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Person } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid(), +}) + /** * Returns a person by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/persons/[id].put.ts b/server/api/persons/[id].put.ts similarity index 84% rename from server/api/[solution-id]/persons/[id].put.ts rename to server/api/persons/[id].put.ts index a83e1188..0ab5f92c 100644 --- a/server/api/[solution-id]/persons/[id].put.ts +++ b/server/api/persons/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { Person } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), email: z.string().email() @@ -17,9 +17,9 @@ const bodySchema = z.object({ * Updates a person by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { email, name, statement, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { email, name, statement } = await validateEventBody(event, bodySchema), em = fork() const person = await em.findOne(Person, id) diff --git a/server/api/[solution-id]/persons/index.get.ts b/server/api/persons/index.get.ts similarity index 75% rename from server/api/[solution-id]/persons/index.get.ts rename to server/api/persons/index.get.ts index afe67ecb..ff4d5907 100644 --- a/server/api/[solution-id]/persons/index.get.ts +++ b/server/api/persons/index.get.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Person } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional(), email: z.string().email().optional() @@ -16,11 +13,10 @@ const querySchema = z.object({ * Returns all persons that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Person, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/persons/index.post.ts b/server/api/persons/index.post.ts similarity index 75% rename from server/api/[solution-id]/persons/index.post.ts rename to server/api/persons/index.post.ts index 3ece31e2..31c2150c 100644 --- a/server/api/[solution-id]/persons/index.post.ts +++ b/server/api/persons/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Person } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), email: z.string().email() @@ -16,8 +13,7 @@ const bodySchema = z.object({ * Creates a new person and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { email, name, statement } = await validateEventBody(event, bodySchema), + const { email, name, statement, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/solutions/[id].delete.ts b/server/api/solutions/[id].delete.ts index 36b72d0f..30515393 100644 --- a/server/api/solutions/[id].delete.ts +++ b/server/api/solutions/[id].delete.ts @@ -2,6 +2,7 @@ import { fork } from "~/server/data/orm" import { z } from "zod" import { Collection } from "@mikro-orm/core"; import assertSolutionAdmin from "~/server/utils/assertSolutionAdmin"; +import { Requirement } from "~/server/domain/requirements"; const paramSchema = z.object({ id: z.string().uuid() @@ -17,10 +18,14 @@ export default defineEventHandler(async (event) => { // for each property of the solution that is a collection, remove all items for (const key in solution) { - const maybeCollection = Reflect.get(solution, key) as Collection - if (maybeCollection instanceof Collection) + const maybeCollection = Reflect.get(solution, key) as Collection + if (maybeCollection instanceof Collection) { + await maybeCollection.load() + maybeCollection.getItems().map(item => em.remove(item)) maybeCollection.removeAll() + } } + await em.flush() await em.removeAndFlush(solution) }) diff --git a/server/api/solutions/index.get.ts b/server/api/solutions/index.get.ts index 73ca0e51..fbebd6f6 100644 --- a/server/api/solutions/index.get.ts +++ b/server/api/solutions/index.get.ts @@ -13,7 +13,7 @@ const querySchema = z.object({ }, "At least one of organizationId or organizationSlug should be provided"); /** - * Returns all solutions that match the optional query parameters + * Returns all solutions that match the query parameters */ export default defineEventHandler(async (event) => { const { description, name, organizationId, organizationSlug, slug } = await validateEventQuery(event, querySchema), diff --git a/server/api/[solution-id]/stakeholders/[id].delete.ts b/server/api/stakeholders/[id].delete.ts similarity index 68% rename from server/api/[solution-id]/stakeholders/[id].delete.ts rename to server/api/stakeholders/[id].delete.ts index 1c0338de..d952fcd4 100644 --- a/server/api/[solution-id]/stakeholders/[id].delete.ts +++ b/server/api/stakeholders/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Stakeholder } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete Stakeholder by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/stakeholders/[id].get.ts b/server/api/stakeholders/[id].get.ts similarity index 74% rename from server/api/[solution-id]/stakeholders/[id].get.ts rename to server/api/stakeholders/[id].get.ts index 2af8395b..c24946a9 100644 --- a/server/api/[solution-id]/stakeholders/[id].get.ts +++ b/server/api/stakeholders/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { Stakeholder } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns a stakeholder by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/stakeholders/[id].put.ts b/server/api/stakeholders/[id].put.ts similarity index 93% rename from server/api/[solution-id]/stakeholders/[id].put.ts rename to server/api/stakeholders/[id].put.ts index ceb388bd..3984a0b1 100644 --- a/server/api/[solution-id]/stakeholders/[id].put.ts +++ b/server/api/stakeholders/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { Stakeholder, StakeholderSegmentation, StakeholderCategory } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), parentComponentId: z.string().uuid().optional(), @@ -21,10 +21,10 @@ const bodySchema = z.object({ * Updates a stakeholder by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), - { sessionUser } = await assertSolutionContributor(event, solutionId), - { availability, category, influence, name, segmentation, statement, parentComponentId } = + const { id } = await validateEventParams(event, paramSchema), + { availability, category, influence, name, segmentation, statement, parentComponentId, solutionId } = await validateEventBody(event, bodySchema), + { sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() const stakeholder = await em.findOne(Stakeholder, id), diff --git a/server/api/[solution-id]/stakeholders/index.get.ts b/server/api/stakeholders/index.get.ts similarity index 76% rename from server/api/[solution-id]/stakeholders/index.get.ts rename to server/api/stakeholders/index.get.ts index 79f3648f..619a59a9 100644 --- a/server/api/[solution-id]/stakeholders/index.get.ts +++ b/server/api/stakeholders/index.get.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Stakeholder, StakeholderSegmentation, StakeholderCategory } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional(), parentComponentId: z.string().uuid().optional(), @@ -17,14 +14,13 @@ const querySchema = z.object({ }) /** - * Returns all stakeholders that match the optional query parameters + * Returns all stakeholders that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(Stakeholder, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/stakeholders/index.post.ts b/server/api/stakeholders/index.post.ts similarity index 80% rename from server/api/[solution-id]/stakeholders/index.post.ts rename to server/api/stakeholders/index.post.ts index 19d1e78a..098c3cdd 100644 --- a/server/api/[solution-id]/stakeholders/index.post.ts +++ b/server/api/stakeholders/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { Stakeholder, StakeholderCategory, StakeholderSegmentation } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), parentComponentId: z.string().uuid().optional(), @@ -20,9 +17,8 @@ const bodySchema = z.object({ * Creates a new stakeholder and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { availability, category, influence, name, segmentation, statement, parentComponentId } - = await validateEventBody(event, bodySchema), + const { availability, category, influence, name, segmentation, statement, parentComponentId, solutionId } + = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork() diff --git a/server/api/[solution-id]/system-components/[id].delete.ts b/server/api/system-components/[id].delete.ts similarity index 68% rename from server/api/[solution-id]/system-components/[id].delete.ts rename to server/api/system-components/[id].delete.ts index 736abec6..5a3ccddc 100644 --- a/server/api/[solution-id]/system-components/[id].delete.ts +++ b/server/api/system-components/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { SystemComponent } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete an system component by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/system-components/[id].get.ts b/server/api/system-components/[id].get.ts similarity index 74% rename from server/api/[solution-id]/system-components/[id].get.ts rename to server/api/system-components/[id].get.ts index 5473ff99..7eb3360f 100644 --- a/server/api/[solution-id]/system-components/[id].get.ts +++ b/server/api/system-components/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { SystemComponent } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns an system component by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/system-components/[id].put.ts b/server/api/system-components/[id].put.ts similarity index 86% rename from server/api/[solution-id]/system-components/[id].put.ts rename to server/api/system-components/[id].put.ts index 3470b6b0..b79eb755 100644 --- a/server/api/[solution-id]/system-components/[id].put.ts +++ b/server/api/system-components/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { SystemComponent } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), parentComponentId: z.string().uuid().optional() @@ -17,9 +17,9 @@ const bodySchema = z.object({ * Updates an environment component by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { name, statement, parentComponentId, solutionId } = await validateEventBody(event, bodySchema), { sessionUser } = await assertSolutionContributor(event, solutionId), - { name, statement, parentComponentId } = await validateEventBody(event, bodySchema), em = fork() const systemComponent = await em.findOne(SystemComponent, id), diff --git a/server/api/[solution-id]/system-components/index.get.ts b/server/api/system-components/index.get.ts similarity index 69% rename from server/api/[solution-id]/system-components/index.get.ts rename to server/api/system-components/index.get.ts index fd23a4e2..be0d441a 100644 --- a/server/api/[solution-id]/system-components/index.get.ts +++ b/server/api/system-components/index.get.ts @@ -2,25 +2,21 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { SystemComponent } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional(), parentComponentId: z.string().uuid().optional() }) /** - * Returns all system-components that match the optional query parameters + * Returns all system-components that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(SystemComponent, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/system-components/index.post.ts b/server/api/system-components/index.post.ts similarity index 79% rename from server/api/[solution-id]/system-components/index.post.ts rename to server/api/system-components/index.post.ts index 294aa144..a5264bb5 100644 --- a/server/api/[solution-id]/system-components/index.post.ts +++ b/server/api/system-components/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { SystemComponent } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), parentComponentId: z.string().uuid().optional() @@ -16,8 +13,7 @@ const bodySchema = z.object({ * Creates a new system-component and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - { name, statement, parentComponentId } = await validateEventBody(event, bodySchema), + const { name, statement, parentComponentId, solutionId } = await validateEventBody(event, bodySchema), { solution, sessionUser } = await assertSolutionContributor(event, solutionId), em = fork(), parentComponent = parentComponentId ? await em.findOne(SystemComponent, parentComponentId) : undefined diff --git a/server/api/[solution-id]/use-cases/[id].delete.ts b/server/api/use-cases/[id].delete.ts similarity index 67% rename from server/api/[solution-id]/use-cases/[id].delete.ts rename to server/api/use-cases/[id].delete.ts index 64b32edc..a0199279 100644 --- a/server/api/[solution-id]/use-cases/[id].delete.ts +++ b/server/api/use-cases/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { UseCase } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete UseCase by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/use-cases/[id].get.ts b/server/api/use-cases/[id].get.ts similarity index 73% rename from server/api/[solution-id]/use-cases/[id].get.ts rename to server/api/use-cases/[id].get.ts index 2525c9ab..0e1e6c99 100644 --- a/server/api/[solution-id]/use-cases/[id].get.ts +++ b/server/api/use-cases/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { UseCase } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns a UseCase by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/use-cases/[id].put.ts b/server/api/use-cases/[id].put.ts similarity index 96% rename from server/api/[solution-id]/use-cases/[id].put.ts rename to server/api/use-cases/[id].put.ts index 268d91c4..40d557b8 100644 --- a/server/api/[solution-id]/use-cases/[id].put.ts +++ b/server/api/use-cases/[id].put.ts @@ -4,11 +4,11 @@ import { Assumption, Effect, MoscowPriority, Stakeholder, UseCase } from "~/serv import { NIL as emptyUuid } from "uuid" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), primaryActorId: z.string().uuid(), @@ -27,9 +27,9 @@ const bodySchema = z.object({ * Updates a UseCase by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), - { sessionUser } = await assertSolutionContributor(event, solutionId), + const { id } = await validateEventParams(event, paramSchema), body = await validateEventBody(event, bodySchema), + { sessionUser } = await assertSolutionContributor(event, body.solutionId), em = fork() const useCase = await em.findOne(UseCase, id), diff --git a/server/api/[solution-id]/use-cases/index.get.ts b/server/api/use-cases/index.get.ts similarity index 83% rename from server/api/[solution-id]/use-cases/index.get.ts rename to server/api/use-cases/index.get.ts index f61b4309..ac0c2310 100644 --- a/server/api/[solution-id]/use-cases/index.get.ts +++ b/server/api/use-cases/index.get.ts @@ -3,11 +3,8 @@ import { fork } from "~/server/data/orm" import { MoscowPriority, UseCase } from "~/server/domain/requirements/index.js" import { NIL as emptyUuid } from "uuid" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional(), primaryActorId: z.string().uuid().optional(), @@ -26,11 +23,10 @@ const querySchema = z.object({ * Returns all stakeholders that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(UseCase, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/use-cases/index.post.ts b/server/api/use-cases/index.post.ts similarity index 90% rename from server/api/[solution-id]/use-cases/index.post.ts rename to server/api/use-cases/index.post.ts index b64a852c..c895d7f8 100644 --- a/server/api/[solution-id]/use-cases/index.post.ts +++ b/server/api/use-cases/index.post.ts @@ -3,11 +3,8 @@ import { z } from "zod" import { MoscowPriority, Stakeholder, Assumption, Effect, UseCase } from "~/server/domain/requirements/index.js" import { fork } from "~/server/data/orm" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), primaryActorId: z.string().uuid(), @@ -26,9 +23,8 @@ const bodySchema = z.object({ * Creates a new use case and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - body = await validateEventBody(event, bodySchema), - { solution, sessionUser } = await assertSolutionContributor(event, solutionId), + const body = await validateEventBody(event, bodySchema), + { solution, sessionUser } = await assertSolutionContributor(event, body.solutionId), em = fork() const primaryActor = await em.findOne(Stakeholder, body.primaryActorId), diff --git a/server/api/[solution-id]/user-stories/[id].delete.ts b/server/api/user-stories/[id].delete.ts similarity index 67% rename from server/api/[solution-id]/user-stories/[id].delete.ts rename to server/api/user-stories/[id].delete.ts index 5555f21f..736773fa 100644 --- a/server/api/[solution-id]/user-stories/[id].delete.ts +++ b/server/api/user-stories/[id].delete.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { UserStory } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const bodySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Delete User Story by id. */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventBody(event, bodySchema), em = fork() await assertSolutionContributor(event, solutionId) diff --git a/server/api/[solution-id]/user-stories/[id].get.ts b/server/api/user-stories/[id].get.ts similarity index 73% rename from server/api/[solution-id]/user-stories/[id].get.ts rename to server/api/user-stories/[id].get.ts index be73c936..4595f9e7 100644 --- a/server/api/[solution-id]/user-stories/[id].get.ts +++ b/server/api/user-stories/[id].get.ts @@ -3,15 +3,19 @@ import { fork } from "~/server/data/orm" import { UserStory } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) +const querySchema = z.object({ + solutionId: z.string().uuid() +}) + /** * Returns a User Story by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), + const { id } = await validateEventParams(event, paramSchema), + { solutionId } = await validateEventQuery(event, querySchema), em = fork() await assertSolutionReader(event, solutionId) diff --git a/server/api/[solution-id]/user-stories/[id].put.ts b/server/api/user-stories/[id].put.ts similarity index 95% rename from server/api/[solution-id]/user-stories/[id].put.ts rename to server/api/user-stories/[id].put.ts index 4b78c21d..77c4a66c 100644 --- a/server/api/[solution-id]/user-stories/[id].put.ts +++ b/server/api/user-stories/[id].put.ts @@ -3,11 +3,11 @@ import { fork } from "~/server/data/orm" import { FunctionalBehavior, MoscowPriority, Outcome, Stakeholder, UserStory } from "~/server/domain/requirements/index.js" const paramSchema = z.object({ - solutionId: z.string().uuid(), id: z.string().uuid() }) const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), primaryActorId: z.string().uuid(), @@ -20,9 +20,9 @@ const bodySchema = z.object({ * Updates a User Story by id */ export default defineEventHandler(async (event) => { - const { id, solutionId } = await validateEventParams(event, paramSchema), - { sessionUser } = await assertSolutionContributor(event, solutionId), + const { id } = await validateEventParams(event, paramSchema), body = await validateEventBody(event, bodySchema), + { sessionUser } = await assertSolutionContributor(event, body.solutionId), em = fork() const userStory = await em.findOne(UserStory, id), diff --git a/server/api/[solution-id]/user-stories/index.get.ts b/server/api/user-stories/index.get.ts similarity index 78% rename from server/api/[solution-id]/user-stories/index.get.ts rename to server/api/user-stories/index.get.ts index 68264500..da1a84c7 100644 --- a/server/api/[solution-id]/user-stories/index.get.ts +++ b/server/api/user-stories/index.get.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { fork } from "~/server/data/orm" import { UserStory, MoscowPriority } from "~/server/domain/requirements/index.js" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const querySchema = z.object({ + solutionId: z.string().uuid(), name: z.string().optional(), statement: z.string().optional(), primaryActorId: z.string().uuid().optional(), @@ -19,11 +16,10 @@ const querySchema = z.object({ * Returns all user stories that match the query parameters */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - query = await validateEventQuery(event, querySchema), + const query = await validateEventQuery(event, querySchema), em = fork() - await assertSolutionReader(event, solutionId) + await assertSolutionReader(event, query.solutionId) const results = await em.find(UserStory, Object.entries(query) .filter(([_, value]) => value !== undefined) diff --git a/server/api/[solution-id]/user-stories/index.post.ts b/server/api/user-stories/index.post.ts similarity index 88% rename from server/api/[solution-id]/user-stories/index.post.ts rename to server/api/user-stories/index.post.ts index 356ba129..703ec1d6 100644 --- a/server/api/[solution-id]/user-stories/index.post.ts +++ b/server/api/user-stories/index.post.ts @@ -2,11 +2,8 @@ import { z } from "zod" import { MoscowPriority, Outcome, Stakeholder, FunctionalBehavior, UserStory } from "~/server/domain/requirements/index.js" import { fork } from "~/server/data/orm" -const paramSchema = z.object({ - solutionId: z.string().uuid() -}) - const bodySchema = z.object({ + solutionId: z.string().uuid(), name: z.string(), statement: z.string(), primaryActorId: z.string().uuid(), @@ -19,9 +16,8 @@ const bodySchema = z.object({ * Creates a new user story and returns its id */ export default defineEventHandler(async (event) => { - const { solutionId } = await validateEventParams(event, paramSchema), - body = await validateEventBody(event, bodySchema), - { solution, sessionUser } = await assertSolutionContributor(event, solutionId), + const body = await validateEventBody(event, bodySchema), + { solution, sessionUser } = await assertSolutionContributor(event, body.solutionId), em = fork() const [primaryActor, outcome, functionalBehavior] = await Promise.all([ diff --git a/server/data/models/AppUserOrganizationRoleSchema.ts b/server/data/models/AppUserOrganizationRoleSchema.ts index e682b364..a220c324 100644 --- a/server/data/models/AppUserOrganizationRoleSchema.ts +++ b/server/data/models/AppUserOrganizationRoleSchema.ts @@ -8,16 +8,12 @@ export default new EntitySchema({ appUser: { kind: 'm:1', entity: 'AppUser', - primary: true, - ref: true, - cascade: [Cascade.REMOVE] + primary: true }, organization: { kind: 'm:1', entity: 'Organization', - ref: true, - primary: true, - cascade: [Cascade.REMOVE] + primary: true }, role: { enum: true, diff --git a/server/data/models/EnvironmentComponentSchema.ts b/server/data/models/EnvironmentComponentSchema.ts index 4ac0721e..429b3a93 100644 --- a/server/data/models/EnvironmentComponentSchema.ts +++ b/server/data/models/EnvironmentComponentSchema.ts @@ -6,6 +6,6 @@ export default new EntitySchema({ class: EnvironmentComponent, extends: RequirementSchema, properties: { - parentComponent: { kind: 'm:1', entity: 'EnvironmentComponent', ref: true, nullable: true } + parentComponent: { kind: 'm:1', entity: 'EnvironmentComponent', nullable: true } } }) \ No newline at end of file diff --git a/server/data/models/GlossaryTermSchema.ts b/server/data/models/GlossaryTermSchema.ts index f729cb70..14ac79c0 100644 --- a/server/data/models/GlossaryTermSchema.ts +++ b/server/data/models/GlossaryTermSchema.ts @@ -6,6 +6,6 @@ export default new EntitySchema({ class: GlossaryTerm, extends: RequirementSchema, properties: { - parentComponent: { kind: 'm:1', entity: 'GlossaryTerm', ref: true, nullable: true } + parentComponent: { kind: 'm:1', entity: 'GlossaryTerm', nullable: true } } }) \ No newline at end of file diff --git a/server/data/models/RequirementSchema.ts b/server/data/models/RequirementSchema.ts index aa8e12f9..32c7fcdb 100644 --- a/server/data/models/RequirementSchema.ts +++ b/server/data/models/RequirementSchema.ts @@ -1,4 +1,4 @@ -import { EntitySchema } from "@mikro-orm/core"; +import { Cascade, EntitySchema } from "@mikro-orm/core"; import { Requirement } from "../../domain/requirements/index.js"; export default new EntitySchema({ @@ -8,10 +8,10 @@ export default new EntitySchema({ id: { type: 'uuid', primary: true }, name: { type: 'string', nullable: false }, statement: { type: 'string', nullable: false }, - solution: { kind: 'm:1', entity: 'Solution', ref: true, nullable: false }, + solution: { kind: 'm:1', entity: 'Solution' }, lastModified: { type: 'datetime', nullable: false, onCreate: () => new Date(), onUpdate: () => new Date() }, modifiedBy: { - kind: 'm:1', entity: 'AppUser', ref: true, nullable: false, + kind: 'm:1', entity: 'AppUser', nullable: false, // System Admin is the default user for the initial migration // This can be removed in v0.14.0 or later default: 'ac594919-50e3-438a-b9bc-efb8a8654243' diff --git a/server/data/models/ScenarioSchema.ts b/server/data/models/ScenarioSchema.ts index 685d9b39..d347960d 100644 --- a/server/data/models/ScenarioSchema.ts +++ b/server/data/models/ScenarioSchema.ts @@ -7,6 +7,6 @@ export default new EntitySchema({ class: Scenario, extends: BehaviorSchema, properties: { - primaryActor: { kind: 'm:1', entity: 'Stakeholder', ref: true, nullable: false } + primaryActor: { kind: 'm:1', entity: 'Stakeholder', nullable: false } } }) \ No newline at end of file diff --git a/server/data/models/StakeholderSchema.ts b/server/data/models/StakeholderSchema.ts index 645b0d28..5c5fb580 100644 --- a/server/data/models/StakeholderSchema.ts +++ b/server/data/models/StakeholderSchema.ts @@ -12,6 +12,6 @@ export default new EntitySchema({ availability: { type: 'number', nullable: false, check: 'availability >= 0 AND availability <= 100' }, segmentation: { enum: true, items: () => StakeholderSegmentation, nullable: false }, category: { enum: true, items: () => StakeholderCategory, nullable: false }, - parentComponent: { kind: 'm:1', entity: 'Stakeholder', ref: true, nullable: true } + parentComponent: { kind: 'm:1', entity: 'Stakeholder', nullable: true } } }) \ No newline at end of file diff --git a/server/data/models/SystemComponentSchema.ts b/server/data/models/SystemComponentSchema.ts index 1b28f437..fabe4cae 100644 --- a/server/data/models/SystemComponentSchema.ts +++ b/server/data/models/SystemComponentSchema.ts @@ -6,6 +6,6 @@ export default new EntitySchema({ class: SystemComponent, extends: RequirementSchema, properties: { - parentComponent: { kind: 'm:1', entity: 'SystemComponent', ref: true, nullable: true } + parentComponent: { kind: 'm:1', entity: 'SystemComponent', nullable: true } } }) \ No newline at end of file diff --git a/server/utils/assertOrgAdmin.ts b/server/utils/assertOrgAdmin.ts index fbf88c74..38a9823b 100644 --- a/server/utils/assertOrgAdmin.ts +++ b/server/utils/assertOrgAdmin.ts @@ -25,12 +25,13 @@ export default async function assertOrgAdmin(event: H3Event const sessionUserOrgRole = await em.findOne(AppUserOrganizationRole, { appUser: session.id, organization - }); + }), + isOrgAdmin = sessionUserOrgRole?.role && [AppRole.ORGANIZATION_ADMIN].includes(sessionUserOrgRole?.role) - if (!session.isSystemAdmin && sessionUserOrgRole?.role !== AppRole.ORGANIZATION_ADMIN) + if (!session.isSystemAdmin && !isOrgAdmin) throw createError({ statusCode: 403, - statusMessage: 'Forbidden: You do not have permission to view these items' + statusMessage: 'Forbidden: You do not have permission to access these items' }) return { diff --git a/server/utils/assertOrgContributor.ts b/server/utils/assertOrgContributor.ts index 375f1f84..75b5d713 100644 --- a/server/utils/assertOrgContributor.ts +++ b/server/utils/assertOrgContributor.ts @@ -25,12 +25,13 @@ export default async function assertOrgContributor(event: H3Event