@orthacms/content-server 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/dist/index.d.ts +16 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +41 -1
  4. package/dist/lib/content.module.d.ts.map +1 -1
  5. package/dist/lib/content.module.js +31 -1
  6. package/dist/lib/copilot/entry-proposal.applier.d.ts.map +1 -1
  7. package/dist/lib/copilot/entry-proposal.applier.js +5 -4
  8. package/dist/lib/docs/describe-content-api.d.ts +7 -0
  9. package/dist/lib/docs/describe-content-api.d.ts.map +1 -1
  10. package/dist/lib/docs/describe-content-api.js +177 -53
  11. package/dist/lib/docs/describe-views-api.d.ts +19 -0
  12. package/dist/lib/docs/describe-views-api.d.ts.map +1 -0
  13. package/dist/lib/docs/describe-views-api.js +76 -0
  14. package/dist/lib/docs/field-schema.d.ts.map +1 -1
  15. package/dist/lib/docs/field-schema.js +36 -2
  16. package/dist/lib/docs/openapi-writer.d.ts +49 -0
  17. package/dist/lib/docs/openapi-writer.d.ts.map +1 -0
  18. package/dist/lib/docs/openapi-writer.js +76 -0
  19. package/dist/lib/docs/public-api-schemas.d.ts +45 -0
  20. package/dist/lib/docs/public-api-schemas.d.ts.map +1 -0
  21. package/dist/lib/docs/public-api-schemas.js +377 -0
  22. package/dist/lib/docs/views-schemas.d.ts +22 -0
  23. package/dist/lib/docs/views-schemas.d.ts.map +1 -0
  24. package/dist/lib/docs/views-schemas.js +156 -0
  25. package/dist/lib/entries/application/use-cases/bulk-publish-entries.use-case.d.ts +8 -2
  26. package/dist/lib/entries/application/use-cases/bulk-publish-entries.use-case.d.ts.map +1 -1
  27. package/dist/lib/entries/application/use-cases/bulk-publish-entries.use-case.js +19 -4
  28. package/dist/lib/entries/application/use-cases/bulk-unpublish-entries.use-case.d.ts +2 -2
  29. package/dist/lib/entries/application/use-cases/bulk-unpublish-entries.use-case.d.ts.map +1 -1
  30. package/dist/lib/entries/application/use-cases/bulk-unpublish-entries.use-case.js +14 -4
  31. package/dist/lib/entries/application/use-cases/publish-entry.use-case.d.ts +6 -8
  32. package/dist/lib/entries/application/use-cases/publish-entry.use-case.d.ts.map +1 -1
  33. package/dist/lib/entries/application/use-cases/publish-entry.use-case.js +10 -4
  34. package/dist/lib/entries/application/use-cases/unpublish-entry.use-case.d.ts +2 -5
  35. package/dist/lib/entries/application/use-cases/unpublish-entry.use-case.d.ts.map +1 -1
  36. package/dist/lib/entries/application/use-cases/unpublish-entry.use-case.js +6 -1
  37. package/dist/lib/entries/domain/entry.d.ts +8 -1
  38. package/dist/lib/entries/domain/entry.d.ts.map +1 -1
  39. package/dist/lib/entries/domain/entry.js +12 -12
  40. package/dist/lib/entries/domain/events/entry-events.d.ts +47 -5
  41. package/dist/lib/entries/domain/events/entry-events.d.ts.map +1 -1
  42. package/dist/lib/entries/domain/events/entry-events.js +26 -10
  43. package/dist/lib/entries/entries.constants.d.ts +10 -2
  44. package/dist/lib/entries/entries.constants.d.ts.map +1 -1
  45. package/dist/lib/entries/entries.constants.js +11 -2
  46. package/dist/lib/entries/http/controllers/bulk-entries.controller.d.ts +2 -2
  47. package/dist/lib/entries/http/controllers/bulk-entries.controller.d.ts.map +1 -1
  48. package/dist/lib/entries/http/controllers/bulk-entries.controller.js +8 -6
  49. package/dist/lib/entries/http/controllers/create-entry.controller.d.ts.map +1 -1
  50. package/dist/lib/entries/http/controllers/create-entry.controller.js +1 -1
  51. package/dist/lib/entries/http/controllers/update-entry.controller.d.ts.map +1 -1
  52. package/dist/lib/entries/http/controllers/update-entry.controller.js +1 -1
  53. package/dist/lib/entries/http/dto/extension-bag.validator.d.ts +14 -0
  54. package/dist/lib/entries/http/dto/extension-bag.validator.d.ts.map +1 -0
  55. package/dist/lib/entries/http/dto/extension-bag.validator.js +42 -0
  56. package/dist/lib/entries/http/dto/save-entry.dto.d.ts +16 -0
  57. package/dist/lib/entries/http/dto/save-entry.dto.d.ts.map +1 -1
  58. package/dist/lib/entries/http/dto/save-entry.dto.js +30 -0
  59. package/dist/lib/entries/infrastructure/persistence/entry-writer.service.d.ts +50 -8
  60. package/dist/lib/entries/infrastructure/persistence/entry-writer.service.d.ts.map +1 -1
  61. package/dist/lib/entries/infrastructure/persistence/entry-writer.service.js +183 -32
  62. package/dist/lib/entries/infrastructure/persistence/relation-link.service.d.ts +38 -5
  63. package/dist/lib/entries/infrastructure/persistence/relation-link.service.d.ts.map +1 -1
  64. package/dist/lib/entries/infrastructure/persistence/relation-link.service.js +38 -6
  65. package/dist/lib/entries/infrastructure/queries/entries.service.d.ts +3 -1
  66. package/dist/lib/entries/infrastructure/queries/entries.service.d.ts.map +1 -1
  67. package/dist/lib/entries/infrastructure/queries/entries.service.js +17 -5
  68. package/dist/lib/entries/infrastructure/queries/entry-match.query.d.ts +82 -0
  69. package/dist/lib/entries/infrastructure/queries/entry-match.query.d.ts.map +1 -0
  70. package/dist/lib/entries/infrastructure/queries/entry-match.query.js +152 -0
  71. package/dist/lib/extension/entry-filter-provider.d.ts +79 -0
  72. package/dist/lib/extension/entry-filter-provider.d.ts.map +1 -0
  73. package/dist/lib/extension/entry-filter-provider.js +149 -0
  74. package/dist/lib/extension/entry-write-extension.d.ts +185 -0
  75. package/dist/lib/extension/entry-write-extension.d.ts.map +1 -0
  76. package/dist/lib/extension/entry-write-extension.js +182 -0
  77. package/dist/lib/extension/read-scope.d.ts +107 -0
  78. package/dist/lib/extension/read-scope.d.ts.map +1 -0
  79. package/dist/lib/extension/read-scope.js +131 -0
  80. package/dist/lib/insights/docs/describe-content-insights-api.d.ts +23 -0
  81. package/dist/lib/insights/docs/describe-content-insights-api.d.ts.map +1 -0
  82. package/dist/lib/insights/docs/describe-content-insights-api.js +329 -0
  83. package/dist/lib/mcp/content-tools.provider.d.ts.map +1 -1
  84. package/dist/lib/mcp/content-tools.provider.js +10 -9
  85. package/dist/lib/public-api/http/controllers/public-entry-writes.controller.d.ts +14 -13
  86. package/dist/lib/public-api/http/controllers/public-entry-writes.controller.d.ts.map +1 -1
  87. package/dist/lib/public-api/http/controllers/public-entry-writes.controller.js +62 -46
  88. package/dist/lib/public-api/http/guards/api-token-workspace.guard.d.ts.map +1 -1
  89. package/dist/lib/public-api/http/guards/api-token-workspace.guard.js +8 -0
  90. package/dist/lib/public-api/infrastructure/public-entries.query.d.ts +14 -1
  91. package/dist/lib/public-api/infrastructure/public-entries.query.d.ts.map +1 -1
  92. package/dist/lib/public-api/infrastructure/public-entries.query.js +20 -3
  93. package/dist/lib/public-api/infrastructure/public-entry-writes.service.d.ts +10 -9
  94. package/dist/lib/public-api/infrastructure/public-entry-writes.service.d.ts.map +1 -1
  95. package/dist/lib/public-api/infrastructure/public-entry-writes.service.js +23 -24
  96. package/dist/lib/public-api/infrastructure/public-expansion.query.d.ts +16 -4
  97. package/dist/lib/public-api/infrastructure/public-expansion.query.d.ts.map +1 -1
  98. package/dist/lib/public-api/infrastructure/public-expansion.query.js +29 -9
  99. package/dist/lib/public-api/infrastructure/token-actor.d.ts +37 -0
  100. package/dist/lib/public-api/infrastructure/token-actor.d.ts.map +1 -0
  101. package/dist/lib/public-api/infrastructure/token-actor.js +58 -0
  102. package/dist/lib/revisions/application/use-cases/restore-revision.use-case.d.ts.map +1 -1
  103. package/dist/lib/revisions/application/use-cases/restore-revision.use-case.js +23 -1
  104. package/dist/lib/revisions/infrastructure/persistence/revision-snapshot.d.ts +7 -1
  105. package/dist/lib/revisions/infrastructure/persistence/revision-snapshot.d.ts.map +1 -1
  106. package/dist/lib/revisions/infrastructure/persistence/revision-snapshot.js +9 -2
  107. package/dist/lib/revisions/infrastructure/purge/revisions-workspace.purger.d.ts +28 -0
  108. package/dist/lib/revisions/infrastructure/purge/revisions-workspace.purger.d.ts.map +1 -0
  109. package/dist/lib/revisions/infrastructure/purge/revisions-workspace.purger.js +52 -0
  110. package/dist/lib/revisions/types/revision-view.d.ts +11 -0
  111. package/dist/lib/revisions/types/revision-view.d.ts.map +1 -1
  112. package/dist/lib/utils/content-plugin.d.ts.map +1 -1
  113. package/dist/lib/utils/content-plugin.js +10 -1
  114. package/dist/lib/utils/content-views-plugin.d.ts +28 -0
  115. package/dist/lib/utils/content-views-plugin.d.ts.map +1 -0
  116. package/dist/lib/utils/content-views-plugin.js +37 -0
  117. package/dist/lib/views/application/queries/saved-views.query.d.ts +16 -0
  118. package/dist/lib/views/application/queries/saved-views.query.d.ts.map +1 -0
  119. package/dist/lib/views/application/queries/saved-views.query.js +46 -0
  120. package/dist/lib/views/application/saved-view-access.service.d.ts +30 -0
  121. package/dist/lib/views/application/saved-view-access.service.d.ts.map +1 -0
  122. package/dist/lib/views/application/saved-view-access.service.js +55 -0
  123. package/dist/lib/views/application/use-cases/create-saved-view.use-case.d.ts +30 -0
  124. package/dist/lib/views/application/use-cases/create-saved-view.use-case.d.ts.map +1 -0
  125. package/dist/lib/views/application/use-cases/create-saved-view.use-case.js +81 -0
  126. package/dist/lib/views/application/use-cases/delete-saved-view.use-case.d.ts +18 -0
  127. package/dist/lib/views/application/use-cases/delete-saved-view.use-case.d.ts.map +1 -0
  128. package/dist/lib/views/application/use-cases/delete-saved-view.use-case.js +56 -0
  129. package/dist/lib/views/application/use-cases/set-default-view.use-case.d.ts +23 -0
  130. package/dist/lib/views/application/use-cases/set-default-view.use-case.d.ts.map +1 -0
  131. package/dist/lib/views/application/use-cases/set-default-view.use-case.js +51 -0
  132. package/dist/lib/views/application/use-cases/update-saved-view.use-case.d.ts +24 -0
  133. package/dist/lib/views/application/use-cases/update-saved-view.use-case.d.ts.map +1 -0
  134. package/dist/lib/views/application/use-cases/update-saved-view.use-case.js +90 -0
  135. package/dist/lib/views/application/view-scope.service.d.ts +25 -0
  136. package/dist/lib/views/application/view-scope.service.d.ts.map +1 -0
  137. package/dist/lib/views/application/view-scope.service.js +45 -0
  138. package/dist/lib/views/content-views.module.d.ts +22 -0
  139. package/dist/lib/views/content-views.module.d.ts.map +1 -0
  140. package/dist/lib/views/content-views.module.js +63 -0
  141. package/dist/lib/views/domain/errors/index.d.ts +6 -0
  142. package/dist/lib/views/domain/errors/index.d.ts.map +1 -0
  143. package/dist/lib/views/domain/errors/index.js +12 -0
  144. package/dist/lib/views/domain/errors/saved-view-forbidden.error.d.ts +10 -0
  145. package/dist/lib/views/domain/errors/saved-view-forbidden.error.d.ts.map +1 -0
  146. package/dist/lib/views/domain/errors/saved-view-forbidden.error.js +16 -0
  147. package/dist/lib/views/domain/errors/saved-view-limit-error.d.ts +9 -0
  148. package/dist/lib/views/domain/errors/saved-view-limit-error.d.ts.map +1 -0
  149. package/dist/lib/views/domain/errors/saved-view-limit-error.js +16 -0
  150. package/dist/lib/views/domain/errors/saved-view-name-taken.error.d.ts +5 -0
  151. package/dist/lib/views/domain/errors/saved-view-name-taken.error.d.ts.map +1 -0
  152. package/dist/lib/views/domain/errors/saved-view-name-taken.error.js +11 -0
  153. package/dist/lib/views/domain/errors/saved-view-not-found.error.d.ts +9 -0
  154. package/dist/lib/views/domain/errors/saved-view-not-found.error.d.ts.map +1 -0
  155. package/dist/lib/views/domain/errors/saved-view-not-found.error.js +15 -0
  156. package/dist/lib/views/domain/events/saved-view-events.d.ts +28 -0
  157. package/dist/lib/views/domain/events/saved-view-events.d.ts.map +1 -0
  158. package/dist/lib/views/domain/events/saved-view-events.js +38 -0
  159. package/dist/lib/views/domain/saved-view.d.ts +66 -0
  160. package/dist/lib/views/domain/saved-view.d.ts.map +1 -0
  161. package/dist/lib/views/domain/saved-view.js +18 -0
  162. package/dist/lib/views/domain/saved-view.repository.d.ts +77 -0
  163. package/dist/lib/views/domain/saved-view.repository.d.ts.map +1 -0
  164. package/dist/lib/views/domain/saved-view.repository.js +5 -0
  165. package/dist/lib/views/http/controllers/saved-views.controller.d.ts +45 -0
  166. package/dist/lib/views/http/controllers/saved-views.controller.d.ts.map +1 -0
  167. package/dist/lib/views/http/controllers/saved-views.controller.js +216 -0
  168. package/dist/lib/views/http/controllers/to-http-error.d.ts +10 -0
  169. package/dist/lib/views/http/controllers/to-http-error.d.ts.map +1 -0
  170. package/dist/lib/views/http/controllers/to-http-error.js +26 -0
  171. package/dist/lib/views/http/dto/save-view.dto.d.ts +54 -0
  172. package/dist/lib/views/http/dto/save-view.dto.d.ts.map +1 -0
  173. package/dist/lib/views/http/dto/save-view.dto.js +230 -0
  174. package/dist/lib/views/http/dto/view-payload.validator.d.ts +20 -0
  175. package/dist/lib/views/http/dto/view-payload.validator.d.ts.map +1 -0
  176. package/dist/lib/views/http/dto/view-payload.validator.js +52 -0
  177. package/dist/lib/views/infrastructure/persistence/drizzle-saved-view.repository.d.ts +26 -0
  178. package/dist/lib/views/infrastructure/persistence/drizzle-saved-view.repository.d.ts.map +1 -0
  179. package/dist/lib/views/infrastructure/persistence/drizzle-saved-view.repository.js +135 -0
  180. package/dist/lib/views/infrastructure/schema/external-refs.d.ts +68 -0
  181. package/dist/lib/views/infrastructure/schema/external-refs.d.ts.map +1 -0
  182. package/dist/lib/views/infrastructure/schema/external-refs.js +29 -0
  183. package/dist/lib/views/infrastructure/schema/index.d.ts +8 -0
  184. package/dist/lib/views/infrastructure/schema/index.d.ts.map +1 -0
  185. package/dist/lib/views/infrastructure/schema/index.js +13 -0
  186. package/dist/lib/views/infrastructure/schema/saved-views.d.ts +275 -0
  187. package/dist/lib/views/infrastructure/schema/saved-views.d.ts.map +1 -0
  188. package/dist/lib/views/infrastructure/schema/saved-views.js +87 -0
  189. package/dist/lib/views/views.constants.d.ts +26 -0
  190. package/dist/lib/views/views.constants.d.ts.map +1 -0
  191. package/dist/lib/views/views.constants.js +28 -0
  192. package/dist/lib/views/views.tokens.d.ts +17 -0
  193. package/dist/lib/views/views.tokens.d.ts.map +1 -0
  194. package/dist/lib/views/views.tokens.js +21 -0
  195. package/migrations/0000_saved_views.sql +29 -0
  196. package/migrations/meta/0000_snapshot.json +256 -0
  197. package/migrations/meta/_journal.json +13 -0
  198. package/package.json +13 -12
  199. package/dist/lib/entries/controllers/bulk-entries.controller.d.ts +0 -26
  200. package/dist/lib/entries/controllers/bulk-entries.controller.d.ts.map +0 -1
  201. package/dist/lib/entries/controllers/create-entry.controller.d.ts +0 -20
  202. package/dist/lib/entries/controllers/create-entry.controller.d.ts.map +0 -1
  203. package/dist/lib/entries/controllers/delete-entry.controller.d.ts +0 -24
  204. package/dist/lib/entries/controllers/delete-entry.controller.d.ts.map +0 -1
  205. package/dist/lib/entries/controllers/get-entry.controller.d.ts +0 -34
  206. package/dist/lib/entries/controllers/get-entry.controller.d.ts.map +0 -1
  207. package/dist/lib/entries/controllers/list-entries.controller.d.ts +0 -20
  208. package/dist/lib/entries/controllers/list-entries.controller.d.ts.map +0 -1
  209. package/dist/lib/entries/controllers/publish-entry.controller.d.ts +0 -19
  210. package/dist/lib/entries/controllers/publish-entry.controller.d.ts.map +0 -1
  211. package/dist/lib/entries/controllers/resolve-type.d.ts +0 -9
  212. package/dist/lib/entries/controllers/resolve-type.d.ts.map +0 -1
  213. package/dist/lib/entries/controllers/update-entry.controller.d.ts +0 -18
  214. package/dist/lib/entries/controllers/update-entry.controller.d.ts.map +0 -1
  215. package/dist/lib/entries/dto/bulk-ids.dto.d.ts +0 -11
  216. package/dist/lib/entries/dto/bulk-ids.dto.d.ts.map +0 -1
  217. package/dist/lib/entries/dto/list-entries-query.dto.d.ts +0 -46
  218. package/dist/lib/entries/dto/list-entries-query.dto.d.ts.map +0 -1
  219. package/dist/lib/entries/dto/relation-delta-map.validator.d.ts +0 -19
  220. package/dist/lib/entries/dto/relation-delta-map.validator.d.ts.map +0 -1
  221. package/dist/lib/entries/dto/save-entry.dto.d.ts +0 -46
  222. package/dist/lib/entries/dto/save-entry.dto.d.ts.map +0 -1
  223. package/dist/lib/entries/infrastructure/persistence/field-selection.d.ts +0 -24
  224. package/dist/lib/entries/infrastructure/persistence/field-selection.d.ts.map +0 -1
  225. package/dist/lib/entries/infrastructure/queries/entry-filter-schema.d.ts +0 -40
  226. package/dist/lib/entries/infrastructure/queries/entry-filter-schema.d.ts.map +0 -1
  227. package/dist/lib/entries/services/entries.service.d.ts +0 -59
  228. package/dist/lib/entries/services/entries.service.d.ts.map +0 -1
  229. package/dist/lib/entries/services/entry-counter.service.d.ts +0 -31
  230. package/dist/lib/entries/services/entry-counter.service.d.ts.map +0 -1
  231. package/dist/lib/entries/services/entry-filter-schema.d.ts +0 -32
  232. package/dist/lib/entries/services/entry-filter-schema.d.ts.map +0 -1
  233. package/dist/lib/entries/services/entry-row.d.ts +0 -56
  234. package/dist/lib/entries/services/entry-row.d.ts.map +0 -1
  235. package/dist/lib/entries/services/entry-writer.service.d.ts +0 -193
  236. package/dist/lib/entries/services/entry-writer.service.d.ts.map +0 -1
  237. package/dist/lib/entries/services/relation-link.service.d.ts +0 -115
  238. package/dist/lib/entries/services/relation-link.service.d.ts.map +0 -1
  239. package/dist/lib/extension/per-locale-relation.d.ts +0 -18
  240. package/dist/lib/extension/per-locale-relation.d.ts.map +0 -1
  241. package/dist/lib/public/controllers/get-public-entry.controller.d.ts +0 -26
  242. package/dist/lib/public/controllers/get-public-entry.controller.d.ts.map +0 -1
  243. package/dist/lib/public/controllers/list-public-entries.controller.d.ts +0 -24
  244. package/dist/lib/public/controllers/list-public-entries.controller.d.ts.map +0 -1
  245. package/dist/lib/public/controllers/public-schema.controller.d.ts +0 -18
  246. package/dist/lib/public/controllers/public-schema.controller.d.ts.map +0 -1
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DrizzleSavedViewRepository = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const database_1 = require("@orthacms/database");
7
+ const drizzle_orm_1 = require("drizzle-orm");
8
+ const saved_views_1 = require("../schema/saved-views");
9
+ const saved_view_1 = require("../../domain/saved-view");
10
+ const errors_1 = require("../../domain/errors");
11
+ /** The columns every read of this table projects. */
12
+ const COLUMNS = {
13
+ id: saved_views_1.savedViews.id,
14
+ workspaceId: saved_views_1.savedViews.workspaceId,
15
+ scope: saved_views_1.savedViews.scope,
16
+ ownerId: saved_views_1.savedViews.ownerId,
17
+ visibility: saved_views_1.savedViews.visibility,
18
+ name: saved_views_1.savedViews.name,
19
+ payload: saved_views_1.savedViews.payload,
20
+ position: saved_views_1.savedViews.position,
21
+ updatedAt: saved_views_1.savedViews.updatedAt
22
+ };
23
+ /** Narrows the enum column's `string` back to the domain union. */
24
+ function toRecord(row) {
25
+ return { ...row, visibility: row.visibility };
26
+ }
27
+ /** Drizzle adapter for {@link SavedViewRepository}. */
28
+ let DrizzleSavedViewRepository = class DrizzleSavedViewRepository {
29
+ uow;
30
+ constructor(uow) {
31
+ this.uow = uow;
32
+ }
33
+ /**
34
+ * The executor to run against: the ambient transaction when a caller opened
35
+ * one, the base connection otherwise.
36
+ *
37
+ * It exists so a view write and the `saved_view.*` event describing it
38
+ * commit together. Outside a unit of work this is the old behaviour
39
+ * exactly — `UnitOfWork.current()` falls back to the pool.
40
+ */
41
+ get db() {
42
+ return this.uow.current();
43
+ }
44
+ async listVisible(workspaceId, scope, readerId) {
45
+ const rows = await this.db
46
+ .select(COLUMNS)
47
+ .from(saved_views_1.savedViews)
48
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(saved_views_1.savedViews.workspaceId, workspaceId), (0, drizzle_orm_1.eq)(saved_views_1.savedViews.scope, scope),
49
+ // Own views at any visibility, plus everyone's shared ones.
50
+ (0, drizzle_orm_1.or)((0, drizzle_orm_1.eq)(saved_views_1.savedViews.ownerId, readerId), (0, drizzle_orm_1.eq)(saved_views_1.savedViews.visibility, saved_view_1.VIEW_VISIBILITY.Workspace))))
51
+ .orderBy((0, drizzle_orm_1.asc)(saved_views_1.savedViews.position), (0, drizzle_orm_1.asc)(saved_views_1.savedViews.createdAt), (0, drizzle_orm_1.asc)(saved_views_1.savedViews.id));
52
+ return rows.map(toRecord);
53
+ }
54
+ async findById(id) {
55
+ const [row] = await this.db
56
+ .select(COLUMNS)
57
+ .from(saved_views_1.savedViews)
58
+ .where((0, drizzle_orm_1.eq)(saved_views_1.savedViews.id, id))
59
+ .limit(1);
60
+ return row ? toRecord(row) : null;
61
+ }
62
+ async countForOwner(workspaceId, scope, ownerId) {
63
+ const [row] = await this.db
64
+ .select({ count: (0, drizzle_orm_1.sql) `count(*)::int` })
65
+ .from(saved_views_1.savedViews)
66
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(saved_views_1.savedViews.workspaceId, workspaceId), (0, drizzle_orm_1.eq)(saved_views_1.savedViews.scope, scope), (0, drizzle_orm_1.eq)(saved_views_1.savedViews.ownerId, ownerId)));
67
+ return row?.count ?? 0;
68
+ }
69
+ async create(view) {
70
+ const [row] = await this.db
71
+ .insert(saved_views_1.savedViews)
72
+ .values({
73
+ workspaceId: view.workspaceId,
74
+ scope: view.scope,
75
+ ownerId: view.ownerId,
76
+ visibility: view.visibility,
77
+ name: view.name,
78
+ payload: view.payload
79
+ })
80
+ .returning(COLUMNS);
81
+ return toRecord(row);
82
+ }
83
+ async update(id, patch) {
84
+ const [row] = await this.db
85
+ .update(saved_views_1.savedViews)
86
+ .set({
87
+ ...(patch.name !== undefined ? { name: patch.name } : {}),
88
+ ...(patch.visibility !== undefined
89
+ ? { visibility: patch.visibility }
90
+ : {}),
91
+ ...(patch.payload !== undefined
92
+ ? { payload: patch.payload }
93
+ : {})
94
+ })
95
+ .where((0, drizzle_orm_1.eq)(saved_views_1.savedViews.id, id))
96
+ .returning(COLUMNS);
97
+ // The use-case reads the row before patching, so a miss here means it
98
+ // was deleted in between — surface the same not-found the read would.
99
+ if (!row)
100
+ throw new errors_1.SavedViewNotFoundError(id);
101
+ return toRecord(row);
102
+ }
103
+ async delete(id) {
104
+ await this.db.delete(saved_views_1.savedViews).where((0, drizzle_orm_1.eq)(saved_views_1.savedViews.id, id));
105
+ }
106
+ async findDefaultId(userId, scope) {
107
+ const [row] = await this.db
108
+ .select({ viewId: saved_views_1.savedViewDefaults.viewId })
109
+ .from(saved_views_1.savedViewDefaults)
110
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(saved_views_1.savedViewDefaults.userId, userId), (0, drizzle_orm_1.eq)(saved_views_1.savedViewDefaults.scope, scope)))
111
+ .limit(1);
112
+ return row?.viewId ?? null;
113
+ }
114
+ async setDefault(userId, scope, viewId) {
115
+ await this.db
116
+ .insert(saved_views_1.savedViewDefaults)
117
+ .values({ userId, scope, viewId })
118
+ // One row per (user, scope) — re-pointing the default is an upsert,
119
+ // not a delete-then-insert that could lose the row on a crash.
120
+ .onConflictDoUpdate({
121
+ target: [saved_views_1.savedViewDefaults.userId, saved_views_1.savedViewDefaults.scope],
122
+ set: { viewId }
123
+ });
124
+ }
125
+ async clearDefault(userId, scope) {
126
+ await this.db
127
+ .delete(saved_views_1.savedViewDefaults)
128
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(saved_views_1.savedViewDefaults.userId, userId), (0, drizzle_orm_1.eq)(saved_views_1.savedViewDefaults.scope, scope)));
129
+ }
130
+ };
131
+ exports.DrizzleSavedViewRepository = DrizzleSavedViewRepository;
132
+ exports.DrizzleSavedViewRepository = DrizzleSavedViewRepository = tslib_1.__decorate([
133
+ (0, common_1.Injectable)(),
134
+ tslib_1.__metadata("design:paramtypes", [database_1.UnitOfWork])
135
+ ], DrizzleSavedViewRepository);
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Reference-only projections of the tables this feature's foreign keys target.
3
+ * Identity owns `users` and workspaces owns `workspaces` (with all their
4
+ * columns and their own migrations); these stubs exist so that:
5
+ *
6
+ * - the generated migration can emit the cross-context FKs
7
+ * `saved_views.owner_id → users(id)` and
8
+ * `saved_views.workspace_id → workspaces(id)` — the host applies identity's
9
+ * and workspaces' migrations before this plugin's, so both physical tables
10
+ * already exist when this one runs; and
11
+ * - `drizzle-kit generate` bundles a **pure-Drizzle** schema graph. Importing
12
+ * either runtime barrel here would pull NestJS providers into drizzle-kit's
13
+ * esbuild pass, which has no `experimentalDecorators` and fails on their
14
+ * parameter decorators.
15
+ *
16
+ * Deliberately **not** re-exported from `schema/index.ts`, so drizzle-kit
17
+ * references them only in the FKs and never emits a duplicate `CREATE TABLE`.
18
+ */
19
+ export declare const users: import("drizzle-orm/pg-core").PgTableWithColumns<{
20
+ name: "users";
21
+ schema: undefined;
22
+ columns: {
23
+ id: import("drizzle-orm/pg-core").PgColumn<{
24
+ name: "id";
25
+ tableName: "users";
26
+ dataType: "string";
27
+ columnType: "PgUUID";
28
+ data: string;
29
+ driverParam: string;
30
+ notNull: true;
31
+ hasDefault: false;
32
+ isPrimaryKey: true;
33
+ isAutoincrement: false;
34
+ hasRuntimeDefault: false;
35
+ enumValues: undefined;
36
+ baseColumn: never;
37
+ identity: undefined;
38
+ generated: undefined;
39
+ }, {}, {}>;
40
+ };
41
+ dialect: "pg";
42
+ }>;
43
+ /** @see users — same reference-only rationale, for the workspaces table. */
44
+ export declare const workspaces: import("drizzle-orm/pg-core").PgTableWithColumns<{
45
+ name: "workspaces";
46
+ schema: undefined;
47
+ columns: {
48
+ id: import("drizzle-orm/pg-core").PgColumn<{
49
+ name: "id";
50
+ tableName: "workspaces";
51
+ dataType: "string";
52
+ columnType: "PgUUID";
53
+ data: string;
54
+ driverParam: string;
55
+ notNull: true;
56
+ hasDefault: false;
57
+ isPrimaryKey: true;
58
+ isAutoincrement: false;
59
+ hasRuntimeDefault: false;
60
+ enumValues: undefined;
61
+ baseColumn: never;
62
+ identity: undefined;
63
+ generated: undefined;
64
+ }, {}, {}>;
65
+ };
66
+ dialect: "pg";
67
+ }>;
68
+ //# sourceMappingURL=external-refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-refs.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/infrastructure/schema/external-refs.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;EAEhB,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;EAErB,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.workspaces = exports.users = void 0;
4
+ const pg_core_1 = require("drizzle-orm/pg-core");
5
+ /**
6
+ * Reference-only projections of the tables this feature's foreign keys target.
7
+ * Identity owns `users` and workspaces owns `workspaces` (with all their
8
+ * columns and their own migrations); these stubs exist so that:
9
+ *
10
+ * - the generated migration can emit the cross-context FKs
11
+ * `saved_views.owner_id → users(id)` and
12
+ * `saved_views.workspace_id → workspaces(id)` — the host applies identity's
13
+ * and workspaces' migrations before this plugin's, so both physical tables
14
+ * already exist when this one runs; and
15
+ * - `drizzle-kit generate` bundles a **pure-Drizzle** schema graph. Importing
16
+ * either runtime barrel here would pull NestJS providers into drizzle-kit's
17
+ * esbuild pass, which has no `experimentalDecorators` and fails on their
18
+ * parameter decorators.
19
+ *
20
+ * Deliberately **not** re-exported from `schema/index.ts`, so drizzle-kit
21
+ * references them only in the FKs and never emits a duplicate `CREATE TABLE`.
22
+ */
23
+ exports.users = (0, pg_core_1.pgTable)('users', {
24
+ id: (0, pg_core_1.uuid)('id').primaryKey()
25
+ });
26
+ /** @see users — same reference-only rationale, for the workspaces table. */
27
+ exports.workspaces = (0, pg_core_1.pgTable)('workspaces', {
28
+ id: (0, pg_core_1.uuid)('id').primaryKey()
29
+ });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The saved-views schema barrel — also the entry point `drizzle.config.ts`
3
+ * diffs. `external-refs.ts` is deliberately absent: those stubs exist only so
4
+ * the foreign keys resolve, and re-exporting them here would make drizzle-kit
5
+ * emit a duplicate `CREATE TABLE users`.
6
+ */
7
+ export { savedViews, savedViewDefaults, viewVisibility } from './saved-views';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/infrastructure/schema/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.viewVisibility = exports.savedViewDefaults = exports.savedViews = void 0;
4
+ /**
5
+ * The saved-views schema barrel — also the entry point `drizzle.config.ts`
6
+ * diffs. `external-refs.ts` is deliberately absent: those stubs exist only so
7
+ * the foreign keys resolve, and re-exporting them here would make drizzle-kit
8
+ * emit a duplicate `CREATE TABLE users`.
9
+ */
10
+ var saved_views_1 = require("./saved-views");
11
+ Object.defineProperty(exports, "savedViews", { enumerable: true, get: function () { return saved_views_1.savedViews; } });
12
+ Object.defineProperty(exports, "savedViewDefaults", { enumerable: true, get: function () { return saved_views_1.savedViewDefaults; } });
13
+ Object.defineProperty(exports, "viewVisibility", { enumerable: true, get: function () { return saved_views_1.viewVisibility; } });
@@ -0,0 +1,275 @@
1
+ import type { SavedViewPayload } from '../../domain/saved-view';
2
+ /** Who may see a saved view. Mirrors `VIEW_VISIBILITY` in the domain module. */
3
+ export declare const viewVisibility: import("drizzle-orm/pg-core").PgEnum<[string, ...string[]]>;
4
+ /**
5
+ * A named slice of a list — the filter, sort, columns and page size an editor
6
+ * returns to. Scoped to a workspace, keyed by the list it belongs to (`scope`,
7
+ * `content:<typeName>` today), and owned by the user who saved it.
8
+ *
9
+ * A view is a **bookmark, not a grant**: its payload is replayed through the
10
+ * ordinary list query with the reader's own permissions and workspace scope, so
11
+ * a shared view shows a narrower reader fewer rows, never more.
12
+ */
13
+ export declare const savedViews: import("drizzle-orm/pg-core").PgTableWithColumns<{
14
+ name: "saved_views";
15
+ schema: undefined;
16
+ columns: {
17
+ id: import("drizzle-orm/pg-core").PgColumn<{
18
+ name: "id";
19
+ tableName: "saved_views";
20
+ dataType: "string";
21
+ columnType: "PgUUID";
22
+ data: string;
23
+ driverParam: string;
24
+ notNull: true;
25
+ hasDefault: true;
26
+ isPrimaryKey: true;
27
+ isAutoincrement: false;
28
+ hasRuntimeDefault: false;
29
+ enumValues: undefined;
30
+ baseColumn: never;
31
+ identity: undefined;
32
+ generated: undefined;
33
+ }, {}, {}>;
34
+ workspaceId: import("drizzle-orm/pg-core").PgColumn<{
35
+ name: "workspace_id";
36
+ tableName: "saved_views";
37
+ dataType: "string";
38
+ columnType: "PgUUID";
39
+ data: string;
40
+ driverParam: string;
41
+ notNull: true;
42
+ hasDefault: false;
43
+ isPrimaryKey: false;
44
+ isAutoincrement: false;
45
+ hasRuntimeDefault: false;
46
+ enumValues: undefined;
47
+ baseColumn: never;
48
+ identity: undefined;
49
+ generated: undefined;
50
+ }, {}, {}>;
51
+ scope: import("drizzle-orm/pg-core").PgColumn<{
52
+ name: "scope";
53
+ tableName: "saved_views";
54
+ dataType: "string";
55
+ columnType: "PgText";
56
+ data: string;
57
+ driverParam: string;
58
+ notNull: true;
59
+ hasDefault: false;
60
+ isPrimaryKey: false;
61
+ isAutoincrement: false;
62
+ hasRuntimeDefault: false;
63
+ enumValues: [string, ...string[]];
64
+ baseColumn: never;
65
+ identity: undefined;
66
+ generated: undefined;
67
+ }, {}, {}>;
68
+ ownerId: import("drizzle-orm/pg-core").PgColumn<{
69
+ name: "owner_id";
70
+ tableName: "saved_views";
71
+ dataType: "string";
72
+ columnType: "PgUUID";
73
+ data: string;
74
+ driverParam: string;
75
+ notNull: true;
76
+ hasDefault: false;
77
+ isPrimaryKey: false;
78
+ isAutoincrement: false;
79
+ hasRuntimeDefault: false;
80
+ enumValues: undefined;
81
+ baseColumn: never;
82
+ identity: undefined;
83
+ generated: undefined;
84
+ }, {}, {}>;
85
+ visibility: import("drizzle-orm/pg-core").PgColumn<{
86
+ name: "visibility";
87
+ tableName: "saved_views";
88
+ dataType: "string";
89
+ columnType: "PgEnumColumn";
90
+ data: string;
91
+ driverParam: string;
92
+ notNull: true;
93
+ hasDefault: true;
94
+ isPrimaryKey: false;
95
+ isAutoincrement: false;
96
+ hasRuntimeDefault: false;
97
+ enumValues: [string, ...string[]];
98
+ baseColumn: never;
99
+ identity: undefined;
100
+ generated: undefined;
101
+ }, {}, {}>;
102
+ name: import("drizzle-orm/pg-core").PgColumn<{
103
+ name: "name";
104
+ tableName: "saved_views";
105
+ dataType: "string";
106
+ columnType: "PgText";
107
+ data: string;
108
+ driverParam: string;
109
+ notNull: true;
110
+ hasDefault: false;
111
+ isPrimaryKey: false;
112
+ isAutoincrement: false;
113
+ hasRuntimeDefault: false;
114
+ enumValues: [string, ...string[]];
115
+ baseColumn: never;
116
+ identity: undefined;
117
+ generated: undefined;
118
+ }, {}, {}>;
119
+ payload: import("drizzle-orm/pg-core").PgColumn<{
120
+ name: "payload";
121
+ tableName: "saved_views";
122
+ dataType: "json";
123
+ columnType: "PgJsonb";
124
+ data: SavedViewPayload;
125
+ driverParam: unknown;
126
+ notNull: true;
127
+ hasDefault: false;
128
+ isPrimaryKey: false;
129
+ isAutoincrement: false;
130
+ hasRuntimeDefault: false;
131
+ enumValues: undefined;
132
+ baseColumn: never;
133
+ identity: undefined;
134
+ generated: undefined;
135
+ }, {}, {
136
+ $type: SavedViewPayload;
137
+ }>;
138
+ position: import("drizzle-orm/pg-core").PgColumn<{
139
+ name: "position";
140
+ tableName: "saved_views";
141
+ dataType: "number";
142
+ columnType: "PgInteger";
143
+ data: number;
144
+ driverParam: string | number;
145
+ notNull: true;
146
+ hasDefault: true;
147
+ isPrimaryKey: false;
148
+ isAutoincrement: false;
149
+ hasRuntimeDefault: false;
150
+ enumValues: undefined;
151
+ baseColumn: never;
152
+ identity: undefined;
153
+ generated: undefined;
154
+ }, {}, {}>;
155
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
156
+ name: "created_at";
157
+ tableName: "saved_views";
158
+ dataType: "date";
159
+ columnType: "PgTimestamp";
160
+ data: Date;
161
+ driverParam: string;
162
+ notNull: true;
163
+ hasDefault: true;
164
+ isPrimaryKey: false;
165
+ isAutoincrement: false;
166
+ hasRuntimeDefault: false;
167
+ enumValues: undefined;
168
+ baseColumn: never;
169
+ identity: undefined;
170
+ generated: undefined;
171
+ }, {}, {}>;
172
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
173
+ name: "updated_at";
174
+ tableName: "saved_views";
175
+ dataType: "date";
176
+ columnType: "PgTimestamp";
177
+ data: Date;
178
+ driverParam: string;
179
+ notNull: true;
180
+ hasDefault: true;
181
+ isPrimaryKey: false;
182
+ isAutoincrement: false;
183
+ hasRuntimeDefault: false;
184
+ enumValues: undefined;
185
+ baseColumn: never;
186
+ identity: undefined;
187
+ generated: undefined;
188
+ }, {}, {}>;
189
+ };
190
+ dialect: "pg";
191
+ }>;
192
+ /**
193
+ * Which view a user lands on when they open a list with no explicit params.
194
+ *
195
+ * A table rather than an `isDefault` column because the choice is **personal**:
196
+ * one shared view may be one member's default and not another's, which a column
197
+ * on the view itself cannot express. `viewId` cascades, so deleting a view
198
+ * silently drops the defaults pointing at it instead of stranding them.
199
+ */
200
+ export declare const savedViewDefaults: import("drizzle-orm/pg-core").PgTableWithColumns<{
201
+ name: "saved_view_defaults";
202
+ schema: undefined;
203
+ columns: {
204
+ userId: import("drizzle-orm/pg-core").PgColumn<{
205
+ name: "user_id";
206
+ tableName: "saved_view_defaults";
207
+ dataType: "string";
208
+ columnType: "PgUUID";
209
+ data: string;
210
+ driverParam: string;
211
+ notNull: true;
212
+ hasDefault: false;
213
+ isPrimaryKey: false;
214
+ isAutoincrement: false;
215
+ hasRuntimeDefault: false;
216
+ enumValues: undefined;
217
+ baseColumn: never;
218
+ identity: undefined;
219
+ generated: undefined;
220
+ }, {}, {}>;
221
+ scope: import("drizzle-orm/pg-core").PgColumn<{
222
+ name: "scope";
223
+ tableName: "saved_view_defaults";
224
+ dataType: "string";
225
+ columnType: "PgText";
226
+ data: string;
227
+ driverParam: string;
228
+ notNull: true;
229
+ hasDefault: false;
230
+ isPrimaryKey: false;
231
+ isAutoincrement: false;
232
+ hasRuntimeDefault: false;
233
+ enumValues: [string, ...string[]];
234
+ baseColumn: never;
235
+ identity: undefined;
236
+ generated: undefined;
237
+ }, {}, {}>;
238
+ viewId: import("drizzle-orm/pg-core").PgColumn<{
239
+ name: "view_id";
240
+ tableName: "saved_view_defaults";
241
+ dataType: "string";
242
+ columnType: "PgUUID";
243
+ data: string;
244
+ driverParam: string;
245
+ notNull: true;
246
+ hasDefault: false;
247
+ isPrimaryKey: false;
248
+ isAutoincrement: false;
249
+ hasRuntimeDefault: false;
250
+ enumValues: undefined;
251
+ baseColumn: never;
252
+ identity: undefined;
253
+ generated: undefined;
254
+ }, {}, {}>;
255
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
256
+ name: "updated_at";
257
+ tableName: "saved_view_defaults";
258
+ dataType: "date";
259
+ columnType: "PgTimestamp";
260
+ data: Date;
261
+ driverParam: string;
262
+ notNull: true;
263
+ hasDefault: true;
264
+ isPrimaryKey: false;
265
+ isAutoincrement: false;
266
+ hasRuntimeDefault: false;
267
+ enumValues: undefined;
268
+ baseColumn: never;
269
+ identity: undefined;
270
+ generated: undefined;
271
+ }, {}, {}>;
272
+ };
273
+ dialect: "pg";
274
+ }>;
275
+ //# sourceMappingURL=saved-views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saved-views.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/infrastructure/schema/saved-views.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,gFAAgF;AAChF,eAAO,MAAM,cAAc,6DAG1B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmDtB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyB7B,CAAC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.savedViewDefaults = exports.savedViews = exports.viewVisibility = void 0;
4
+ const pg_core_1 = require("drizzle-orm/pg-core");
5
+ const external_refs_1 = require("./external-refs");
6
+ const saved_view_1 = require("../../domain/saved-view");
7
+ /** Who may see a saved view. Mirrors `VIEW_VISIBILITY` in the domain module. */
8
+ exports.viewVisibility = (0, pg_core_1.pgEnum)('view_visibility', saved_view_1.VIEW_VISIBILITY_VALUES);
9
+ /**
10
+ * A named slice of a list — the filter, sort, columns and page size an editor
11
+ * returns to. Scoped to a workspace, keyed by the list it belongs to (`scope`,
12
+ * `content:<typeName>` today), and owned by the user who saved it.
13
+ *
14
+ * A view is a **bookmark, not a grant**: its payload is replayed through the
15
+ * ordinary list query with the reader's own permissions and workspace scope, so
16
+ * a shared view shows a narrower reader fewer rows, never more.
17
+ */
18
+ exports.savedViews = (0, pg_core_1.pgTable)('saved_views', {
19
+ /** Primary key. */
20
+ id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
21
+ /** The workspace this view belongs to. */
22
+ workspaceId: (0, pg_core_1.uuid)('workspace_id')
23
+ .notNull()
24
+ .references(() => external_refs_1.workspaces.id, { onDelete: 'cascade' }),
25
+ /** The list this view is over (`content:<typeName>`). */
26
+ scope: (0, pg_core_1.text)('scope').notNull(),
27
+ /** The user who saved it. */
28
+ ownerId: (0, pg_core_1.uuid)('owner_id')
29
+ .notNull()
30
+ .references(() => external_refs_1.users.id, { onDelete: 'cascade' }),
31
+ /** `private` (owner only) or `workspace` (every member). */
32
+ visibility: (0, exports.viewVisibility)('visibility').notNull().default('private'),
33
+ /** Display name. */
34
+ name: (0, pg_core_1.text)('name').notNull(),
35
+ /** The slice this view restores. @see SavedViewPayload */
36
+ payload: (0, pg_core_1.jsonb)('payload').$type().notNull(),
37
+ /** Manual ordering within its scope; ties break on `createdAt`. */
38
+ position: (0, pg_core_1.integer)('position').notNull().default(0),
39
+ /** Row creation timestamp. */
40
+ createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true })
41
+ .notNull()
42
+ .defaultNow(),
43
+ /** Last-modified timestamp; refreshed on every update. */
44
+ updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true })
45
+ .notNull()
46
+ .defaultNow()
47
+ .$onUpdate(() => new Date())
48
+ }, (table) => [
49
+ // The list query's shape: every view in one workspace + scope, both
50
+ // the caller's private ones and the workspace-visible ones.
51
+ (0, pg_core_1.index)('saved_views_workspace_scope_idx').on(table.workspaceId, table.scope),
52
+ // A person's own view names are unique per list, so "Save as new" with
53
+ // an existing name is a clean 409 rather than a second, indistinguishable
54
+ // row in the switcher. Scoped to the owner: two people may each have a
55
+ // "Needs review".
56
+ (0, pg_core_1.unique)('saved_views_owner_name_unique').on(table.workspaceId, table.scope, table.ownerId, table.name)
57
+ ]);
58
+ /**
59
+ * Which view a user lands on when they open a list with no explicit params.
60
+ *
61
+ * A table rather than an `isDefault` column because the choice is **personal**:
62
+ * one shared view may be one member's default and not another's, which a column
63
+ * on the view itself cannot express. `viewId` cascades, so deleting a view
64
+ * silently drops the defaults pointing at it instead of stranding them.
65
+ */
66
+ exports.savedViewDefaults = (0, pg_core_1.pgTable)('saved_view_defaults', {
67
+ /** The user whose default this is. */
68
+ userId: (0, pg_core_1.uuid)('user_id')
69
+ .notNull()
70
+ .references(() => external_refs_1.users.id, { onDelete: 'cascade' }),
71
+ /** The list the default applies to. */
72
+ scope: (0, pg_core_1.text)('scope').notNull(),
73
+ /** The view to open. */
74
+ viewId: (0, pg_core_1.uuid)('view_id')
75
+ .notNull()
76
+ .references(() => exports.savedViews.id, { onDelete: 'cascade' }),
77
+ /** Last-modified timestamp. */
78
+ updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true })
79
+ .notNull()
80
+ .defaultNow()
81
+ .$onUpdate(() => new Date())
82
+ }, (table) => [
83
+ // One default per user per list.
84
+ (0, pg_core_1.primaryKey)({ columns: [table.userId, table.scope] }),
85
+ // Covers the cascade probe when a view is deleted.
86
+ (0, pg_core_1.index)('saved_view_defaults_view_id_idx').on(table.viewId)
87
+ ]);
@@ -0,0 +1,26 @@
1
+ /** Limits and scope rules for saved list views. */
2
+ /** Longest accepted view name. */
3
+ export declare const VIEW_NAME_MAX_LENGTH = 80;
4
+ /**
5
+ * Longest accepted `scope` key. A scope names the list a view belongs to —
6
+ * `content:<typeName>` today, `users:members` when the switcher reaches the
7
+ * other list pages. Kept generous enough for a long content-type name.
8
+ */
9
+ export declare const VIEW_SCOPE_MAX_LENGTH = 128;
10
+ /**
11
+ * The scopes this endpoint accepts, as a prefix. v1 only serves content
12
+ * collections; anything else is refused at the DTO so a typo can't quietly
13
+ * create a view nothing will ever read.
14
+ */
15
+ export declare const CONTENT_SCOPE_PREFIX = "content:";
16
+ /** Max columns a payload may pin — bounds the stored array. */
17
+ export declare const VIEW_MAX_COLUMNS = 100;
18
+ /** Max length of one column id inside a payload. */
19
+ export declare const VIEW_COLUMN_MAX_LENGTH = 128;
20
+ /** Max slot-owned list params (`extra`) a payload may carry. */
21
+ export declare const VIEW_MAX_EXTRA_KEYS = 20;
22
+ /** Max length of an `extra` key or value. */
23
+ export declare const VIEW_EXTRA_MAX_LENGTH = 255;
24
+ /** Max saved views one user may hold in a single workspace + scope. */
25
+ export declare const VIEW_MAX_PER_SCOPE = 100;
26
+ //# sourceMappingURL=views.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.constants.d.ts","sourceRoot":"","sources":["../../../src/lib/views/views.constants.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,kCAAkC;AAClC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAE/C,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,6CAA6C;AAC7C,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,MAAM,CAAC"}