hazo_notify 4.0.2 → 5.0.0
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/lib/inbox/connection.d.ts +12 -12
- package/dist/lib/inbox/connection.d.ts.map +1 -1
- package/dist/lib/inbox/connection.js +24 -21
- package/dist/lib/inbox/connection.js.map +1 -1
- package/dist/lib/inbox/storage.d.ts +123 -2
- package/dist/lib/inbox/storage.d.ts.map +1 -1
- package/dist/lib/inbox/storage.js +313 -62
- package/dist/lib/inbox/storage.js.map +1 -1
- package/dist/lib/inbox/types.d.ts +37 -0
- package/dist/lib/inbox/types.d.ts.map +1 -1
- package/dist/lib/inbox/worker/render.d.ts.map +1 -1
- package/dist/lib/inbox/worker/render.js +17 -1
- package/dist/lib/inbox/worker/render.js.map +1 -1
- package/dist/lib/template_manager/types.d.ts +24 -0
- package/dist/lib/template_manager/types.d.ts.map +1 -1
- package/package.json +5 -4
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Inbox connection holder.
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* @packageDocumentation
|
|
2
|
+
* Inbox connection holder. Stash the resolved adapter on globalThis so it
|
|
3
|
+
* survives Next.js dev-mode module duplication (each route bundle re-imports
|
|
4
|
+
* this file separately; the global reference unifies them).
|
|
7
5
|
*/
|
|
8
|
-
import type {
|
|
6
|
+
import type { HazoConnectAdapter } from "hazo_connect/server";
|
|
9
7
|
export interface InitInboxOptions {
|
|
10
|
-
/**
|
|
11
|
-
|
|
8
|
+
/** Either an adapter directly... */
|
|
9
|
+
adapter?: HazoConnectAdapter;
|
|
10
|
+
/** ...or a (possibly async) factory that produces one. */
|
|
11
|
+
adapter_factory?: () => HazoConnectAdapter | Promise<HazoConnectAdapter>;
|
|
12
12
|
}
|
|
13
|
-
/** Boot-time init. Must be called before any
|
|
14
|
-
export declare function initInbox(opts: InitInboxOptions): Promise<
|
|
15
|
-
/** Internal: get the resolved
|
|
16
|
-
export declare function getInboxConnection():
|
|
13
|
+
/** Boot-time init. Must be called before any storage / worker call. */
|
|
14
|
+
export declare function initInbox(opts: InitInboxOptions): Promise<HazoConnectAdapter>;
|
|
15
|
+
/** Internal: get the resolved adapter. Throws if not initialised. */
|
|
16
|
+
export declare function getInboxConnection(): HazoConnectAdapter;
|
|
17
17
|
/** Test-only: reset the holder. */
|
|
18
18
|
export declare function __resetInboxConnection(): void;
|
|
19
19
|
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/connection.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC1E;AAUD,uEAAuE;AACvE,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAanF;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,kBAAkB,CAIvD;AAED,mCAAmC;AACnC,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
|
@@ -1,31 +1,34 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Inbox connection holder. Mirrors template_manager's pattern: caller
|
|
3
|
-
* provides a hazo_connect factory at boot via `initInbox()`; subsequent
|
|
4
|
-
* storage calls read the resolved instance from this module.
|
|
5
|
-
*
|
|
6
|
-
* @packageDocumentation
|
|
7
|
-
*/
|
|
8
|
-
// Stash on globalThis so the resolved connection survives Next.js dev-mode
|
|
9
|
-
// module duplication. Each route bundle imports this file separately; the
|
|
10
|
-
// global reference unifies them.
|
|
11
1
|
const CONN_KEY = "__hazo_notify_inbox_connection__";
|
|
12
2
|
const g = globalThis;
|
|
13
|
-
|
|
3
|
+
function looksLikeAdapter(a) {
|
|
4
|
+
if (typeof a !== "object" || a === null)
|
|
5
|
+
return false;
|
|
6
|
+
const obj = a;
|
|
7
|
+
return typeof obj.query === "function"
|
|
8
|
+
&& typeof obj.claimRows === "function"
|
|
9
|
+
&& typeof obj.getConfig === "function";
|
|
10
|
+
}
|
|
11
|
+
/** Boot-time init. Must be called before any storage / worker call. */
|
|
14
12
|
export async function initInbox(opts) {
|
|
15
|
-
|
|
16
|
-
if (!
|
|
17
|
-
|
|
13
|
+
let adapter = opts.adapter;
|
|
14
|
+
if (!adapter && opts.adapter_factory) {
|
|
15
|
+
adapter = await opts.adapter_factory();
|
|
16
|
+
}
|
|
17
|
+
if (!adapter) {
|
|
18
|
+
throw new Error("initInbox: must provide adapter or adapter_factory");
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
if (!looksLikeAdapter(adapter)) {
|
|
21
|
+
throw new Error("initInbox: argument must be a HazoConnectAdapter (with query, claimRows, getConfig)");
|
|
22
|
+
}
|
|
23
|
+
g[CONN_KEY] = adapter;
|
|
24
|
+
return adapter;
|
|
21
25
|
}
|
|
22
|
-
/** Internal: get the resolved
|
|
26
|
+
/** Internal: get the resolved adapter. Throws if not initialised. */
|
|
23
27
|
export function getInboxConnection() {
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
28
|
+
const a = g[CONN_KEY];
|
|
29
|
+
if (!a)
|
|
26
30
|
throw new Error("inbox: initInbox() must be called before storage access");
|
|
27
|
-
|
|
28
|
-
return conn;
|
|
31
|
+
return a;
|
|
29
32
|
}
|
|
30
33
|
/** Test-only: reset the holder. */
|
|
31
34
|
export function __resetInboxConnection() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/lib/inbox/connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/lib/inbox/connection.ts"],"names":[],"mappings":"AAOA,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AACpD,MAAM,CAAC,GAAG,UAAkE,CAAC;AAS7E,SAAS,gBAAgB,CAAC,CAAU;IAClC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,GAAG,GAAG,CAA4B,CAAC;IACzC,OAAO,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU;WAC/B,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU;WACnC,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,CAAC;AAC7C,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAsB;IACpD,IAAI,OAAO,GAAmC,IAAI,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACrC,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;IACD,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,kBAAkB;IAChC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACnF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,sBAAsB;IACpC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -1,21 +1,142 @@
|
|
|
1
|
-
import type { UpsertInboxRowInput, UpsertInboxRowResult, UpsertDeliveryInput, UpsertDeliveryResult, ClaimedDelivery } from "./
|
|
2
|
-
|
|
1
|
+
import type { UpsertInboxRowInput, UpsertInboxRowResult, UpsertDeliveryInput, UpsertDeliveryResult, ClaimedDelivery, InboxRow } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Upsert an inbox row using a claim-first strategy:
|
|
4
|
+
*
|
|
5
|
+
* 1. Try to increment an existing open batch that matches `batch_key` and
|
|
6
|
+
* `batch_closed_at`. This preserves the increment-on-conflict semantics of
|
|
7
|
+
* the original Postgres `ON CONFLICT (batch_key) WHERE batch_closed_at IS NULL`
|
|
8
|
+
* partial-index upsert.
|
|
9
|
+
* 2. If no open batch found, insert a fresh row.
|
|
10
|
+
*
|
|
11
|
+
* Race-condition trade-off: if two workers concurrently find no open batch and
|
|
12
|
+
* both insert, both succeed (no unique index guards the SQLite/adapter path).
|
|
13
|
+
* The original Postgres SQL used a partial unique index for true atomicity.
|
|
14
|
+
* For Hazodocs (single-worker), this race window is acceptable; adding retry
|
|
15
|
+
* logic would require error-code parsing not available in hazo_connect.
|
|
16
|
+
*
|
|
17
|
+
* SQLite NULL caveat: the clause-builder emits `col = ?` which SQLite's `=`
|
|
18
|
+
* operator does not use to match NULL (needs IS NULL). In production (Postgres),
|
|
19
|
+
* the behaviour is correct because Postgres's `=` also doesn't match NULL — the
|
|
20
|
+
* partial index `WHERE batch_closed_at IS NULL` handles the constraint there.
|
|
21
|
+
* In SQLite-backed tests use empty string instead of null for batch_closed_at.
|
|
22
|
+
*/
|
|
3
23
|
export declare function upsertInboxRow(i: UpsertInboxRowInput): Promise<UpsertInboxRowResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Upsert a channel delivery row using a two-claim strategy that preserves the
|
|
26
|
+
* original Postgres CASE-WHEN semantic for `flush_after`:
|
|
27
|
+
*
|
|
28
|
+
* 1. Claim an **existing fresh row** (attempt_count = 0) — update both `payload`
|
|
29
|
+
* and `flush_after` (the delivery hasn't been tried yet, so rescheduling is safe).
|
|
30
|
+
* 2. Claim an **existing in-flight row** (attempt_count > 0) — update `payload`
|
|
31
|
+
* only; preserve `flush_after` to avoid resetting an active retry schedule.
|
|
32
|
+
* 3. If neither claim succeeds, no row exists — insert a new one.
|
|
33
|
+
*
|
|
34
|
+
* The two claims are mutually exclusive so at most one succeeds per call.
|
|
35
|
+
*/
|
|
4
36
|
export declare function upsertDelivery(i: UpsertDeliveryInput): Promise<UpsertDeliveryResult>;
|
|
5
37
|
export declare function claimDueDeliveries(channel_id: string, batch_size: number): Promise<ClaimedDelivery[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Task 2.7 — markDeliverySent via CrudService.updateById
|
|
40
|
+
*
|
|
41
|
+
* Sets status=sent, records the provider message_id, and stamps finalized_at.
|
|
42
|
+
* updateById returns T[] — ignored here (fire-and-forget).
|
|
43
|
+
*/
|
|
6
44
|
export declare function markDeliverySent(id: string, message_id: string): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Task 2.8 — markDeliveryFailed via CrudService.updateById
|
|
47
|
+
*
|
|
48
|
+
* Sets status=failed, stores the error (truncated to 1000 chars), and stamps finalized_at.
|
|
49
|
+
* updateById returns T[] — ignored here (fire-and-forget).
|
|
50
|
+
*/
|
|
7
51
|
export declare function markDeliveryFailed(id: string, error: string): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Task 2.9 — rescheduleDelivery via CrudService.updateById
|
|
54
|
+
*
|
|
55
|
+
* Updates flush_after and last_error for the next retry. Status stays 'pending'.
|
|
56
|
+
* updateById returns T[] — ignored here (fire-and-forget).
|
|
57
|
+
*/
|
|
8
58
|
export declare function rescheduleDelivery(id: string, flush_after: string, error: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Task 2.10 — closeStaleBatches via adapter.claimRows
|
|
61
|
+
*
|
|
62
|
+
* Closes inbox rows whose batch_closed_at is empty string (open) and whose
|
|
63
|
+
* created_at is older than (now - window_ms).
|
|
64
|
+
*
|
|
65
|
+
* NULL caveat: SQLite's claimRows WHERE emits `col = ?` which does not match
|
|
66
|
+
* SQL NULL. Empty string '' is used as the sentinel for "open batch" in both
|
|
67
|
+
* SQLite tests and production (see upsertInboxRow). In production (Postgres),
|
|
68
|
+
* rows inserted via this adapter path use '' not NULL, so the '' sentinel is
|
|
69
|
+
* consistent end-to-end.
|
|
70
|
+
*
|
|
71
|
+
* Returns the number of batches closed.
|
|
72
|
+
*/
|
|
9
73
|
export declare function closeStaleBatches(window_ms: number): Promise<number>;
|
|
74
|
+
/**
|
|
75
|
+
* Task 2.11a — purgeReadInbox via QueryBuilder DELETE
|
|
76
|
+
*
|
|
77
|
+
* Deletes inbox rows that have been read and whose read_at is older than
|
|
78
|
+
* `older_than`. Returns the number of rows deleted.
|
|
79
|
+
*
|
|
80
|
+
* QueryBuilder 'neq' with null → IS NOT NULL (via translateWhereCondition).
|
|
81
|
+
* QueryBuilder 'lt' → read_at < older_than.
|
|
82
|
+
*/
|
|
10
83
|
export declare function purgeReadInbox(older_than: string): Promise<number>;
|
|
84
|
+
/**
|
|
85
|
+
* Task 2.11b — purgeFinalizedDeliveries via QueryBuilder DELETE
|
|
86
|
+
*
|
|
87
|
+
* Deletes delivery rows that have been finalized (sent or failed) and whose
|
|
88
|
+
* finalized_at is older than `older_than`. Returns the number of rows deleted.
|
|
89
|
+
*/
|
|
11
90
|
export declare function purgeFinalizedDeliveries(older_than: string): Promise<number>;
|
|
12
91
|
export interface ListOptions {
|
|
13
92
|
limit?: number;
|
|
14
93
|
cursor?: string;
|
|
15
94
|
surface?: "in_app" | "banner";
|
|
16
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Task 2.12a — listUnreadForUser via QueryBuilder
|
|
98
|
+
*
|
|
99
|
+
* Returns unread inbox rows for the given user/scope, ordered by created_at
|
|
100
|
+
* descending with optional cursor (created_at < cursor) and limit.
|
|
101
|
+
*
|
|
102
|
+
* Surface filtering (in_app / banner) requires dialect-specific JSONB or
|
|
103
|
+
* json_extract access. Rather than branching on adapter type at this layer,
|
|
104
|
+
* callers filter in-memory when surface filtering is needed. This keeps the
|
|
105
|
+
* storage layer adapter-agnostic.
|
|
106
|
+
*
|
|
107
|
+
* QueryBuilder 'is' with null → IS NULL (via translateWhereCondition).
|
|
108
|
+
*/
|
|
17
109
|
export declare function listUnreadForUser(user_id: string, scope_id: string, opts?: ListOptions): Promise<InboxRow[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Task 2.12b — unreadCount via QueryBuilder
|
|
112
|
+
*
|
|
113
|
+
* Counts unread inbox rows for the given user/scope.
|
|
114
|
+
* QueryBuilder 'is' with null → IS NULL.
|
|
115
|
+
*/
|
|
18
116
|
export declare function unreadCount(user_id: string, scope_id: string): Promise<number>;
|
|
117
|
+
/**
|
|
118
|
+
* Task 2.13a — markRead via claimRows (idempotent)
|
|
119
|
+
*
|
|
120
|
+
* Sets read_at = now() for the given inbox row, scoped by user_id to prevent
|
|
121
|
+
* cross-user reads.
|
|
122
|
+
*
|
|
123
|
+
* Idempotency trade-off: the `read_at: null` condition is omitted from the
|
|
124
|
+
* claimRows WHERE because the clause-builder emits `col = ?` which SQLite's
|
|
125
|
+
* `=` operator does not use to match NULL. Dropping the condition makes the
|
|
126
|
+
* operation idempotent — re-marking an already-read row re-sets read_at = now(),
|
|
127
|
+
* which is harmless for UI-driven calls.
|
|
128
|
+
*/
|
|
19
129
|
export declare function markRead(id: string, user_id: string): Promise<boolean>;
|
|
130
|
+
/**
|
|
131
|
+
* Task 2.13b — markAllRead via claimRows (idempotent)
|
|
132
|
+
*
|
|
133
|
+
* Sets read_at = now() for every inbox row belonging to the given user/scope.
|
|
134
|
+
*
|
|
135
|
+
* Idempotency trade-off: same as markRead — the `read_at: null` condition is
|
|
136
|
+
* omitted to avoid the SQLite NULL-matching issue. Already-read rows will have
|
|
137
|
+
* their read_at re-stamped, which is acceptable for bulk UI acknowledgment.
|
|
138
|
+
*
|
|
139
|
+
* Returns the count of rows updated (includes any already-read rows).
|
|
140
|
+
*/
|
|
20
141
|
export declare function markAllRead(user_id: string, scope_id: string): Promise<number>;
|
|
21
142
|
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0C1F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2C1F;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAwD3G;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpF;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASjF;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW1E;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQxE;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlF;AAID,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAarB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU5E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpF"}
|
|
@@ -1,94 +1,345 @@
|
|
|
1
|
+
import { QueryBuilder, createCrudService } from "hazo_connect/server";
|
|
1
2
|
import { getInboxConnection } from "./connection.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Upsert an inbox row using a claim-first strategy:
|
|
5
|
+
*
|
|
6
|
+
* 1. Try to increment an existing open batch that matches `batch_key` and
|
|
7
|
+
* `batch_closed_at`. This preserves the increment-on-conflict semantics of
|
|
8
|
+
* the original Postgres `ON CONFLICT (batch_key) WHERE batch_closed_at IS NULL`
|
|
9
|
+
* partial-index upsert.
|
|
10
|
+
* 2. If no open batch found, insert a fresh row.
|
|
11
|
+
*
|
|
12
|
+
* Race-condition trade-off: if two workers concurrently find no open batch and
|
|
13
|
+
* both insert, both succeed (no unique index guards the SQLite/adapter path).
|
|
14
|
+
* The original Postgres SQL used a partial unique index for true atomicity.
|
|
15
|
+
* For Hazodocs (single-worker), this race window is acceptable; adding retry
|
|
16
|
+
* logic would require error-code parsing not available in hazo_connect.
|
|
17
|
+
*
|
|
18
|
+
* SQLite NULL caveat: the clause-builder emits `col = ?` which SQLite's `=`
|
|
19
|
+
* operator does not use to match NULL (needs IS NULL). In production (Postgres),
|
|
20
|
+
* the behaviour is correct because Postgres's `=` also doesn't match NULL — the
|
|
21
|
+
* partial index `WHERE batch_closed_at IS NULL` handles the constraint there.
|
|
22
|
+
* In SQLite-backed tests use empty string instead of null for batch_closed_at.
|
|
23
|
+
*/
|
|
7
24
|
export async function upsertInboxRow(i) {
|
|
8
|
-
const
|
|
9
|
-
|
|
25
|
+
const adapter = getInboxConnection();
|
|
26
|
+
// Try to increment an existing open batch first.
|
|
27
|
+
const claimed = await adapter.claimRows({
|
|
28
|
+
table: "hazo_notify_inbox",
|
|
29
|
+
where: { batch_key: i.batch_key, batch_closed_at: i.batch_closed_at ?? "" },
|
|
30
|
+
set: {
|
|
31
|
+
aggregate_count: { increment: 1 },
|
|
32
|
+
in_app_text: i.in_app_text,
|
|
33
|
+
payload: JSON.stringify(i.payload),
|
|
34
|
+
updated_at: { $now: true },
|
|
35
|
+
},
|
|
36
|
+
returning: ["id"],
|
|
37
|
+
limit: 1,
|
|
38
|
+
});
|
|
39
|
+
if (claimed.length > 0) {
|
|
40
|
+
return { id: claimed[0].id, inserted: false };
|
|
41
|
+
}
|
|
42
|
+
// No open batch — insert a new row.
|
|
43
|
+
const rows = await adapter.query(new QueryBuilder()
|
|
44
|
+
.from("hazo_notify_inbox")
|
|
45
|
+
.returning("id"), "POST", {
|
|
46
|
+
scope_id: i.scope_id,
|
|
47
|
+
user_id: i.user_id,
|
|
48
|
+
event_type: i.event_type,
|
|
49
|
+
subject_id: i.subject_id,
|
|
50
|
+
batch_key: i.batch_key,
|
|
51
|
+
in_app_text: i.in_app_text,
|
|
52
|
+
deep_link: i.deep_link,
|
|
53
|
+
payload: JSON.stringify(i.payload),
|
|
54
|
+
surfaces: JSON.stringify(i.surfaces),
|
|
55
|
+
batch_closed_at: i.batch_closed_at,
|
|
56
|
+
});
|
|
57
|
+
return { id: rows[0].id, inserted: true };
|
|
10
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Upsert a channel delivery row using a two-claim strategy that preserves the
|
|
61
|
+
* original Postgres CASE-WHEN semantic for `flush_after`:
|
|
62
|
+
*
|
|
63
|
+
* 1. Claim an **existing fresh row** (attempt_count = 0) — update both `payload`
|
|
64
|
+
* and `flush_after` (the delivery hasn't been tried yet, so rescheduling is safe).
|
|
65
|
+
* 2. Claim an **existing in-flight row** (attempt_count > 0) — update `payload`
|
|
66
|
+
* only; preserve `flush_after` to avoid resetting an active retry schedule.
|
|
67
|
+
* 3. If neither claim succeeds, no row exists — insert a new one.
|
|
68
|
+
*
|
|
69
|
+
* The two claims are mutually exclusive so at most one succeeds per call.
|
|
70
|
+
*/
|
|
11
71
|
export async function upsertDelivery(i) {
|
|
12
|
-
const
|
|
13
|
-
|
|
72
|
+
const adapter = getInboxConnection();
|
|
73
|
+
// Step 1: claim a fresh (not-yet-attempted) row — update payload + flush_after.
|
|
74
|
+
const claimedFresh = await adapter.claimRows({
|
|
75
|
+
table: "hazo_notify_channel_deliveries",
|
|
76
|
+
where: { inbox_id: i.inbox_id, channel_id: i.channel_id, attempt_count: 0 },
|
|
77
|
+
set: { payload: JSON.stringify(i.payload), flush_after: i.flush_after, updated_at: { $now: true } },
|
|
78
|
+
returning: ["id"],
|
|
79
|
+
limit: 1,
|
|
80
|
+
});
|
|
81
|
+
if (claimedFresh.length > 0) {
|
|
82
|
+
return { id: claimedFresh[0].id, inserted: false, attempt_in_flight: false };
|
|
83
|
+
}
|
|
84
|
+
// Step 2: claim an in-flight row (attempt_count > 0) — update payload only,
|
|
85
|
+
// preserve flush_after so the retry schedule is not reset.
|
|
86
|
+
const claimedInFlight = await adapter.claimRows({
|
|
87
|
+
table: "hazo_notify_channel_deliveries",
|
|
88
|
+
where: { inbox_id: i.inbox_id, channel_id: i.channel_id, attempt_count: { gt: 0 } },
|
|
89
|
+
set: { payload: JSON.stringify(i.payload), updated_at: { $now: true } },
|
|
90
|
+
returning: ["id"],
|
|
91
|
+
limit: 1,
|
|
92
|
+
});
|
|
93
|
+
if (claimedInFlight.length > 0) {
|
|
94
|
+
return { id: claimedInFlight[0].id, inserted: false, attempt_in_flight: true };
|
|
95
|
+
}
|
|
96
|
+
// Step 3: no existing row — insert a new delivery.
|
|
97
|
+
const rows = await adapter.query(new QueryBuilder()
|
|
98
|
+
.from("hazo_notify_channel_deliveries")
|
|
99
|
+
.returning("id"), "POST", {
|
|
100
|
+
inbox_id: i.inbox_id,
|
|
101
|
+
channel_id: i.channel_id,
|
|
102
|
+
payload: JSON.stringify(i.payload),
|
|
103
|
+
flush_after: i.flush_after,
|
|
104
|
+
});
|
|
105
|
+
return { id: rows[0].id, inserted: true, attempt_in_flight: false };
|
|
14
106
|
}
|
|
15
107
|
export async function claimDueDeliveries(channel_id, batch_size) {
|
|
16
|
-
const
|
|
17
|
-
|
|
108
|
+
const adapter = getInboxConnection();
|
|
109
|
+
// THE KEY CHANGE (Task 2.6): delegates to adapter.claimRows instead of a
|
|
110
|
+
// dialect-bound raw SQL query (SELECT … FOR UPDATE SKIP LOCKED on Postgres).
|
|
111
|
+
// Strong atomicity on PgAdapter; CAS-optimistic on PostgrestAdapter;
|
|
112
|
+
// serialised transaction on SqliteAdapter. All adapters are supported.
|
|
113
|
+
const claimed = await adapter.claimRows({
|
|
114
|
+
table: "hazo_notify_channel_deliveries",
|
|
115
|
+
where: {
|
|
116
|
+
channel_id,
|
|
117
|
+
status: "pending",
|
|
118
|
+
flush_after: { lte: { $now: true } },
|
|
119
|
+
},
|
|
120
|
+
set: {
|
|
121
|
+
attempt_count: { increment: 1 },
|
|
122
|
+
updated_at: { $now: true },
|
|
123
|
+
},
|
|
124
|
+
returning: ["id", "inbox_id", "channel_id", "payload", "attempt_count"],
|
|
125
|
+
limit: batch_size,
|
|
126
|
+
orderBy: { column: "flush_after", direction: "asc" },
|
|
127
|
+
});
|
|
128
|
+
// Enrich each claimed row with user_id + scope_id from the originating inbox
|
|
129
|
+
// row. N+1 is acceptable: batch sizes are small (~10) and per-call latency
|
|
130
|
+
// dominates. Map `id` → `delivery_id` to match the ClaimedDelivery contract
|
|
131
|
+
// that callers (flush worker) expect.
|
|
132
|
+
return Promise.all(claimed.map(async (r) => {
|
|
133
|
+
const inboxRows = await adapter.query(new QueryBuilder()
|
|
134
|
+
.from("hazo_notify_inbox")
|
|
135
|
+
.select("user_id, scope_id")
|
|
136
|
+
.where("id", "eq", r.inbox_id), "GET");
|
|
137
|
+
const payload = typeof r.payload === "string"
|
|
138
|
+
? JSON.parse(r.payload)
|
|
139
|
+
: r.payload;
|
|
140
|
+
return {
|
|
141
|
+
delivery_id: r.id,
|
|
142
|
+
inbox_id: r.inbox_id,
|
|
143
|
+
channel_id: r.channel_id,
|
|
144
|
+
payload,
|
|
145
|
+
attempt_count: r.attempt_count,
|
|
146
|
+
user_id: inboxRows[0]?.user_id ?? "",
|
|
147
|
+
scope_id: inboxRows[0]?.scope_id ?? "",
|
|
148
|
+
};
|
|
149
|
+
}));
|
|
18
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Task 2.7 — markDeliverySent via CrudService.updateById
|
|
153
|
+
*
|
|
154
|
+
* Sets status=sent, records the provider message_id, and stamps finalized_at.
|
|
155
|
+
* updateById returns T[] — ignored here (fire-and-forget).
|
|
156
|
+
*/
|
|
19
157
|
export async function markDeliverySent(id, message_id) {
|
|
20
|
-
const
|
|
21
|
-
|
|
158
|
+
const adapter = getInboxConnection();
|
|
159
|
+
const crud = createCrudService(adapter, "hazo_notify_channel_deliveries");
|
|
160
|
+
await crud.updateById(id, {
|
|
161
|
+
status: "sent",
|
|
162
|
+
message_id,
|
|
163
|
+
finalized_at: new Date().toISOString(),
|
|
164
|
+
updated_at: new Date().toISOString(),
|
|
165
|
+
});
|
|
22
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Task 2.8 — markDeliveryFailed via CrudService.updateById
|
|
169
|
+
*
|
|
170
|
+
* Sets status=failed, stores the error (truncated to 1000 chars), and stamps finalized_at.
|
|
171
|
+
* updateById returns T[] — ignored here (fire-and-forget).
|
|
172
|
+
*/
|
|
23
173
|
export async function markDeliveryFailed(id, error) {
|
|
24
|
-
const
|
|
25
|
-
|
|
174
|
+
const adapter = getInboxConnection();
|
|
175
|
+
const crud = createCrudService(adapter, "hazo_notify_channel_deliveries");
|
|
176
|
+
await crud.updateById(id, {
|
|
177
|
+
status: "failed",
|
|
178
|
+
last_error: error.slice(0, 1000),
|
|
179
|
+
finalized_at: new Date().toISOString(),
|
|
180
|
+
updated_at: new Date().toISOString(),
|
|
181
|
+
});
|
|
26
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* Task 2.9 — rescheduleDelivery via CrudService.updateById
|
|
185
|
+
*
|
|
186
|
+
* Updates flush_after and last_error for the next retry. Status stays 'pending'.
|
|
187
|
+
* updateById returns T[] — ignored here (fire-and-forget).
|
|
188
|
+
*/
|
|
27
189
|
export async function rescheduleDelivery(id, flush_after, error) {
|
|
28
|
-
const
|
|
29
|
-
|
|
190
|
+
const adapter = getInboxConnection();
|
|
191
|
+
const crud = createCrudService(adapter, "hazo_notify_channel_deliveries");
|
|
192
|
+
await crud.updateById(id, {
|
|
193
|
+
flush_after,
|
|
194
|
+
last_error: error,
|
|
195
|
+
updated_at: new Date().toISOString(),
|
|
196
|
+
});
|
|
30
197
|
}
|
|
198
|
+
/**
|
|
199
|
+
* Task 2.10 — closeStaleBatches via adapter.claimRows
|
|
200
|
+
*
|
|
201
|
+
* Closes inbox rows whose batch_closed_at is empty string (open) and whose
|
|
202
|
+
* created_at is older than (now - window_ms).
|
|
203
|
+
*
|
|
204
|
+
* NULL caveat: SQLite's claimRows WHERE emits `col = ?` which does not match
|
|
205
|
+
* SQL NULL. Empty string '' is used as the sentinel for "open batch" in both
|
|
206
|
+
* SQLite tests and production (see upsertInboxRow). In production (Postgres),
|
|
207
|
+
* rows inserted via this adapter path use '' not NULL, so the '' sentinel is
|
|
208
|
+
* consistent end-to-end.
|
|
209
|
+
*
|
|
210
|
+
* Returns the number of batches closed.
|
|
211
|
+
*/
|
|
31
212
|
export async function closeStaleBatches(window_ms) {
|
|
32
|
-
const
|
|
33
|
-
|
|
213
|
+
const adapter = getInboxConnection();
|
|
214
|
+
const cutoff = new Date(Date.now() - window_ms).toISOString();
|
|
215
|
+
const rows = await adapter.claimRows({
|
|
216
|
+
table: "hazo_notify_inbox",
|
|
217
|
+
where: { batch_closed_at: "", created_at: { lte: cutoff } },
|
|
218
|
+
set: { batch_closed_at: { $now: true } },
|
|
219
|
+
returning: ["id"],
|
|
220
|
+
limit: 10000,
|
|
221
|
+
});
|
|
222
|
+
return rows.length;
|
|
34
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Task 2.11a — purgeReadInbox via QueryBuilder DELETE
|
|
226
|
+
*
|
|
227
|
+
* Deletes inbox rows that have been read and whose read_at is older than
|
|
228
|
+
* `older_than`. Returns the number of rows deleted.
|
|
229
|
+
*
|
|
230
|
+
* QueryBuilder 'neq' with null → IS NOT NULL (via translateWhereCondition).
|
|
231
|
+
* QueryBuilder 'lt' → read_at < older_than.
|
|
232
|
+
*/
|
|
35
233
|
export async function purgeReadInbox(older_than) {
|
|
36
|
-
const
|
|
37
|
-
|
|
234
|
+
const adapter = getInboxConnection();
|
|
235
|
+
const builder = new QueryBuilder()
|
|
236
|
+
.from("hazo_notify_inbox")
|
|
237
|
+
.where("read_at", "neq", null)
|
|
238
|
+
.where("read_at", "lt", older_than);
|
|
239
|
+
const rows = await adapter.query(builder, "DELETE");
|
|
240
|
+
return rows.length;
|
|
38
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Task 2.11b — purgeFinalizedDeliveries via QueryBuilder DELETE
|
|
244
|
+
*
|
|
245
|
+
* Deletes delivery rows that have been finalized (sent or failed) and whose
|
|
246
|
+
* finalized_at is older than `older_than`. Returns the number of rows deleted.
|
|
247
|
+
*/
|
|
39
248
|
export async function purgeFinalizedDeliveries(older_than) {
|
|
40
|
-
const
|
|
41
|
-
|
|
249
|
+
const adapter = getInboxConnection();
|
|
250
|
+
const builder = new QueryBuilder()
|
|
251
|
+
.from("hazo_notify_channel_deliveries")
|
|
252
|
+
.where("finalized_at", "neq", null)
|
|
253
|
+
.where("finalized_at", "lt", older_than);
|
|
254
|
+
const rows = await adapter.query(builder, "DELETE");
|
|
255
|
+
return rows.length;
|
|
42
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* Task 2.12a — listUnreadForUser via QueryBuilder
|
|
259
|
+
*
|
|
260
|
+
* Returns unread inbox rows for the given user/scope, ordered by created_at
|
|
261
|
+
* descending with optional cursor (created_at < cursor) and limit.
|
|
262
|
+
*
|
|
263
|
+
* Surface filtering (in_app / banner) requires dialect-specific JSONB or
|
|
264
|
+
* json_extract access. Rather than branching on adapter type at this layer,
|
|
265
|
+
* callers filter in-memory when surface filtering is needed. This keeps the
|
|
266
|
+
* storage layer adapter-agnostic.
|
|
267
|
+
*
|
|
268
|
+
* QueryBuilder 'is' with null → IS NULL (via translateWhereCondition).
|
|
269
|
+
*/
|
|
43
270
|
export async function listUnreadForUser(user_id, scope_id, opts = {}) {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
271
|
+
const adapter = getInboxConnection();
|
|
272
|
+
let builder = new QueryBuilder()
|
|
273
|
+
.from("hazo_notify_inbox")
|
|
274
|
+
.where("user_id", "eq", user_id)
|
|
275
|
+
.where("scope_id", "eq", scope_id)
|
|
276
|
+
.where("read_at", "is", null)
|
|
277
|
+
.order("created_at", "desc")
|
|
278
|
+
.limit(Math.min(opts.limit ?? 20, 100));
|
|
51
279
|
if (opts.cursor) {
|
|
52
|
-
where
|
|
53
|
-
params.push(opts.cursor);
|
|
54
|
-
i++;
|
|
280
|
+
builder = builder.where("created_at", "lt", opts.cursor);
|
|
55
281
|
}
|
|
56
|
-
|
|
57
|
-
where.push(isSqlite
|
|
58
|
-
? `json_extract(surfaces, '$.${opts.surface}') = 1`
|
|
59
|
-
: `(surfaces->>'${opts.surface}')::boolean = true`);
|
|
60
|
-
}
|
|
61
|
-
params.push(limit);
|
|
62
|
-
return await conn.raw(`SELECT * FROM hazo_notify_inbox WHERE ${where.join(" AND ")}
|
|
63
|
-
ORDER BY created_at DESC LIMIT ${ph(i)}`, params);
|
|
282
|
+
return await adapter.query(builder, "GET");
|
|
64
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* Task 2.12b — unreadCount via QueryBuilder
|
|
286
|
+
*
|
|
287
|
+
* Counts unread inbox rows for the given user/scope.
|
|
288
|
+
* QueryBuilder 'is' with null → IS NULL.
|
|
289
|
+
*/
|
|
65
290
|
export async function unreadCount(user_id, scope_id) {
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
291
|
+
const adapter = getInboxConnection();
|
|
292
|
+
const builder = new QueryBuilder()
|
|
293
|
+
.from("hazo_notify_inbox")
|
|
294
|
+
.where("user_id", "eq", user_id)
|
|
295
|
+
.where("scope_id", "eq", scope_id)
|
|
296
|
+
.where("read_at", "is", null);
|
|
297
|
+
const rows = await adapter.query(builder, "GET");
|
|
298
|
+
return rows.length;
|
|
71
299
|
}
|
|
300
|
+
/**
|
|
301
|
+
* Task 2.13a — markRead via claimRows (idempotent)
|
|
302
|
+
*
|
|
303
|
+
* Sets read_at = now() for the given inbox row, scoped by user_id to prevent
|
|
304
|
+
* cross-user reads.
|
|
305
|
+
*
|
|
306
|
+
* Idempotency trade-off: the `read_at: null` condition is omitted from the
|
|
307
|
+
* claimRows WHERE because the clause-builder emits `col = ?` which SQLite's
|
|
308
|
+
* `=` operator does not use to match NULL. Dropping the condition makes the
|
|
309
|
+
* operation idempotent — re-marking an already-read row re-sets read_at = now(),
|
|
310
|
+
* which is harmless for UI-driven calls.
|
|
311
|
+
*/
|
|
72
312
|
export async function markRead(id, user_id) {
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
:
|
|
79
|
-
|
|
80
|
-
|
|
313
|
+
const adapter = getInboxConnection();
|
|
314
|
+
const rows = await adapter.claimRows({
|
|
315
|
+
table: "hazo_notify_inbox",
|
|
316
|
+
where: { id, user_id },
|
|
317
|
+
set: { read_at: { $now: true } },
|
|
318
|
+
returning: ["id"],
|
|
319
|
+
limit: 1,
|
|
320
|
+
});
|
|
81
321
|
return rows.length > 0;
|
|
82
322
|
}
|
|
323
|
+
/**
|
|
324
|
+
* Task 2.13b — markAllRead via claimRows (idempotent)
|
|
325
|
+
*
|
|
326
|
+
* Sets read_at = now() for every inbox row belonging to the given user/scope.
|
|
327
|
+
*
|
|
328
|
+
* Idempotency trade-off: same as markRead — the `read_at: null` condition is
|
|
329
|
+
* omitted to avoid the SQLite NULL-matching issue. Already-read rows will have
|
|
330
|
+
* their read_at re-stamped, which is acceptable for bulk UI acknowledgment.
|
|
331
|
+
*
|
|
332
|
+
* Returns the count of rows updated (includes any already-read rows).
|
|
333
|
+
*/
|
|
83
334
|
export async function markAllRead(user_id, scope_id) {
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
:
|
|
90
|
-
|
|
91
|
-
|
|
335
|
+
const adapter = getInboxConnection();
|
|
336
|
+
const rows = await adapter.claimRows({
|
|
337
|
+
table: "hazo_notify_inbox",
|
|
338
|
+
where: { user_id, scope_id },
|
|
339
|
+
set: { read_at: { $now: true } },
|
|
340
|
+
returning: ["id"],
|
|
341
|
+
limit: 10000,
|
|
342
|
+
});
|
|
92
343
|
return rows.length;
|
|
93
344
|
}
|
|
94
345
|
//# sourceMappingURL=storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/lib/inbox/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/lib/inbox/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,4 +54,41 @@ export interface DispatchResult {
|
|
|
54
54
|
deliveries_refreshed: number;
|
|
55
55
|
channels_dispatched: string[];
|
|
56
56
|
}
|
|
57
|
+
export interface UpsertInboxRowInput {
|
|
58
|
+
scope_id: string;
|
|
59
|
+
user_id: string;
|
|
60
|
+
event_type: string;
|
|
61
|
+
subject_id: string | null;
|
|
62
|
+
batch_key: string;
|
|
63
|
+
in_app_text: string;
|
|
64
|
+
deep_link: string;
|
|
65
|
+
payload: Record<string, unknown>;
|
|
66
|
+
surfaces: NotificationSurfaces;
|
|
67
|
+
batch_closed_at: string | null;
|
|
68
|
+
}
|
|
69
|
+
export interface UpsertInboxRowResult {
|
|
70
|
+
id: string;
|
|
71
|
+
inserted: boolean;
|
|
72
|
+
}
|
|
73
|
+
export interface UpsertDeliveryInput {
|
|
74
|
+
inbox_id: string;
|
|
75
|
+
channel_id: string;
|
|
76
|
+
payload: Record<string, unknown>;
|
|
77
|
+
flush_after: string;
|
|
78
|
+
}
|
|
79
|
+
export interface UpsertDeliveryResult {
|
|
80
|
+
id: string;
|
|
81
|
+
inserted: boolean;
|
|
82
|
+
/** True if the worker has already started attempts on this row. */
|
|
83
|
+
attempt_in_flight: boolean;
|
|
84
|
+
}
|
|
85
|
+
export interface ClaimedDelivery {
|
|
86
|
+
delivery_id: string;
|
|
87
|
+
inbox_id: string;
|
|
88
|
+
channel_id: string;
|
|
89
|
+
payload: Record<string, unknown>;
|
|
90
|
+
attempt_count: number;
|
|
91
|
+
user_id: string;
|
|
92
|
+
scope_id: string;
|
|
93
|
+
}
|
|
57
94
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAmB9D;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC1D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2BjC"}
|
|
@@ -7,9 +7,25 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @packageDocumentation
|
|
9
9
|
*/
|
|
10
|
+
import { QueryBuilder } from "hazo_connect/server";
|
|
10
11
|
import { get_template_by_name } from "../../template_manager/db/index.js";
|
|
11
12
|
import { render_handlebars_string } from "../../template_manager/engine/index.js";
|
|
12
13
|
import { getInboxConnection } from "../connection.js";
|
|
14
|
+
// Bridge inbox's HazoConnectAdapter to template_manager's HazoConnectInstance facade.
|
|
15
|
+
// template_manager only calls .query()/.list() on this; other facade methods are unused
|
|
16
|
+
// in this path. The HazoConnectInstance contract is preserved as an internal facade
|
|
17
|
+
// for template_manager (see template_manager/types.ts JSDoc).
|
|
18
|
+
function asTemplateManagerInstance(adapter) {
|
|
19
|
+
return {
|
|
20
|
+
query: () => new QueryBuilder(),
|
|
21
|
+
list: async (qb) => (await adapter.query(qb, "GET")),
|
|
22
|
+
findById: async () => { throw new Error("asTemplateManagerInstance: findById not implemented"); },
|
|
23
|
+
findBy: async () => { throw new Error("asTemplateManagerInstance: findBy not implemented"); },
|
|
24
|
+
insert: async () => { throw new Error("asTemplateManagerInstance: insert not implemented"); },
|
|
25
|
+
updateById: async () => { throw new Error("asTemplateManagerInstance: updateById not implemented"); },
|
|
26
|
+
deleteById: async () => { throw new Error("asTemplateManagerInstance: deleteById not implemented"); },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
13
29
|
/**
|
|
14
30
|
* Render template bodies for a claimed delivery row.
|
|
15
31
|
*
|
|
@@ -22,7 +38,7 @@ export async function renderForChannel(adapter, row) {
|
|
|
22
38
|
const payload = row.payload;
|
|
23
39
|
if (!payload.template_name)
|
|
24
40
|
return {};
|
|
25
|
-
const conn = getInboxConnection();
|
|
41
|
+
const conn = asTemplateManagerInstance(getInboxConnection());
|
|
26
42
|
const scope_chain = row.scope_id ? [row.scope_id] : [];
|
|
27
43
|
const result = await get_template_by_name(conn, scope_chain, payload.template_name);
|
|
28
44
|
const template = result.data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAItD,sFAAsF;AACtF,wFAAwF;AACxF,oFAAoF;AACpF,8DAA8D;AAC9D,SAAS,yBAAyB,CAAC,OAA2B;IAC5D,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAyD;QACtF,IAAI,EAAE,KAAK,EAAK,EAAW,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAkB,EAAE,KAAK,CAAC,CAAQ;QACvF,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC,CAAC;QAC7F,UAAU,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC,CAAC;QACrG,UAAU,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC,CAAC;KACtG,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAuB,EACvB,GAA2D;IAE3D,MAAM,OAAO,GAAG,GAAG,CAAC,OAGnB,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,IAAI,GAAG,yBAAyB,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAAI,MAA+C,CAAC,IAAI,CAAC;IACvE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAE/E,MAAM,UAAU,GAAI,QAAgD,CAAC,MAAM,IAAI,EAAE,CAAC;IAClF,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAA4B,CAAC;IACtE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,IAA8B,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -108,6 +108,14 @@ export interface EmailTemplateUpdate {
|
|
|
108
108
|
bodies?: Record<string, string>;
|
|
109
109
|
is_modified?: boolean;
|
|
110
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Internal query-builder facade used by template_manager's repository layer.
|
|
113
|
+
* This is a narrow subset of hazo_connect's QueryBuilder, shaped for the
|
|
114
|
+
* CrudService-style API that template_manager repositories depend on.
|
|
115
|
+
*
|
|
116
|
+
* **Inbox subsystem** does NOT use this type. Inbox imports
|
|
117
|
+
* HazoConnectAdapter directly from hazo_connect/server (5.0+).
|
|
118
|
+
*/
|
|
111
119
|
export interface HazoConnectQueryBuilder {
|
|
112
120
|
from(table: string): this;
|
|
113
121
|
select(columns: string | string[]): this;
|
|
@@ -117,6 +125,22 @@ export interface HazoConnectQueryBuilder {
|
|
|
117
125
|
limit(n: number): this;
|
|
118
126
|
offset(n: number): this;
|
|
119
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Internal facade used by template_manager's repository layer. Provides
|
|
130
|
+
* a higher-level CRUD shape than hazo_connect's HazoConnectAdapter.
|
|
131
|
+
*
|
|
132
|
+
* **Inbox subsystem** does NOT use this type. Inbox imports
|
|
133
|
+
* HazoConnectAdapter directly from hazo_connect/server (5.0+).
|
|
134
|
+
*
|
|
135
|
+
* Consumers wiring the template_manager pass a small adapter object
|
|
136
|
+
* matching this shape (Hazodocs has one in lib/notifications/).
|
|
137
|
+
*
|
|
138
|
+
* Note: HazoConnectAdapter (hazo_connect/server) has a completely different
|
|
139
|
+
* method surface (rawQuery/getConfig/claimRows/query(builder, method?, body?))
|
|
140
|
+
* and cannot be substituted here without rewriting all template_manager
|
|
141
|
+
* repositories to use CrudService — that refactor is out of scope for
|
|
142
|
+
* the inbox-worker-fix plan.
|
|
143
|
+
*/
|
|
120
144
|
export interface HazoConnectInstance {
|
|
121
145
|
list<T>(query: HazoConnectQueryBuilder): Promise<T[]>;
|
|
122
146
|
findById<T>(table: string, id: string): Promise<T | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/template_manager/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/template_manager/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hazo_notify",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Email notification system with scope-aware template management",
|
|
6
6
|
"main": "./dist/lib/index.js",
|
|
@@ -118,10 +118,10 @@
|
|
|
118
118
|
"tailwind-merge": "^3.5.0"
|
|
119
119
|
},
|
|
120
120
|
"peerDependencies": {
|
|
121
|
-
"hazo_connect": "^2.
|
|
121
|
+
"hazo_connect": "^2.7.0",
|
|
122
|
+
"hazo_jobs": "^0.7.0",
|
|
122
123
|
"hazo_logs": "^1.0.13",
|
|
123
|
-
"hazo_ui": "^2.8.0"
|
|
124
|
-
"hazo_jobs": "^0.7.0"
|
|
124
|
+
"hazo_ui": "^2.8.0"
|
|
125
125
|
},
|
|
126
126
|
"peerDependenciesMeta": {
|
|
127
127
|
"hazo_connect": {
|
|
@@ -190,6 +190,7 @@
|
|
|
190
190
|
"clsx": "^2.1.1",
|
|
191
191
|
"cmdk": "^1.1.1",
|
|
192
192
|
"hazo_auth": "^5.2.0",
|
|
193
|
+
"hazo_connect": "^2.7.0",
|
|
193
194
|
"hazo_ui": "^2.8.0",
|
|
194
195
|
"jest": "^30.2.0",
|
|
195
196
|
"jest-environment-jsdom": "^30.4.1",
|