| 1 | import { createId } from '@paralleldrive/cuid2' |
| 2 | import { |
| 3 | integer, |
| 4 | pgEnum, |
| 5 | pgTable, |
| 6 | text, |
| 7 | timestamp, |
| 8 | uniqueIndex, |
| 9 | } from 'drizzle-orm/pg-core' |
| 10 | import { projects } |
| 11 | import { requirements } |
| 12 | |
| 13 | export const milestoneStatusEnum = |
| 14 | 'pending', |
| 15 | 'in_progress', |
| 16 | 'completed', |
| 17 | 'blocked', |
| 18 | ]) |
| 19 | |
| 20 | export const milestones = |
| 21 | id: text('id |
| 22 | .primaryKey() |
| 23 | .$defaultFn(() => |
| 24 | projectId: text('project_id |
| 25 | .references(() => |
| 26 | .notNull(), |
| 27 | name: text('name |
| 28 | description: text('description |
| 29 | status: milestoneStatusEnum('status |
| 30 | sortOrder: integer('sort_order |
| 31 | dueDate: timestamp('due_date |
| 32 | completedAt: timestamp('completed_at |
| 33 | budgetMinutes: integer('budget_minutes |
| 34 | currency: text('currency |
| 35 | budgetAmountCents: integer('budget_amount_cents |
| 36 | blockReason: text('block_reason |
| 37 | createdAt: timestamp('created_at |
| 38 | updatedAt: timestamp('updated_at |
| 39 | .defaultNow() |
| 40 | .$onUpdate(() => |
| 41 | .notNull(), |
| 42 | }) |
| 43 | |
| 44 | export const milestoneRequirements = |
| 45 | 'milestone_requirements', |
| 46 | { |
| 47 | id: text('id |
| 48 | .primaryKey() |
| 49 | .$defaultFn(() => |
| 50 | milestoneId: text('milestone_id |
| 51 | .references(() => |
| 52 | .notNull(), |
| 53 | requirementId: text('requirement_id |
| 54 | .references(() => |
| 55 | .notNull(), |
| 56 | sortOrder: integer('sort_order |
| 57 | }, |
| 58 | (table) => |
| 59 | uniqueIndex('milestone_requirement_unique'). |
| 60 | table.milestoneId, |
| 61 | table.requirementId |
| 62 | ), |
| 63 | ] |
| 64 | ) |