diff --git a/packages/db/src/migrations/0108_document_company_cascade.sql b/packages/db/src/migrations/0108_document_company_cascade.sql new file mode 100644 index 00000000000..948c1347685 --- /dev/null +++ b/packages/db/src/migrations/0108_document_company_cascade.sql @@ -0,0 +1,31 @@ +DO $$ BEGIN + IF EXISTS ( + SELECT 1 FROM "pg_constraint" WHERE "conname" = 'document_revisions_company_id_companies_id_fk' + ) THEN + ALTER TABLE "document_revisions" DROP CONSTRAINT "document_revisions_company_id_companies_id_fk"; + END IF; +END $$; +--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS ( + SELECT 1 FROM "pg_constraint" WHERE "conname" = 'document_revisions_company_id_companies_id_fk' + ) THEN + ALTER TABLE "document_revisions" ADD CONSTRAINT "document_revisions_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE cascade ON UPDATE no action; + END IF; +END $$; +--> statement-breakpoint +DO $$ BEGIN + IF EXISTS ( + SELECT 1 FROM "pg_constraint" WHERE "conname" = 'documents_company_id_companies_id_fk' + ) THEN + ALTER TABLE "documents" DROP CONSTRAINT "documents_company_id_companies_id_fk"; + END IF; +END $$; +--> statement-breakpoint +DO $$ BEGIN + IF NOT EXISTS ( + SELECT 1 FROM "pg_constraint" WHERE "conname" = 'documents_company_id_companies_id_fk' + ) THEN + ALTER TABLE "documents" ADD CONSTRAINT "documents_company_id_companies_id_fk" FOREIGN KEY ("company_id") REFERENCES "public"."companies"("id") ON DELETE cascade ON UPDATE no action; + END IF; +END $$; diff --git a/packages/db/src/migrations/meta/_journal.json b/packages/db/src/migrations/meta/_journal.json index 04c7aa50cc1..be7eb6feffb 100644 --- a/packages/db/src/migrations/meta/_journal.json +++ b/packages/db/src/migrations/meta/_journal.json @@ -771,6 +771,13 @@ "when": 1781902300000, "tag": "0109_routine_description_annotations", "breakpoints": true + }, + { + "idx": 108, + "version": "7", + "when": 1781902300000, + "tag": "0108_document_company_cascade", + "breakpoints": true } ] } diff --git a/packages/db/src/schema/document_revisions.ts b/packages/db/src/schema/document_revisions.ts index cdc8a18f537..d966b33329e 100644 --- a/packages/db/src/schema/document_revisions.ts +++ b/packages/db/src/schema/document_revisions.ts @@ -8,7 +8,7 @@ export const documentRevisions = pgTable( "document_revisions", { id: uuid("id").primaryKey().defaultRandom(), - companyId: uuid("company_id").notNull().references(() => companies.id), + companyId: uuid("company_id").notNull().references(() => companies.id, { onDelete: "cascade" }), documentId: uuid("document_id").notNull().references(() => documents.id, { onDelete: "cascade" }), revisionNumber: integer("revision_number").notNull(), title: text("title"), diff --git a/packages/db/src/schema/documents.ts b/packages/db/src/schema/documents.ts index 7dcc0f4578d..14039e1d37e 100644 --- a/packages/db/src/schema/documents.ts +++ b/packages/db/src/schema/documents.ts @@ -7,7 +7,7 @@ export const documents = pgTable( "documents", { id: uuid("id").primaryKey().defaultRandom(), - companyId: uuid("company_id").notNull().references(() => companies.id), + companyId: uuid("company_id").notNull().references(() => companies.id, { onDelete: "cascade" }), title: text("title"), format: text("format").notNull().default("markdown"), latestBody: text("latest_body").notNull(), diff --git a/server/src/routes/openapi.ts b/server/src/routes/openapi.ts index 82ac734ef6a..808fd7d9557 100644 --- a/server/src/routes/openapi.ts +++ b/server/src/routes/openapi.ts @@ -4544,6 +4544,8 @@ registerCurrentRoute({ for (const route of [ ["get", "/api/routines/{id}/revisions", "List routine revisions"], ["post", "/api/routines/{id}/revisions/{revisionId}/restore", "Restore a routine revision"], + ["get", "/api/routines/{id}/description/annotations", "List routine description annotation threads"], + ["get", "/api/routines/{id}/description/annotations/{threadId}", "Get a routine description annotation thread"], ] as const) { registerCurrentRoute({ method: route[0], @@ -4553,6 +4555,32 @@ for (const route of [ }); } +registerCurrentRoute({ + method: "post", + path: "/api/routines/{id}/description/annotations", + tags: ["routines"], + summary: "Create a routine description annotation thread", + body: createDocumentAnnotationThreadSchema, + responses: { 201: r.ok(), 400: r.badRequest, 401: r.unauthorized, 404: r.notFound }, +}); + +registerCurrentRoute({ + method: "post", + path: "/api/routines/{id}/description/annotations/{threadId}/comments", + tags: ["routines"], + summary: "Add a routine description annotation comment", + body: createDocumentAnnotationCommentSchema, + responses: { 201: r.ok(), 400: r.badRequest, 401: r.unauthorized, 404: r.notFound }, +}); + +registerCurrentRoute({ + method: "patch", + path: "/api/routines/{id}/description/annotations/{threadId}", + tags: ["routines"], + summary: "Update a routine description annotation thread", + body: updateDocumentAnnotationThreadSchema, +}); + const pluginLocalFolderRequestSchema = z.object({ path: z.string().min(1), access: z.enum(["read", "readWrite"]).optional(),