feat(tickets): log when transcripts are viewed
vi v@vt3e.cat
Thu, 05 Mar 2026 03:25:29 +0000
2 files changed,
44 insertions(+),
2 deletions(-)
M
src/database/schema/tickets.ts
→
src/database/schema/tickets.ts
@@ -61,18 +61,46 @@ },
(t) => [index("ticket_msgs_ticket_idx").on(t.ticketId)], ); +export const ticketAccessLogs = sqliteTable( + "ticket_access_logs", + { + id: integer("id").primaryKey({ autoIncrement: true }), + ticketId: integer("ticket_id") + .references(() => tickets.id, { onDelete: "cascade" }) + .notNull(), + + userId: text("user_id").notNull(), + action: text("action", { enum: ["view_transcript"] }).notNull(), + + createdAt: integer("created_at", { mode: "timestamp" }) + .default(sql`(unixepoch())`) + .notNull(), + }, + (t) => [index("ticket_access_logs_ticket_idx").on(t.ticketId)], +); + export const TicketRelations = defineRelations( - { tickets, ticketMessages }, + { tickets, ticketMessages, ticketAccessLogs }, (r) => ({ tickets: { messages: r.many.ticketMessages({ from: r.tickets.id, to: r.ticketMessages.ticketId, }), + accessLogs: r.many.ticketAccessLogs({ + from: r.tickets.id, + to: r.ticketAccessLogs.ticketId, + }), }, ticketMessages: { ticket: r.one.tickets({ from: r.ticketMessages.ticketId, + to: r.tickets.id, + }), + }, + ticketAccessLogs: { + ticket: r.one.tickets({ + from: r.ticketAccessLogs.ticketId, to: r.tickets.id, }), },