feat(14-01): add dependency methods to PhaseRepository
- Add createDependency(phaseId, dependsOnPhaseId) to interface and adapter - Add getDependencies(phaseId) returning IDs of phases this phase depends on - Add getDependents(phaseId) returning IDs of phases that depend on this phase - Import phaseDependencies table in DrizzlePhaseRepository - Follow exact pattern from DrizzleTaskRepository.createDependency
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
import { eq, asc, and, max } from 'drizzle-orm';
|
import { eq, asc, and, max } from 'drizzle-orm';
|
||||||
import { nanoid } from 'nanoid';
|
import { nanoid } from 'nanoid';
|
||||||
import type { DrizzleDatabase } from '../../index.js';
|
import type { DrizzleDatabase } from '../../index.js';
|
||||||
import { phases, type Phase } from '../../schema.js';
|
import { phases, phaseDependencies, type Phase } from '../../schema.js';
|
||||||
import type {
|
import type {
|
||||||
PhaseRepository,
|
PhaseRepository,
|
||||||
CreatePhaseData,
|
CreatePhaseData,
|
||||||
@@ -102,4 +102,34 @@ export class DrizzlePhaseRepository implements PhaseRepository {
|
|||||||
|
|
||||||
await this.db.delete(phases).where(eq(phases.id, id));
|
await this.db.delete(phases).where(eq(phases.id, id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async createDependency(phaseId: string, dependsOnPhaseId: string): Promise<void> {
|
||||||
|
const id = nanoid();
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
await this.db.insert(phaseDependencies).values({
|
||||||
|
id,
|
||||||
|
phaseId,
|
||||||
|
dependsOnPhaseId,
|
||||||
|
createdAt: now,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async getDependencies(phaseId: string): Promise<string[]> {
|
||||||
|
const result = await this.db
|
||||||
|
.select({ dependsOnPhaseId: phaseDependencies.dependsOnPhaseId })
|
||||||
|
.from(phaseDependencies)
|
||||||
|
.where(eq(phaseDependencies.phaseId, phaseId));
|
||||||
|
|
||||||
|
return result.map((row) => row.dependsOnPhaseId);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getDependents(phaseId: string): Promise<string[]> {
|
||||||
|
const result = await this.db
|
||||||
|
.select({ phaseId: phaseDependencies.phaseId })
|
||||||
|
.from(phaseDependencies)
|
||||||
|
.where(eq(phaseDependencies.dependsOnPhaseId, phaseId));
|
||||||
|
|
||||||
|
return result.map((row) => row.phaseId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,4 +71,23 @@ export interface PhaseRepository {
|
|||||||
* Cascades to child plans and tasks via FK constraints.
|
* Cascades to child plans and tasks via FK constraints.
|
||||||
*/
|
*/
|
||||||
delete(id: string): Promise<void>;
|
delete(id: string): Promise<void>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a dependency between two phases.
|
||||||
|
* The phase identified by phaseId will depend on dependsOnPhaseId.
|
||||||
|
* Both phases must exist.
|
||||||
|
*/
|
||||||
|
createDependency(phaseId: string, dependsOnPhaseId: string): Promise<void>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get IDs of phases that this phase depends on.
|
||||||
|
* Returns empty array if no dependencies.
|
||||||
|
*/
|
||||||
|
getDependencies(phaseId: string): Promise<string[]>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get IDs of phases that depend on this phase.
|
||||||
|
* Returns empty array if no dependents.
|
||||||
|
*/
|
||||||
|
getDependents(phaseId: string): Promise<string[]>;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user