@orthacms/content-server 0.4.2 → 0.4.3

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 (135) hide show
  1. package/dist/index.d.ts +15 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +38 -1
  4. package/dist/lib/content.module.d.ts.map +1 -1
  5. package/dist/lib/content.module.js +23 -1
  6. package/dist/lib/entries/http/controllers/create-entry.controller.d.ts.map +1 -1
  7. package/dist/lib/entries/http/controllers/create-entry.controller.js +1 -1
  8. package/dist/lib/entries/http/controllers/update-entry.controller.d.ts.map +1 -1
  9. package/dist/lib/entries/http/controllers/update-entry.controller.js +1 -1
  10. package/dist/lib/entries/http/dto/extension-bag.validator.d.ts +14 -0
  11. package/dist/lib/entries/http/dto/extension-bag.validator.d.ts.map +1 -0
  12. package/dist/lib/entries/http/dto/extension-bag.validator.js +42 -0
  13. package/dist/lib/entries/http/dto/save-entry.dto.d.ts +16 -0
  14. package/dist/lib/entries/http/dto/save-entry.dto.d.ts.map +1 -1
  15. package/dist/lib/entries/http/dto/save-entry.dto.js +30 -0
  16. package/dist/lib/entries/infrastructure/persistence/entry-writer.service.d.ts +28 -2
  17. package/dist/lib/entries/infrastructure/persistence/entry-writer.service.d.ts.map +1 -1
  18. package/dist/lib/entries/infrastructure/persistence/entry-writer.service.js +112 -15
  19. package/dist/lib/entries/infrastructure/persistence/relation-link.service.d.ts +38 -5
  20. package/dist/lib/entries/infrastructure/persistence/relation-link.service.d.ts.map +1 -1
  21. package/dist/lib/entries/infrastructure/persistence/relation-link.service.js +38 -6
  22. package/dist/lib/entries/infrastructure/queries/entries.service.d.ts +3 -1
  23. package/dist/lib/entries/infrastructure/queries/entries.service.d.ts.map +1 -1
  24. package/dist/lib/entries/infrastructure/queries/entries.service.js +17 -5
  25. package/dist/lib/entries/infrastructure/queries/entry-match.query.d.ts +82 -0
  26. package/dist/lib/entries/infrastructure/queries/entry-match.query.d.ts.map +1 -0
  27. package/dist/lib/entries/infrastructure/queries/entry-match.query.js +152 -0
  28. package/dist/lib/extension/entry-access-source.d.ts +112 -0
  29. package/dist/lib/extension/entry-access-source.d.ts.map +1 -0
  30. package/dist/lib/extension/entry-filter-provider.d.ts +79 -0
  31. package/dist/lib/extension/entry-filter-provider.d.ts.map +1 -0
  32. package/dist/lib/extension/entry-filter-provider.js +149 -0
  33. package/dist/lib/extension/entry-write-extension.d.ts +185 -0
  34. package/dist/lib/extension/entry-write-extension.d.ts.map +1 -0
  35. package/dist/lib/extension/entry-write-extension.js +182 -0
  36. package/dist/lib/extension/entry-write-hook.d.ts +98 -0
  37. package/dist/lib/extension/entry-write-hook.d.ts.map +1 -0
  38. package/dist/lib/extension/read-scope.d.ts +107 -0
  39. package/dist/lib/extension/read-scope.d.ts.map +1 -0
  40. package/dist/lib/extension/read-scope.js +131 -0
  41. package/dist/lib/public-api/infrastructure/public-entries.query.d.ts +14 -1
  42. package/dist/lib/public-api/infrastructure/public-entries.query.d.ts.map +1 -1
  43. package/dist/lib/public-api/infrastructure/public-entries.query.js +20 -3
  44. package/dist/lib/public-api/infrastructure/public-expansion.query.d.ts +16 -4
  45. package/dist/lib/public-api/infrastructure/public-expansion.query.d.ts.map +1 -1
  46. package/dist/lib/public-api/infrastructure/public-expansion.query.js +29 -9
  47. package/dist/lib/revisions/application/use-cases/restore-revision.use-case.d.ts.map +1 -1
  48. package/dist/lib/revisions/application/use-cases/restore-revision.use-case.js +12 -1
  49. package/dist/lib/revisions/infrastructure/persistence/revision-snapshot.d.ts +7 -1
  50. package/dist/lib/revisions/infrastructure/persistence/revision-snapshot.d.ts.map +1 -1
  51. package/dist/lib/revisions/infrastructure/persistence/revision-snapshot.js +9 -2
  52. package/dist/lib/revisions/types/revision-view.d.ts +11 -0
  53. package/dist/lib/revisions/types/revision-view.d.ts.map +1 -1
  54. package/dist/lib/utils/content-views-plugin.d.ts +28 -0
  55. package/dist/lib/utils/content-views-plugin.d.ts.map +1 -0
  56. package/dist/lib/utils/content-views-plugin.js +29 -0
  57. package/dist/lib/views/application/queries/saved-views.query.d.ts +16 -0
  58. package/dist/lib/views/application/queries/saved-views.query.d.ts.map +1 -0
  59. package/dist/lib/views/application/queries/saved-views.query.js +46 -0
  60. package/dist/lib/views/application/saved-view-access.service.d.ts +30 -0
  61. package/dist/lib/views/application/saved-view-access.service.d.ts.map +1 -0
  62. package/dist/lib/views/application/saved-view-access.service.js +55 -0
  63. package/dist/lib/views/application/use-cases/create-saved-view.use-case.d.ts +27 -0
  64. package/dist/lib/views/application/use-cases/create-saved-view.use-case.d.ts.map +1 -0
  65. package/dist/lib/views/application/use-cases/create-saved-view.use-case.js +57 -0
  66. package/dist/lib/views/application/use-cases/delete-saved-view.use-case.d.ts +15 -0
  67. package/dist/lib/views/application/use-cases/delete-saved-view.use-case.d.ts.map +1 -0
  68. package/dist/lib/views/application/use-cases/delete-saved-view.use-case.js +35 -0
  69. package/dist/lib/views/application/use-cases/set-default-view.use-case.d.ts +23 -0
  70. package/dist/lib/views/application/use-cases/set-default-view.use-case.d.ts.map +1 -0
  71. package/dist/lib/views/application/use-cases/set-default-view.use-case.js +51 -0
  72. package/dist/lib/views/application/use-cases/update-saved-view.use-case.d.ts +21 -0
  73. package/dist/lib/views/application/use-cases/update-saved-view.use-case.d.ts.map +1 -0
  74. package/dist/lib/views/application/use-cases/update-saved-view.use-case.js +61 -0
  75. package/dist/lib/views/application/view-scope.service.d.ts +25 -0
  76. package/dist/lib/views/application/view-scope.service.d.ts.map +1 -0
  77. package/dist/lib/views/application/view-scope.service.js +45 -0
  78. package/dist/lib/views/content-views.module.d.ts +22 -0
  79. package/dist/lib/views/content-views.module.d.ts.map +1 -0
  80. package/dist/lib/views/content-views.module.js +63 -0
  81. package/dist/lib/views/domain/errors/index.d.ts +6 -0
  82. package/dist/lib/views/domain/errors/index.d.ts.map +1 -0
  83. package/dist/lib/views/domain/errors/index.js +12 -0
  84. package/dist/lib/views/domain/errors/saved-view-forbidden.error.d.ts +10 -0
  85. package/dist/lib/views/domain/errors/saved-view-forbidden.error.d.ts.map +1 -0
  86. package/dist/lib/views/domain/errors/saved-view-forbidden.error.js +16 -0
  87. package/dist/lib/views/domain/errors/saved-view-limit-error.d.ts +9 -0
  88. package/dist/lib/views/domain/errors/saved-view-limit-error.d.ts.map +1 -0
  89. package/dist/lib/views/domain/errors/saved-view-limit-error.js +16 -0
  90. package/dist/lib/views/domain/errors/saved-view-name-taken.error.d.ts +5 -0
  91. package/dist/lib/views/domain/errors/saved-view-name-taken.error.d.ts.map +1 -0
  92. package/dist/lib/views/domain/errors/saved-view-name-taken.error.js +11 -0
  93. package/dist/lib/views/domain/errors/saved-view-not-found.error.d.ts +9 -0
  94. package/dist/lib/views/domain/errors/saved-view-not-found.error.d.ts.map +1 -0
  95. package/dist/lib/views/domain/errors/saved-view-not-found.error.js +15 -0
  96. package/dist/lib/views/domain/saved-view.d.ts +66 -0
  97. package/dist/lib/views/domain/saved-view.d.ts.map +1 -0
  98. package/dist/lib/views/domain/saved-view.js +18 -0
  99. package/dist/lib/views/domain/saved-view.repository.d.ts +77 -0
  100. package/dist/lib/views/domain/saved-view.repository.d.ts.map +1 -0
  101. package/dist/lib/views/domain/saved-view.repository.js +5 -0
  102. package/dist/lib/views/http/controllers/saved-views.controller.d.ts +45 -0
  103. package/dist/lib/views/http/controllers/saved-views.controller.d.ts.map +1 -0
  104. package/dist/lib/views/http/controllers/saved-views.controller.js +216 -0
  105. package/dist/lib/views/http/controllers/to-http-error.d.ts +10 -0
  106. package/dist/lib/views/http/controllers/to-http-error.d.ts.map +1 -0
  107. package/dist/lib/views/http/controllers/to-http-error.js +26 -0
  108. package/dist/lib/views/http/dto/save-view.dto.d.ts +54 -0
  109. package/dist/lib/views/http/dto/save-view.dto.d.ts.map +1 -0
  110. package/dist/lib/views/http/dto/save-view.dto.js +230 -0
  111. package/dist/lib/views/http/dto/view-payload.validator.d.ts +20 -0
  112. package/dist/lib/views/http/dto/view-payload.validator.d.ts.map +1 -0
  113. package/dist/lib/views/http/dto/view-payload.validator.js +52 -0
  114. package/dist/lib/views/infrastructure/persistence/drizzle-saved-view.repository.d.ts +17 -0
  115. package/dist/lib/views/infrastructure/persistence/drizzle-saved-view.repository.d.ts.map +1 -0
  116. package/dist/lib/views/infrastructure/persistence/drizzle-saved-view.repository.js +125 -0
  117. package/dist/lib/views/infrastructure/schema/external-refs.d.ts +68 -0
  118. package/dist/lib/views/infrastructure/schema/external-refs.d.ts.map +1 -0
  119. package/dist/lib/views/infrastructure/schema/external-refs.js +29 -0
  120. package/dist/lib/views/infrastructure/schema/index.d.ts +8 -0
  121. package/dist/lib/views/infrastructure/schema/index.d.ts.map +1 -0
  122. package/dist/lib/views/infrastructure/schema/index.js +13 -0
  123. package/dist/lib/views/infrastructure/schema/saved-views.d.ts +275 -0
  124. package/dist/lib/views/infrastructure/schema/saved-views.d.ts.map +1 -0
  125. package/dist/lib/views/infrastructure/schema/saved-views.js +87 -0
  126. package/dist/lib/views/views.constants.d.ts +26 -0
  127. package/dist/lib/views/views.constants.d.ts.map +1 -0
  128. package/dist/lib/views/views.constants.js +28 -0
  129. package/dist/lib/views/views.tokens.d.ts +17 -0
  130. package/dist/lib/views/views.tokens.d.ts.map +1 -0
  131. package/dist/lib/views/views.tokens.js +21 -0
  132. package/migrations/0000_saved_views.sql +29 -0
  133. package/migrations/meta/0000_snapshot.json +256 -0
  134. package/migrations/meta/_journal.json +13 -0
  135. package/package.json +13 -12
@@ -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"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /** Limits and scope rules for saved list views. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.VIEW_MAX_PER_SCOPE = exports.VIEW_EXTRA_MAX_LENGTH = exports.VIEW_MAX_EXTRA_KEYS = exports.VIEW_COLUMN_MAX_LENGTH = exports.VIEW_MAX_COLUMNS = exports.CONTENT_SCOPE_PREFIX = exports.VIEW_SCOPE_MAX_LENGTH = exports.VIEW_NAME_MAX_LENGTH = void 0;
5
+ /** Longest accepted view name. */
6
+ exports.VIEW_NAME_MAX_LENGTH = 80;
7
+ /**
8
+ * Longest accepted `scope` key. A scope names the list a view belongs to —
9
+ * `content:<typeName>` today, `users:members` when the switcher reaches the
10
+ * other list pages. Kept generous enough for a long content-type name.
11
+ */
12
+ exports.VIEW_SCOPE_MAX_LENGTH = 128;
13
+ /**
14
+ * The scopes this endpoint accepts, as a prefix. v1 only serves content
15
+ * collections; anything else is refused at the DTO so a typo can't quietly
16
+ * create a view nothing will ever read.
17
+ */
18
+ exports.CONTENT_SCOPE_PREFIX = 'content:';
19
+ /** Max columns a payload may pin — bounds the stored array. */
20
+ exports.VIEW_MAX_COLUMNS = 100;
21
+ /** Max length of one column id inside a payload. */
22
+ exports.VIEW_COLUMN_MAX_LENGTH = 128;
23
+ /** Max slot-owned list params (`extra`) a payload may carry. */
24
+ exports.VIEW_MAX_EXTRA_KEYS = 20;
25
+ /** Max length of an `extra` key or value. */
26
+ exports.VIEW_EXTRA_MAX_LENGTH = 255;
27
+ /** Max saved views one user may hold in a single workspace + scope. */
28
+ exports.VIEW_MAX_PER_SCOPE = 100;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The content-type registry, as the **views** module provides it.
3
+ *
4
+ * A token of its own rather than reusing `CONTENT_REGISTRY`: both modules are
5
+ * `global: true`, and two global modules providing the same token put one in
6
+ * the position of silently shadowing the other in Nest's global registry. The
7
+ * value is the same registry instance either way, so nothing would break today
8
+ * — but "which module wins" is not a question a reader of either file can
9
+ * answer, and the answer would change with registration order.
10
+ *
11
+ * Dependency-free by design, so providers reference it without an import cycle
12
+ * with the module.
13
+ */
14
+ export declare const VIEW_CONTENT_REGISTRY: unique symbol;
15
+ /** Injects the registry the views module was constructed with. */
16
+ export declare const InjectViewContentRegistry: () => ParameterDecorator;
17
+ //# sourceMappingURL=views.tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.tokens.d.ts","sourceRoot":"","sources":["../../../src/lib/views/views.tokens.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAErE,kEAAkE;AAClE,eAAO,MAAM,yBAAyB,QAAO,kBACZ,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectViewContentRegistry = exports.VIEW_CONTENT_REGISTRY = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ /**
6
+ * The content-type registry, as the **views** module provides it.
7
+ *
8
+ * A token of its own rather than reusing `CONTENT_REGISTRY`: both modules are
9
+ * `global: true`, and two global modules providing the same token put one in
10
+ * the position of silently shadowing the other in Nest's global registry. The
11
+ * value is the same registry instance either way, so nothing would break today
12
+ * — but "which module wins" is not a question a reader of either file can
13
+ * answer, and the answer would change with registration order.
14
+ *
15
+ * Dependency-free by design, so providers reference it without an import cycle
16
+ * with the module.
17
+ */
18
+ exports.VIEW_CONTENT_REGISTRY = Symbol('VIEW_CONTENT_REGISTRY');
19
+ /** Injects the registry the views module was constructed with. */
20
+ const InjectViewContentRegistry = () => (0, common_1.Inject)(exports.VIEW_CONTENT_REGISTRY);
21
+ exports.InjectViewContentRegistry = InjectViewContentRegistry;
@@ -0,0 +1,29 @@
1
+ CREATE TYPE "public"."view_visibility" AS ENUM('private', 'workspace');--> statement-breakpoint
2
+ CREATE TABLE "saved_view_defaults" (
3
+ "user_id" uuid NOT NULL,
4
+ "scope" text NOT NULL,
5
+ "view_id" uuid NOT NULL,
6
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
7
+ CONSTRAINT "saved_view_defaults_user_id_scope_pk" PRIMARY KEY("user_id","scope")
8
+ );
9
+ --> statement-breakpoint
10
+ CREATE TABLE "saved_views" (
11
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
12
+ "workspace_id" uuid NOT NULL,
13
+ "scope" text NOT NULL,
14
+ "owner_id" uuid NOT NULL,
15
+ "visibility" "view_visibility" DEFAULT 'private' NOT NULL,
16
+ "name" text NOT NULL,
17
+ "payload" jsonb NOT NULL,
18
+ "position" integer DEFAULT 0 NOT NULL,
19
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
20
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
21
+ CONSTRAINT "saved_views_owner_name_unique" UNIQUE("workspace_id","scope","owner_id","name")
22
+ );
23
+ --> statement-breakpoint
24
+ ALTER TABLE "saved_view_defaults" ADD CONSTRAINT "saved_view_defaults_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
25
+ ALTER TABLE "saved_view_defaults" ADD CONSTRAINT "saved_view_defaults_view_id_saved_views_id_fk" FOREIGN KEY ("view_id") REFERENCES "public"."saved_views"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
26
+ ALTER TABLE "saved_views" ADD CONSTRAINT "saved_views_workspace_id_workspaces_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspaces"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
27
+ ALTER TABLE "saved_views" ADD CONSTRAINT "saved_views_owner_id_users_id_fk" FOREIGN KEY ("owner_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
28
+ CREATE INDEX "saved_view_defaults_view_id_idx" ON "saved_view_defaults" USING btree ("view_id");--> statement-breakpoint
29
+ CREATE INDEX "saved_views_workspace_scope_idx" ON "saved_views" USING btree ("workspace_id","scope");