@vritti/api-sdk 0.3.3 → 0.3.6

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 (133) hide show
  1. package/dist/auth.cjs +942 -0
  2. package/dist/auth.cjs.map +1 -0
  3. package/dist/auth.d.cts +95 -0
  4. package/dist/auth.d.ts +95 -0
  5. package/dist/auth.js +884 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/cache.cjs +182 -14
  8. package/dist/cache.cjs.map +1 -1
  9. package/dist/cache.d.cts +48 -4
  10. package/dist/cache.d.ts +48 -4
  11. package/dist/cache.js +177 -12
  12. package/dist/cache.js.map +1 -1
  13. package/dist/catalog-resolver.cjs +337 -140
  14. package/dist/catalog-resolver.cjs.map +1 -1
  15. package/dist/catalog-resolver.d.cts +70 -45
  16. package/dist/catalog-resolver.d.ts +70 -45
  17. package/dist/catalog-resolver.js +322 -135
  18. package/dist/catalog-resolver.js.map +1 -1
  19. package/dist/code-pattern-BP4zkNtT.d.cts +12 -0
  20. package/dist/code-pattern-BP4zkNtT.d.ts +12 -0
  21. package/dist/context.cjs +93 -0
  22. package/dist/context.cjs.map +1 -0
  23. package/dist/context.d.cts +19 -0
  24. package/dist/context.d.ts +19 -0
  25. package/dist/context.js +64 -0
  26. package/dist/context.js.map +1 -0
  27. package/dist/countries.cjs +1559 -0
  28. package/dist/countries.cjs.map +1 -0
  29. package/dist/countries.d.cts +13 -0
  30. package/dist/countries.d.ts +13 -0
  31. package/dist/countries.js +1532 -0
  32. package/dist/countries.js.map +1 -0
  33. package/dist/data-table.cjs +1280 -0
  34. package/dist/data-table.cjs.map +1 -0
  35. package/dist/data-table.d.cts +123 -0
  36. package/dist/data-table.d.ts +123 -0
  37. package/dist/data-table.js +1260 -0
  38. package/dist/data-table.js.map +1 -0
  39. package/dist/database.cjs +1510 -0
  40. package/dist/database.cjs.map +1 -0
  41. package/dist/database.d.cts +287 -0
  42. package/dist/database.d.ts +287 -0
  43. package/dist/database.js +1469 -0
  44. package/dist/database.js.map +1 -0
  45. package/dist/decimal.d.cts +0 -1
  46. package/dist/decimal.d.ts +0 -1
  47. package/dist/decorators.cjs +1817 -0
  48. package/dist/decorators.cjs.map +1 -0
  49. package/dist/decorators.d.cts +24 -0
  50. package/dist/decorators.d.ts +24 -0
  51. package/dist/decorators.js +1780 -0
  52. package/dist/decorators.js.map +1 -0
  53. package/dist/drizzle-pg-core.cjs +25 -0
  54. package/dist/drizzle-pg-core.cjs.map +1 -1
  55. package/dist/drizzle-pg-core.d.cts +7 -0
  56. package/dist/drizzle-pg-core.d.ts +7 -0
  57. package/dist/drizzle-pg-core.js +22 -0
  58. package/dist/drizzle-pg-core.js.map +1 -1
  59. package/dist/exceptions.cjs +301 -0
  60. package/dist/exceptions.cjs.map +1 -0
  61. package/dist/exceptions.d.cts +90 -0
  62. package/dist/exceptions.d.ts +90 -0
  63. package/dist/exceptions.js +257 -0
  64. package/dist/exceptions.js.map +1 -0
  65. package/dist/filter.types-PuARU9XD.d.cts +50 -0
  66. package/dist/filter.types-PuARU9XD.d.ts +50 -0
  67. package/dist/filters.cjs +407 -0
  68. package/dist/filters.cjs.map +1 -0
  69. package/dist/filters.d.cts +55 -0
  70. package/dist/filters.d.ts +55 -0
  71. package/dist/filters.js +377 -0
  72. package/dist/filters.js.map +1 -0
  73. package/dist/index.cjs +0 -5423
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +93 -854
  76. package/dist/index.d.ts +93 -854
  77. package/dist/index.js +0 -5301
  78. package/dist/index.js.map +1 -1
  79. package/dist/is-country.decorator-CcNwSSr5.d.cts +5 -0
  80. package/dist/is-country.decorator-CcNwSSr5.d.ts +5 -0
  81. package/dist/license.d.cts +1 -1
  82. package/dist/license.d.ts +1 -1
  83. package/dist/lodash.cjs.map +1 -1
  84. package/dist/lodash.js.map +1 -1
  85. package/dist/logger.cjs +862 -0
  86. package/dist/logger.cjs.map +1 -0
  87. package/dist/logger.d.cts +118 -0
  88. package/dist/logger.d.ts +118 -0
  89. package/dist/logger.js +816 -0
  90. package/dist/logger.js.map +1 -0
  91. package/dist/migrate.cjs +2 -2
  92. package/dist/migrate.cjs.map +1 -1
  93. package/dist/migrate.d.cts +2 -0
  94. package/dist/migrate.d.ts +2 -0
  95. package/dist/migrate.js +2 -2
  96. package/dist/migrate.js.map +1 -1
  97. package/dist/money.cjs +18 -3
  98. package/dist/money.cjs.map +1 -1
  99. package/dist/money.d.cts +13 -13
  100. package/dist/money.d.ts +13 -13
  101. package/dist/money.js +18 -3
  102. package/dist/money.js.map +1 -1
  103. package/dist/nats.cjs +34 -35
  104. package/dist/nats.cjs.map +1 -1
  105. package/dist/nats.d.cts +14 -14
  106. package/dist/nats.d.ts +14 -14
  107. package/dist/nats.js +32 -33
  108. package/dist/nats.js.map +1 -1
  109. package/dist/root.cjs +225 -0
  110. package/dist/root.cjs.map +1 -0
  111. package/dist/root.d.cts +4 -0
  112. package/dist/root.d.ts +4 -0
  113. package/dist/root.js +200 -0
  114. package/dist/root.js.map +1 -0
  115. package/dist/{types-DQRwj5rr.d.cts → types-BBK6MG-U.d.cts} +37 -6
  116. package/dist/{types-DQRwj5rr.d.ts → types-BBK6MG-U.d.ts} +37 -6
  117. package/dist/types.cjs +19 -0
  118. package/dist/types.cjs.map +1 -0
  119. package/dist/types.d.cts +17 -0
  120. package/dist/types.d.ts +17 -0
  121. package/dist/types.js +1 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/utils.cjs +273 -0
  124. package/dist/utils.cjs.map +1 -0
  125. package/dist/utils.d.cts +8 -0
  126. package/dist/utils.d.ts +8 -0
  127. package/dist/utils.js +245 -0
  128. package/dist/utils.js.map +1 -0
  129. package/package.json +122 -1
  130. package/dist/cache.service-_SuJIcNA.d.cts +0 -20
  131. package/dist/cache.service-_SuJIcNA.d.ts +0 -20
  132. package/dist/fastify-augmentation-CQPBNS5a.d.cts +0 -105
  133. package/dist/fastify-augmentation-CQPBNS5a.d.ts +0 -105
@@ -0,0 +1,1280 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/data-table/index.ts
23
+ var data_table_exports = {};
24
+ __export(data_table_exports, {
25
+ CreateDataTableViewDto: () => CreateDataTableViewDto,
26
+ DATA_TABLE_VIEWS_TABLE: () => DATA_TABLE_VIEWS_TABLE,
27
+ DataTableModule: () => DataTableModule,
28
+ DataTableStateService: () => DataTableStateService,
29
+ DataTableViewDto: () => DataTableViewDto,
30
+ DataTableViewsService: () => DataTableViewsService,
31
+ RenameDataTableViewDto: () => RenameDataTableViewDto,
32
+ ToggleShareDataTableViewDto: () => ToggleShareDataTableViewDto,
33
+ UpdateDataTableViewDto: () => UpdateDataTableViewDto,
34
+ UpsertDataTableStateDto: () => UpsertDataTableStateDto,
35
+ dataTableViewsColumns: () => dataTableViewsColumns,
36
+ dataTableViewsIndexes: () => dataTableViewsIndexes
37
+ });
38
+ module.exports = __toCommonJS(data_table_exports);
39
+
40
+ // src/data-table/data-table.module.ts
41
+ var import_common28 = require("@nestjs/common");
42
+ var import_config3 = require("@nestjs/config");
43
+ var import_cache3 = require("@vritti/api-sdk/cache");
44
+
45
+ // src/data-table/data-table.constants.ts
46
+ var DATA_TABLE_VIEWS_TABLE = Symbol("DATA_TABLE_VIEWS_TABLE");
47
+
48
+ // src/data-table/state/controllers/data-table-state.controller.ts
49
+ var import_common4 = require("@nestjs/common");
50
+ var import_swagger3 = require("@nestjs/swagger");
51
+
52
+ // src/auth/decorators/user-id.decorator.ts
53
+ var import_common = require("@nestjs/common");
54
+
55
+ // src/context/extractors/graphql.extractor.ts
56
+ var graphqlExtractor = {
57
+ getRequest: /* @__PURE__ */ __name((host) => host.getArgByIndex(2).req, "getRequest"),
58
+ getResponse: /* @__PURE__ */ __name((host) => host.getArgByIndex(2).reply, "getResponse")
59
+ };
60
+
61
+ // src/context/extractors/http.extractor.ts
62
+ var httpExtractor = {
63
+ getRequest: /* @__PURE__ */ __name((host) => host.switchToHttp().getRequest(), "getRequest"),
64
+ getResponse: /* @__PURE__ */ __name((host) => host.switchToHttp().getResponse(), "getResponse")
65
+ };
66
+
67
+ // src/context/context.registry.ts
68
+ var registry = /* @__PURE__ */ new Map([
69
+ [
70
+ "http",
71
+ httpExtractor
72
+ ],
73
+ [
74
+ "graphql",
75
+ graphqlExtractor
76
+ ]
77
+ ]);
78
+ function resolveExtractor(type) {
79
+ return registry.get(type) ?? httpExtractor;
80
+ }
81
+ __name(resolveExtractor, "resolveExtractor");
82
+
83
+ // src/context/get-request.ts
84
+ function getRequestFromContext(host) {
85
+ return resolveExtractor(host.getType()).getRequest(host);
86
+ }
87
+ __name(getRequestFromContext, "getRequestFromContext");
88
+
89
+ // src/auth/decorators/user-id.decorator.ts
90
+ var UserId = (0, import_common.createParamDecorator)((_data, ctx) => {
91
+ const request = getRequestFromContext(ctx);
92
+ const sessionInfo = request.sessionInfo;
93
+ if (!sessionInfo?.userId) {
94
+ throw new Error("User ID not found on request. Ensure route is protected by auth guard.");
95
+ }
96
+ return sessionInfo.userId;
97
+ });
98
+
99
+ // src/data-table/state/docs/data-table-state.docs.ts
100
+ var import_common2 = require("@nestjs/common");
101
+ var import_swagger2 = require("@nestjs/swagger");
102
+
103
+ // src/data-table/state/dto/request/upsert-data-table-state.dto.ts
104
+ var import_swagger = require("@nestjs/swagger");
105
+ var import_class_validator = require("class-validator");
106
+ function _ts_decorate(decorators, target, key, desc) {
107
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
108
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
109
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
110
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
111
+ }
112
+ __name(_ts_decorate, "_ts_decorate");
113
+ function _ts_metadata(k, v) {
114
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
115
+ }
116
+ __name(_ts_metadata, "_ts_metadata");
117
+ var UpsertDataTableStateDto = class {
118
+ static {
119
+ __name(this, "UpsertDataTableStateDto");
120
+ }
121
+ tableSlug;
122
+ state;
123
+ activeViewId;
124
+ };
125
+ _ts_decorate([
126
+ (0, import_swagger.ApiProperty)({
127
+ description: "Unique slug identifying the table",
128
+ example: "cloud-providers"
129
+ }),
130
+ (0, import_class_validator.IsString)(),
131
+ (0, import_class_validator.MaxLength)(200),
132
+ _ts_metadata("design:type", String)
133
+ ], UpsertDataTableStateDto.prototype, "tableSlug", void 0);
134
+ _ts_decorate([
135
+ (0, import_swagger.ApiProperty)({
136
+ description: "Full table view state including filters, sort, and column visibility"
137
+ }),
138
+ (0, import_class_validator.IsObject)(),
139
+ _ts_metadata("design:type", typeof TableViewState === "undefined" ? Object : TableViewState)
140
+ ], UpsertDataTableStateDto.prototype, "state", void 0);
141
+ _ts_decorate([
142
+ (0, import_swagger.ApiPropertyOptional)(),
143
+ (0, import_class_validator.IsOptional)(),
144
+ (0, import_class_validator.IsUUID)(),
145
+ _ts_metadata("design:type", Object)
146
+ ], UpsertDataTableStateDto.prototype, "activeViewId", void 0);
147
+
148
+ // src/data-table/state/docs/data-table-state.docs.ts
149
+ function ApiUpsertDataTableState() {
150
+ return (0, import_common2.applyDecorators)((0, import_swagger2.ApiOperation)({
151
+ summary: "Save live table state",
152
+ description: "Stores the current filter, sort, and column visibility state in Redis cache. Called on filter Apply and sort column click. State expires after TABLE_STATE_CACHE_TTL seconds."
153
+ }), (0, import_swagger2.ApiBody)({
154
+ type: UpsertDataTableStateDto
155
+ }), (0, import_swagger2.ApiResponse)({
156
+ status: 200,
157
+ description: "Live state cached."
158
+ }), (0, import_swagger2.ApiResponse)({
159
+ status: 400,
160
+ description: "Invalid request body."
161
+ }), (0, import_swagger2.ApiResponse)({
162
+ status: 401,
163
+ description: "Unauthorized."
164
+ }));
165
+ }
166
+ __name(ApiUpsertDataTableState, "ApiUpsertDataTableState");
167
+
168
+ // src/data-table/state/services/data-table-state.service.ts
169
+ var import_common3 = require("@nestjs/common");
170
+ var import_config = require("@nestjs/config");
171
+ var import_cache = require("@vritti/api-sdk/cache");
172
+ function _ts_decorate2(decorators, target, key, desc) {
173
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
174
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
175
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
176
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
177
+ }
178
+ __name(_ts_decorate2, "_ts_decorate");
179
+ function _ts_metadata2(k, v) {
180
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
181
+ }
182
+ __name(_ts_metadata2, "_ts_metadata");
183
+ var EMPTY_TABLE_STATE = {
184
+ filters: [],
185
+ sort: [],
186
+ columnVisibility: {},
187
+ columnOrder: [],
188
+ columnSizing: {},
189
+ columnPinning: {
190
+ left: [],
191
+ right: []
192
+ },
193
+ lockedColumnSizing: false,
194
+ density: "normal",
195
+ filterOrder: [],
196
+ filterVisibility: {},
197
+ search: null,
198
+ pagination: {
199
+ limit: 20,
200
+ offset: 0
201
+ }
202
+ };
203
+ var DataTableStateService = class _DataTableStateService {
204
+ static {
205
+ __name(this, "DataTableStateService");
206
+ }
207
+ cacheService;
208
+ configService;
209
+ logger = new import_common3.Logger(_DataTableStateService.name);
210
+ constructor(cacheService, configService) {
211
+ this.cacheService = cacheService;
212
+ this.configService = configService;
213
+ }
214
+ // Returns configured TTL for live table state in seconds, defaulting to 3600 (1h)
215
+ get stateTtl() {
216
+ return this.configService.get("TABLE_STATE_CACHE_TTL") ?? 3600;
217
+ }
218
+ // Saves live table state and active view ID to Redis; DB is not written
219
+ async upsertCurrentState(userId, dto) {
220
+ const key = `dt:${userId}:${dto.tableSlug}`;
221
+ await this.cacheService.set(key, {
222
+ state: dto.state,
223
+ activeViewId: dto.activeViewId ?? null
224
+ }, this.stateTtl);
225
+ this.logger.log(`Cached live state for user: ${userId}, table: ${dto.tableSlug}`);
226
+ }
227
+ // Returns live table state and active view ID from Redis; returns empty state on miss — no DB query
228
+ async getCurrentState(userId, tableSlug) {
229
+ const key = `dt:${userId}:${tableSlug}`;
230
+ const cached = await this.cacheService.get(key);
231
+ return cached ?? {
232
+ state: EMPTY_TABLE_STATE,
233
+ activeViewId: null
234
+ };
235
+ }
236
+ };
237
+ DataTableStateService = _ts_decorate2([
238
+ (0, import_common3.Injectable)(),
239
+ _ts_metadata2("design:type", Function),
240
+ _ts_metadata2("design:paramtypes", [
241
+ typeof import_cache.CacheService === "undefined" ? Object : import_cache.CacheService,
242
+ typeof import_config.ConfigService === "undefined" ? Object : import_config.ConfigService
243
+ ])
244
+ ], DataTableStateService);
245
+
246
+ // src/data-table/state/controllers/data-table-state.controller.ts
247
+ function _ts_decorate3(decorators, target, key, desc) {
248
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
249
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
250
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
251
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
252
+ }
253
+ __name(_ts_decorate3, "_ts_decorate");
254
+ function _ts_metadata3(k, v) {
255
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
256
+ }
257
+ __name(_ts_metadata3, "_ts_metadata");
258
+ function _ts_param(paramIndex, decorator) {
259
+ return function(target, key) {
260
+ decorator(target, key, paramIndex);
261
+ };
262
+ }
263
+ __name(_ts_param, "_ts_param");
264
+ var DataTableStateController = class _DataTableStateController {
265
+ static {
266
+ __name(this, "DataTableStateController");
267
+ }
268
+ dataTableStateService;
269
+ logger = new import_common4.Logger(_DataTableStateController.name);
270
+ constructor(dataTableStateService) {
271
+ this.dataTableStateService = dataTableStateService;
272
+ }
273
+ // Saves live table state to Redis cache for the authenticated user's table
274
+ upsertCurrentState(userId, dto) {
275
+ this.logger.log(`POST /table-states - User: ${userId}, table: ${dto.tableSlug}`);
276
+ return this.dataTableStateService.upsertCurrentState(userId, dto);
277
+ }
278
+ };
279
+ _ts_decorate3([
280
+ (0, import_common4.Post)(),
281
+ (0, import_common4.HttpCode)(import_common4.HttpStatus.OK),
282
+ ApiUpsertDataTableState(),
283
+ _ts_param(0, UserId()),
284
+ _ts_param(1, (0, import_common4.Body)()),
285
+ _ts_metadata3("design:type", Function),
286
+ _ts_metadata3("design:paramtypes", [
287
+ String,
288
+ typeof UpsertDataTableStateDto === "undefined" ? Object : UpsertDataTableStateDto
289
+ ]),
290
+ _ts_metadata3("design:returntype", typeof Promise === "undefined" ? Object : Promise)
291
+ ], DataTableStateController.prototype, "upsertCurrentState", null);
292
+ DataTableStateController = _ts_decorate3([
293
+ (0, import_swagger3.ApiTags)("Table States"),
294
+ (0, import_swagger3.ApiBearerAuth)(),
295
+ (0, import_common4.Controller)("table-states"),
296
+ _ts_metadata3("design:type", Function),
297
+ _ts_metadata3("design:paramtypes", [
298
+ typeof DataTableStateService === "undefined" ? Object : DataTableStateService
299
+ ])
300
+ ], DataTableStateController);
301
+
302
+ // src/data-table/views/controllers/data-table-views.controller.ts
303
+ var import_common27 = require("@nestjs/common");
304
+ var import_swagger10 = require("@nestjs/swagger");
305
+
306
+ // src/data-table/views/docs/data-table-views.docs.ts
307
+ var import_common5 = require("@nestjs/common");
308
+ var import_swagger9 = require("@nestjs/swagger");
309
+
310
+ // src/data-table/views/dto/entity/data-table-view.dto.ts
311
+ var import_swagger4 = require("@nestjs/swagger");
312
+ function _ts_decorate4(decorators, target, key, desc) {
313
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
314
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
315
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
316
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
317
+ }
318
+ __name(_ts_decorate4, "_ts_decorate");
319
+ function _ts_metadata4(k, v) {
320
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
321
+ }
322
+ __name(_ts_metadata4, "_ts_metadata");
323
+ var DataTableViewDto = class _DataTableViewDto {
324
+ static {
325
+ __name(this, "DataTableViewDto");
326
+ }
327
+ id;
328
+ name;
329
+ tableSlug;
330
+ state;
331
+ isShared;
332
+ isOwn;
333
+ createdAt;
334
+ updatedAt;
335
+ // Creates a response DTO from a DataTableView entity, computing isOwn by comparing userId
336
+ static from(view, userId) {
337
+ const dto = new _DataTableViewDto();
338
+ dto.id = view.id;
339
+ dto.name = view.name ?? null;
340
+ dto.tableSlug = view.tableSlug;
341
+ dto.state = view.state;
342
+ dto.isShared = view.isShared;
343
+ dto.isOwn = view.userId === userId;
344
+ dto.createdAt = view.createdAt;
345
+ dto.updatedAt = view.updatedAt ?? null;
346
+ return dto;
347
+ }
348
+ };
349
+ _ts_decorate4([
350
+ (0, import_swagger4.ApiProperty)({
351
+ description: "View unique identifier"
352
+ }),
353
+ _ts_metadata4("design:type", String)
354
+ ], DataTableViewDto.prototype, "id", void 0);
355
+ _ts_decorate4([
356
+ (0, import_swagger4.ApiPropertyOptional)({
357
+ description: "Display name of the view",
358
+ nullable: true
359
+ }),
360
+ _ts_metadata4("design:type", Object)
361
+ ], DataTableViewDto.prototype, "name", void 0);
362
+ _ts_decorate4([
363
+ (0, import_swagger4.ApiProperty)({
364
+ description: "Slug of the table this view belongs to",
365
+ example: "cloud-providers"
366
+ }),
367
+ _ts_metadata4("design:type", String)
368
+ ], DataTableViewDto.prototype, "tableSlug", void 0);
369
+ _ts_decorate4([
370
+ (0, import_swagger4.ApiProperty)({
371
+ description: "Stored filter, sort, and column visibility state"
372
+ }),
373
+ _ts_metadata4("design:type", typeof TableViewState === "undefined" ? Object : TableViewState)
374
+ ], DataTableViewDto.prototype, "state", void 0);
375
+ _ts_decorate4([
376
+ (0, import_swagger4.ApiProperty)({
377
+ description: "Whether the view is visible to all users",
378
+ example: false
379
+ }),
380
+ _ts_metadata4("design:type", Boolean)
381
+ ], DataTableViewDto.prototype, "isShared", void 0);
382
+ _ts_decorate4([
383
+ (0, import_swagger4.ApiProperty)({
384
+ description: "Whether the requesting user owns this view",
385
+ example: true
386
+ }),
387
+ _ts_metadata4("design:type", Boolean)
388
+ ], DataTableViewDto.prototype, "isOwn", void 0);
389
+ _ts_decorate4([
390
+ (0, import_swagger4.ApiProperty)({
391
+ description: "Creation timestamp"
392
+ }),
393
+ _ts_metadata4("design:type", typeof Date === "undefined" ? Object : Date)
394
+ ], DataTableViewDto.prototype, "createdAt", void 0);
395
+ _ts_decorate4([
396
+ (0, import_swagger4.ApiPropertyOptional)({
397
+ description: "Last updated timestamp",
398
+ nullable: true
399
+ }),
400
+ _ts_metadata4("design:type", Object)
401
+ ], DataTableViewDto.prototype, "updatedAt", void 0);
402
+
403
+ // src/data-table/views/dto/request/create-data-table-view.dto.ts
404
+ var import_swagger5 = require("@nestjs/swagger");
405
+ var import_class_validator2 = require("class-validator");
406
+ function _ts_decorate5(decorators, target, key, desc) {
407
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
408
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
409
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
410
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
411
+ }
412
+ __name(_ts_decorate5, "_ts_decorate");
413
+ function _ts_metadata5(k, v) {
414
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
415
+ }
416
+ __name(_ts_metadata5, "_ts_metadata");
417
+ var CreateDataTableViewDto = class {
418
+ static {
419
+ __name(this, "CreateDataTableViewDto");
420
+ }
421
+ name;
422
+ tableSlug;
423
+ state;
424
+ isShared;
425
+ };
426
+ _ts_decorate5([
427
+ (0, import_swagger5.ApiProperty)({
428
+ description: "Display name for the saved view",
429
+ example: "AWS Only"
430
+ }),
431
+ (0, import_class_validator2.IsString)(),
432
+ (0, import_class_validator2.MaxLength)(100),
433
+ _ts_metadata5("design:type", String)
434
+ ], CreateDataTableViewDto.prototype, "name", void 0);
435
+ _ts_decorate5([
436
+ (0, import_swagger5.ApiProperty)({
437
+ description: "Unique slug identifying the table",
438
+ example: "cloud-providers"
439
+ }),
440
+ (0, import_class_validator2.IsString)(),
441
+ (0, import_class_validator2.MaxLength)(200),
442
+ _ts_metadata5("design:type", String)
443
+ ], CreateDataTableViewDto.prototype, "tableSlug", void 0);
444
+ _ts_decorate5([
445
+ (0, import_swagger5.ApiProperty)({
446
+ description: "Full table view state including filters, sort, and column visibility"
447
+ }),
448
+ (0, import_class_validator2.IsObject)(),
449
+ _ts_metadata5("design:type", typeof TableViewState === "undefined" ? Object : TableViewState)
450
+ ], CreateDataTableViewDto.prototype, "state", void 0);
451
+ _ts_decorate5([
452
+ (0, import_swagger5.ApiPropertyOptional)({
453
+ description: "Whether this view is visible to all users",
454
+ example: false
455
+ }),
456
+ (0, import_class_validator2.IsBoolean)(),
457
+ (0, import_class_validator2.IsOptional)(),
458
+ _ts_metadata5("design:type", Boolean)
459
+ ], CreateDataTableViewDto.prototype, "isShared", void 0);
460
+
461
+ // src/data-table/views/dto/request/rename-data-table-view.dto.ts
462
+ var import_swagger6 = require("@nestjs/swagger");
463
+ var import_class_validator3 = require("class-validator");
464
+ function _ts_decorate6(decorators, target, key, desc) {
465
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
466
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
467
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
468
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
469
+ }
470
+ __name(_ts_decorate6, "_ts_decorate");
471
+ function _ts_metadata6(k, v) {
472
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
473
+ }
474
+ __name(_ts_metadata6, "_ts_metadata");
475
+ var RenameDataTableViewDto = class {
476
+ static {
477
+ __name(this, "RenameDataTableViewDto");
478
+ }
479
+ name;
480
+ };
481
+ _ts_decorate6([
482
+ (0, import_swagger6.ApiProperty)({
483
+ description: "New display name for the view",
484
+ example: "AWS Only"
485
+ }),
486
+ (0, import_class_validator3.IsString)(),
487
+ (0, import_class_validator3.MinLength)(1),
488
+ (0, import_class_validator3.MaxLength)(100),
489
+ _ts_metadata6("design:type", String)
490
+ ], RenameDataTableViewDto.prototype, "name", void 0);
491
+
492
+ // src/data-table/views/dto/request/toggle-share-data-table-view.dto.ts
493
+ var import_swagger7 = require("@nestjs/swagger");
494
+ var import_class_validator4 = require("class-validator");
495
+ function _ts_decorate7(decorators, target, key, desc) {
496
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
497
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
498
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
499
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
500
+ }
501
+ __name(_ts_decorate7, "_ts_decorate");
502
+ function _ts_metadata7(k, v) {
503
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
504
+ }
505
+ __name(_ts_metadata7, "_ts_metadata");
506
+ var ToggleShareDataTableViewDto = class {
507
+ static {
508
+ __name(this, "ToggleShareDataTableViewDto");
509
+ }
510
+ isShared;
511
+ };
512
+ _ts_decorate7([
513
+ (0, import_swagger7.ApiProperty)({
514
+ description: "Whether the view should be visible to all users",
515
+ example: true
516
+ }),
517
+ (0, import_class_validator4.IsBoolean)(),
518
+ _ts_metadata7("design:type", Boolean)
519
+ ], ToggleShareDataTableViewDto.prototype, "isShared", void 0);
520
+
521
+ // src/data-table/views/dto/request/update-data-table-view.dto.ts
522
+ var import_swagger8 = require("@nestjs/swagger");
523
+ var import_class_validator5 = require("class-validator");
524
+ function _ts_decorate8(decorators, target, key, desc) {
525
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
526
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
527
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
528
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
529
+ }
530
+ __name(_ts_decorate8, "_ts_decorate");
531
+ function _ts_metadata8(k, v) {
532
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
533
+ }
534
+ __name(_ts_metadata8, "_ts_metadata");
535
+ var UpdateDataTableViewDto = class {
536
+ static {
537
+ __name(this, "UpdateDataTableViewDto");
538
+ }
539
+ state;
540
+ };
541
+ _ts_decorate8([
542
+ (0, import_swagger8.ApiProperty)({
543
+ description: "Updated filter, sort, and column visibility state"
544
+ }),
545
+ (0, import_class_validator5.IsObject)(),
546
+ _ts_metadata8("design:type", typeof TableViewState === "undefined" ? Object : TableViewState)
547
+ ], UpdateDataTableViewDto.prototype, "state", void 0);
548
+
549
+ // src/data-table/views/docs/data-table-views.docs.ts
550
+ function ApiListDataTableViews() {
551
+ return (0, import_common5.applyDecorators)((0, import_swagger9.ApiOperation)({
552
+ summary: "List named table views",
553
+ description: "Returns the authenticated user's own named views plus all shared views for the given table slug."
554
+ }), (0, import_swagger9.ApiQuery)({
555
+ name: "tableSlug",
556
+ description: "Slug of the table to fetch views for",
557
+ example: "cloud-providers",
558
+ required: true
559
+ }), (0, import_swagger9.ApiResponse)({
560
+ status: 200,
561
+ description: "Named views retrieved.",
562
+ type: [
563
+ DataTableViewDto
564
+ ]
565
+ }), (0, import_swagger9.ApiResponse)({
566
+ status: 401,
567
+ description: "Unauthorized."
568
+ }));
569
+ }
570
+ __name(ApiListDataTableViews, "ApiListDataTableViews");
571
+ function ApiCreateDataTableView() {
572
+ return (0, import_common5.applyDecorators)((0, import_swagger9.ApiOperation)({
573
+ summary: "Create named table view",
574
+ description: "Saves the current table state as a named view snapshot. The name must be unique per user+table."
575
+ }), (0, import_swagger9.ApiBody)({
576
+ type: CreateDataTableViewDto
577
+ }), (0, import_swagger9.ApiResponse)({
578
+ status: 201,
579
+ description: "Named view created.",
580
+ type: DataTableViewDto
581
+ }), (0, import_swagger9.ApiResponse)({
582
+ status: 400,
583
+ description: "Invalid request body."
584
+ }), (0, import_swagger9.ApiResponse)({
585
+ status: 401,
586
+ description: "Unauthorized."
587
+ }));
588
+ }
589
+ __name(ApiCreateDataTableView, "ApiCreateDataTableView");
590
+ function ApiUpdateDataTableView() {
591
+ return (0, import_common5.applyDecorators)((0, import_swagger9.ApiOperation)({
592
+ summary: "Update named table view",
593
+ description: "Updates the state of an existing named view. Only the owner can update."
594
+ }), (0, import_swagger9.ApiParam)({
595
+ name: "id",
596
+ description: "UUID of the table view to update"
597
+ }), (0, import_swagger9.ApiBody)({
598
+ type: UpdateDataTableViewDto
599
+ }), (0, import_swagger9.ApiResponse)({
600
+ status: 200,
601
+ description: "View updated.",
602
+ type: DataTableViewDto
603
+ }), (0, import_swagger9.ApiResponse)({
604
+ status: 400,
605
+ description: "Validation failed or not owned by caller."
606
+ }), (0, import_swagger9.ApiResponse)({
607
+ status: 401,
608
+ description: "Unauthorized."
609
+ }), (0, import_swagger9.ApiResponse)({
610
+ status: 404,
611
+ description: "View not found."
612
+ }));
613
+ }
614
+ __name(ApiUpdateDataTableView, "ApiUpdateDataTableView");
615
+ function ApiRenameDataTableView() {
616
+ return (0, import_common5.applyDecorators)((0, import_swagger9.ApiOperation)({
617
+ summary: "Rename a named table view",
618
+ description: "Updates the display name of an existing view. The new name must be unique per user+table. Only the owner can rename."
619
+ }), (0, import_swagger9.ApiParam)({
620
+ name: "id",
621
+ description: "UUID of the table view to rename"
622
+ }), (0, import_swagger9.ApiBody)({
623
+ type: RenameDataTableViewDto
624
+ }), (0, import_swagger9.ApiResponse)({
625
+ status: 200,
626
+ description: "View renamed.",
627
+ type: DataTableViewDto
628
+ }), (0, import_swagger9.ApiResponse)({
629
+ status: 400,
630
+ description: "Not owned by caller."
631
+ }), (0, import_swagger9.ApiResponse)({
632
+ status: 401,
633
+ description: "Unauthorized."
634
+ }), (0, import_swagger9.ApiResponse)({
635
+ status: 404,
636
+ description: "View not found."
637
+ }), (0, import_swagger9.ApiResponse)({
638
+ status: 409,
639
+ description: "A view with this name already exists."
640
+ }));
641
+ }
642
+ __name(ApiRenameDataTableView, "ApiRenameDataTableView");
643
+ function ApiToggleShareDataTableView() {
644
+ return (0, import_common5.applyDecorators)((0, import_swagger9.ApiOperation)({
645
+ summary: "Toggle view sharing",
646
+ description: "Makes a view visible to all users (shared) or restricts it to the owner only (private). Only the owner can toggle sharing."
647
+ }), (0, import_swagger9.ApiParam)({
648
+ name: "id",
649
+ description: "UUID of the table view"
650
+ }), (0, import_swagger9.ApiBody)({
651
+ type: ToggleShareDataTableViewDto
652
+ }), (0, import_swagger9.ApiResponse)({
653
+ status: 200,
654
+ description: "Sharing status updated.",
655
+ type: DataTableViewDto
656
+ }), (0, import_swagger9.ApiResponse)({
657
+ status: 400,
658
+ description: "Not owned by caller."
659
+ }), (0, import_swagger9.ApiResponse)({
660
+ status: 401,
661
+ description: "Unauthorized."
662
+ }), (0, import_swagger9.ApiResponse)({
663
+ status: 404,
664
+ description: "View not found."
665
+ }));
666
+ }
667
+ __name(ApiToggleShareDataTableView, "ApiToggleShareDataTableView");
668
+ function ApiDeleteDataTableView() {
669
+ return (0, import_common5.applyDecorators)((0, import_swagger9.ApiOperation)({
670
+ summary: "Delete named table view",
671
+ description: "Permanently deletes a named view. Only the owner can delete their own views."
672
+ }), (0, import_swagger9.ApiParam)({
673
+ name: "id",
674
+ description: "UUID of the table view to delete"
675
+ }), (0, import_swagger9.ApiResponse)({
676
+ status: 200,
677
+ description: "View deleted.",
678
+ type: DataTableViewDto
679
+ }), (0, import_swagger9.ApiResponse)({
680
+ status: 400,
681
+ description: "Not owned by caller."
682
+ }), (0, import_swagger9.ApiResponse)({
683
+ status: 401,
684
+ description: "Unauthorized."
685
+ }), (0, import_swagger9.ApiResponse)({
686
+ status: 404,
687
+ description: "View not found."
688
+ }));
689
+ }
690
+ __name(ApiDeleteDataTableView, "ApiDeleteDataTableView");
691
+
692
+ // src/data-table/views/services/data-table-views.service.ts
693
+ var import_node_crypto = require("crypto");
694
+ var import_common26 = require("@nestjs/common");
695
+ var import_config2 = require("@nestjs/config");
696
+ var import_cache2 = require("@vritti/api-sdk/cache");
697
+
698
+ // src/exceptions/bad-gateway.exception.ts
699
+ var import_common7 = require("@nestjs/common");
700
+
701
+ // src/exceptions/base-field.exception.ts
702
+ var import_common6 = require("@nestjs/common");
703
+ var HttpProblemException = class extends import_common6.HttpException {
704
+ static {
705
+ __name(this, "HttpProblemException");
706
+ }
707
+ constructor(detailOrOptions, httpStatus) {
708
+ const options = typeof detailOrOptions === "string" ? {
709
+ detail: detailOrOptions
710
+ } : detailOrOptions;
711
+ super({
712
+ type: options.type ?? "about:blank",
713
+ label: options.label,
714
+ detail: options.detail,
715
+ errors: options.errors ?? []
716
+ }, httpStatus);
717
+ }
718
+ };
719
+
720
+ // src/exceptions/bad-request.exception.ts
721
+ var import_common8 = require("@nestjs/common");
722
+ var BadRequestException = class extends HttpProblemException {
723
+ static {
724
+ __name(this, "BadRequestException");
725
+ }
726
+ constructor(detailOrOptions) {
727
+ super(detailOrOptions ?? "Bad Request", import_common8.HttpStatus.BAD_REQUEST);
728
+ }
729
+ };
730
+
731
+ // src/exceptions/conflict.exception.ts
732
+ var import_common9 = require("@nestjs/common");
733
+ var ConflictException = class extends HttpProblemException {
734
+ static {
735
+ __name(this, "ConflictException");
736
+ }
737
+ constructor(detailOrOptions) {
738
+ super(detailOrOptions ?? "Conflict", import_common9.HttpStatus.CONFLICT);
739
+ }
740
+ };
741
+
742
+ // src/exceptions/forbidden.exception.ts
743
+ var import_common10 = require("@nestjs/common");
744
+
745
+ // src/exceptions/gone.exception.ts
746
+ var import_common11 = require("@nestjs/common");
747
+
748
+ // src/exceptions/internal-server-error.exception.ts
749
+ var import_common12 = require("@nestjs/common");
750
+
751
+ // src/exceptions/method-not-allowed.exception.ts
752
+ var import_common13 = require("@nestjs/common");
753
+
754
+ // src/exceptions/not-acceptable.exception.ts
755
+ var import_common14 = require("@nestjs/common");
756
+
757
+ // src/exceptions/not-found.exception.ts
758
+ var import_common15 = require("@nestjs/common");
759
+ var NotFoundException = class extends HttpProblemException {
760
+ static {
761
+ __name(this, "NotFoundException");
762
+ }
763
+ constructor(detailOrOptions) {
764
+ super(detailOrOptions ?? "Not Found", import_common15.HttpStatus.NOT_FOUND);
765
+ }
766
+ };
767
+
768
+ // src/exceptions/not-implemented.exception.ts
769
+ var import_common16 = require("@nestjs/common");
770
+
771
+ // src/exceptions/payload-too-large.exception.ts
772
+ var import_common17 = require("@nestjs/common");
773
+
774
+ // src/exceptions/request-timeout.exception.ts
775
+ var import_common18 = require("@nestjs/common");
776
+
777
+ // src/exceptions/service-unavailable.exception.ts
778
+ var import_common19 = require("@nestjs/common");
779
+
780
+ // src/exceptions/too-many-requests.exception.ts
781
+ var import_common20 = require("@nestjs/common");
782
+
783
+ // src/exceptions/unauthorized.exception.ts
784
+ var import_common21 = require("@nestjs/common");
785
+
786
+ // src/exceptions/unprocessable-entity.exception.ts
787
+ var import_common22 = require("@nestjs/common");
788
+
789
+ // src/exceptions/unsupported-media-type.exception.ts
790
+ var import_common23 = require("@nestjs/common");
791
+
792
+ // src/exceptions/validation.exception.ts
793
+ var import_common24 = require("@nestjs/common");
794
+
795
+ // src/data-table/views/repositories/data-table-views.repository.ts
796
+ var import_common25 = require("@nestjs/common");
797
+ var import_drizzle_orm = require("drizzle-orm");
798
+ var import_database = require("@vritti/api-sdk/database");
799
+ function _ts_decorate9(decorators, target, key, desc) {
800
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
801
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
802
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
803
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
804
+ }
805
+ __name(_ts_decorate9, "_ts_decorate");
806
+ function _ts_metadata9(k, v) {
807
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
808
+ }
809
+ __name(_ts_metadata9, "_ts_metadata");
810
+ function _ts_param2(paramIndex, decorator) {
811
+ return function(target, key) {
812
+ decorator(target, key, paramIndex);
813
+ };
814
+ }
815
+ __name(_ts_param2, "_ts_param");
816
+ var NAMED_VIEWS_LIMIT = 100;
817
+ var DataTableViewsRepository = class extends import_database.PrimaryBaseRepository {
818
+ static {
819
+ __name(this, "DataTableViewsRepository");
820
+ }
821
+ constructor(database, table) {
822
+ super(database, table);
823
+ }
824
+ // Returns personal (non-shared) named views owned by the user for a given table
825
+ async findPersonalViewsBySlug(userId, tableSlug) {
826
+ const t = this.table;
827
+ return this.db.select().from(this.table).where((0, import_drizzle_orm.and)((0, import_drizzle_orm.eq)(t.tableSlug, tableSlug), (0, import_drizzle_orm.eq)(t.userId, userId), (0, import_drizzle_orm.eq)(t.isShared, false))).orderBy(t.createdAt).limit(NAMED_VIEWS_LIMIT);
828
+ }
829
+ // Returns all shared named views for a given table — visible to all users
830
+ async findSharedViewsBySlug(tableSlug) {
831
+ const t = this.table;
832
+ return this.db.select().from(this.table).where((0, import_drizzle_orm.and)((0, import_drizzle_orm.eq)(t.tableSlug, tableSlug), (0, import_drizzle_orm.eq)(t.isShared, true))).orderBy(t.createdAt).limit(NAMED_VIEWS_LIMIT);
833
+ }
834
+ };
835
+ DataTableViewsRepository = _ts_decorate9([
836
+ (0, import_common25.Injectable)(),
837
+ _ts_param2(1, (0, import_common25.Inject)(DATA_TABLE_VIEWS_TABLE)),
838
+ _ts_metadata9("design:type", Function),
839
+ _ts_metadata9("design:paramtypes", [
840
+ typeof import_database.PrimaryDatabaseService === "undefined" ? Object : import_database.PrimaryDatabaseService,
841
+ typeof PgTable === "undefined" ? Object : PgTable
842
+ ])
843
+ ], DataTableViewsRepository);
844
+
845
+ // src/data-table/views/services/data-table-views.service.ts
846
+ function _ts_decorate10(decorators, target, key, desc) {
847
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
848
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
849
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
850
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
851
+ }
852
+ __name(_ts_decorate10, "_ts_decorate");
853
+ function _ts_metadata10(k, v) {
854
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
855
+ }
856
+ __name(_ts_metadata10, "_ts_metadata");
857
+ function computeChecksum(value) {
858
+ return (0, import_node_crypto.createHash)("sha256").update(JSON.stringify(value)).digest("hex");
859
+ }
860
+ __name(computeChecksum, "computeChecksum");
861
+ var DataTableViewsService = class _DataTableViewsService {
862
+ static {
863
+ __name(this, "DataTableViewsService");
864
+ }
865
+ dataTableViewsRepository;
866
+ cacheService;
867
+ configService;
868
+ logger = new import_common26.Logger(_DataTableViewsService.name);
869
+ constructor(dataTableViewsRepository, cacheService, configService) {
870
+ this.dataTableViewsRepository = dataTableViewsRepository;
871
+ this.cacheService = cacheService;
872
+ this.configService = configService;
873
+ }
874
+ // Builds the Redis key for a user's personal (non-shared) views for a given table
875
+ personalViewsKey(userId, tableSlug) {
876
+ return `views:personal:${userId}:${tableSlug}`;
877
+ }
878
+ // Builds the Redis key for all shared views for a given table — same key for all users
879
+ sharedViewsKey(tableSlug) {
880
+ return `views:shared:${tableSlug}`;
881
+ }
882
+ // Returns configured TTL for named views in seconds, defaulting to 86400 (24h)
883
+ get viewsTtl() {
884
+ return this.configService.get("TABLE_VIEWS_CACHE_TTL") ?? 86400;
885
+ }
886
+ // Fetches personal views from cache; falls back to DB and warms cache on miss
887
+ async getOrCachePersonalViews(userId, tableSlug) {
888
+ const key = this.personalViewsKey(userId, tableSlug);
889
+ const cached = await this.cacheService.get(key);
890
+ if (cached) {
891
+ this.logger.debug(`Cache hit for personal views: user=${userId}, table=${tableSlug}`);
892
+ return cached;
893
+ }
894
+ const rows = await this.dataTableViewsRepository.findPersonalViewsBySlug(userId, tableSlug);
895
+ await this.cacheService.set(key, rows, this.viewsTtl);
896
+ return rows;
897
+ }
898
+ // Fetches shared views from cache; falls back to DB and warms cache on miss
899
+ async getOrCacheSharedViews(tableSlug) {
900
+ const key = this.sharedViewsKey(tableSlug);
901
+ const cached = await this.cacheService.get(key);
902
+ if (cached) {
903
+ this.logger.debug(`Cache hit for shared views: table=${tableSlug}`);
904
+ return cached;
905
+ }
906
+ const rows = await this.dataTableViewsRepository.findSharedViewsBySlug(tableSlug);
907
+ await this.cacheService.set(key, rows, this.viewsTtl);
908
+ return rows;
909
+ }
910
+ // Deletes personal and/or shared cache keys based on which pools the mutation affects
911
+ async invalidateViewsCache(userId, tableSlug, affectsPersonal, affectsShared) {
912
+ const toDelete = [];
913
+ if (affectsPersonal) toDelete.push(this.personalViewsKey(userId, tableSlug));
914
+ if (affectsShared) toDelete.push(this.sharedViewsKey(tableSlug));
915
+ if (toDelete.length > 0) await this.cacheService.del(...toDelete);
916
+ }
917
+ // Returns personal + shared named views — each pool fetched from cache or DB in parallel
918
+ async findViews(userId, tableSlug) {
919
+ const [personalRows, sharedRows] = await Promise.all([
920
+ this.getOrCachePersonalViews(userId, tableSlug),
921
+ this.getOrCacheSharedViews(tableSlug)
922
+ ]);
923
+ return [
924
+ ...personalRows,
925
+ ...sharedRows
926
+ ].map((row) => DataTableViewDto.from(row, userId));
927
+ }
928
+ // Creates a named snapshot and invalidates the relevant cache pool
929
+ async createView(userId, dto) {
930
+ const view = await this.dataTableViewsRepository.create({
931
+ userId,
932
+ tableSlug: dto.tableSlug,
933
+ name: dto.name,
934
+ state: dto.state,
935
+ isShared: dto.isShared ?? false
936
+ });
937
+ this.logger.log(`Created view "${dto.name}" for user: ${userId}, table: ${dto.tableSlug}`);
938
+ const isShared = dto.isShared ?? false;
939
+ await this.invalidateViewsCache(userId, dto.tableSlug, !isShared, isShared);
940
+ return DataTableViewDto.from(view, userId);
941
+ }
942
+ // Updates the state of a named view — skips DB write if state is unchanged
943
+ async updateView(userId, id, dto) {
944
+ const view = await this.dataTableViewsRepository.findById(id);
945
+ if (!view) throw new NotFoundException("Table view not found.");
946
+ if (view.userId !== userId) throw new BadRequestException("You do not have permission to update this view.");
947
+ if (computeChecksum(dto.state) === computeChecksum(view.state)) {
948
+ this.logger.log(`State unchanged for view ${id} \u2014 skipping DB write`);
949
+ return DataTableViewDto.from(view, userId);
950
+ }
951
+ const updated = await this.dataTableViewsRepository.update(id, {
952
+ state: dto.state
953
+ });
954
+ this.logger.log(`Updated state for view ${id}, user: ${userId}`);
955
+ await this.invalidateViewsCache(userId, view.tableSlug, !view.isShared, view.isShared);
956
+ return DataTableViewDto.from(updated, userId);
957
+ }
958
+ // Toggles the sharing status of a named view — updates both personal and shared cache
959
+ async toggleShareView(userId, id, isShared) {
960
+ const view = await this.dataTableViewsRepository.findById(id);
961
+ if (!view) throw new NotFoundException("Table view not found.");
962
+ if (view.userId !== userId) throw new BadRequestException("You do not have permission to share this view.");
963
+ const updated = await this.dataTableViewsRepository.update(id, {
964
+ isShared
965
+ });
966
+ this.logger.log(`Set isShared=${isShared} for view ${id}, user: ${userId}`);
967
+ await this.invalidateViewsCache(userId, view.tableSlug, true, true);
968
+ return DataTableViewDto.from(updated, userId);
969
+ }
970
+ // Renames a named view — enforces unique name per user+table, invalidates personal cache
971
+ async renameView(userId, id, name) {
972
+ const view = await this.dataTableViewsRepository.findById(id);
973
+ if (!view) throw new NotFoundException("Table view not found.");
974
+ if (view.userId !== userId) throw new BadRequestException("You do not have permission to rename this view.");
975
+ const existing = await this.dataTableViewsRepository.findOne({
976
+ userId,
977
+ tableSlug: view.tableSlug,
978
+ name,
979
+ isShared: false
980
+ });
981
+ if (existing && existing.id !== id) {
982
+ throw new ConflictException({
983
+ label: "Name Already Taken",
984
+ detail: "A view with this name already exists for this table.",
985
+ errors: [
986
+ {
987
+ field: "name",
988
+ message: "Name already taken"
989
+ }
990
+ ]
991
+ });
992
+ }
993
+ const updated = await this.dataTableViewsRepository.update(id, {
994
+ name
995
+ });
996
+ this.logger.log(`Renamed view ${id} to "${name}" for user: ${userId}`);
997
+ await this.invalidateViewsCache(userId, view.tableSlug, !view.isShared, view.isShared);
998
+ return DataTableViewDto.from(updated, userId);
999
+ }
1000
+ // Deletes a named view and invalidates the relevant cache pool
1001
+ async deleteView(userId, id) {
1002
+ const view = await this.dataTableViewsRepository.findById(id);
1003
+ if (!view) throw new NotFoundException("Table view not found.");
1004
+ if (view.userId !== userId) throw new BadRequestException("You do not have permission to delete this view.");
1005
+ await this.dataTableViewsRepository.delete(id);
1006
+ this.logger.log(`Deleted view ${id} for user: ${userId}`);
1007
+ await this.invalidateViewsCache(userId, view.tableSlug, !view.isShared, view.isShared);
1008
+ return DataTableViewDto.from(view, userId);
1009
+ }
1010
+ };
1011
+ DataTableViewsService = _ts_decorate10([
1012
+ (0, import_common26.Injectable)(),
1013
+ _ts_metadata10("design:type", Function),
1014
+ _ts_metadata10("design:paramtypes", [
1015
+ typeof DataTableViewsRepository === "undefined" ? Object : DataTableViewsRepository,
1016
+ typeof import_cache2.CacheService === "undefined" ? Object : import_cache2.CacheService,
1017
+ typeof import_config2.ConfigService === "undefined" ? Object : import_config2.ConfigService
1018
+ ])
1019
+ ], DataTableViewsService);
1020
+
1021
+ // src/data-table/views/controllers/data-table-views.controller.ts
1022
+ function _ts_decorate11(decorators, target, key, desc) {
1023
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1024
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1025
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1026
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1027
+ }
1028
+ __name(_ts_decorate11, "_ts_decorate");
1029
+ function _ts_metadata11(k, v) {
1030
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
1031
+ }
1032
+ __name(_ts_metadata11, "_ts_metadata");
1033
+ function _ts_param3(paramIndex, decorator) {
1034
+ return function(target, key) {
1035
+ decorator(target, key, paramIndex);
1036
+ };
1037
+ }
1038
+ __name(_ts_param3, "_ts_param");
1039
+ var DataTableViewsController = class _DataTableViewsController {
1040
+ static {
1041
+ __name(this, "DataTableViewsController");
1042
+ }
1043
+ dataTableViewsService;
1044
+ logger = new import_common27.Logger(_DataTableViewsController.name);
1045
+ constructor(dataTableViewsService) {
1046
+ this.dataTableViewsService = dataTableViewsService;
1047
+ }
1048
+ // Returns all named views for the given table — own plus shared
1049
+ findViews(userId, tableSlug) {
1050
+ this.logger.log(`GET /table-views?tableSlug=${tableSlug} - User: ${userId}`);
1051
+ return this.dataTableViewsService.findViews(userId, tableSlug);
1052
+ }
1053
+ // Creates a named snapshot of the current table state
1054
+ createView(userId, dto) {
1055
+ this.logger.log(`POST /table-views - User: ${userId}, table: ${dto.tableSlug}`);
1056
+ return this.dataTableViewsService.createView(userId, dto);
1057
+ }
1058
+ // Updates state of an existing named view
1059
+ updateView(userId, id, dto) {
1060
+ this.logger.log(`PATCH /table-views/${id} - User: ${userId}`);
1061
+ return this.dataTableViewsService.updateView(userId, id, dto);
1062
+ }
1063
+ // Renames an existing named view — enforces unique name per user+table
1064
+ renameView(userId, id, dto) {
1065
+ this.logger.log(`PATCH /table-views/${id}/rename - User: ${userId}`);
1066
+ return this.dataTableViewsService.renameView(userId, id, dto.name);
1067
+ }
1068
+ // Toggles sharing visibility of a named view
1069
+ toggleShareView(userId, id, dto) {
1070
+ this.logger.log(`PATCH /table-views/${id}/share - User: ${userId}`);
1071
+ return this.dataTableViewsService.toggleShareView(userId, id, dto.isShared);
1072
+ }
1073
+ // Deletes a named view owned by the authenticated user
1074
+ deleteView(userId, id) {
1075
+ this.logger.log(`DELETE /table-views/${id} - User: ${userId}`);
1076
+ return this.dataTableViewsService.deleteView(userId, id);
1077
+ }
1078
+ };
1079
+ _ts_decorate11([
1080
+ (0, import_common27.Get)(),
1081
+ ApiListDataTableViews(),
1082
+ _ts_param3(0, UserId()),
1083
+ _ts_param3(1, (0, import_common27.Query)("tableSlug")),
1084
+ _ts_metadata11("design:type", Function),
1085
+ _ts_metadata11("design:paramtypes", [
1086
+ String,
1087
+ String
1088
+ ]),
1089
+ _ts_metadata11("design:returntype", typeof Promise === "undefined" ? Object : Promise)
1090
+ ], DataTableViewsController.prototype, "findViews", null);
1091
+ _ts_decorate11([
1092
+ (0, import_common27.Post)(),
1093
+ (0, import_common27.HttpCode)(import_common27.HttpStatus.CREATED),
1094
+ ApiCreateDataTableView(),
1095
+ _ts_param3(0, UserId()),
1096
+ _ts_param3(1, (0, import_common27.Body)()),
1097
+ _ts_metadata11("design:type", Function),
1098
+ _ts_metadata11("design:paramtypes", [
1099
+ String,
1100
+ typeof CreateDataTableViewDto === "undefined" ? Object : CreateDataTableViewDto
1101
+ ]),
1102
+ _ts_metadata11("design:returntype", typeof Promise === "undefined" ? Object : Promise)
1103
+ ], DataTableViewsController.prototype, "createView", null);
1104
+ _ts_decorate11([
1105
+ (0, import_common27.Patch)(":id"),
1106
+ ApiUpdateDataTableView(),
1107
+ _ts_param3(0, UserId()),
1108
+ _ts_param3(1, (0, import_common27.Param)("id")),
1109
+ _ts_param3(2, (0, import_common27.Body)()),
1110
+ _ts_metadata11("design:type", Function),
1111
+ _ts_metadata11("design:paramtypes", [
1112
+ String,
1113
+ String,
1114
+ typeof UpdateDataTableViewDto === "undefined" ? Object : UpdateDataTableViewDto
1115
+ ]),
1116
+ _ts_metadata11("design:returntype", typeof Promise === "undefined" ? Object : Promise)
1117
+ ], DataTableViewsController.prototype, "updateView", null);
1118
+ _ts_decorate11([
1119
+ (0, import_common27.Patch)(":id/rename"),
1120
+ ApiRenameDataTableView(),
1121
+ _ts_param3(0, UserId()),
1122
+ _ts_param3(1, (0, import_common27.Param)("id")),
1123
+ _ts_param3(2, (0, import_common27.Body)()),
1124
+ _ts_metadata11("design:type", Function),
1125
+ _ts_metadata11("design:paramtypes", [
1126
+ String,
1127
+ String,
1128
+ typeof RenameDataTableViewDto === "undefined" ? Object : RenameDataTableViewDto
1129
+ ]),
1130
+ _ts_metadata11("design:returntype", typeof Promise === "undefined" ? Object : Promise)
1131
+ ], DataTableViewsController.prototype, "renameView", null);
1132
+ _ts_decorate11([
1133
+ (0, import_common27.Patch)(":id/share"),
1134
+ ApiToggleShareDataTableView(),
1135
+ _ts_param3(0, UserId()),
1136
+ _ts_param3(1, (0, import_common27.Param)("id")),
1137
+ _ts_param3(2, (0, import_common27.Body)()),
1138
+ _ts_metadata11("design:type", Function),
1139
+ _ts_metadata11("design:paramtypes", [
1140
+ String,
1141
+ String,
1142
+ typeof ToggleShareDataTableViewDto === "undefined" ? Object : ToggleShareDataTableViewDto
1143
+ ]),
1144
+ _ts_metadata11("design:returntype", typeof Promise === "undefined" ? Object : Promise)
1145
+ ], DataTableViewsController.prototype, "toggleShareView", null);
1146
+ _ts_decorate11([
1147
+ (0, import_common27.Delete)(":id"),
1148
+ ApiDeleteDataTableView(),
1149
+ _ts_param3(0, UserId()),
1150
+ _ts_param3(1, (0, import_common27.Param)("id")),
1151
+ _ts_metadata11("design:type", Function),
1152
+ _ts_metadata11("design:paramtypes", [
1153
+ String,
1154
+ String
1155
+ ]),
1156
+ _ts_metadata11("design:returntype", typeof Promise === "undefined" ? Object : Promise)
1157
+ ], DataTableViewsController.prototype, "deleteView", null);
1158
+ DataTableViewsController = _ts_decorate11([
1159
+ (0, import_swagger10.ApiTags)("Table Views"),
1160
+ (0, import_swagger10.ApiBearerAuth)(),
1161
+ (0, import_common27.Controller)("table-views"),
1162
+ _ts_metadata11("design:type", Function),
1163
+ _ts_metadata11("design:paramtypes", [
1164
+ typeof DataTableViewsService === "undefined" ? Object : DataTableViewsService
1165
+ ])
1166
+ ], DataTableViewsController);
1167
+
1168
+ // src/data-table/data-table.module.ts
1169
+ function _ts_decorate12(decorators, target, key, desc) {
1170
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1171
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1172
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1173
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1174
+ }
1175
+ __name(_ts_decorate12, "_ts_decorate");
1176
+ var DataTableModule = class _DataTableModule {
1177
+ static {
1178
+ __name(this, "DataTableModule");
1179
+ }
1180
+ static forRoot(options) {
1181
+ return {
1182
+ global: true,
1183
+ module: _DataTableModule,
1184
+ imports: [
1185
+ import_config3.ConfigModule,
1186
+ import_cache3.CacheModule
1187
+ ],
1188
+ controllers: [
1189
+ DataTableStateController,
1190
+ DataTableViewsController
1191
+ ],
1192
+ providers: [
1193
+ {
1194
+ provide: DATA_TABLE_VIEWS_TABLE,
1195
+ useValue: options.tableViews
1196
+ },
1197
+ DataTableViewsService,
1198
+ DataTableViewsRepository,
1199
+ DataTableStateService
1200
+ ],
1201
+ exports: [
1202
+ DataTableViewsService,
1203
+ DataTableStateService
1204
+ ]
1205
+ };
1206
+ }
1207
+ };
1208
+ DataTableModule = _ts_decorate12([
1209
+ (0, import_common28.Module)({})
1210
+ ], DataTableModule);
1211
+
1212
+ // src/drizzle-pg-core.ts
1213
+ var drizzle_pg_core_exports = {};
1214
+ __export(drizzle_pg_core_exports, {
1215
+ codeCheck: () => codeCheck
1216
+ });
1217
+ __reExport(drizzle_pg_core_exports, require("drizzle-orm/pg-core"));
1218
+ var import_drizzle_orm2 = require("drizzle-orm");
1219
+ var import_pg_core = require("drizzle-orm/pg-core");
1220
+
1221
+ // src/decorators/code-pattern.ts
1222
+ var SEGMENT = "[a-z][a-z0-9-]*";
1223
+ var CODE_PATTERN_SOURCE = `^${SEGMENT}$`;
1224
+ var DOTTED_CODE_PATTERN_SOURCE = `^${SEGMENT}(\\.${SEGMENT})*$`;
1225
+ var CODE_PATTERN = new RegExp(CODE_PATTERN_SOURCE);
1226
+ var DOTTED_CODE_PATTERN = new RegExp(DOTTED_CODE_PATTERN_SOURCE);
1227
+
1228
+ // src/drizzle-pg-core.ts
1229
+ function codeCheck(name, column, options) {
1230
+ const source = options?.dotted ? DOTTED_CODE_PATTERN_SOURCE : CODE_PATTERN_SOURCE;
1231
+ return (0, import_pg_core.check)(name, import_drizzle_orm2.sql`${column} ~ ${import_drizzle_orm2.sql.raw(`'${source}'`)}`);
1232
+ }
1233
+ __name(codeCheck, "codeCheck");
1234
+
1235
+ // src/data-table/schema/data-table-views.table.ts
1236
+ function dataTableViewsColumns() {
1237
+ return {
1238
+ id: (0, drizzle_pg_core_exports.uuid)("id").primaryKey().defaultRandom(),
1239
+ userId: (0, drizzle_pg_core_exports.uuid)("user_id").notNull(),
1240
+ tableSlug: (0, drizzle_pg_core_exports.varchar)("table_slug", {
1241
+ length: 200
1242
+ }).notNull(),
1243
+ name: (0, drizzle_pg_core_exports.varchar)("name", {
1244
+ length: 100
1245
+ }).notNull(),
1246
+ state: (0, drizzle_pg_core_exports.jsonb)("state").notNull().$type(),
1247
+ isShared: (0, drizzle_pg_core_exports.boolean)("is_shared").notNull().default(false),
1248
+ createdAt: (0, drizzle_pg_core_exports.timestamp)("created_at", {
1249
+ withTimezone: true
1250
+ }).notNull().defaultNow(),
1251
+ updatedAt: (0, drizzle_pg_core_exports.timestamp)("updated_at", {
1252
+ withTimezone: true
1253
+ }).$onUpdate(() => /* @__PURE__ */ new Date())
1254
+ };
1255
+ }
1256
+ __name(dataTableViewsColumns, "dataTableViewsColumns");
1257
+ function dataTableViewsIndexes(table) {
1258
+ return [
1259
+ (0, drizzle_pg_core_exports.index)("table_views_user_table_idx").on(table.userId, table.tableSlug),
1260
+ (0, drizzle_pg_core_exports.index)("table_views_shared_slug_idx").on(table.tableSlug, table.isShared),
1261
+ (0, drizzle_pg_core_exports.uniqueIndex)("table_views_user_table_name_shared_unique").on(table.userId, table.tableSlug, table.name, table.isShared)
1262
+ ];
1263
+ }
1264
+ __name(dataTableViewsIndexes, "dataTableViewsIndexes");
1265
+ // Annotate the CommonJS export names for ESM import in node:
1266
+ 0 && (module.exports = {
1267
+ CreateDataTableViewDto,
1268
+ DATA_TABLE_VIEWS_TABLE,
1269
+ DataTableModule,
1270
+ DataTableStateService,
1271
+ DataTableViewDto,
1272
+ DataTableViewsService,
1273
+ RenameDataTableViewDto,
1274
+ ToggleShareDataTableViewDto,
1275
+ UpdateDataTableViewDto,
1276
+ UpsertDataTableStateDto,
1277
+ dataTableViewsColumns,
1278
+ dataTableViewsIndexes
1279
+ });
1280
+ //# sourceMappingURL=data-table.cjs.map