diff --git a/drizzle/migrations/0002_short_custom_field_keys.sql b/drizzle/migrations/0002_short_custom_field_keys.sql new file mode 100644 index 0000000..07bced3 --- /dev/null +++ b/drizzle/migrations/0002_short_custom_field_keys.sql @@ -0,0 +1,10 @@ +ALTER TABLE "custom_fields" ADD COLUMN "key" text; +--> statement-breakpoint +UPDATE "custom_fields" +SET "key" = trim(both '_' from regexp_replace(lower("name"), '[^a-z0-9]+', '_', 'g')); +--> statement-breakpoint +UPDATE "custom_fields" SET "key" = 'field_' || substring("id"::text, 1, 8) WHERE "key" IS NULL OR "key" = ''; +--> statement-breakpoint +ALTER TABLE "custom_fields" ALTER COLUMN "key" SET NOT NULL; +--> statement-breakpoint +ALTER TABLE "custom_fields" ADD CONSTRAINT "custom_fields_key_unique" UNIQUE("key"); diff --git a/drizzle/migrations/meta/_journal.json b/drizzle/migrations/meta/_journal.json index e79fa0f..5a065b8 100644 --- a/drizzle/migrations/meta/_journal.json +++ b/drizzle/migrations/meta/_journal.json @@ -15,6 +15,13 @@ "when": 1780867177929, "tag": "0001_lovely_quentin_quire", "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1780904200000, + "tag": "0002_short_custom_field_keys", + "breakpoints": true } ] -} \ No newline at end of file +} diff --git a/package.json b/package.json index 03debb3..1f96fc5 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,13 @@ "module": "src/index.ts", "type": "module", "private": true, + "scripts": { + "dev:backend": "bun run src/index.ts", + "db:migrate": "bun run src/db/migrate.ts", + "db:seed": "bun run src/db/seed.ts", + "db:seed:reset": "bun run src/db/seed.ts --reset", + "smoke": "bun run scripts/smoke-test.ts" + }, "devDependencies": { "@types/bun": "latest", "@types/handlebars": "^4.1.0", diff --git a/src/db/schema.ts b/src/db/schema.ts index b625949..1ccede2 100644 --- a/src/db/schema.ts +++ b/src/db/schema.ts @@ -83,6 +83,7 @@ export const scrips = pgTable('scrips', { export const customFields = pgTable('custom_fields', { id: uuid('id').primaryKey().defaultRandom(), + key: text('key').notNull().unique(), name: text('name').notNull(), field_type: text('field_type').notNull(), values: jsonb('values'), diff --git a/src/index.ts b/src/index.ts index 9f1fff9..44e2c71 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,8 @@ import { createQueuesRouter } from './routes/queues.ts'; import { createScripsRouter } from './routes/scrips.ts'; import { createCustomFieldsRouter } from './routes/custom-fields.ts'; import { createLifecyclesRouter } from './routes/lifecycles.ts'; +import { createUsersRouter } from './routes/users.ts'; +import { createTemplatesRouter } from './routes/templates.ts'; let db: Db | null = null; @@ -31,6 +33,8 @@ app.route('/queues', createQueuesRouter(getDb())); app.route('/scrips', createScripsRouter(getDb())); app.route('/custom-fields', createCustomFieldsRouter(getDb())); app.route('/lifecycles', createLifecyclesRouter(getDb())); +app.route('/users', createUsersRouter(getDb())); +app.route('/templates', createTemplatesRouter(getDb())); export default app; export { app }; @@ -41,6 +45,7 @@ if (Bun.main === import.meta.path) { fetch: app.fetch, port: config.SERVER_PORT, hostname: config.SERVER_HOST, + development: false, }); console.log(`Server running at http://${config.SERVER_HOST}:${config.SERVER_PORT}`); } diff --git a/src/models/ticket.ts b/src/models/ticket.ts index 27ccbb3..a33f40d 100644 --- a/src/models/ticket.ts +++ b/src/models/ticket.ts @@ -7,12 +7,14 @@ export type Ticket = InferSelectModel; export const CreateTicketSchema = z.object({ subject: z.string().min(1), queue_id: z.string().uuid(), + description: z.string().trim().optional(), + custom_fields: z.record(z.string(), z.string()).optional(), }); export const UpdateTicketSchema = z.object({ subject: z.string().min(1).optional(), status: z.string().min(1).optional(), - owner_id: z.string().uuid().optional(), + owner_id: z.string().uuid().nullable().optional(), }); export const CommentSchema = z.object({