session.sql.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { sqliteTable, text, integer, index, primaryKey } from "drizzle-orm/sqlite-core"
  2. import { ProjectTable } from "../project/project.sql"
  3. import type { MessageV2 } from "./message-v2"
  4. import type { Snapshot } from "@/snapshot"
  5. import type { PermissionNext } from "@/permission/next"
  6. import { Timestamps } from "@/storage/schema.sql"
  7. type PartData = Omit<MessageV2.Part, "id" | "sessionID" | "messageID">
  8. type InfoData = Omit<MessageV2.Info, "id" | "sessionID">
  9. export const SessionTable = sqliteTable(
  10. "session",
  11. {
  12. id: text().primaryKey(),
  13. project_id: text()
  14. .notNull()
  15. .references(() => ProjectTable.id, { onDelete: "cascade" }),
  16. parent_id: text(),
  17. slug: text().notNull(),
  18. directory: text().notNull(),
  19. title: text().notNull(),
  20. version: text().notNull(),
  21. share_url: text(),
  22. summary_additions: integer(),
  23. summary_deletions: integer(),
  24. summary_files: integer(),
  25. summary_diffs: text({ mode: "json" }).$type<Snapshot.FileDiff[]>(),
  26. revert: text({ mode: "json" }).$type<{ messageID: string; partID?: string; snapshot?: string; diff?: string }>(),
  27. permission: text({ mode: "json" }).$type<PermissionNext.Ruleset>(),
  28. ...Timestamps,
  29. time_compacting: integer(),
  30. time_archived: integer(),
  31. },
  32. (table) => [index("session_project_idx").on(table.project_id), index("session_parent_idx").on(table.parent_id)],
  33. )
  34. export const MessageTable = sqliteTable(
  35. "message",
  36. {
  37. id: text().primaryKey(),
  38. session_id: text()
  39. .notNull()
  40. .references(() => SessionTable.id, { onDelete: "cascade" }),
  41. ...Timestamps,
  42. data: text({ mode: "json" }).notNull().$type<InfoData>(),
  43. },
  44. (table) => [index("message_session_idx").on(table.session_id)],
  45. )
  46. export const PartTable = sqliteTable(
  47. "part",
  48. {
  49. id: text().primaryKey(),
  50. message_id: text()
  51. .notNull()
  52. .references(() => MessageTable.id, { onDelete: "cascade" }),
  53. session_id: text().notNull(),
  54. ...Timestamps,
  55. data: text({ mode: "json" }).notNull().$type<PartData>(),
  56. },
  57. (table) => [index("part_message_idx").on(table.message_id), index("part_session_idx").on(table.session_id)],
  58. )
  59. export const TodoTable = sqliteTable(
  60. "todo",
  61. {
  62. session_id: text()
  63. .notNull()
  64. .references(() => SessionTable.id, { onDelete: "cascade" }),
  65. content: text().notNull(),
  66. status: text().notNull(),
  67. priority: text().notNull(),
  68. position: integer().notNull(),
  69. ...Timestamps,
  70. },
  71. (table) => [
  72. primaryKey({ columns: [table.session_id, table.position] }),
  73. index("todo_session_idx").on(table.session_id),
  74. ],
  75. )
  76. export const PermissionTable = sqliteTable("permission", {
  77. project_id: text()
  78. .primaryKey()
  79. .references(() => ProjectTable.id, { onDelete: "cascade" }),
  80. ...Timestamps,
  81. data: text({ mode: "json" }).notNull().$type<PermissionNext.Ruleset>(),
  82. })