@oktis-works/core 0.6.1 → 0.8.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/cache/tags.d.ts +12 -0
- package/dist/cache/tags.d.ts.map +1 -0
- package/dist/cache/tags.js +55 -0
- package/dist/cache/tags.js.map +1 -0
- package/dist/comments/service.d.ts +54 -0
- package/dist/comments/service.d.ts.map +1 -0
- package/dist/comments/service.js +166 -0
- package/dist/comments/service.js.map +1 -0
- package/dist/content/service.d.ts.map +1 -1
- package/dist/content/service.js +24 -14
- package/dist/content/service.js.map +1 -1
- package/dist/fields/location-rules.d.ts +3 -1
- package/dist/fields/location-rules.d.ts.map +1 -1
- package/dist/fields/location-rules.js +1 -0
- package/dist/fields/location-rules.js.map +1 -1
- package/dist/fields/service.d.ts +5 -1
- package/dist/fields/service.d.ts.map +1 -1
- package/dist/fields/service.js +10 -3
- package/dist/fields/service.js.map +1 -1
- package/dist/fields/types/registry.d.ts +2 -0
- package/dist/fields/types/registry.d.ts.map +1 -1
- package/dist/fields/types/registry.js.map +1 -1
- package/dist/hooks/points.d.ts +6 -0
- package/dist/hooks/points.d.ts.map +1 -1
- package/dist/hooks/points.js +7 -0
- package/dist/hooks/points.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/mail/service.d.ts +26 -0
- package/dist/mail/service.d.ts.map +1 -0
- package/dist/mail/service.js +117 -0
- package/dist/mail/service.js.map +1 -0
- package/dist/plugin/load.d.ts +78 -10
- package/dist/plugin/load.d.ts.map +1 -1
- package/dist/plugin/load.js +277 -58
- package/dist/plugin/load.js.map +1 -1
- package/dist/queue/producer.d.ts +12 -1
- package/dist/queue/producer.d.ts.map +1 -1
- package/dist/queue/producer.js +92 -0
- package/dist/queue/producer.js.map +1 -1
- package/dist/role/plugin-roles.d.ts +39 -0
- package/dist/role/plugin-roles.d.ts.map +1 -0
- package/dist/role/plugin-roles.js +161 -0
- package/dist/role/plugin-roles.js.map +1 -0
- package/dist/theme/service.d.ts +5 -0
- package/dist/theme/service.d.ts.map +1 -1
- package/dist/theme/service.js +10 -0
- package/dist/theme/service.js.map +1 -1
- package/dist/webhooks/service.d.ts +33 -0
- package/dist/webhooks/service.d.ts.map +1 -0
- package/dist/webhooks/service.js +57 -0
- package/dist/webhooks/service.js.map +1 -0
- package/package.json +6 -6
package/dist/queue/producer.js
CHANGED
|
@@ -17,6 +17,8 @@ const QUEUE_BY_JOB_TYPE = {
|
|
|
17
17
|
'cache.invalidate': 'system',
|
|
18
18
|
'cleanup.expired_sessions': 'system',
|
|
19
19
|
'cleanup.expired_audit_logs': 'system',
|
|
20
|
+
'plugin.job': 'plugins',
|
|
21
|
+
'mail.deliver': 'mails',
|
|
20
22
|
};
|
|
21
23
|
function buildRedisUrl(redis) {
|
|
22
24
|
const auth = redis.password ? `:${redis.password}@` : '';
|
|
@@ -109,6 +111,96 @@ export class QueueProducer {
|
|
|
109
111
|
return false;
|
|
110
112
|
}
|
|
111
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Agenda/recalcula um job recorrente (fila `plugins` / plugin.job).
|
|
116
|
+
* Idempotente: remove repeatables pré-existentes do mesmo `jobId` antes de
|
|
117
|
+
* re-adicionar (spec pode ter mudado de `every` para `cron`). Nunca lança.
|
|
118
|
+
*/
|
|
119
|
+
async scheduleRepeatable(jobType, jobId, payload, spec, options = {}) {
|
|
120
|
+
const queueName = QUEUE_BY_JOB_TYPE[jobType];
|
|
121
|
+
if (!queueName)
|
|
122
|
+
return false;
|
|
123
|
+
const connection = this.ensureConnection();
|
|
124
|
+
if (!connection)
|
|
125
|
+
return false;
|
|
126
|
+
try {
|
|
127
|
+
if (connection.status === 'wait' || connection.status === 'end') {
|
|
128
|
+
await connection.connect().catch(() => {
|
|
129
|
+
throw new Error('redis connect failed');
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const queue = this.getQueue(queueName);
|
|
133
|
+
// Validação do spec (narrowing para RepeatOptions do BullMQ 5: `pattern`
|
|
134
|
+
// é o campo do cron — `cron` não existe mais nessa versão)
|
|
135
|
+
let repeat;
|
|
136
|
+
if (typeof spec.cron === 'string' && spec.cron.trim().length > 0) {
|
|
137
|
+
repeat = { pattern: spec.cron };
|
|
138
|
+
}
|
|
139
|
+
else if (typeof spec.every === 'number' && spec.every > 0) {
|
|
140
|
+
repeat = { every: spec.every };
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
// Idempotência: zera agendas anteriores deste jobId (spec pode mudar)
|
|
146
|
+
const existing = await queue.getRepeatableJobs();
|
|
147
|
+
for (const repeatable of existing) {
|
|
148
|
+
if (repeatable.name === jobType && (repeatable.id === jobId || repeatable.key.includes(jobId))) {
|
|
149
|
+
await queue.removeRepeatableByKey(repeatable.key).catch(() => undefined);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const envelope = {
|
|
153
|
+
payload,
|
|
154
|
+
tenantId: options.tenantId ?? 'default',
|
|
155
|
+
userId: options.userId,
|
|
156
|
+
};
|
|
157
|
+
await queue.add(jobType, envelope, {
|
|
158
|
+
jobId,
|
|
159
|
+
repeat,
|
|
160
|
+
attempts: 3,
|
|
161
|
+
backoff: { type: 'exponential', delay: 1_000 },
|
|
162
|
+
removeOnComplete: true,
|
|
163
|
+
removeOnFail: false,
|
|
164
|
+
});
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
this.warnDegraded(`${jobType}(schedule)`, error);
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Cancela agendas recorrentes do `jobId`. Nunca lança. */
|
|
173
|
+
async cancelRepeatable(jobType, jobId) {
|
|
174
|
+
const queueName = QUEUE_BY_JOB_TYPE[jobType];
|
|
175
|
+
if (!queueName)
|
|
176
|
+
return false;
|
|
177
|
+
const connection = this.ensureConnection();
|
|
178
|
+
if (!connection)
|
|
179
|
+
return false;
|
|
180
|
+
try {
|
|
181
|
+
if (connection.status === 'wait' || connection.status === 'end') {
|
|
182
|
+
await connection.connect().catch(() => {
|
|
183
|
+
throw new Error('redis connect failed');
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
const queue = this.getQueue(queueName);
|
|
187
|
+
const existing = await queue.getRepeatableJobs();
|
|
188
|
+
let removed = false;
|
|
189
|
+
for (const repeatable of existing) {
|
|
190
|
+
if (repeatable.name === jobType && (repeatable.id === jobId || repeatable.key.includes(jobId))) {
|
|
191
|
+
await queue.removeRepeatableByKey(repeatable.key).catch(() => undefined);
|
|
192
|
+
removed = true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Limpa também uma instância pendente avulsa com o mesmo jobId
|
|
196
|
+
await queue.remove(jobId).catch(() => undefined);
|
|
197
|
+
return removed;
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
this.warnDegraded(`${jobType}(cancel)`, error);
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
112
204
|
/** Log espaçado (1x/30s): degradação visível sem poluir o log. */
|
|
113
205
|
warnDegraded(jobType, error) {
|
|
114
206
|
const now = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"producer.js","sourceRoot":"","sources":["../../src/queue/producer.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,mEAAmE;AACnE,4EAA4E;AAC5E,4DAA4D;AAE5D,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAoB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"producer.js","sourceRoot":"","sources":["../../src/queue/producer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Role } from '@oktis-works/types';
|
|
2
|
+
/** Role slugs a plugin can never create or modify (built-ins). */
|
|
3
|
+
export declare const RESERVED_ROLE_SLUGS: Set<string>;
|
|
4
|
+
/** Normalizes a role name into a URL-safe slug (kebab-case). */
|
|
5
|
+
export declare function roleSlugFromName(name: string): string;
|
|
6
|
+
/** Parses `action:resource`; rejects wildcards and platform-only operations. */
|
|
7
|
+
export declare function parseRolePermission(permission: string): {
|
|
8
|
+
action: string;
|
|
9
|
+
resource: string;
|
|
10
|
+
};
|
|
11
|
+
export declare class PluginRolesService {
|
|
12
|
+
/** Creates a tenant role owned by the plugin flow (audited). */
|
|
13
|
+
add(input: {
|
|
14
|
+
tenantId: string;
|
|
15
|
+
pluginName: string;
|
|
16
|
+
name: string;
|
|
17
|
+
slug?: string;
|
|
18
|
+
permissions?: string[];
|
|
19
|
+
}): Promise<Role>;
|
|
20
|
+
/** Removes a non-system tenant role by slug (audited). */
|
|
21
|
+
remove(input: {
|
|
22
|
+
tenantId: string;
|
|
23
|
+
pluginName: string;
|
|
24
|
+
slug: string;
|
|
25
|
+
}): Promise<boolean>;
|
|
26
|
+
/** Grants one extra permission to a non-system tenant role (audited). */
|
|
27
|
+
addPermission(input: {
|
|
28
|
+
tenantId: string;
|
|
29
|
+
pluginName: string;
|
|
30
|
+
slug: string;
|
|
31
|
+
permission: string;
|
|
32
|
+
}): Promise<boolean>;
|
|
33
|
+
/** Tenant roles (own tenant) + platform roles — a plugin never collides with either. */
|
|
34
|
+
private findBySlug;
|
|
35
|
+
/** Append-only audit entry; failure is logged, never blocks the operation. */
|
|
36
|
+
private audit;
|
|
37
|
+
}
|
|
38
|
+
export declare const pluginRolesService: PluginRolesService;
|
|
39
|
+
//# sourceMappingURL=plugin-roles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-roles.d.ts","sourceRoot":"","sources":["../../src/role/plugin-roles.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAI/C,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,aAQ9B,CAAC;AAKH,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASrD;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAgB5F;AASD,qBAAa,kBAAkB;IAC7B,gEAAgE;IAC1D,GAAG,CAAC,KAAK,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCjB,0DAA0D;IACpD,MAAM,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB7F,yEAAyE;IACnE,aAAa,CAAC,KAAK,EAAE;QACzB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBpB,wFAAwF;YAC1E,UAAU;IAMxB,8EAA8E;YAChE,KAAK;CAmBpB;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// @oktis-works/core - Plugin roles service (Item 6 do plugin-parity-plan)
|
|
2
|
+
//
|
|
3
|
+
// WordPress-parity item 6: `api.roles.add/remove/addPermission` for plugins.
|
|
4
|
+
// Every operation is tenant-scoped and audited; anti-escalation is BLOCKING:
|
|
5
|
+
// - reserved/system role slugs can never be created or modified;
|
|
6
|
+
// - wildcard permissions ('*') are rejected;
|
|
7
|
+
// - platform-only operations (create/update/delete plugin) are rejected —
|
|
8
|
+
// the TENANT_ADMIN ceiling (they are denied even to TENANT_ADMIN).
|
|
9
|
+
// Permissions are stored as `action:resource` strings (matching the
|
|
10
|
+
// requirePermission(action, resource) middleware vocabulary).
|
|
11
|
+
import { roleService } from './service.js';
|
|
12
|
+
import { auditService } from '../observability/audit.js';
|
|
13
|
+
/** Role slugs a plugin can never create or modify (built-ins). */
|
|
14
|
+
export const RESERVED_ROLE_SLUGS = new Set([
|
|
15
|
+
'super-admin',
|
|
16
|
+
'tenant-admin',
|
|
17
|
+
'admin',
|
|
18
|
+
'editor',
|
|
19
|
+
'author',
|
|
20
|
+
'viewer',
|
|
21
|
+
'subscriber',
|
|
22
|
+
]);
|
|
23
|
+
/** Operations a tenant role may never receive (platform-level ceiling). */
|
|
24
|
+
const PLATFORM_ONLY_PERMISSIONS = new Set(['create:plugin', 'update:plugin', 'delete:plugin']);
|
|
25
|
+
/** Normalizes a role name into a URL-safe slug (kebab-case). */
|
|
26
|
+
export function roleSlugFromName(name) {
|
|
27
|
+
return (name
|
|
28
|
+
.toLowerCase()
|
|
29
|
+
.normalize('NFD')
|
|
30
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
31
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
32
|
+
.replace(/^-+|-+$/g, '') || 'role');
|
|
33
|
+
}
|
|
34
|
+
/** Parses `action:resource`; rejects wildcards and platform-only operations. */
|
|
35
|
+
export function parseRolePermission(permission) {
|
|
36
|
+
if (typeof permission !== 'string') {
|
|
37
|
+
throw new Error(`Permission must be an "action:resource" string, received ${typeof permission}`);
|
|
38
|
+
}
|
|
39
|
+
const parts = permission.split(':').map((part) => part.trim());
|
|
40
|
+
if (parts.length !== 2 || !parts[0] || !parts[1]) {
|
|
41
|
+
throw new Error(`Invalid permission "${permission}" (expected "action:resource")`);
|
|
42
|
+
}
|
|
43
|
+
const [action, resource] = parts;
|
|
44
|
+
if (action === '*' || resource === '*') {
|
|
45
|
+
throw new Error(`Wildcard permission "${permission}" is not allowed for plugin roles (anti-escalation)`);
|
|
46
|
+
}
|
|
47
|
+
if (PLATFORM_ONLY_PERMISSIONS.has(`${action}:${resource}`)) {
|
|
48
|
+
throw new Error(`Permission "${permission}" is platform-only and cannot be granted by plugins (anti-escalation)`);
|
|
49
|
+
}
|
|
50
|
+
return { action, resource };
|
|
51
|
+
}
|
|
52
|
+
/** Reads snake_case or camelCase keys off raw DB rows (roleService returns rows as-is). */
|
|
53
|
+
function roleFlag(row, camel) {
|
|
54
|
+
const record = row;
|
|
55
|
+
if (camel === 'isSystem')
|
|
56
|
+
return record['isSystem'] ?? record['is_system'] ?? false;
|
|
57
|
+
return record['tenantId'] ?? record['tenant_id'];
|
|
58
|
+
}
|
|
59
|
+
export class PluginRolesService {
|
|
60
|
+
/** Creates a tenant role owned by the plugin flow (audited). */
|
|
61
|
+
async add(input) {
|
|
62
|
+
const name = input.name.trim();
|
|
63
|
+
const slug = (input.slug?.trim() || roleSlugFromName(name)).toLowerCase();
|
|
64
|
+
if (RESERVED_ROLE_SLUGS.has(slug)) {
|
|
65
|
+
throw new Error(`Role slug "${slug}" is reserved (anti-escalation)`);
|
|
66
|
+
}
|
|
67
|
+
const permissions = [];
|
|
68
|
+
for (const permission of input.permissions ?? []) {
|
|
69
|
+
const parsed = parseRolePermission(permission);
|
|
70
|
+
const serialized = `${parsed.action}:${parsed.resource}`;
|
|
71
|
+
if (!permissions.includes(serialized))
|
|
72
|
+
permissions.push(serialized);
|
|
73
|
+
}
|
|
74
|
+
const existing = await this.findBySlug(input.tenantId, slug);
|
|
75
|
+
if (existing) {
|
|
76
|
+
throw new Error(`Role slug "${slug}" already exists in this tenant`);
|
|
77
|
+
}
|
|
78
|
+
const role = await roleService.create({
|
|
79
|
+
tenantId: input.tenantId,
|
|
80
|
+
name,
|
|
81
|
+
slug,
|
|
82
|
+
permissions,
|
|
83
|
+
});
|
|
84
|
+
if (!role || typeof role !== 'object') {
|
|
85
|
+
throw new Error('Role creation failed (database returned no row)');
|
|
86
|
+
}
|
|
87
|
+
await this.audit(input.tenantId, 'plugin.role.create', 'role', role.id ?? undefined, {
|
|
88
|
+
plugin: input.pluginName,
|
|
89
|
+
name,
|
|
90
|
+
slug,
|
|
91
|
+
permissions,
|
|
92
|
+
});
|
|
93
|
+
return role;
|
|
94
|
+
}
|
|
95
|
+
/** Removes a non-system tenant role by slug (audited). */
|
|
96
|
+
async remove(input) {
|
|
97
|
+
if (RESERVED_ROLE_SLUGS.has(input.slug.toLowerCase())) {
|
|
98
|
+
throw new Error(`Role slug "${input.slug}" is reserved (anti-escalation)`);
|
|
99
|
+
}
|
|
100
|
+
const role = await this.findBySlug(input.tenantId, input.slug);
|
|
101
|
+
if (!role)
|
|
102
|
+
return false;
|
|
103
|
+
if (roleFlag(role, 'isSystem')) {
|
|
104
|
+
throw new Error(`Role "${input.slug}" is a system role and cannot be removed by plugins`);
|
|
105
|
+
}
|
|
106
|
+
const removed = await roleService.delete(role.id);
|
|
107
|
+
if (removed) {
|
|
108
|
+
await this.audit(input.tenantId, 'plugin.role.delete', 'role', role.id ?? undefined, {
|
|
109
|
+
plugin: input.pluginName,
|
|
110
|
+
slug: input.slug,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return removed;
|
|
114
|
+
}
|
|
115
|
+
/** Grants one extra permission to a non-system tenant role (audited). */
|
|
116
|
+
async addPermission(input) {
|
|
117
|
+
const parsed = parseRolePermission(input.permission);
|
|
118
|
+
const serialized = `${parsed.action}:${parsed.resource}`;
|
|
119
|
+
const role = await this.findBySlug(input.tenantId, input.slug);
|
|
120
|
+
if (!role)
|
|
121
|
+
return false;
|
|
122
|
+
if (roleFlag(role, 'isSystem')) {
|
|
123
|
+
throw new Error(`Role "${input.slug}" is a system role and cannot be modified by plugins`);
|
|
124
|
+
}
|
|
125
|
+
const current = Array.isArray(role.permissions) ? role.permissions.map(String) : [];
|
|
126
|
+
if (current.includes(serialized))
|
|
127
|
+
return true;
|
|
128
|
+
const updated = await roleService.update(role.id, { permissions: [...current, serialized] });
|
|
129
|
+
if (!updated)
|
|
130
|
+
return false;
|
|
131
|
+
await this.audit(input.tenantId, 'plugin.role.add-permission', 'role', role.id ?? undefined, {
|
|
132
|
+
plugin: input.pluginName,
|
|
133
|
+
slug: input.slug,
|
|
134
|
+
permission: serialized,
|
|
135
|
+
});
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
/** Tenant roles (own tenant) + platform roles — a plugin never collides with either. */
|
|
139
|
+
async findBySlug(tenantId, slug) {
|
|
140
|
+
const roles = await roleService.list(tenantId);
|
|
141
|
+
const wanted = slug.toLowerCase();
|
|
142
|
+
return roles.find((role) => role.slug.toLowerCase() === wanted) ?? null;
|
|
143
|
+
}
|
|
144
|
+
/** Append-only audit entry; failure is logged, never blocks the operation. */
|
|
145
|
+
async audit(tenantId, action, resourceType, resourceId, changes) {
|
|
146
|
+
try {
|
|
147
|
+
await auditService.record({
|
|
148
|
+
tenantId,
|
|
149
|
+
action,
|
|
150
|
+
resourceType,
|
|
151
|
+
resourceId,
|
|
152
|
+
changes,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// auditService.record already swallows + logs DB failures
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
export const pluginRolesService = new PluginRolesService();
|
|
161
|
+
//# sourceMappingURL=plugin-roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-roles.js","sourceRoot":"","sources":["../../src/role/plugin-roles.ts"],"names":[],"mappings":"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"}
|
package/dist/theme/service.d.ts
CHANGED
|
@@ -28,6 +28,11 @@ export declare class ThemeService {
|
|
|
28
28
|
* tenant, garantida também pelo índice parcial idx_themes_single_active).
|
|
29
29
|
*/
|
|
30
30
|
activate(id: string): Promise<Theme | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Deactivates a theme. Invariant: the site must always keep an active
|
|
33
|
+
* theme — deactivation is refused while it is the only registered theme;
|
|
34
|
+
* with multiple themes the admin re-activates one of the others.
|
|
35
|
+
*/
|
|
31
36
|
deactivate(id: string): Promise<Theme | null>;
|
|
32
37
|
/** Tema ativo atual (fonte única lida pelo app web na renderização). */
|
|
33
38
|
getActive(): Promise<Theme | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/theme/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAUhD,qBAAa,YAAY;IACvB;;;;;;OAMG;IACG,iBAAiB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAwC3C,4DAA4D;YAC9C,YAAY;IAWpB,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAMxB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAM1C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMpD;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,KAAK,CAAC;IAqClB;;;OAGG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/theme/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAUhD,qBAAa,YAAY;IACvB;;;;;;OAMG;IACG,iBAAiB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAwC3C,4DAA4D;YAC9C,YAAY;IAWpB,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAMxB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAM1C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMpD;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,KAAK,CAAC;IAqClB;;;OAGG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAsBjD;;;;OAIG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAqBnD,wEAAwE;IAClE,SAAS,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAUxC,+EAA+E;IACzE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAiBhE,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS9C;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
package/dist/theme/service.js
CHANGED
|
@@ -125,11 +125,21 @@ export class ThemeService {
|
|
|
125
125
|
RETURNING *`, [id]);
|
|
126
126
|
return result[0] ?? null;
|
|
127
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Deactivates a theme. Invariant: the site must always keep an active
|
|
130
|
+
* theme — deactivation is refused while it is the only registered theme;
|
|
131
|
+
* with multiple themes the admin re-activates one of the others.
|
|
132
|
+
*/
|
|
128
133
|
async deactivate(id) {
|
|
129
134
|
const existing = await this.getById(id);
|
|
130
135
|
if (!existing)
|
|
131
136
|
return null;
|
|
132
137
|
const sql = getConnection();
|
|
138
|
+
const countResult = await sql.unsafe('SELECT COUNT(*)::int AS count FROM themes');
|
|
139
|
+
const total = Number(countResult[0]?.count ?? 0);
|
|
140
|
+
if (total <= 1) {
|
|
141
|
+
throw new Error('Cannot deactivate the only available theme — at least one active theme is required');
|
|
142
|
+
}
|
|
133
143
|
const result = await sql.unsafe(`UPDATE themes
|
|
134
144
|
SET status = 'INACTIVE', updated_at = NOW()
|
|
135
145
|
WHERE id = $1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/theme/service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/theme/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface WebhookSecretVersion {
|
|
2
|
+
id: string;
|
|
3
|
+
webhookId: string;
|
|
4
|
+
version: number;
|
|
5
|
+
isActive: boolean;
|
|
6
|
+
rotatedAt: Date | null;
|
|
7
|
+
createdAt: Date;
|
|
8
|
+
/** Only present right after rotation (never listed). */
|
|
9
|
+
secret?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class WebhookSecretService {
|
|
12
|
+
/**
|
|
13
|
+
* Rotates the signing secret: creates version N+1 as the only active one
|
|
14
|
+
* and stamps the previous version with rotated_at (24h grace for
|
|
15
|
+
* consumers). Returns the new secret ONCE — it is never listed again.
|
|
16
|
+
*/
|
|
17
|
+
rotate(webhookId: string): Promise<WebhookSecretVersion | null>;
|
|
18
|
+
/** Versioned history WITHOUT the secret values (safe to list). */
|
|
19
|
+
listVersions(webhookId: string): Promise<Array<Omit<WebhookSecretVersion, 'secret'>>>;
|
|
20
|
+
/** Newest active secret for signing (worker-side; legacy fallback). */
|
|
21
|
+
getActiveSecret(webhookId: string): Promise<{
|
|
22
|
+
secret: string;
|
|
23
|
+
version: number;
|
|
24
|
+
} | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Records a delivery that exhausted its retries into the dead-letter
|
|
27
|
+
* table — one row per failed delivery job (BullMQ already applied the
|
|
28
|
+
* exponential backoff before the handler gives up).
|
|
29
|
+
*/
|
|
30
|
+
recordDeadLetter(webhookId: string, event: string, payload: unknown, error: string): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export declare const webhookSecretService: WebhookSecretService;
|
|
33
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/webhooks/service.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,oBAAoB;IAC/B;;;;OAIG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IA4BrE,kEAAkE;IAC5D,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAU3F,uEAAuE;IACjE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAW7F;;;;OAIG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQzG;AAED,eAAO,MAAM,oBAAoB,sBAA6B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// @oktis-works/core - Webhook secret rotation (Item 19 do plugin-parity-plan)
|
|
2
|
+
//
|
|
3
|
+
// Versioned secrets for webhook signing: `rotate` creates the next version,
|
|
4
|
+
// deactivates the previous one (keeping it recorded with rotated_at so
|
|
5
|
+
// consumers have a 24h grace window to swap the key) and returns the new
|
|
6
|
+
// secret exactly once. Signing itself happens in the worker, which picks the
|
|
7
|
+
// newest active version and stamps X-Webhook-Secret-Version.
|
|
8
|
+
import { randomUUID, randomBytes } from 'node:crypto';
|
|
9
|
+
import { getConnection } from '@oktis-works/database';
|
|
10
|
+
export class WebhookSecretService {
|
|
11
|
+
/**
|
|
12
|
+
* Rotates the signing secret: creates version N+1 as the only active one
|
|
13
|
+
* and stamps the previous version with rotated_at (24h grace for
|
|
14
|
+
* consumers). Returns the new secret ONCE — it is never listed again.
|
|
15
|
+
*/
|
|
16
|
+
async rotate(webhookId) {
|
|
17
|
+
const sql = getConnection();
|
|
18
|
+
const webhook = await sql.unsafe('SELECT id FROM webhooks WHERE id = $1', [webhookId]);
|
|
19
|
+
if (webhook.length === 0)
|
|
20
|
+
return null;
|
|
21
|
+
const versionRows = await sql.unsafe('SELECT COALESCE(MAX(version), 0)::int AS max_version FROM webhook_secrets WHERE webhook_id = $1', [webhookId]);
|
|
22
|
+
const nextVersion = Number(versionRows[0]?.max_version ?? 0) + 1;
|
|
23
|
+
// Deactivate previous versions (kept for the 24h grace window).
|
|
24
|
+
await sql.unsafe('UPDATE webhook_secrets SET is_active = false, rotated_at = NOW() WHERE webhook_id = $1 AND is_active = true', [webhookId]);
|
|
25
|
+
const secret = randomBytes(32).toString('hex');
|
|
26
|
+
const id = randomUUID();
|
|
27
|
+
await sql.unsafe('INSERT INTO webhook_secrets (id, webhook_id, secret, version, is_active) VALUES ($1, $2, $3, $4, true)', [id, webhookId, secret, nextVersion]);
|
|
28
|
+
return { id, webhookId, version: nextVersion, isActive: true, rotatedAt: null, createdAt: new Date(), secret };
|
|
29
|
+
}
|
|
30
|
+
/** Versioned history WITHOUT the secret values (safe to list). */
|
|
31
|
+
async listVersions(webhookId) {
|
|
32
|
+
const sql = getConnection();
|
|
33
|
+
const rows = await sql.unsafe(`SELECT id, webhook_id, version, is_active, rotated_at, created_at
|
|
34
|
+
FROM webhook_secrets WHERE webhook_id = $1 ORDER BY version DESC`, [webhookId]);
|
|
35
|
+
return rows;
|
|
36
|
+
}
|
|
37
|
+
/** Newest active secret for signing (worker-side; legacy fallback). */
|
|
38
|
+
async getActiveSecret(webhookId) {
|
|
39
|
+
const sql = getConnection();
|
|
40
|
+
const rows = await sql.unsafe(`SELECT secret, version FROM webhook_secrets
|
|
41
|
+
WHERE webhook_id = $1 AND is_active = true ORDER BY version DESC LIMIT 1`, [webhookId]);
|
|
42
|
+
const row = rows[0];
|
|
43
|
+
return row ? { secret: row.secret, version: row.version } : null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Records a delivery that exhausted its retries into the dead-letter
|
|
47
|
+
* table — one row per failed delivery job (BullMQ already applied the
|
|
48
|
+
* exponential backoff before the handler gives up).
|
|
49
|
+
*/
|
|
50
|
+
async recordDeadLetter(webhookId, event, payload, error) {
|
|
51
|
+
const sql = getConnection();
|
|
52
|
+
await sql.unsafe(`INSERT INTO webhook_dead_letters (webhook_id, event, payload, error, attempts)
|
|
53
|
+
VALUES ($1, $2, $3::jsonb, $4, 1)`, [webhookId, event, JSON.stringify(payload ?? {}), error]);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export const webhookSecretService = new WebhookSecretService();
|
|
57
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/webhooks/service.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,uEAAuE;AACvE,yEAAyE;AACzE,6EAA6E;AAC7E,6DAA6D;AAE7D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAatD,MAAM,OAAO,oBAAoB;IAC/B;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAE5B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,uCAAuC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACvF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,MAAM,CAClC,iGAAiG,EACjG,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,CAAE,WAAW,CAAC,CAAC,CAA0C,EAAE,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAE3G,gEAAgE;QAChE,MAAM,GAAG,CAAC,MAAM,CACd,6GAA6G,EAC7G,CAAC,SAAS,CAAC,CACZ,CAAC;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,MAAM,CACd,wGAAwG,EACxG,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CACrC,CAAC;QAEF,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;IACjH,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,YAAY,CAAC,SAAiB;QAClC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAC3B;wEACkE,EAClE,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,OAAO,IAA8D,CAAC;IACxE,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAC3B;gFAC0E,EAC1E,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAA+D,CAAC;QAClF,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,SAAiB,EAAE,KAAa,EAAE,OAAgB,EAAE,KAAa;QACtF,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAC,MAAM,CACd;yCACmC,EACnC,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CACzD,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oktis-works/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@oktis-works/types": "^0.
|
|
25
|
-
"@oktis-works/validation": "^0.
|
|
26
|
-
"@oktis-works/config": "^0.6.
|
|
27
|
-
"@oktis-works/database": "^0.
|
|
28
|
-
"@oktis-works/plugin-runtime": "^0.
|
|
24
|
+
"@oktis-works/types": "^0.9.0",
|
|
25
|
+
"@oktis-works/validation": "^0.7.0",
|
|
26
|
+
"@oktis-works/config": "^0.6.4",
|
|
27
|
+
"@oktis-works/database": "^0.8.0",
|
|
28
|
+
"@oktis-works/plugin-runtime": "^0.7.0",
|
|
29
29
|
"@aws-sdk/client-s3": "3.700.0",
|
|
30
30
|
"bullmq": "5.0.0",
|
|
31
31
|
"ioredis": "5.3.0",
|