@go-avro/avro-js 0.0.32 → 0.0.33

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.
@@ -34,10 +34,10 @@ const SOCKET_EVENT_CONFIG = {
34
34
  create_route: { entityKey: 'routes', action: 'create', fetchPath: (id) => `/route/${id}` },
35
35
  update_route: { entityKey: 'routes', action: 'update', fetchPath: (id) => `/route/${id}` },
36
36
  delete_route: { entityKey: 'routes', action: 'delete', fetchPath: null },
37
- // ── Events ──
38
- create_event: { entityKey: 'events', action: 'create', fetchPath: (id) => `/event/${id}` },
39
- update_event: { entityKey: 'events', action: 'update', fetchPath: (id) => `/event/${id}` },
40
- delete_event: { entityKey: 'events', action: 'delete', fetchPath: null },
37
+ // ── Events (also refetch parent job — overdueness, last_event, etc.) ──
38
+ create_event: { entityKey: 'events', action: 'create', fetchPath: (id) => `/event/${id}`, relatedRefetch: [{ entityKey: 'jobs', idField: 'job_id', fetchPath: (id) => `/job/${id}` }] },
39
+ update_event: { entityKey: 'events', action: 'update', fetchPath: (id) => `/event/${id}`, relatedRefetch: [{ entityKey: 'jobs', idField: 'job_id', fetchPath: (id) => `/job/${id}` }] },
40
+ delete_event: { entityKey: 'events', action: 'delete', fetchPath: null, relatedRefetch: [{ entityKey: 'jobs', idField: 'job_id', fetchPath: (id) => `/job/${id}` }] },
41
41
  update_events: { invalidateKeys: [['events']] },
42
42
  // ── Teams ──
43
43
  create_team: { entityKey: 'teams', action: 'create', fetchPath: null },
@@ -205,7 +205,7 @@ export class AvroQueryClient {
205
205
  }
206
206
  else {
207
207
  // ── Targeted: surgical cache update ──────────────────
208
- const { entityKey, action, fetchPath, idField, alsoInvalidate } = config;
208
+ const { entityKey, action, fetchPath, idField, alsoInvalidate, relatedRefetch } = config;
209
209
  const handler = async (data) => {
210
210
  const id = data?.[idField ?? 'id'];
211
211
  // No id → old backend or malformed payload → full invalidation
@@ -319,6 +319,40 @@ export class AvroQueryClient {
319
319
  }
320
320
  // Invalidate any additional keys (e.g. companies → /company/list)
321
321
  alsoInvalidate?.forEach((k) => queryClient.invalidateQueries({ queryKey: k }));
322
+ // Refetch & patch related entities (e.g. event → parent job)
323
+ if (relatedRefetch) {
324
+ for (const related of relatedRefetch) {
325
+ const relatedId = data?.[related.idField];
326
+ if (!relatedId || typeof relatedId !== 'string')
327
+ continue;
328
+ try {
329
+ const item = await queryClient.fetchQuery({
330
+ queryKey: [related.entityKey, relatedId],
331
+ queryFn: () => client.get({ path: related.fetchPath(relatedId) }),
332
+ staleTime: 0,
333
+ });
334
+ const relatedPredicate = (q) => matchesEntityKey(q, related.entityKey);
335
+ queryClient.setQueriesData({ predicate: relatedPredicate, type: 'active' }, (old) => {
336
+ if (!old)
337
+ return old;
338
+ if (old.pages && Array.isArray(old.pages)) {
339
+ return {
340
+ ...old,
341
+ pages: old.pages.map((page) => page.map((x) => (x?.id === relatedId ? item : x))),
342
+ };
343
+ }
344
+ if (Array.isArray(old)) {
345
+ return old.map((x) => (x?.id === relatedId ? item : x));
346
+ }
347
+ return old;
348
+ });
349
+ }
350
+ catch {
351
+ // Fetch failed → invalidate related entity lists
352
+ invalidateEntity(related.entityKey);
353
+ }
354
+ }
355
+ }
322
356
  };
323
357
  this.socket.on(event, handler);
324
358
  handlers.push({ event, handler });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@go-avro/avro-js",
3
- "version": "0.0.32",
3
+ "version": "0.0.33",
4
4
  "description": "JS client for Avro backend integration.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",