dzql 0.6.3 → 0.6.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.
- package/README.md +33 -0
- package/docs/for_ai.md +14 -18
- package/docs/project-setup.md +15 -14
- package/package.json +28 -6
- package/src/cli/codegen/client.ts +5 -6
- package/src/cli/codegen/subscribable_store.ts +5 -5
- package/src/runtime/ws.ts +16 -15
- package/.env.sample +0 -28
- package/compose.yml +0 -28
- package/dist/client/index.ts +0 -1
- package/dist/client/stores/useMyProfileStore.ts +0 -114
- package/dist/client/stores/useOrgDashboardStore.ts +0 -131
- package/dist/client/stores/useVenueDetailStore.ts +0 -117
- package/dist/client/ws.ts +0 -716
- package/dist/db/migrations/000_core.sql +0 -92
- package/dist/db/migrations/20260101T235039268Z_schema.sql +0 -3020
- package/dist/db/migrations/20260101T235039268Z_subscribables.sql +0 -371
- package/dist/runtime/manifest.json +0 -1562
- package/examples/blog.ts +0 -50
- package/examples/invalid.ts +0 -18
- package/examples/venues.js +0 -485
- package/tests/client.test.ts +0 -38
- package/tests/codegen.test.ts +0 -71
- package/tests/compiler.test.ts +0 -45
- package/tests/graph_rules.test.ts +0 -173
- package/tests/integration/db.test.ts +0 -174
- package/tests/integration/e2e.test.ts +0 -65
- package/tests/integration/features.test.ts +0 -922
- package/tests/integration/full_stack.test.ts +0 -262
- package/tests/integration/setup.ts +0 -45
- package/tests/ir.test.ts +0 -32
- package/tests/namespace.test.ts +0 -395
- package/tests/permissions.test.ts +0 -55
- package/tests/pinia.test.ts +0 -48
- package/tests/realtime.test.ts +0 -22
- package/tests/runtime.test.ts +0 -80
- package/tests/subscribable_gen.test.ts +0 -72
- package/tests/subscribable_reactivity.test.ts +0 -258
- package/tests/venues_gen.test.ts +0 -25
- package/tsconfig.json +0 -20
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
-- ============================================================================
|
|
2
|
-
-- Subscribable: venue_detail
|
|
3
|
-
-- Root Entity: venues
|
|
4
|
-
-- Scope Tables: venues, organisations, sites, allocations
|
|
5
|
-
-- Generated: 2026-01-01T23:50:39.267Z
|
|
6
|
-
-- ============================================================================
|
|
7
|
-
|
|
8
|
-
CREATE OR REPLACE FUNCTION dzql_v2.venue_detail_can_subscribe(
|
|
9
|
-
p_user_id INT,
|
|
10
|
-
p_params JSONB
|
|
11
|
-
) RETURNS BOOLEAN
|
|
12
|
-
LANGUAGE plpgsql
|
|
13
|
-
STABLE
|
|
14
|
-
SECURITY DEFINER
|
|
15
|
-
SET search_path = dzql_v2, public
|
|
16
|
-
AS $$
|
|
17
|
-
DECLARE
|
|
18
|
-
v_venue_id int;
|
|
19
|
-
v_root RECORD;
|
|
20
|
-
BEGIN
|
|
21
|
-
-- Extract parameters
|
|
22
|
-
v_venue_id := (p_params->>'venue_id')::int;
|
|
23
|
-
|
|
24
|
-
-- Fetch root entity
|
|
25
|
-
SELECT * INTO v_root
|
|
26
|
-
FROM venues
|
|
27
|
-
WHERE id = v_venue_id;
|
|
28
|
-
|
|
29
|
-
IF NOT FOUND THEN
|
|
30
|
-
RETURN FALSE;
|
|
31
|
-
END IF;
|
|
32
|
-
|
|
33
|
-
-- Check permissions
|
|
34
|
-
RETURN (
|
|
35
|
-
p_user_id IS NOT NULL -- Fallback: multi-level paths not yet supported
|
|
36
|
-
);
|
|
37
|
-
END;
|
|
38
|
-
$$;
|
|
39
|
-
|
|
40
|
-
CREATE OR REPLACE FUNCTION dzql_v2.get_venue_detail(
|
|
41
|
-
p_params JSONB,
|
|
42
|
-
p_user_id INT
|
|
43
|
-
) RETURNS JSONB
|
|
44
|
-
LANGUAGE plpgsql
|
|
45
|
-
SECURITY DEFINER
|
|
46
|
-
SET search_path = dzql_v2, public
|
|
47
|
-
AS $$
|
|
48
|
-
DECLARE
|
|
49
|
-
v_venue_id int;
|
|
50
|
-
v_data JSONB;
|
|
51
|
-
BEGIN
|
|
52
|
-
-- Extract parameters
|
|
53
|
-
v_venue_id := (p_params->>'venue_id')::int;
|
|
54
|
-
|
|
55
|
-
-- Check access control
|
|
56
|
-
IF NOT dzql_v2.venue_detail_can_subscribe(p_user_id, p_params) THEN
|
|
57
|
-
RAISE EXCEPTION 'permission_denied';
|
|
58
|
-
END IF;
|
|
59
|
-
|
|
60
|
-
-- Build document with root and all relations
|
|
61
|
-
SELECT jsonb_build_object(
|
|
62
|
-
'venues', row_to_json(root.*),
|
|
63
|
-
'org', (
|
|
64
|
-
SELECT row_to_json(rel.*)
|
|
65
|
-
FROM organisations rel
|
|
66
|
-
WHERE rel.id = root.org_id
|
|
67
|
-
),
|
|
68
|
-
'sites', COALESCE((
|
|
69
|
-
SELECT jsonb_agg(
|
|
70
|
-
to_jsonb(rel.*) || jsonb_build_object(
|
|
71
|
-
'allocations', COALESCE((
|
|
72
|
-
SELECT jsonb_agg(row_to_json(nested.*))
|
|
73
|
-
FROM allocations nested
|
|
74
|
-
WHERE nested.site_id = rel.id
|
|
75
|
-
), '[]'::jsonb))
|
|
76
|
-
)
|
|
77
|
-
FROM sites rel
|
|
78
|
-
WHERE rel.venue_id = root.id
|
|
79
|
-
), '[]'::jsonb)
|
|
80
|
-
)
|
|
81
|
-
INTO v_data
|
|
82
|
-
FROM venues root
|
|
83
|
-
WHERE root.id = v_venue_id;
|
|
84
|
-
|
|
85
|
-
-- Return data with embedded schema for atomic updates
|
|
86
|
-
RETURN jsonb_build_object(
|
|
87
|
-
'data', v_data,
|
|
88
|
-
'schema', '{"root":"venues","paths":{"venues":".","organisations":"org","sites":"sites","allocations":"sites.allocations"},"scopeTables":["venues","organisations","sites","allocations"]}'::jsonb
|
|
89
|
-
);
|
|
90
|
-
END;
|
|
91
|
-
$$;
|
|
92
|
-
|
|
93
|
-
CREATE OR REPLACE FUNCTION dzql_v2.venue_detail_affected_keys(
|
|
94
|
-
p_table TEXT,
|
|
95
|
-
p_op TEXT,
|
|
96
|
-
p_data JSONB
|
|
97
|
-
) RETURNS TEXT[]
|
|
98
|
-
LANGUAGE plpgsql
|
|
99
|
-
IMMUTABLE
|
|
100
|
-
AS $$
|
|
101
|
-
DECLARE
|
|
102
|
-
v_keys TEXT[];
|
|
103
|
-
BEGIN
|
|
104
|
-
CASE p_table
|
|
105
|
-
WHEN 'venues' THEN
|
|
106
|
-
RETURN ARRAY['venue_detail:' || (p_data->>'id')];
|
|
107
|
-
WHEN 'organisations' THEN
|
|
108
|
-
RETURN ARRAY['venue_detail:' || (p_data->>'venue_id')];
|
|
109
|
-
WHEN 'sites' THEN
|
|
110
|
-
RETURN ARRAY['venue_detail:' || (p_data->>'venue_id')];
|
|
111
|
-
WHEN 'allocations' THEN
|
|
112
|
-
-- Nested: traverse via sites
|
|
113
|
-
SELECT ARRAY_AGG('venue_detail:' || parent.venue_id)
|
|
114
|
-
INTO v_keys
|
|
115
|
-
FROM sites parent
|
|
116
|
-
WHERE parent.id = (p_data->>'site_id')::int;
|
|
117
|
-
RETURN COALESCE(v_keys, ARRAY[]::text[]);
|
|
118
|
-
ELSE
|
|
119
|
-
RETURN ARRAY[]::text[];
|
|
120
|
-
END CASE;
|
|
121
|
-
END;
|
|
122
|
-
$$;
|
|
123
|
-
|
|
124
|
-
-- ============================================================================
|
|
125
|
-
-- Subscribable: org_dashboard
|
|
126
|
-
-- Root Entity: organisations
|
|
127
|
-
-- Scope Tables: organisations, venues, sites, products, packages, brands, artwork
|
|
128
|
-
-- Generated: 2026-01-01T23:50:39.267Z
|
|
129
|
-
-- ============================================================================
|
|
130
|
-
|
|
131
|
-
CREATE OR REPLACE FUNCTION dzql_v2.org_dashboard_can_subscribe(
|
|
132
|
-
p_user_id INT,
|
|
133
|
-
p_params JSONB
|
|
134
|
-
) RETURNS BOOLEAN
|
|
135
|
-
LANGUAGE plpgsql
|
|
136
|
-
STABLE
|
|
137
|
-
SECURITY DEFINER
|
|
138
|
-
SET search_path = dzql_v2, public
|
|
139
|
-
AS $$
|
|
140
|
-
DECLARE
|
|
141
|
-
v_org_id int;
|
|
142
|
-
v_root RECORD;
|
|
143
|
-
BEGIN
|
|
144
|
-
-- Extract parameters
|
|
145
|
-
v_org_id := (p_params->>'org_id')::int;
|
|
146
|
-
|
|
147
|
-
-- Fetch root entity
|
|
148
|
-
SELECT * INTO v_root
|
|
149
|
-
FROM organisations
|
|
150
|
-
WHERE id = v_org_id;
|
|
151
|
-
|
|
152
|
-
IF NOT FOUND THEN
|
|
153
|
-
RETURN FALSE;
|
|
154
|
-
END IF;
|
|
155
|
-
|
|
156
|
-
-- Check permissions
|
|
157
|
-
RETURN (
|
|
158
|
-
EXISTS (SELECT 1 FROM acts_for WHERE acts_for.org_id = v_root.id AND acts_for.user_id = p_user_id AND acts_for.active)
|
|
159
|
-
);
|
|
160
|
-
END;
|
|
161
|
-
$$;
|
|
162
|
-
|
|
163
|
-
CREATE OR REPLACE FUNCTION dzql_v2.get_org_dashboard(
|
|
164
|
-
p_params JSONB,
|
|
165
|
-
p_user_id INT
|
|
166
|
-
) RETURNS JSONB
|
|
167
|
-
LANGUAGE plpgsql
|
|
168
|
-
SECURITY DEFINER
|
|
169
|
-
SET search_path = dzql_v2, public
|
|
170
|
-
AS $$
|
|
171
|
-
DECLARE
|
|
172
|
-
v_org_id int;
|
|
173
|
-
v_data JSONB;
|
|
174
|
-
BEGIN
|
|
175
|
-
-- Extract parameters
|
|
176
|
-
v_org_id := (p_params->>'org_id')::int;
|
|
177
|
-
|
|
178
|
-
-- Check access control
|
|
179
|
-
IF NOT dzql_v2.org_dashboard_can_subscribe(p_user_id, p_params) THEN
|
|
180
|
-
RAISE EXCEPTION 'permission_denied';
|
|
181
|
-
END IF;
|
|
182
|
-
|
|
183
|
-
-- Build document with root and all relations
|
|
184
|
-
SELECT jsonb_build_object(
|
|
185
|
-
'organisations', row_to_json(root.*),
|
|
186
|
-
'venues', COALESCE((
|
|
187
|
-
SELECT jsonb_agg(
|
|
188
|
-
to_jsonb(rel.*) || jsonb_build_object(
|
|
189
|
-
'sites', COALESCE((
|
|
190
|
-
SELECT jsonb_agg(row_to_json(nested.*))
|
|
191
|
-
FROM sites nested
|
|
192
|
-
WHERE nested.venue_id = rel.id
|
|
193
|
-
), '[]'::jsonb))
|
|
194
|
-
)
|
|
195
|
-
FROM venues rel
|
|
196
|
-
WHERE rel.org_id = v_org_id
|
|
197
|
-
), '[]'::jsonb),
|
|
198
|
-
'products', COALESCE((
|
|
199
|
-
SELECT jsonb_agg(row_to_json(rel.*))
|
|
200
|
-
FROM products rel
|
|
201
|
-
WHERE rel.org_id = v_org_id
|
|
202
|
-
), '[]'::jsonb),
|
|
203
|
-
'packages', COALESCE((
|
|
204
|
-
SELECT jsonb_agg(row_to_json(rel.*))
|
|
205
|
-
FROM packages rel
|
|
206
|
-
WHERE rel.owner_org_id = v_org_id
|
|
207
|
-
), '[]'::jsonb),
|
|
208
|
-
'brands', COALESCE((
|
|
209
|
-
SELECT jsonb_agg(
|
|
210
|
-
to_jsonb(rel.*) || jsonb_build_object(
|
|
211
|
-
'artwork', COALESCE((
|
|
212
|
-
SELECT jsonb_agg(row_to_json(nested.*))
|
|
213
|
-
FROM artwork nested
|
|
214
|
-
WHERE nested.brand_id = rel.id
|
|
215
|
-
), '[]'::jsonb))
|
|
216
|
-
)
|
|
217
|
-
FROM brands rel
|
|
218
|
-
WHERE rel.org_id = v_org_id
|
|
219
|
-
), '[]'::jsonb)
|
|
220
|
-
)
|
|
221
|
-
INTO v_data
|
|
222
|
-
FROM organisations root
|
|
223
|
-
WHERE root.id = v_org_id;
|
|
224
|
-
|
|
225
|
-
-- Return data with embedded schema for atomic updates
|
|
226
|
-
RETURN jsonb_build_object(
|
|
227
|
-
'data', v_data,
|
|
228
|
-
'schema', '{"root":"organisations","paths":{"organisations":".","venues":"venues","sites":"venues.sites","products":"products","packages":"packages","brands":"brands","artwork":"brands.artwork"},"scopeTables":["organisations","venues","sites","products","packages","brands","artwork"]}'::jsonb
|
|
229
|
-
);
|
|
230
|
-
END;
|
|
231
|
-
$$;
|
|
232
|
-
|
|
233
|
-
CREATE OR REPLACE FUNCTION dzql_v2.org_dashboard_affected_keys(
|
|
234
|
-
p_table TEXT,
|
|
235
|
-
p_op TEXT,
|
|
236
|
-
p_data JSONB
|
|
237
|
-
) RETURNS TEXT[]
|
|
238
|
-
LANGUAGE plpgsql
|
|
239
|
-
IMMUTABLE
|
|
240
|
-
AS $$
|
|
241
|
-
DECLARE
|
|
242
|
-
v_keys TEXT[];
|
|
243
|
-
BEGIN
|
|
244
|
-
CASE p_table
|
|
245
|
-
WHEN 'organisations' THEN
|
|
246
|
-
RETURN ARRAY['org_dashboard:' || (p_data->>'id')];
|
|
247
|
-
WHEN 'venues' THEN
|
|
248
|
-
RETURN ARRAY['org_dashboard:' || (p_data->>'org_id')];
|
|
249
|
-
WHEN 'sites' THEN
|
|
250
|
-
-- Nested: traverse via venues
|
|
251
|
-
SELECT ARRAY_AGG('org_dashboard:' || parent.organisation_id)
|
|
252
|
-
INTO v_keys
|
|
253
|
-
FROM venues parent
|
|
254
|
-
WHERE parent.id = (p_data->>'venue_id')::int;
|
|
255
|
-
RETURN COALESCE(v_keys, ARRAY[]::text[]);
|
|
256
|
-
WHEN 'products' THEN
|
|
257
|
-
RETURN ARRAY['org_dashboard:' || (p_data->>'org_id')];
|
|
258
|
-
WHEN 'packages' THEN
|
|
259
|
-
RETURN ARRAY['org_dashboard:' || (p_data->>'owner_org_id')];
|
|
260
|
-
WHEN 'brands' THEN
|
|
261
|
-
RETURN ARRAY['org_dashboard:' || (p_data->>'org_id')];
|
|
262
|
-
WHEN 'artwork' THEN
|
|
263
|
-
-- Nested: traverse via brands
|
|
264
|
-
SELECT ARRAY_AGG('org_dashboard:' || parent.organisation_id)
|
|
265
|
-
INTO v_keys
|
|
266
|
-
FROM brands parent
|
|
267
|
-
WHERE parent.id = (p_data->>'brand_id')::int;
|
|
268
|
-
RETURN COALESCE(v_keys, ARRAY[]::text[]);
|
|
269
|
-
ELSE
|
|
270
|
-
RETURN ARRAY[]::text[];
|
|
271
|
-
END CASE;
|
|
272
|
-
END;
|
|
273
|
-
$$;
|
|
274
|
-
|
|
275
|
-
-- ============================================================================
|
|
276
|
-
-- Subscribable: my_profile
|
|
277
|
-
-- Root Entity: users
|
|
278
|
-
-- Scope Tables: users, acts_for, organisations
|
|
279
|
-
-- Generated: 2026-01-01T23:50:39.267Z
|
|
280
|
-
-- ============================================================================
|
|
281
|
-
|
|
282
|
-
CREATE OR REPLACE FUNCTION dzql_v2.my_profile_can_subscribe(
|
|
283
|
-
p_user_id INT,
|
|
284
|
-
p_params JSONB
|
|
285
|
-
) RETURNS BOOLEAN
|
|
286
|
-
LANGUAGE plpgsql
|
|
287
|
-
STABLE
|
|
288
|
-
SECURITY DEFINER
|
|
289
|
-
SET search_path = dzql_v2, public
|
|
290
|
-
AS $$
|
|
291
|
-
BEGIN
|
|
292
|
-
RETURN TRUE; -- Public access
|
|
293
|
-
END;
|
|
294
|
-
$$;
|
|
295
|
-
|
|
296
|
-
CREATE OR REPLACE FUNCTION dzql_v2.get_my_profile(
|
|
297
|
-
p_params JSONB,
|
|
298
|
-
p_user_id INT
|
|
299
|
-
) RETURNS JSONB
|
|
300
|
-
LANGUAGE plpgsql
|
|
301
|
-
SECURITY DEFINER
|
|
302
|
-
SET search_path = dzql_v2, public
|
|
303
|
-
AS $$
|
|
304
|
-
DECLARE
|
|
305
|
-
|
|
306
|
-
v_data JSONB;
|
|
307
|
-
BEGIN
|
|
308
|
-
-- Extract parameters
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
-- Check access control
|
|
312
|
-
IF NOT dzql_v2.my_profile_can_subscribe(p_user_id, p_params) THEN
|
|
313
|
-
RAISE EXCEPTION 'permission_denied';
|
|
314
|
-
END IF;
|
|
315
|
-
|
|
316
|
-
-- Build document with root and all relations
|
|
317
|
-
SELECT jsonb_build_object(
|
|
318
|
-
'users', jsonb_build_object('id', root.id, 'name', root.name, 'email', root.email, 'created_at', root.created_at),
|
|
319
|
-
'memberships', COALESCE((
|
|
320
|
-
SELECT jsonb_agg(
|
|
321
|
-
to_jsonb(rel.*) || jsonb_build_object(
|
|
322
|
-
'org', (
|
|
323
|
-
SELECT row_to_json(nested.*)
|
|
324
|
-
FROM organisations nested
|
|
325
|
-
WHERE nested.id = rel.org_id
|
|
326
|
-
))
|
|
327
|
-
)
|
|
328
|
-
FROM acts_for rel
|
|
329
|
-
WHERE rel.user_id = p_user_id
|
|
330
|
-
), '[]'::jsonb)
|
|
331
|
-
)
|
|
332
|
-
INTO v_data
|
|
333
|
-
FROM users root
|
|
334
|
-
WHERE root.id = p_user_id;
|
|
335
|
-
|
|
336
|
-
-- Return data with embedded schema for atomic updates
|
|
337
|
-
RETURN jsonb_build_object(
|
|
338
|
-
'data', v_data,
|
|
339
|
-
'schema', '{"root":"users","paths":{"users":".","acts_for":"memberships","organisations":"memberships.org"},"scopeTables":["users","acts_for","organisations"]}'::jsonb
|
|
340
|
-
);
|
|
341
|
-
END;
|
|
342
|
-
$$;
|
|
343
|
-
|
|
344
|
-
CREATE OR REPLACE FUNCTION dzql_v2.my_profile_affected_keys(
|
|
345
|
-
p_table TEXT,
|
|
346
|
-
p_op TEXT,
|
|
347
|
-
p_data JSONB
|
|
348
|
-
) RETURNS TEXT[]
|
|
349
|
-
LANGUAGE plpgsql
|
|
350
|
-
IMMUTABLE
|
|
351
|
-
AS $$
|
|
352
|
-
DECLARE
|
|
353
|
-
v_keys TEXT[];
|
|
354
|
-
BEGIN
|
|
355
|
-
CASE p_table
|
|
356
|
-
WHEN 'users' THEN
|
|
357
|
-
RETURN ARRAY['my_profile:' || (p_data->>'id')];
|
|
358
|
-
WHEN 'acts_for' THEN
|
|
359
|
-
RETURN ARRAY['my_profile:' || (p_data->>'user_id')];
|
|
360
|
-
WHEN 'organisations' THEN
|
|
361
|
-
-- Nested: traverse via acts_for
|
|
362
|
-
SELECT ARRAY_AGG('my_profile:' || parent.user_id)
|
|
363
|
-
INTO v_keys
|
|
364
|
-
FROM acts_for parent
|
|
365
|
-
WHERE parent.id = (p_data->>'acts_for_id')::int;
|
|
366
|
-
RETURN COALESCE(v_keys, ARRAY[]::text[]);
|
|
367
|
-
ELSE
|
|
368
|
-
RETURN ARRAY[]::text[];
|
|
369
|
-
END CASE;
|
|
370
|
-
END;
|
|
371
|
-
$$;
|