@stratum-hq/lib 1.0.0 → 1.2.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/README.md +109 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/migrations/020_usage_events.sql +55 -0
- package/dist/migrations/021_tenant_status_suspended.sql +12 -0
- package/dist/scoped-job.d.ts +57 -0
- package/dist/scoped-job.d.ts.map +1 -0
- package/dist/scoped-job.js +56 -0
- package/dist/scoped-job.js.map +1 -0
- package/dist/services/audit-service.d.ts +10 -2
- package/dist/services/audit-service.d.ts.map +1 -1
- package/dist/services/audit-service.js +22 -3
- package/dist/services/audit-service.js.map +1 -1
- package/dist/services/event-service.d.ts +1 -1
- package/dist/services/event-service.d.ts.map +1 -1
- package/dist/services/event-service.js +7 -6
- package/dist/services/event-service.js.map +1 -1
- package/dist/services/rate-limit-service.d.ts +135 -0
- package/dist/services/rate-limit-service.d.ts.map +1 -0
- package/dist/services/rate-limit-service.js +113 -0
- package/dist/services/rate-limit-service.js.map +1 -0
- package/dist/services/tenant-service.d.ts +34 -0
- package/dist/services/tenant-service.d.ts.map +1 -1
- package/dist/services/tenant-service.js +154 -13
- package/dist/services/tenant-service.js.map +1 -1
- package/dist/services/usage-service.d.ts +18 -0
- package/dist/services/usage-service.d.ts.map +1 -0
- package/dist/services/usage-service.js +80 -0
- package/dist/services/usage-service.js.map +1 -0
- package/dist/services/webhook-service.d.ts +9 -1
- package/dist/services/webhook-service.d.ts.map +1 -1
- package/dist/services/webhook-service.js +51 -0
- package/dist/services/webhook-service.js.map +1 -1
- package/dist/stratum.d.ts +48 -1
- package/dist/stratum.d.ts.map +1 -1
- package/dist/stratum.js +94 -0
- package/dist/stratum.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-tenant rate limiting primitive.
|
|
3
|
+
*
|
|
4
|
+
* A small, storage-agnostic fixed-window rate limiter for library consumers.
|
|
5
|
+
* It is intentionally NOT wired into the `Stratum` facade (which is bound to a
|
|
6
|
+
* single `pg.Pool`): the point of this primitive is that its storage is
|
|
7
|
+
* pluggable, so it ships with a process-local in-memory store and a documented
|
|
8
|
+
* {@link RateLimitStore} contract a consumer can implement over Redis, Postgres,
|
|
9
|
+
* or anything else with an atomic per-key increment.
|
|
10
|
+
*
|
|
11
|
+
* This is distinct from the HTTP-layer rate limiting in
|
|
12
|
+
* `@stratum-hq/control-plane`; this is a building block for embedding
|
|
13
|
+
* per-tenant limits directly in an application.
|
|
14
|
+
*/
|
|
15
|
+
/** A rate limit: at most `limit` hits per `windowMs` window. */
|
|
16
|
+
export interface RateLimit {
|
|
17
|
+
/** Maximum number of hits allowed within the window. Positive integer. */
|
|
18
|
+
limit: number;
|
|
19
|
+
/** Window length in milliseconds. Positive. */
|
|
20
|
+
windowMs: number;
|
|
21
|
+
}
|
|
22
|
+
/** The outcome of a {@link RateLimiter.checkLimit} call. */
|
|
23
|
+
export interface RateLimitResult {
|
|
24
|
+
/** Whether this hit is within the limit. */
|
|
25
|
+
allowed: boolean;
|
|
26
|
+
/** The effective limit that was applied. */
|
|
27
|
+
limit: number;
|
|
28
|
+
/** Hits remaining in the current window. 0 once the limit is reached. */
|
|
29
|
+
remaining: number;
|
|
30
|
+
/** Epoch milliseconds at which the current window ends and the counter clears. */
|
|
31
|
+
resetAt: number;
|
|
32
|
+
/** Seconds until the caller may retry. 0 when `allowed` is true. */
|
|
33
|
+
retryAfter: number;
|
|
34
|
+
}
|
|
35
|
+
/** A live window's counter state, as returned by a {@link RateLimitStore}. */
|
|
36
|
+
export interface RateLimitState {
|
|
37
|
+
/** Hit count within the current window, including the hit that produced it. */
|
|
38
|
+
count: number;
|
|
39
|
+
/** Epoch milliseconds at which the current window ends. */
|
|
40
|
+
resetAt: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Storage backend contract for {@link RateLimiter}.
|
|
44
|
+
*
|
|
45
|
+
* A conforming store must provide an atomic-per-key increment. Implementations:
|
|
46
|
+
*
|
|
47
|
+
* - **Redis** — `INCR key` then, when the reply is `1`, `PEXPIRE key windowMs`;
|
|
48
|
+
* derive `resetAt` from `now + PTTL`. A short Lua script keeps it atomic and
|
|
49
|
+
* returns both count and TTL in one round trip.
|
|
50
|
+
* - **Postgres** — `INSERT ... ON CONFLICT (key) DO UPDATE SET count = ... `
|
|
51
|
+
* returning the new count, resetting the row when `reset_at` has passed.
|
|
52
|
+
* - **In-memory** — see {@link MemoryRateLimitStore}.
|
|
53
|
+
*/
|
|
54
|
+
export interface RateLimitStore {
|
|
55
|
+
/**
|
|
56
|
+
* Atomically increment the hit counter for `key` and return the resulting
|
|
57
|
+
* count together with the window's reset time.
|
|
58
|
+
*
|
|
59
|
+
* Contract:
|
|
60
|
+
* - If no live window exists for `key` (never seen, or the previous window
|
|
61
|
+
* has already elapsed), begin a fresh window: set count to 1 and `resetAt`
|
|
62
|
+
* to `now + windowMs`.
|
|
63
|
+
* - Otherwise increment the existing count by 1 and return the current
|
|
64
|
+
* window's unchanged `resetAt`.
|
|
65
|
+
* - The read-modify-write MUST be atomic per key: two concurrent callers must
|
|
66
|
+
* never both observe the same pre-increment value.
|
|
67
|
+
*/
|
|
68
|
+
increment(key: string, windowMs: number): Promise<RateLimitState>;
|
|
69
|
+
/** Clear any counter for `key`, so the next increment starts a new window. */
|
|
70
|
+
reset(key: string): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Process-local, in-memory {@link RateLimitStore}. Suitable for single-process
|
|
74
|
+
* deployments, tests, and development.
|
|
75
|
+
*
|
|
76
|
+
* It holds one entry per distinct key seen; an entry is overwritten once its
|
|
77
|
+
* window elapses and it is next incremented, and can be dropped with
|
|
78
|
+
* {@link reset}. Memory therefore scales with the number of distinct
|
|
79
|
+
* `tenantId:key` pairs. For high key cardinality or multi-process deployments,
|
|
80
|
+
* back {@link RateLimiter} with a store that has native TTL eviction (e.g. Redis).
|
|
81
|
+
*/
|
|
82
|
+
export declare class MemoryRateLimitStore implements RateLimitStore {
|
|
83
|
+
private readonly buckets;
|
|
84
|
+
increment(key: string, windowMs: number): Promise<RateLimitState>;
|
|
85
|
+
reset(key: string): Promise<void>;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Resolves a tenant's effective {@link RateLimit} dynamically. Return
|
|
89
|
+
* `undefined` to fall through to the static map and then the default. This is
|
|
90
|
+
* the seam for Stratum config inheritance: back it with
|
|
91
|
+
* `stratum.resolveConfig(tenantId)` to drive limits from the tenant config tree.
|
|
92
|
+
*/
|
|
93
|
+
export type RateLimitResolver = (tenantId: string) => RateLimit | undefined | Promise<RateLimit | undefined>;
|
|
94
|
+
export interface RateLimiterOptions {
|
|
95
|
+
/** Backing store. Defaults to a new {@link MemoryRateLimitStore}. */
|
|
96
|
+
store?: RateLimitStore;
|
|
97
|
+
/** Limit applied to any tenant without a more specific one. */
|
|
98
|
+
defaultLimit: RateLimit;
|
|
99
|
+
/** Static per-tenant overrides, keyed by tenant id. */
|
|
100
|
+
limits?: Record<string, RateLimit>;
|
|
101
|
+
/**
|
|
102
|
+
* Dynamic per-tenant resolver, consulted before `limits` and `defaultLimit`.
|
|
103
|
+
* See {@link RateLimitResolver}.
|
|
104
|
+
*/
|
|
105
|
+
resolveLimit?: RateLimitResolver;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Per-tenant fixed-window rate limiter.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```ts
|
|
112
|
+
* const limiter = new RateLimiter({ defaultLimit: { limit: 100, windowMs: 60_000 } });
|
|
113
|
+
* const res = await limiter.checkLimit(tenantId, "api");
|
|
114
|
+
* if (!res.allowed) throw new Error(`rate limited, retry in ${res.retryAfter}s`);
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export declare class RateLimiter {
|
|
118
|
+
private readonly store;
|
|
119
|
+
private readonly defaultLimit;
|
|
120
|
+
private readonly limits;
|
|
121
|
+
private readonly resolveLimit?;
|
|
122
|
+
constructor(options: RateLimiterOptions);
|
|
123
|
+
/**
|
|
124
|
+
* Consume one hit against a tenant's limit and report whether it is allowed.
|
|
125
|
+
*
|
|
126
|
+
* `key` sub-scopes the limit within a tenant (e.g. per-endpoint or per-user);
|
|
127
|
+
* omit it for a single tenant-wide bucket. Counters are namespaced by tenant,
|
|
128
|
+
* so one tenant's usage never affects another's.
|
|
129
|
+
*/
|
|
130
|
+
checkLimit(tenantId: string, key?: string): Promise<RateLimitResult>;
|
|
131
|
+
/** Clear a tenant's counter for `key`, starting a fresh window on next hit. */
|
|
132
|
+
reset(tenantId: string, key?: string): Promise<void>;
|
|
133
|
+
private resolveEffectiveLimit;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=rate-limit-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-service.d.ts","sourceRoot":"","sources":["../../src/services/rate-limit-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,gEAAgE;AAChE,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAElE,8EAA8E;IAC9E,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAEvD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAYjE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,QAAQ,EAAE,MAAM,KACb,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,+DAA+D;IAC/D,YAAY,EAAE,SAAS,CAAC;IACxB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAYD;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAoB;gBAEtC,OAAO,EAAE,kBAAkB;IAUvC;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAgB7E,+EAA+E;IACzE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAI/C,qBAAqB;CASpC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Per-tenant rate limiting primitive.
|
|
4
|
+
*
|
|
5
|
+
* A small, storage-agnostic fixed-window rate limiter for library consumers.
|
|
6
|
+
* It is intentionally NOT wired into the `Stratum` facade (which is bound to a
|
|
7
|
+
* single `pg.Pool`): the point of this primitive is that its storage is
|
|
8
|
+
* pluggable, so it ships with a process-local in-memory store and a documented
|
|
9
|
+
* {@link RateLimitStore} contract a consumer can implement over Redis, Postgres,
|
|
10
|
+
* or anything else with an atomic per-key increment.
|
|
11
|
+
*
|
|
12
|
+
* This is distinct from the HTTP-layer rate limiting in
|
|
13
|
+
* `@stratum-hq/control-plane`; this is a building block for embedding
|
|
14
|
+
* per-tenant limits directly in an application.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.RateLimiter = exports.MemoryRateLimitStore = void 0;
|
|
18
|
+
/**
|
|
19
|
+
* Process-local, in-memory {@link RateLimitStore}. Suitable for single-process
|
|
20
|
+
* deployments, tests, and development.
|
|
21
|
+
*
|
|
22
|
+
* It holds one entry per distinct key seen; an entry is overwritten once its
|
|
23
|
+
* window elapses and it is next incremented, and can be dropped with
|
|
24
|
+
* {@link reset}. Memory therefore scales with the number of distinct
|
|
25
|
+
* `tenantId:key` pairs. For high key cardinality or multi-process deployments,
|
|
26
|
+
* back {@link RateLimiter} with a store that has native TTL eviction (e.g. Redis).
|
|
27
|
+
*/
|
|
28
|
+
class MemoryRateLimitStore {
|
|
29
|
+
buckets = new Map();
|
|
30
|
+
async increment(key, windowMs) {
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
const existing = this.buckets.get(key);
|
|
33
|
+
if (existing === undefined || now >= existing.resetAt) {
|
|
34
|
+
const fresh = { count: 1, resetAt: now + windowMs };
|
|
35
|
+
this.buckets.set(key, fresh);
|
|
36
|
+
return { ...fresh };
|
|
37
|
+
}
|
|
38
|
+
existing.count += 1;
|
|
39
|
+
return { ...existing };
|
|
40
|
+
}
|
|
41
|
+
async reset(key) {
|
|
42
|
+
this.buckets.delete(key);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.MemoryRateLimitStore = MemoryRateLimitStore;
|
|
46
|
+
function assertValidLimit(limit, label) {
|
|
47
|
+
if (!Number.isInteger(limit.limit) || limit.limit <= 0) {
|
|
48
|
+
throw new RangeError(`${label}.limit must be a positive integer, got ${limit.limit}`);
|
|
49
|
+
}
|
|
50
|
+
if (!Number.isFinite(limit.windowMs) || limit.windowMs <= 0) {
|
|
51
|
+
throw new RangeError(`${label}.windowMs must be a positive number, got ${limit.windowMs}`);
|
|
52
|
+
}
|
|
53
|
+
return limit;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Per-tenant fixed-window rate limiter.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* const limiter = new RateLimiter({ defaultLimit: { limit: 100, windowMs: 60_000 } });
|
|
61
|
+
* const res = await limiter.checkLimit(tenantId, "api");
|
|
62
|
+
* if (!res.allowed) throw new Error(`rate limited, retry in ${res.retryAfter}s`);
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
class RateLimiter {
|
|
66
|
+
store;
|
|
67
|
+
defaultLimit;
|
|
68
|
+
limits;
|
|
69
|
+
resolveLimit;
|
|
70
|
+
constructor(options) {
|
|
71
|
+
this.store = options.store ?? new MemoryRateLimitStore();
|
|
72
|
+
this.defaultLimit = assertValidLimit(options.defaultLimit, "defaultLimit");
|
|
73
|
+
this.limits = {};
|
|
74
|
+
for (const [tenantId, limit] of Object.entries(options.limits ?? {})) {
|
|
75
|
+
this.limits[tenantId] = assertValidLimit(limit, `limits[${tenantId}]`);
|
|
76
|
+
}
|
|
77
|
+
this.resolveLimit = options.resolveLimit;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Consume one hit against a tenant's limit and report whether it is allowed.
|
|
81
|
+
*
|
|
82
|
+
* `key` sub-scopes the limit within a tenant (e.g. per-endpoint or per-user);
|
|
83
|
+
* omit it for a single tenant-wide bucket. Counters are namespaced by tenant,
|
|
84
|
+
* so one tenant's usage never affects another's.
|
|
85
|
+
*/
|
|
86
|
+
async checkLimit(tenantId, key = "default") {
|
|
87
|
+
const limit = await this.resolveEffectiveLimit(tenantId);
|
|
88
|
+
const { count, resetAt } = await this.store.increment(`${tenantId}:${key}`, limit.windowMs);
|
|
89
|
+
const allowed = count <= limit.limit;
|
|
90
|
+
return {
|
|
91
|
+
allowed,
|
|
92
|
+
limit: limit.limit,
|
|
93
|
+
remaining: Math.max(0, limit.limit - count),
|
|
94
|
+
resetAt,
|
|
95
|
+
retryAfter: allowed ? 0 : Math.max(0, Math.ceil((resetAt - Date.now()) / 1000)),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Clear a tenant's counter for `key`, starting a fresh window on next hit. */
|
|
99
|
+
async reset(tenantId, key = "default") {
|
|
100
|
+
await this.store.reset(`${tenantId}:${key}`);
|
|
101
|
+
}
|
|
102
|
+
async resolveEffectiveLimit(tenantId) {
|
|
103
|
+
if (this.resolveLimit) {
|
|
104
|
+
const resolved = await this.resolveLimit(tenantId);
|
|
105
|
+
if (resolved !== undefined) {
|
|
106
|
+
return assertValidLimit(resolved, `resolveLimit(${tenantId})`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return this.limits[tenantId] ?? this.defaultLimit;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.RateLimiter = RateLimiter;
|
|
113
|
+
//# sourceMappingURL=rate-limit-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-service.js","sourceRoot":"","sources":["../../src/services/rate-limit-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,42 @@ import pg from "pg";
|
|
|
2
2
|
import { type TenantNode, type CreateTenantInput, type UpdateTenantInput, type PaginationInput, type PaginatedResult } from "@stratum-hq/core";
|
|
3
3
|
export declare function createTenant(pool: pg.Pool, input: CreateTenantInput): Promise<TenantNode>;
|
|
4
4
|
export declare function getTenant(pool: pg.Pool, id: string, includeArchived?: boolean): Promise<TenantNode>;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a tenant by its globally-unique slug in a single indexed lookup
|
|
7
|
+
* (idx_tenant_slug), the slug-keyed counterpart to {@link getTenant}. Consumers
|
|
8
|
+
* that hold a slug can skip scanning the unindexed listTenants/listOrganizations
|
|
9
|
+
* pages. Slug is globally unique, so this returns exactly the one matching row.
|
|
10
|
+
*
|
|
11
|
+
* Mirrors getTenant's not-found and state contract: throws TenantNotFoundError
|
|
12
|
+
* when no row matches, and — unless `includeArchived` is set — TenantArchivedError
|
|
13
|
+
* / TenantSuspendedError for a non-active row. `includeArchived` is the "give me
|
|
14
|
+
* the row whatever its state" escape hatch and bypasses both non-active states.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getTenantBySlug(pool: pg.Pool, slug: string, includeArchived?: boolean): Promise<TenantNode>;
|
|
5
17
|
export declare function listTenants(pool: pg.Pool, pagination: PaginationInput): Promise<PaginatedResult<TenantNode>>;
|
|
6
18
|
export declare function updateTenant(pool: pg.Pool, id: string, patch: UpdateTenantInput): Promise<TenantNode>;
|
|
19
|
+
/**
|
|
20
|
+
* Suspend an active tenant: reversible block on access. Rejects if the tenant
|
|
21
|
+
* is not active, or if it has active children (suspend leaf-first).
|
|
22
|
+
*/
|
|
23
|
+
export declare function suspendTenant(pool: pg.Pool, id: string): Promise<TenantNode>;
|
|
24
|
+
/**
|
|
25
|
+
* Archive a tenant: reversible soft delete. Accepts an active or suspended
|
|
26
|
+
* tenant. Rejects if already archived, or if it has active children.
|
|
27
|
+
*/
|
|
28
|
+
export declare function archiveTenant(pool: pg.Pool, id: string): Promise<TenantNode>;
|
|
29
|
+
/**
|
|
30
|
+
* Resume a suspended or archived tenant back to active, reversing suspend and
|
|
31
|
+
* archive (clearing deleted_at). Rejects if the tenant is already active, or if
|
|
32
|
+
* its parent is not active. Resuming is top-down.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resumeTenant(pool: pg.Pool, id: string): Promise<TenantNode>;
|
|
35
|
+
/**
|
|
36
|
+
* Soft-delete a tenant.
|
|
37
|
+
*
|
|
38
|
+
* @deprecated Prefer {@link archiveTenant}; soft-deleting a tenant is archiving
|
|
39
|
+
* it. Retained as an alias so existing callers keep working.
|
|
40
|
+
*/
|
|
7
41
|
export declare function deleteTenant(pool: pg.Pool, id: string): Promise<void>;
|
|
8
42
|
export declare function moveTenant(pool: pg.Pool, id: string, newParentId: string): Promise<TenantNode>;
|
|
9
43
|
export interface BatchCreateResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-service.d.ts","sourceRoot":"","sources":["../../src/services/tenant-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"tenant-service.d.ts","sourceRoot":"","sources":["../../src/services/tenant-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createTenant = createTenant;
|
|
4
4
|
exports.getTenant = getTenant;
|
|
5
|
+
exports.getTenantBySlug = getTenantBySlug;
|
|
5
6
|
exports.listTenants = listTenants;
|
|
6
7
|
exports.updateTenant = updateTenant;
|
|
8
|
+
exports.suspendTenant = suspendTenant;
|
|
9
|
+
exports.archiveTenant = archiveTenant;
|
|
10
|
+
exports.resumeTenant = resumeTenant;
|
|
7
11
|
exports.deleteTenant = deleteTenant;
|
|
8
12
|
exports.moveTenant = moveTenant;
|
|
9
13
|
exports.batchCreateTenants = batchCreateTenants;
|
|
@@ -27,6 +31,11 @@ async function createTenant(pool, input) {
|
|
|
27
31
|
if (parentRes.rows[0].status === "archived") {
|
|
28
32
|
throw new core_1.TenantArchivedError(input.parent_id);
|
|
29
33
|
}
|
|
34
|
+
// A suspended or archived subtree must not grow: an active tenant always
|
|
35
|
+
// has an active parent. See suspendTenant/resumeTenant for the inverse.
|
|
36
|
+
if (parentRes.rows[0].status === "suspended") {
|
|
37
|
+
throw new core_1.TenantSuspendedError(input.parent_id);
|
|
38
|
+
}
|
|
30
39
|
const parent = parentRes.rows[0];
|
|
31
40
|
const ancestry_path = (0, core_1.appendToPath)(parent.ancestry_path, parent.id);
|
|
32
41
|
// Inherit region_id from parent if not explicitly provided
|
|
@@ -81,6 +90,40 @@ async function getTenant(pool, id, includeArchived = false) {
|
|
|
81
90
|
if (!includeArchived && tenant.status === "archived") {
|
|
82
91
|
throw new core_1.TenantArchivedError(id);
|
|
83
92
|
}
|
|
93
|
+
// Suspended tenants are blocked from normal access too. `includeArchived`
|
|
94
|
+
// is the "give me the row whatever its state" escape hatch and bypasses
|
|
95
|
+
// both non-active states.
|
|
96
|
+
if (!includeArchived && tenant.status === "suspended") {
|
|
97
|
+
throw new core_1.TenantSuspendedError(id);
|
|
98
|
+
}
|
|
99
|
+
return tenant;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Resolve a tenant by its globally-unique slug in a single indexed lookup
|
|
104
|
+
* (idx_tenant_slug), the slug-keyed counterpart to {@link getTenant}. Consumers
|
|
105
|
+
* that hold a slug can skip scanning the unindexed listTenants/listOrganizations
|
|
106
|
+
* pages. Slug is globally unique, so this returns exactly the one matching row.
|
|
107
|
+
*
|
|
108
|
+
* Mirrors getTenant's not-found and state contract: throws TenantNotFoundError
|
|
109
|
+
* when no row matches, and — unless `includeArchived` is set — TenantArchivedError
|
|
110
|
+
* / TenantSuspendedError for a non-active row. `includeArchived` is the "give me
|
|
111
|
+
* the row whatever its state" escape hatch and bypasses both non-active states.
|
|
112
|
+
*/
|
|
113
|
+
async function getTenantBySlug(pool, slug, includeArchived = false) {
|
|
114
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
115
|
+
// Single indexed lookup on the unique slug column; check state in app logic.
|
|
116
|
+
const res = await client.query(`SELECT * FROM tenants WHERE slug = $1`, [slug]);
|
|
117
|
+
if (res.rows.length === 0) {
|
|
118
|
+
throw new core_1.TenantNotFoundError(slug);
|
|
119
|
+
}
|
|
120
|
+
const tenant = res.rows[0];
|
|
121
|
+
if (!includeArchived && tenant.status === "archived") {
|
|
122
|
+
throw new core_1.TenantArchivedError(tenant.id);
|
|
123
|
+
}
|
|
124
|
+
if (!includeArchived && tenant.status === "suspended") {
|
|
125
|
+
throw new core_1.TenantSuspendedError(tenant.id);
|
|
126
|
+
}
|
|
84
127
|
return tenant;
|
|
85
128
|
});
|
|
86
129
|
}
|
|
@@ -148,20 +191,115 @@ async function updateTenant(pool, id, patch) {
|
|
|
148
191
|
throw err;
|
|
149
192
|
});
|
|
150
193
|
}
|
|
151
|
-
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
// Tenant lifecycle
|
|
196
|
+
//
|
|
197
|
+
// States: active -> {suspended, archived} -> (purged). Transitions:
|
|
198
|
+
// createTenant (none) -> active
|
|
199
|
+
// suspendTenant active -> suspended (reversible, blocks access)
|
|
200
|
+
// resumeTenant suspended | archived -> active (reverses suspend/archive)
|
|
201
|
+
// archiveTenant active | suspended -> archived (soft delete, reversible)
|
|
202
|
+
// purgeTenant any -> (row gone) (GDPR, irreversible;
|
|
203
|
+
// retention-service.ts)
|
|
204
|
+
//
|
|
205
|
+
// The state machine is strict: a transition from an unexpected state throws
|
|
206
|
+
// InvalidTenantStateError rather than silently no-op'ing.
|
|
207
|
+
//
|
|
208
|
+
// Descendant rules, tested against real Postgres in packages/integration-tests:
|
|
209
|
+
// * suspend / archive block when the tenant has an ACTIVE child
|
|
210
|
+
// (TenantHasChildrenError). They act leaf-first and never cascade.
|
|
211
|
+
// * resume / create require the parent to be ACTIVE, so the invariant "an
|
|
212
|
+
// active tenant's parent is active" always holds.
|
|
213
|
+
// * purge requires an empty subtree (no children of ANY status).
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
/**
|
|
216
|
+
* Load a tenant row of any status for a lifecycle transition, or throw
|
|
217
|
+
* TenantNotFoundError. Unlike updateTenant this does not filter out archived /
|
|
218
|
+
* suspended rows, because lifecycle operations act on exactly those states.
|
|
219
|
+
*/
|
|
220
|
+
async function loadForTransition(client, id) {
|
|
221
|
+
const res = await client.query(`SELECT * FROM tenants WHERE id = $1`, [id]);
|
|
222
|
+
if (res.rows.length === 0) {
|
|
223
|
+
throw new core_1.TenantNotFoundError(id);
|
|
224
|
+
}
|
|
225
|
+
return res.rows[0];
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Guard for downward transitions (suspend, archive): reject if the tenant has
|
|
229
|
+
* any ACTIVE direct child. Matches the existing TenantHasChildrenError contract
|
|
230
|
+
* and forces a leaf-first walk so no active tenant is ever left under a
|
|
231
|
+
* non-active parent.
|
|
232
|
+
*/
|
|
233
|
+
async function assertNoActiveChildren(client, id) {
|
|
234
|
+
const childrenRes = await client.query(`SELECT COUNT(*) as count FROM tenants WHERE parent_id = $1 AND status = 'active'`, [id]);
|
|
235
|
+
if (parseInt(childrenRes.rows[0].count, 10) > 0) {
|
|
236
|
+
throw new core_1.TenantHasChildrenError(id);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Suspend an active tenant: reversible block on access. Rejects if the tenant
|
|
241
|
+
* is not active, or if it has active children (suspend leaf-first).
|
|
242
|
+
*/
|
|
243
|
+
async function suspendTenant(pool, id) {
|
|
152
244
|
return (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
153
|
-
const
|
|
154
|
-
if (
|
|
155
|
-
throw new core_1.
|
|
245
|
+
const tenant = await loadForTransition(client, id);
|
|
246
|
+
if (tenant.status !== "active") {
|
|
247
|
+
throw new core_1.InvalidTenantStateError(id, tenant.status, "suspend", ["active"]);
|
|
156
248
|
}
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
249
|
+
await assertNoActiveChildren(client, id);
|
|
250
|
+
const res = await client.query(`UPDATE tenants SET status = 'suspended', updated_at = now() WHERE id = $1 RETURNING *`, [id]);
|
|
251
|
+
return res.rows[0];
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Archive a tenant: reversible soft delete. Accepts an active or suspended
|
|
256
|
+
* tenant. Rejects if already archived, or if it has active children.
|
|
257
|
+
*/
|
|
258
|
+
async function archiveTenant(pool, id) {
|
|
259
|
+
return (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
260
|
+
const tenant = await loadForTransition(client, id);
|
|
261
|
+
if (tenant.status !== "active" && tenant.status !== "suspended") {
|
|
262
|
+
throw new core_1.InvalidTenantStateError(id, tenant.status, "archive", ["active", "suspended"]);
|
|
161
263
|
}
|
|
162
|
-
await client
|
|
264
|
+
await assertNoActiveChildren(client, id);
|
|
265
|
+
const res = await client.query(`UPDATE tenants SET status = 'archived', deleted_at = now(), updated_at = now() WHERE id = $1 RETURNING *`, [id]);
|
|
266
|
+
return res.rows[0];
|
|
163
267
|
});
|
|
164
268
|
}
|
|
269
|
+
/**
|
|
270
|
+
* Resume a suspended or archived tenant back to active, reversing suspend and
|
|
271
|
+
* archive (clearing deleted_at). Rejects if the tenant is already active, or if
|
|
272
|
+
* its parent is not active. Resuming is top-down.
|
|
273
|
+
*/
|
|
274
|
+
async function resumeTenant(pool, id) {
|
|
275
|
+
return (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
276
|
+
const tenant = await loadForTransition(client, id);
|
|
277
|
+
if (tenant.status !== "suspended" && tenant.status !== "archived") {
|
|
278
|
+
throw new core_1.InvalidTenantStateError(id, tenant.status, "resume", ["suspended", "archived"]);
|
|
279
|
+
}
|
|
280
|
+
if (tenant.parent_id) {
|
|
281
|
+
const parentRes = await client.query(`SELECT status FROM tenants WHERE id = $1`, [tenant.parent_id]);
|
|
282
|
+
const parentStatus = parentRes.rows[0]?.status;
|
|
283
|
+
if (parentStatus === "archived") {
|
|
284
|
+
throw new core_1.TenantArchivedError(tenant.parent_id);
|
|
285
|
+
}
|
|
286
|
+
if (parentStatus === "suspended") {
|
|
287
|
+
throw new core_1.TenantSuspendedError(tenant.parent_id);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const res = await client.query(`UPDATE tenants SET status = 'active', deleted_at = NULL, updated_at = now() WHERE id = $1 RETURNING *`, [id]);
|
|
291
|
+
return res.rows[0];
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Soft-delete a tenant.
|
|
296
|
+
*
|
|
297
|
+
* @deprecated Prefer {@link archiveTenant}; soft-deleting a tenant is archiving
|
|
298
|
+
* it. Retained as an alias so existing callers keep working.
|
|
299
|
+
*/
|
|
300
|
+
async function deleteTenant(pool, id) {
|
|
301
|
+
await archiveTenant(pool, id);
|
|
302
|
+
}
|
|
165
303
|
async function moveTenant(pool, id, newParentId) {
|
|
166
304
|
return (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
167
305
|
// Lock both old and new parents to prevent concurrent moves
|
|
@@ -377,11 +515,14 @@ async function getDescendants(pool, id, includeArchived = false) {
|
|
|
377
515
|
if (existsRes.rows.length === 0) {
|
|
378
516
|
throw new core_1.TenantNotFoundError(id);
|
|
379
517
|
}
|
|
380
|
-
//
|
|
381
|
-
//
|
|
518
|
+
// Match descendants by the stable, ID-based ancestry_path (this tenant's id
|
|
519
|
+
// appears as a path segment of every descendant) so the subtree query reaches
|
|
520
|
+
// all current descendants regardless of any slug rename. ancestry_ltree is
|
|
521
|
+
// derived from slugs and must not scope this isolation boundary. Filter to
|
|
522
|
+
// active rows unless the caller opts into the full subtree.
|
|
382
523
|
const res = await client.query(`SELECT * FROM tenants
|
|
383
|
-
WHERE
|
|
384
|
-
AND
|
|
524
|
+
WHERE id != $1
|
|
525
|
+
AND (ancestry_path LIKE '%/' || $1 || '/%' OR ancestry_path LIKE '%/' || $1)${includeArchived ? "" : "\n AND status = 'active'"}
|
|
385
526
|
ORDER BY depth ASC`, [id]);
|
|
386
527
|
return res.rows;
|
|
387
528
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-service.js","sourceRoot":"","sources":["../../src/services/tenant-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tenant-service.js","sourceRoot":"","sources":["../../src/services/tenant-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
import { type RecordUsageInput, type UsageEvent, type UsageAggregate, type UsageAggregateQuery } from "@stratum-hq/core";
|
|
3
|
+
/**
|
|
4
|
+
* Record a usage event for a tenant. Returns the stored event.
|
|
5
|
+
*
|
|
6
|
+
* When `idempotency_key` is set, a second call with the same key for the same
|
|
7
|
+
* (tenant, metric) is a no-op and returns the already-stored event unchanged,
|
|
8
|
+
* so at-least-once producers cannot double count.
|
|
9
|
+
*/
|
|
10
|
+
export declare function recordUsage(pool: pg.Pool, tenantId: string, input: RecordUsageInput): Promise<UsageEvent>;
|
|
11
|
+
/**
|
|
12
|
+
* Aggregate a tenant's usage per metric over an optional half-open window
|
|
13
|
+
* [from, to) on occurred_at. Always scoped to one tenant, so tenant A's totals
|
|
14
|
+
* never include tenant B's events. Metrics with no matching events are absent
|
|
15
|
+
* from the result.
|
|
16
|
+
*/
|
|
17
|
+
export declare function aggregateUsage(pool: pg.Pool, query: UsageAggregateQuery): Promise<UsageAggregate[]>;
|
|
18
|
+
//# sourceMappingURL=usage-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-service.d.ts","sourceRoot":"","sources":["../../src/services/usage-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAwB1B;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,cAAc,EAAE,CAAC,CAiC3B"}
|