@murumets-ee/settings 0.1.1 → 0.1.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.
- package/dist/plugin.js +24 -1
- package/package.json +9 -14
- package/dist/admin.cjs +0 -1
- package/dist/admin.d.cts +0 -100
- package/dist/index.cjs +0 -1
- package/dist/index.d.cts +0 -291
- package/dist/index.d.ts +0 -291
- package/dist/plugin.cjs +0 -1
- package/dist/plugin.d.cts +0 -22
- package/dist/plugin.d.ts +0 -22
- package/dist/schema.cjs +0 -1
- package/dist/schema.d.cts +0 -316
- package/dist/schema.d.ts +0 -316
- package/dist/view-state.cjs +0 -1
- package/dist/view-state.d.cts +0 -68
- package/dist/view-state.d.ts +0 -68
package/dist/schema.d.ts
DELETED
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Drizzle schema for settings tables.
|
|
5
|
-
*
|
|
6
|
-
* Two tables:
|
|
7
|
-
* - toolkit_settings: typed key-value settings grouped by namespace and scope
|
|
8
|
-
* - toolkit_view_state: schemaless user-scoped JSON blobs with optional TTL
|
|
9
|
-
*
|
|
10
|
-
* Usage in drizzle.config.ts:
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import type { Config } from 'drizzle-kit'
|
|
13
|
-
* export default {
|
|
14
|
-
* schema: ['./generated/schema.ts', '@murumets-ee/settings/schema'],
|
|
15
|
-
* // ...
|
|
16
|
-
* } satisfies Config
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
/**
|
|
20
|
-
* Typed settings table.
|
|
21
|
-
*
|
|
22
|
-
* Stores key-value pairs grouped by namespace and scoped
|
|
23
|
-
* to global, team, or user contexts.
|
|
24
|
-
*
|
|
25
|
-
* scopeId uses '__global__' sentinel for global scope to avoid
|
|
26
|
-
* PostgreSQL's NULL != NULL behavior in unique constraints.
|
|
27
|
-
*/
|
|
28
|
-
declare const toolkitSettings: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
29
|
-
name: "toolkit_settings";
|
|
30
|
-
schema: undefined;
|
|
31
|
-
columns: {
|
|
32
|
-
id: drizzle_orm_pg_core.PgColumn<{
|
|
33
|
-
name: "id";
|
|
34
|
-
tableName: "toolkit_settings";
|
|
35
|
-
dataType: "string";
|
|
36
|
-
columnType: "PgUUID";
|
|
37
|
-
data: string;
|
|
38
|
-
driverParam: string;
|
|
39
|
-
notNull: true;
|
|
40
|
-
hasDefault: true;
|
|
41
|
-
isPrimaryKey: true;
|
|
42
|
-
isAutoincrement: false;
|
|
43
|
-
hasRuntimeDefault: false;
|
|
44
|
-
enumValues: undefined;
|
|
45
|
-
baseColumn: never;
|
|
46
|
-
identity: undefined;
|
|
47
|
-
generated: undefined;
|
|
48
|
-
}, {}, {}>;
|
|
49
|
-
namespace: drizzle_orm_pg_core.PgColumn<{
|
|
50
|
-
name: "namespace";
|
|
51
|
-
tableName: "toolkit_settings";
|
|
52
|
-
dataType: "string";
|
|
53
|
-
columnType: "PgVarchar";
|
|
54
|
-
data: string;
|
|
55
|
-
driverParam: string;
|
|
56
|
-
notNull: true;
|
|
57
|
-
hasDefault: false;
|
|
58
|
-
isPrimaryKey: false;
|
|
59
|
-
isAutoincrement: false;
|
|
60
|
-
hasRuntimeDefault: false;
|
|
61
|
-
enumValues: [string, ...string[]];
|
|
62
|
-
baseColumn: never;
|
|
63
|
-
identity: undefined;
|
|
64
|
-
generated: undefined;
|
|
65
|
-
}, {}, {
|
|
66
|
-
length: 100;
|
|
67
|
-
}>;
|
|
68
|
-
scope: drizzle_orm_pg_core.PgColumn<{
|
|
69
|
-
name: "scope";
|
|
70
|
-
tableName: "toolkit_settings";
|
|
71
|
-
dataType: "string";
|
|
72
|
-
columnType: "PgVarchar";
|
|
73
|
-
data: string;
|
|
74
|
-
driverParam: string;
|
|
75
|
-
notNull: true;
|
|
76
|
-
hasDefault: true;
|
|
77
|
-
isPrimaryKey: false;
|
|
78
|
-
isAutoincrement: false;
|
|
79
|
-
hasRuntimeDefault: false;
|
|
80
|
-
enumValues: [string, ...string[]];
|
|
81
|
-
baseColumn: never;
|
|
82
|
-
identity: undefined;
|
|
83
|
-
generated: undefined;
|
|
84
|
-
}, {}, {
|
|
85
|
-
length: 20;
|
|
86
|
-
}>;
|
|
87
|
-
scopeId: drizzle_orm_pg_core.PgColumn<{
|
|
88
|
-
name: "scope_id";
|
|
89
|
-
tableName: "toolkit_settings";
|
|
90
|
-
dataType: "string";
|
|
91
|
-
columnType: "PgVarchar";
|
|
92
|
-
data: string;
|
|
93
|
-
driverParam: string;
|
|
94
|
-
notNull: true;
|
|
95
|
-
hasDefault: true;
|
|
96
|
-
isPrimaryKey: false;
|
|
97
|
-
isAutoincrement: false;
|
|
98
|
-
hasRuntimeDefault: false;
|
|
99
|
-
enumValues: [string, ...string[]];
|
|
100
|
-
baseColumn: never;
|
|
101
|
-
identity: undefined;
|
|
102
|
-
generated: undefined;
|
|
103
|
-
}, {}, {
|
|
104
|
-
length: 100;
|
|
105
|
-
}>;
|
|
106
|
-
key: drizzle_orm_pg_core.PgColumn<{
|
|
107
|
-
name: "key";
|
|
108
|
-
tableName: "toolkit_settings";
|
|
109
|
-
dataType: "string";
|
|
110
|
-
columnType: "PgVarchar";
|
|
111
|
-
data: string;
|
|
112
|
-
driverParam: string;
|
|
113
|
-
notNull: true;
|
|
114
|
-
hasDefault: false;
|
|
115
|
-
isPrimaryKey: false;
|
|
116
|
-
isAutoincrement: false;
|
|
117
|
-
hasRuntimeDefault: false;
|
|
118
|
-
enumValues: [string, ...string[]];
|
|
119
|
-
baseColumn: never;
|
|
120
|
-
identity: undefined;
|
|
121
|
-
generated: undefined;
|
|
122
|
-
}, {}, {
|
|
123
|
-
length: 255;
|
|
124
|
-
}>;
|
|
125
|
-
locale: drizzle_orm_pg_core.PgColumn<{
|
|
126
|
-
name: "locale";
|
|
127
|
-
tableName: "toolkit_settings";
|
|
128
|
-
dataType: "string";
|
|
129
|
-
columnType: "PgVarchar";
|
|
130
|
-
data: string;
|
|
131
|
-
driverParam: string;
|
|
132
|
-
notNull: true;
|
|
133
|
-
hasDefault: true;
|
|
134
|
-
isPrimaryKey: false;
|
|
135
|
-
isAutoincrement: false;
|
|
136
|
-
hasRuntimeDefault: false;
|
|
137
|
-
enumValues: [string, ...string[]];
|
|
138
|
-
baseColumn: never;
|
|
139
|
-
identity: undefined;
|
|
140
|
-
generated: undefined;
|
|
141
|
-
}, {}, {
|
|
142
|
-
length: 10;
|
|
143
|
-
}>;
|
|
144
|
-
value: drizzle_orm_pg_core.PgColumn<{
|
|
145
|
-
name: "value";
|
|
146
|
-
tableName: "toolkit_settings";
|
|
147
|
-
dataType: "json";
|
|
148
|
-
columnType: "PgJsonb";
|
|
149
|
-
data: unknown;
|
|
150
|
-
driverParam: unknown;
|
|
151
|
-
notNull: false;
|
|
152
|
-
hasDefault: false;
|
|
153
|
-
isPrimaryKey: false;
|
|
154
|
-
isAutoincrement: false;
|
|
155
|
-
hasRuntimeDefault: false;
|
|
156
|
-
enumValues: undefined;
|
|
157
|
-
baseColumn: never;
|
|
158
|
-
identity: undefined;
|
|
159
|
-
generated: undefined;
|
|
160
|
-
}, {}, {}>;
|
|
161
|
-
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
162
|
-
name: "updated_at";
|
|
163
|
-
tableName: "toolkit_settings";
|
|
164
|
-
dataType: "date";
|
|
165
|
-
columnType: "PgTimestamp";
|
|
166
|
-
data: Date;
|
|
167
|
-
driverParam: string;
|
|
168
|
-
notNull: true;
|
|
169
|
-
hasDefault: true;
|
|
170
|
-
isPrimaryKey: false;
|
|
171
|
-
isAutoincrement: false;
|
|
172
|
-
hasRuntimeDefault: false;
|
|
173
|
-
enumValues: undefined;
|
|
174
|
-
baseColumn: never;
|
|
175
|
-
identity: undefined;
|
|
176
|
-
generated: undefined;
|
|
177
|
-
}, {}, {}>;
|
|
178
|
-
updatedBy: drizzle_orm_pg_core.PgColumn<{
|
|
179
|
-
name: "updated_by";
|
|
180
|
-
tableName: "toolkit_settings";
|
|
181
|
-
dataType: "string";
|
|
182
|
-
columnType: "PgUUID";
|
|
183
|
-
data: string;
|
|
184
|
-
driverParam: string;
|
|
185
|
-
notNull: false;
|
|
186
|
-
hasDefault: false;
|
|
187
|
-
isPrimaryKey: false;
|
|
188
|
-
isAutoincrement: false;
|
|
189
|
-
hasRuntimeDefault: false;
|
|
190
|
-
enumValues: undefined;
|
|
191
|
-
baseColumn: never;
|
|
192
|
-
identity: undefined;
|
|
193
|
-
generated: undefined;
|
|
194
|
-
}, {}, {}>;
|
|
195
|
-
};
|
|
196
|
-
dialect: "pg";
|
|
197
|
-
}>;
|
|
198
|
-
/**
|
|
199
|
-
* View state table.
|
|
200
|
-
*
|
|
201
|
-
* Stores schemaless user-scoped JSON blobs for persisting
|
|
202
|
-
* UI state (table filters, column order, etc.) with optional TTL.
|
|
203
|
-
*/
|
|
204
|
-
declare const toolkitViewState: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
205
|
-
name: "toolkit_view_state";
|
|
206
|
-
schema: undefined;
|
|
207
|
-
columns: {
|
|
208
|
-
id: drizzle_orm_pg_core.PgColumn<{
|
|
209
|
-
name: "id";
|
|
210
|
-
tableName: "toolkit_view_state";
|
|
211
|
-
dataType: "string";
|
|
212
|
-
columnType: "PgUUID";
|
|
213
|
-
data: string;
|
|
214
|
-
driverParam: string;
|
|
215
|
-
notNull: true;
|
|
216
|
-
hasDefault: true;
|
|
217
|
-
isPrimaryKey: true;
|
|
218
|
-
isAutoincrement: false;
|
|
219
|
-
hasRuntimeDefault: false;
|
|
220
|
-
enumValues: undefined;
|
|
221
|
-
baseColumn: never;
|
|
222
|
-
identity: undefined;
|
|
223
|
-
generated: undefined;
|
|
224
|
-
}, {}, {}>;
|
|
225
|
-
userId: drizzle_orm_pg_core.PgColumn<{
|
|
226
|
-
name: "user_id";
|
|
227
|
-
tableName: "toolkit_view_state";
|
|
228
|
-
dataType: "string";
|
|
229
|
-
columnType: "PgUUID";
|
|
230
|
-
data: string;
|
|
231
|
-
driverParam: string;
|
|
232
|
-
notNull: true;
|
|
233
|
-
hasDefault: false;
|
|
234
|
-
isPrimaryKey: false;
|
|
235
|
-
isAutoincrement: false;
|
|
236
|
-
hasRuntimeDefault: false;
|
|
237
|
-
enumValues: undefined;
|
|
238
|
-
baseColumn: never;
|
|
239
|
-
identity: undefined;
|
|
240
|
-
generated: undefined;
|
|
241
|
-
}, {}, {}>;
|
|
242
|
-
viewKey: drizzle_orm_pg_core.PgColumn<{
|
|
243
|
-
name: "view_key";
|
|
244
|
-
tableName: "toolkit_view_state";
|
|
245
|
-
dataType: "string";
|
|
246
|
-
columnType: "PgVarchar";
|
|
247
|
-
data: string;
|
|
248
|
-
driverParam: string;
|
|
249
|
-
notNull: true;
|
|
250
|
-
hasDefault: false;
|
|
251
|
-
isPrimaryKey: false;
|
|
252
|
-
isAutoincrement: false;
|
|
253
|
-
hasRuntimeDefault: false;
|
|
254
|
-
enumValues: [string, ...string[]];
|
|
255
|
-
baseColumn: never;
|
|
256
|
-
identity: undefined;
|
|
257
|
-
generated: undefined;
|
|
258
|
-
}, {}, {
|
|
259
|
-
length: 255;
|
|
260
|
-
}>;
|
|
261
|
-
state: drizzle_orm_pg_core.PgColumn<{
|
|
262
|
-
name: "state";
|
|
263
|
-
tableName: "toolkit_view_state";
|
|
264
|
-
dataType: "json";
|
|
265
|
-
columnType: "PgJsonb";
|
|
266
|
-
data: unknown;
|
|
267
|
-
driverParam: unknown;
|
|
268
|
-
notNull: true;
|
|
269
|
-
hasDefault: false;
|
|
270
|
-
isPrimaryKey: false;
|
|
271
|
-
isAutoincrement: false;
|
|
272
|
-
hasRuntimeDefault: false;
|
|
273
|
-
enumValues: undefined;
|
|
274
|
-
baseColumn: never;
|
|
275
|
-
identity: undefined;
|
|
276
|
-
generated: undefined;
|
|
277
|
-
}, {}, {}>;
|
|
278
|
-
expiresAt: drizzle_orm_pg_core.PgColumn<{
|
|
279
|
-
name: "expires_at";
|
|
280
|
-
tableName: "toolkit_view_state";
|
|
281
|
-
dataType: "date";
|
|
282
|
-
columnType: "PgTimestamp";
|
|
283
|
-
data: Date;
|
|
284
|
-
driverParam: string;
|
|
285
|
-
notNull: false;
|
|
286
|
-
hasDefault: false;
|
|
287
|
-
isPrimaryKey: false;
|
|
288
|
-
isAutoincrement: false;
|
|
289
|
-
hasRuntimeDefault: false;
|
|
290
|
-
enumValues: undefined;
|
|
291
|
-
baseColumn: never;
|
|
292
|
-
identity: undefined;
|
|
293
|
-
generated: undefined;
|
|
294
|
-
}, {}, {}>;
|
|
295
|
-
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
296
|
-
name: "updated_at";
|
|
297
|
-
tableName: "toolkit_view_state";
|
|
298
|
-
dataType: "date";
|
|
299
|
-
columnType: "PgTimestamp";
|
|
300
|
-
data: Date;
|
|
301
|
-
driverParam: string;
|
|
302
|
-
notNull: true;
|
|
303
|
-
hasDefault: true;
|
|
304
|
-
isPrimaryKey: false;
|
|
305
|
-
isAutoincrement: false;
|
|
306
|
-
hasRuntimeDefault: false;
|
|
307
|
-
enumValues: undefined;
|
|
308
|
-
baseColumn: never;
|
|
309
|
-
identity: undefined;
|
|
310
|
-
generated: undefined;
|
|
311
|
-
}, {}, {}>;
|
|
312
|
-
};
|
|
313
|
-
dialect: "pg";
|
|
314
|
-
}>;
|
|
315
|
-
|
|
316
|
-
export { toolkitSettings, toolkitViewState };
|
package/dist/view-state.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var d=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var i in e)d(r,i,{get:e[i],enumerable:!0})},h=(r,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of p(e))!w.call(r,a)&&a!==i&&d(r,a,{get:()=>e[a],enumerable:!(o=g(e,a))||o.enumerable});return r};var m=r=>h(d({},"__esModule",{value:!0}),r);var b={};c(b,{ViewStateClient:()=>l,createViewStateClient:()=>I});module.exports=m(b);var n=require("drizzle-orm");var t=require("drizzle-orm/pg-core"),x=(0,t.pgTable)("toolkit_settings",{id:(0,t.uuid)("id").primaryKey().defaultRandom(),namespace:(0,t.varchar)("namespace",{length:100}).notNull(),scope:(0,t.varchar)("scope",{length:20}).notNull().default("global"),scopeId:(0,t.varchar)("scope_id",{length:100}).notNull().default("__global__"),key:(0,t.varchar)("key",{length:255}).notNull(),locale:(0,t.varchar)("locale",{length:10}).notNull().default("_default"),value:(0,t.jsonb)("value"),updatedAt:(0,t.timestamp)("updated_at",{withTimezone:!0}).notNull().defaultNow(),updatedBy:(0,t.uuid)("updated_by")},r=>({uniqueSetting:(0,t.unique)().on(r.namespace,r.scope,r.scopeId,r.key,r.locale)})),s=(0,t.pgTable)("toolkit_view_state",{id:(0,t.uuid)("id").primaryKey().defaultRandom(),userId:(0,t.uuid)("user_id").notNull(),viewKey:(0,t.varchar)("view_key",{length:255}).notNull(),state:(0,t.jsonb)("state").notNull(),expiresAt:(0,t.timestamp)("expires_at",{withTimezone:!0}),updatedAt:(0,t.timestamp)("updated_at",{withTimezone:!0}).notNull().defaultNow()},r=>({uniqueUserView:(0,t.unique)().on(r.userId,r.viewKey)}));var f=720*60*60,l=class{db;userId;logger;defaultTtl;constructor(e){if(typeof window<"u")throw new Error("ViewStateClient cannot be used in browser code.");this.db=e.db,this.userId=e.userId,this.logger=e.logger,this.defaultTtl=e.defaultTtl??f}async save(e,i,o){this.logger?.debug({userId:this.userId,viewKey:e},"Saving view state");let a=o?.ttl??this.defaultTtl,u=new Date(Date.now()+a*1e3);await this.db.insert(s).values({userId:this.userId,viewKey:e,state:i,expiresAt:u,updatedAt:new Date}).onConflictDoUpdate({target:[s.userId,s.viewKey],set:{state:i,expiresAt:u,updatedAt:new Date}})}async load(e){this.logger?.debug({userId:this.userId,viewKey:e},"Loading view state");let i=await this.db.select({state:s.state,expiresAt:s.expiresAt}).from(s).where((0,n.and)((0,n.eq)(s.userId,this.userId),(0,n.eq)(s.viewKey,e))).limit(1);if(i.length===0)return null;let o=i[0];return o.expiresAt&&o.expiresAt<new Date?(await this.clear(e),null):o.state}async clear(e){this.logger?.debug({userId:this.userId,viewKey:e},"Clearing view state"),await this.db.delete(s).where((0,n.and)((0,n.eq)(s.userId,this.userId),(0,n.eq)(s.viewKey,e)))}async clearExpired(){this.logger?.info("Clearing expired view state entries");let i=(await this.db.delete(s).where((0,n.lt)(s.expiresAt,new Date)).returning({id:s.id})).length;return this.logger?.info({count:i},"Expired view state entries cleared"),i}};function I(r){return new l(r)}0&&(module.exports={ViewStateClient,createViewStateClient});
|
package/dist/view-state.d.cts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@murumets-ee/core';
|
|
2
|
-
import { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* ViewStateClient — schemaless user-scoped state persistence.
|
|
6
|
-
*
|
|
7
|
-
* Used by admin UI for table filters, column order, panel state, etc.
|
|
8
|
-
* Optional TTL for auto-cleanup of stale state.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { createViewStateClient } from '@murumets-ee/settings/view-state'
|
|
13
|
-
*
|
|
14
|
-
* const viewState = createViewStateClient({ db, userId: currentUser.id })
|
|
15
|
-
*
|
|
16
|
-
* await viewState.save('articles-table', {
|
|
17
|
-
* filters: { status: 'published' },
|
|
18
|
-
* columnOrder: ['title', 'status', 'date'],
|
|
19
|
-
* sortBy: 'date',
|
|
20
|
-
* })
|
|
21
|
-
*
|
|
22
|
-
* const state = await viewState.load('articles-table')
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
interface ViewStateClientConfig {
|
|
27
|
-
/** Database client (read-write) */
|
|
28
|
-
db: PostgresJsDatabase;
|
|
29
|
-
/** User ID for scoping */
|
|
30
|
-
userId: string;
|
|
31
|
-
/** Logger instance */
|
|
32
|
-
logger?: Logger;
|
|
33
|
-
/** Default TTL in seconds for view state entries. Defaults to 30 days. */
|
|
34
|
-
defaultTtl?: number;
|
|
35
|
-
}
|
|
36
|
-
declare class ViewStateClient {
|
|
37
|
-
private db;
|
|
38
|
-
private userId;
|
|
39
|
-
private logger?;
|
|
40
|
-
private defaultTtl;
|
|
41
|
-
constructor(config: ViewStateClientConfig);
|
|
42
|
-
/**
|
|
43
|
-
* Save view state (upsert).
|
|
44
|
-
*/
|
|
45
|
-
save<T extends Record<string, unknown>>(viewKey: string, state: T, options?: {
|
|
46
|
-
ttl?: number;
|
|
47
|
-
}): Promise<void>;
|
|
48
|
-
/**
|
|
49
|
-
* Load view state. Returns null if not found or expired.
|
|
50
|
-
*/
|
|
51
|
-
load<T extends Record<string, unknown> = Record<string, unknown>>(viewKey: string): Promise<T | null>;
|
|
52
|
-
/**
|
|
53
|
-
* Clear a specific view state entry.
|
|
54
|
-
*/
|
|
55
|
-
clear(viewKey: string): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Clear all expired view state entries (maintenance task).
|
|
58
|
-
* Call periodically (e.g., from a cron job or queue task).
|
|
59
|
-
* Returns the number of entries removed.
|
|
60
|
-
*/
|
|
61
|
-
clearExpired(): Promise<number>;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Factory function following toolkit conventions.
|
|
65
|
-
*/
|
|
66
|
-
declare function createViewStateClient(config: ViewStateClientConfig): ViewStateClient;
|
|
67
|
-
|
|
68
|
-
export { ViewStateClient, type ViewStateClientConfig, createViewStateClient };
|
package/dist/view-state.d.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@murumets-ee/core';
|
|
2
|
-
import { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* ViewStateClient — schemaless user-scoped state persistence.
|
|
6
|
-
*
|
|
7
|
-
* Used by admin UI for table filters, column order, panel state, etc.
|
|
8
|
-
* Optional TTL for auto-cleanup of stale state.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { createViewStateClient } from '@murumets-ee/settings/view-state'
|
|
13
|
-
*
|
|
14
|
-
* const viewState = createViewStateClient({ db, userId: currentUser.id })
|
|
15
|
-
*
|
|
16
|
-
* await viewState.save('articles-table', {
|
|
17
|
-
* filters: { status: 'published' },
|
|
18
|
-
* columnOrder: ['title', 'status', 'date'],
|
|
19
|
-
* sortBy: 'date',
|
|
20
|
-
* })
|
|
21
|
-
*
|
|
22
|
-
* const state = await viewState.load('articles-table')
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
interface ViewStateClientConfig {
|
|
27
|
-
/** Database client (read-write) */
|
|
28
|
-
db: PostgresJsDatabase;
|
|
29
|
-
/** User ID for scoping */
|
|
30
|
-
userId: string;
|
|
31
|
-
/** Logger instance */
|
|
32
|
-
logger?: Logger;
|
|
33
|
-
/** Default TTL in seconds for view state entries. Defaults to 30 days. */
|
|
34
|
-
defaultTtl?: number;
|
|
35
|
-
}
|
|
36
|
-
declare class ViewStateClient {
|
|
37
|
-
private db;
|
|
38
|
-
private userId;
|
|
39
|
-
private logger?;
|
|
40
|
-
private defaultTtl;
|
|
41
|
-
constructor(config: ViewStateClientConfig);
|
|
42
|
-
/**
|
|
43
|
-
* Save view state (upsert).
|
|
44
|
-
*/
|
|
45
|
-
save<T extends Record<string, unknown>>(viewKey: string, state: T, options?: {
|
|
46
|
-
ttl?: number;
|
|
47
|
-
}): Promise<void>;
|
|
48
|
-
/**
|
|
49
|
-
* Load view state. Returns null if not found or expired.
|
|
50
|
-
*/
|
|
51
|
-
load<T extends Record<string, unknown> = Record<string, unknown>>(viewKey: string): Promise<T | null>;
|
|
52
|
-
/**
|
|
53
|
-
* Clear a specific view state entry.
|
|
54
|
-
*/
|
|
55
|
-
clear(viewKey: string): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Clear all expired view state entries (maintenance task).
|
|
58
|
-
* Call periodically (e.g., from a cron job or queue task).
|
|
59
|
-
* Returns the number of entries removed.
|
|
60
|
-
*/
|
|
61
|
-
clearExpired(): Promise<number>;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Factory function following toolkit conventions.
|
|
65
|
-
*/
|
|
66
|
-
declare function createViewStateClient(config: ViewStateClientConfig): ViewStateClient;
|
|
67
|
-
|
|
68
|
-
export { ViewStateClient, type ViewStateClientConfig, createViewStateClient };
|