From a55d08fffe9a90eb1c79a73a7cd99e05ec3f73e6 Mon Sep 17 00:00:00 2001 From: Lukas May Date: Mon, 2 Feb 2026 13:32:19 +0100 Subject: [PATCH] feat(14-01): add phase_dependencies table to schema - Add phase_dependencies table mirroring task_dependencies pattern - Add phaseId and dependsOnPhaseId FK columns with cascade delete - Add phasesRelations with dependsOn and dependents many relations - Add phaseDependenciesRelations with phase and dependsOnPhase one relations - Export PhaseDependency and NewPhaseDependency types --- src/db/schema.ts | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/db/schema.ts b/src/db/schema.ts index 28e367d..17fdfcd 100644 --- a/src/db/schema.ts +++ b/src/db/schema.ts @@ -60,11 +60,46 @@ export const phasesRelations = relations(phases, ({ one, many }) => ({ references: [initiatives.id], }), plans: many(plans), + // Dependencies: phases this phase depends on + dependsOn: many(phaseDependencies, { relationName: 'dependentPhase' }), + // Dependents: phases that depend on this phase + dependents: many(phaseDependencies, { relationName: 'dependencyPhase' }), })); export type Phase = InferSelectModel; export type NewPhase = InferInsertModel; +// ============================================================================ +// PHASE DEPENDENCIES +// ============================================================================ + +export const phaseDependencies = sqliteTable('phase_dependencies', { + id: text('id').primaryKey(), + phaseId: text('phase_id') + .notNull() + .references(() => phases.id, { onDelete: 'cascade' }), + dependsOnPhaseId: text('depends_on_phase_id') + .notNull() + .references(() => phases.id, { onDelete: 'cascade' }), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull(), +}); + +export const phaseDependenciesRelations = relations(phaseDependencies, ({ one }) => ({ + phase: one(phases, { + fields: [phaseDependencies.phaseId], + references: [phases.id], + relationName: 'dependentPhase', + }), + dependsOnPhase: one(phases, { + fields: [phaseDependencies.dependsOnPhaseId], + references: [phases.id], + relationName: 'dependencyPhase', + }), +})); + +export type PhaseDependency = InferSelectModel; +export type NewPhaseDependency = InferInsertModel; + // ============================================================================ // PLANS // ============================================================================