@oktis-works/core 0.1.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/bootstrap/index.d.ts +7 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +16 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/build/service.d.ts +28 -0
- package/dist/build/service.d.ts.map +1 -0
- package/dist/build/service.js +71 -0
- package/dist/build/service.js.map +1 -0
- package/dist/cache/index.d.ts +31 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +110 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/category/service.d.ts +21 -0
- package/dist/category/service.d.ts.map +1 -0
- package/dist/category/service.js +67 -0
- package/dist/category/service.js.map +1 -0
- package/dist/content/field-resolver.d.ts +31 -0
- package/dist/content/field-resolver.d.ts.map +1 -0
- package/dist/content/field-resolver.js +40 -0
- package/dist/content/field-resolver.js.map +1 -0
- package/dist/content/post-types.d.ts +28 -0
- package/dist/content/post-types.d.ts.map +1 -0
- package/dist/content/post-types.js +127 -0
- package/dist/content/post-types.js.map +1 -0
- package/dist/content/publisher.d.ts +26 -0
- package/dist/content/publisher.d.ts.map +1 -0
- package/dist/content/publisher.js +156 -0
- package/dist/content/publisher.js.map +1 -0
- package/dist/content/service.d.ts +53 -0
- package/dist/content/service.d.ts.map +1 -0
- package/dist/content/service.js +335 -0
- package/dist/content/service.js.map +1 -0
- package/dist/deployment/service.d.ts +25 -0
- package/dist/deployment/service.d.ts.map +1 -0
- package/dist/deployment/service.js +102 -0
- package/dist/deployment/service.js.map +1 -0
- package/dist/events/bus.d.ts +25 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +89 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/store.d.ts +19 -0
- package/dist/events/store.d.ts.map +1 -0
- package/dist/events/store.js +52 -0
- package/dist/events/store.js.map +1 -0
- package/dist/fields/clone.d.ts +2 -0
- package/dist/fields/clone.d.ts.map +1 -0
- package/dist/fields/clone.js +3 -0
- package/dist/fields/clone.js.map +1 -0
- package/dist/fields/conditional.d.ts +2 -0
- package/dist/fields/conditional.d.ts.map +1 -0
- package/dist/fields/conditional.js +3 -0
- package/dist/fields/conditional.js.map +1 -0
- package/dist/fields/index.d.ts +5 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/index.js +6 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/location-rules.d.ts +16 -0
- package/dist/fields/location-rules.d.ts.map +1 -0
- package/dist/fields/location-rules.js +22 -0
- package/dist/fields/location-rules.js.map +1 -0
- package/dist/fields/service.d.ts +77 -0
- package/dist/fields/service.d.ts.map +1 -0
- package/dist/fields/service.js +278 -0
- package/dist/fields/service.js.map +1 -0
- package/dist/fields/types/registry.d.ts +20 -0
- package/dist/fields/types/registry.d.ts.map +1 -0
- package/dist/fields/types/registry.js +68 -0
- package/dist/fields/types/registry.js.map +1 -0
- package/dist/fields/types/validators/basic.d.ts +2 -0
- package/dist/fields/types/validators/basic.d.ts.map +1 -0
- package/dist/fields/types/validators/basic.js +3 -0
- package/dist/fields/types/validators/basic.js.map +1 -0
- package/dist/fields/types/validators/choice.d.ts +2 -0
- package/dist/fields/types/validators/choice.d.ts.map +1 -0
- package/dist/fields/types/validators/choice.js +3 -0
- package/dist/fields/types/validators/choice.js.map +1 -0
- package/dist/fields/types/validators/client-validate.d.ts +2 -0
- package/dist/fields/types/validators/client-validate.d.ts.map +1 -0
- package/dist/fields/types/validators/client-validate.js +3 -0
- package/dist/fields/types/validators/client-validate.js.map +1 -0
- package/dist/fields/types/validators/index.d.ts +8 -0
- package/dist/fields/types/validators/index.d.ts.map +1 -0
- package/dist/fields/types/validators/index.js +10 -0
- package/dist/fields/types/validators/index.js.map +1 -0
- package/dist/fields/types/validators/media.d.ts +2 -0
- package/dist/fields/types/validators/media.d.ts.map +1 -0
- package/dist/fields/types/validators/media.js +3 -0
- package/dist/fields/types/validators/media.js.map +1 -0
- package/dist/fields/types/validators/relational.d.ts +2 -0
- package/dist/fields/types/validators/relational.d.ts.map +1 -0
- package/dist/fields/types/validators/relational.js +3 -0
- package/dist/fields/types/validators/relational.js.map +1 -0
- package/dist/fields/types/validators/structural.d.ts +2 -0
- package/dist/fields/types/validators/structural.d.ts.map +1 -0
- package/dist/fields/types/validators/structural.js +3 -0
- package/dist/fields/types/validators/structural.js.map +1 -0
- package/dist/fields/validation.d.ts +16 -0
- package/dist/fields/validation.d.ts.map +1 -0
- package/dist/fields/validation.js +123 -0
- package/dist/fields/validation.js.map +1 -0
- package/dist/hooks/catalog.d.ts +20 -0
- package/dist/hooks/catalog.d.ts.map +1 -0
- package/dist/hooks/catalog.js +59 -0
- package/dist/hooks/catalog.js.map +1 -0
- package/dist/hooks/points.d.ts +26 -0
- package/dist/hooks/points.d.ts.map +1 -0
- package/dist/hooks/points.js +33 -0
- package/dist/hooks/points.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/index.d.ts +17 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +79 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/media/service.d.ts +32 -0
- package/dist/media/service.d.ts.map +1 -0
- package/dist/media/service.js +87 -0
- package/dist/media/service.js.map +1 -0
- package/dist/menu/service.d.ts +19 -0
- package/dist/menu/service.d.ts.map +1 -0
- package/dist/menu/service.js +64 -0
- package/dist/menu/service.js.map +1 -0
- package/dist/observability/audit.d.ts +26 -0
- package/dist/observability/audit.d.ts.map +1 -0
- package/dist/observability/audit.js +67 -0
- package/dist/observability/audit.js.map +1 -0
- package/dist/observability/event-audit.d.ts +8 -0
- package/dist/observability/event-audit.d.ts.map +1 -0
- package/dist/observability/event-audit.js +20 -0
- package/dist/observability/event-audit.js.map +1 -0
- package/dist/observability/index.d.ts +5 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +6 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +13 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +45 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +34 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +56 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/plugin/service.d.ts +32 -0
- package/dist/plugin/service.d.ts.map +1 -0
- package/dist/plugin/service.js +190 -0
- package/dist/plugin/service.js.map +1 -0
- package/dist/role/service.d.ts +19 -0
- package/dist/role/service.d.ts.map +1 -0
- package/dist/role/service.js +65 -0
- package/dist/role/service.js.map +1 -0
- package/dist/settings/service.d.ts +16 -0
- package/dist/settings/service.d.ts.map +1 -0
- package/dist/settings/service.js +64 -0
- package/dist/settings/service.js.map +1 -0
- package/dist/storage/driver.d.ts +20 -0
- package/dist/storage/driver.d.ts.map +1 -0
- package/dist/storage/driver.js +3 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/drivers/local.d.ts +17 -0
- package/dist/storage/drivers/local.d.ts.map +1 -0
- package/dist/storage/drivers/local.js +88 -0
- package/dist/storage/drivers/local.js.map +1 -0
- package/dist/storage/drivers/s3.d.ts +28 -0
- package/dist/storage/drivers/s3.d.ts.map +1 -0
- package/dist/storage/drivers/s3.js +105 -0
- package/dist/storage/drivers/s3.js.map +1 -0
- package/dist/storage/index.d.ts +16 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +58 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/migrator.d.ts +18 -0
- package/dist/storage/migrator.d.ts.map +1 -0
- package/dist/storage/migrator.js +46 -0
- package/dist/storage/migrator.js.map +1 -0
- package/dist/tag/service.d.ts +13 -0
- package/dist/tag/service.d.ts.map +1 -0
- package/dist/tag/service.js +37 -0
- package/dist/tag/service.js.map +1 -0
- package/dist/taxonomies/service.d.ts +50 -0
- package/dist/taxonomies/service.d.ts.map +1 -0
- package/dist/taxonomies/service.js +179 -0
- package/dist/taxonomies/service.js.map +1 -0
- package/dist/tenant/context.d.ts +9 -0
- package/dist/tenant/context.d.ts.map +1 -0
- package/dist/tenant/context.js +67 -0
- package/dist/tenant/context.js.map +1 -0
- package/dist/tenant/service.d.ts +31 -0
- package/dist/tenant/service.d.ts.map +1 -0
- package/dist/tenant/service.js +90 -0
- package/dist/tenant/service.js.map +1 -0
- package/dist/theme/service.d.ts +16 -0
- package/dist/theme/service.d.ts.map +1 -0
- package/dist/theme/service.js +57 -0
- package/dist/theme/service.js.map +1 -0
- package/dist/user/service.d.ts +31 -0
- package/dist/user/service.d.ts.map +1 -0
- package/dist/user/service.js +95 -0
- package/dist/user/service.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { getConnection, runPluginMigrations, rollbackPluginMigrations } from '@oktis-works/database';
|
|
3
|
+
import { satisfies, validRange } from 'semver';
|
|
4
|
+
import { CMS_VERSION } from '@oktis-works/validation';
|
|
5
|
+
import { auditService } from '../observability/index.js';
|
|
6
|
+
import { getEventBus } from '../events/bus.js';
|
|
7
|
+
export class PluginService {
|
|
8
|
+
/**
|
|
9
|
+
* RULE-tenant-plugin-scope: retorna plugins platform (globais) + os do tenant informado.
|
|
10
|
+
* Sem tenantId, retorna apenas os de escopo platform.
|
|
11
|
+
*/
|
|
12
|
+
async list(tenantId) {
|
|
13
|
+
const sql = getConnection();
|
|
14
|
+
const result = tenantId
|
|
15
|
+
? await sql.unsafe("SELECT * FROM plugins WHERE manifest->>'scope' = 'platform' OR manifest->>'scope' IS NULL OR tenant_id = $1 ORDER BY name ASC", [tenantId])
|
|
16
|
+
: await sql.unsafe("SELECT * FROM plugins WHERE manifest->>'scope' = 'platform' OR manifest->>'scope' IS NULL ORDER BY name ASC");
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
async getById(id) {
|
|
20
|
+
const sql = getConnection();
|
|
21
|
+
const result = await sql.unsafe('SELECT * FROM plugins WHERE id = $1', [id]);
|
|
22
|
+
return result[0] ?? null;
|
|
23
|
+
}
|
|
24
|
+
async getByName(name) {
|
|
25
|
+
const sql = getConnection();
|
|
26
|
+
const result = await sql.unsafe('SELECT * FROM plugins WHERE name = $1', [name]);
|
|
27
|
+
return result[0] ?? null;
|
|
28
|
+
}
|
|
29
|
+
async install(input) {
|
|
30
|
+
const sql = getConnection();
|
|
31
|
+
// REQ-plugin-installation-002: dependências devem estar instaladas primeiro
|
|
32
|
+
const missing = [];
|
|
33
|
+
for (const dep of input.dependencies ?? []) {
|
|
34
|
+
if (dep.optional)
|
|
35
|
+
continue;
|
|
36
|
+
const found = await sql.unsafe("SELECT id FROM plugins WHERE name = $1 AND status IN ('INSTALLED','ACTIVATED') LIMIT 1", [dep.name]);
|
|
37
|
+
if (found.length === 0)
|
|
38
|
+
missing.push(dep.name);
|
|
39
|
+
}
|
|
40
|
+
if (missing.length > 0) {
|
|
41
|
+
throw new Error(`DEPENDENCY_MISSING: instale primeiro as dependências: ${missing.join(', ')}`);
|
|
42
|
+
}
|
|
43
|
+
const id = randomUUID();
|
|
44
|
+
const now = new Date().toISOString();
|
|
45
|
+
const result = await sql.unsafe(`INSERT INTO plugins (id, name, version, status, manifest, permissions, config, created_at, updated_at)
|
|
46
|
+
VALUES ($1, $2, $3, $4, $5::jsonb, $6, $7::jsonb, $8, $8)
|
|
47
|
+
RETURNING *`, [
|
|
48
|
+
id,
|
|
49
|
+
input.name,
|
|
50
|
+
input.version,
|
|
51
|
+
'INSTALLED',
|
|
52
|
+
JSON.stringify(input.manifest),
|
|
53
|
+
input.permissions ?? [],
|
|
54
|
+
input.config ? JSON.stringify(input.config) : null,
|
|
55
|
+
now,
|
|
56
|
+
]);
|
|
57
|
+
// Registra o grafo de dependências (plugin_dependencies)
|
|
58
|
+
for (const dep of input.dependencies ?? []) {
|
|
59
|
+
const depRow = await sql.unsafe('SELECT id FROM plugins WHERE name = $1 ORDER BY created_at DESC LIMIT 1', [dep.name]);
|
|
60
|
+
const depId = depRow[0]?.id;
|
|
61
|
+
if (!depId)
|
|
62
|
+
continue;
|
|
63
|
+
await sql.unsafe('INSERT INTO plugin_dependencies (plugin_id, dependency_id, version_range, optional) VALUES ($1, $2, $3, $4)', [id, depId, dep.versionRange ?? '*', dep.optional === true]);
|
|
64
|
+
}
|
|
65
|
+
// REQ-plugin-installation-003/005: migrations do plugin rodam transacionais;
|
|
66
|
+
// falha => status MIGRATION_FAILED e erro propagado.
|
|
67
|
+
if (input.migrations && input.migrations.length > 0) {
|
|
68
|
+
try {
|
|
69
|
+
await runPluginMigrations(input.tenantId ?? '', input.name, input.migrations);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
73
|
+
await sql.unsafe("UPDATE plugins SET status = 'MIGRATION_FAILED', updated_at = NOW() WHERE id = $1", [id]);
|
|
74
|
+
throw new Error(`MIGRATION_FAILED: ${input.name} — ${message}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
await auditService.record({
|
|
78
|
+
action: 'plugin.install',
|
|
79
|
+
resourceType: 'plugin',
|
|
80
|
+
resourceId: id,
|
|
81
|
+
changes: { name: input.name, version: input.version },
|
|
82
|
+
});
|
|
83
|
+
return result[0];
|
|
84
|
+
}
|
|
85
|
+
async activate(id) {
|
|
86
|
+
const sql = getConnection();
|
|
87
|
+
const existing = await this.getById(id);
|
|
88
|
+
if (!existing)
|
|
89
|
+
return null;
|
|
90
|
+
if (!['INSTALLED', 'DEACTIVATED'].includes(existing.status)) {
|
|
91
|
+
throw new Error(`Invalid plugin transition: ${existing.status} → ACTIVATED`);
|
|
92
|
+
}
|
|
93
|
+
// REQ-plugin-activation-004: range compatibility.blacklotus insatisfazível bloqueia ativação
|
|
94
|
+
const raw = existing.manifest;
|
|
95
|
+
let manifest = {};
|
|
96
|
+
if (typeof raw === 'string') {
|
|
97
|
+
try {
|
|
98
|
+
manifest = JSON.parse(raw);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
manifest = {};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else if (raw && typeof raw === 'object') {
|
|
105
|
+
manifest = raw;
|
|
106
|
+
}
|
|
107
|
+
const compat = manifest.compatibility?.blacklotus;
|
|
108
|
+
if (typeof compat === 'string' && validRange(compat) && !satisfies(CMS_VERSION, compat)) {
|
|
109
|
+
throw new Error(`ACTIVATION_FAILED: plugin requer BlackLotus ${compat}, versão atual é ${CMS_VERSION}`);
|
|
110
|
+
}
|
|
111
|
+
const result = await sql.unsafe(`UPDATE plugins
|
|
112
|
+
SET status = $1, activated_at = NOW(), updated_at = NOW()
|
|
113
|
+
WHERE id = $2
|
|
114
|
+
RETURNING *`, ['ACTIVATED', id]);
|
|
115
|
+
await auditService.record({ action: 'plugin.activate', resourceType: 'plugin', resourceId: id });
|
|
116
|
+
return result[0] ?? null;
|
|
117
|
+
}
|
|
118
|
+
async deactivate(id) {
|
|
119
|
+
const sql = getConnection();
|
|
120
|
+
const existing = await this.getById(id);
|
|
121
|
+
if (!existing)
|
|
122
|
+
return null;
|
|
123
|
+
if (existing.status !== 'ACTIVATED') {
|
|
124
|
+
throw new Error(`Invalid plugin transition: ${existing.status} → DEACTIVATED`);
|
|
125
|
+
}
|
|
126
|
+
const result = await sql.unsafe(`UPDATE plugins
|
|
127
|
+
SET status = $1, updated_at = NOW()
|
|
128
|
+
WHERE id = $2
|
|
129
|
+
RETURNING *`, ['DEACTIVATED', id]);
|
|
130
|
+
// REQ-plugin-activation-003: dependentes ativos são notificados via evento de domínio
|
|
131
|
+
const dependentsResult = await sql.unsafe(`SELECT p.id, p.name FROM plugins p
|
|
132
|
+
JOIN plugin_dependencies pd ON pd.plugin_id = p.id
|
|
133
|
+
JOIN plugins dep ON dep.id = pd.dependency_id
|
|
134
|
+
WHERE dep.name = $1 AND p.status = 'ACTIVATED'`, [existing.name]);
|
|
135
|
+
const dependents = dependentsResult.map((d) => d.name);
|
|
136
|
+
await getEventBus().emit({
|
|
137
|
+
id: randomUUID(),
|
|
138
|
+
type: 'plugin.deactivated',
|
|
139
|
+
aggregateType: 'plugin',
|
|
140
|
+
aggregateId: id,
|
|
141
|
+
payload: { pluginId: id, name: existing.name, dependents },
|
|
142
|
+
processed: false,
|
|
143
|
+
createdAt: new Date(),
|
|
144
|
+
});
|
|
145
|
+
await auditService.record({
|
|
146
|
+
action: 'plugin.deactivate',
|
|
147
|
+
resourceType: 'plugin',
|
|
148
|
+
resourceId: id,
|
|
149
|
+
changes: { notifiedDependents: dependents },
|
|
150
|
+
});
|
|
151
|
+
return result[0] ?? null;
|
|
152
|
+
}
|
|
153
|
+
async uninstall(id) {
|
|
154
|
+
const sql = getConnection();
|
|
155
|
+
const existing = await this.getById(id);
|
|
156
|
+
if (!existing)
|
|
157
|
+
return false;
|
|
158
|
+
// REQU-022-004: desinstalação remove dependências registradas e reverte migrations
|
|
159
|
+
const tenantId = existing.tenant_id ?? '';
|
|
160
|
+
let rolledBack = 0;
|
|
161
|
+
try {
|
|
162
|
+
rolledBack = await rollbackPluginMigrations(tenantId, existing.name);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
rolledBack = 0;
|
|
166
|
+
}
|
|
167
|
+
await sql.unsafe('DELETE FROM plugin_dependencies WHERE plugin_id = $1', [id]);
|
|
168
|
+
await sql.unsafe(`UPDATE plugins SET status = $1, updated_at = NOW() WHERE id = $2`, ['UNINSTALLED', id]);
|
|
169
|
+
await auditService.record({
|
|
170
|
+
action: 'plugin.uninstall',
|
|
171
|
+
resourceType: 'plugin',
|
|
172
|
+
resourceId: id,
|
|
173
|
+
changes: { migrationsRolledBack: rolledBack },
|
|
174
|
+
});
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
async updateConfig(id, config) {
|
|
178
|
+
const sql = getConnection();
|
|
179
|
+
const existing = await this.getById(id);
|
|
180
|
+
if (!existing)
|
|
181
|
+
return null;
|
|
182
|
+
const result = await sql.unsafe(`UPDATE plugins
|
|
183
|
+
SET config = $1::jsonb, updated_at = NOW()
|
|
184
|
+
WHERE id = $2
|
|
185
|
+
RETURNING *`, [JSON.stringify(config), id]);
|
|
186
|
+
return result[0] ?? null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export const pluginService = new PluginService();
|
|
190
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/plugin/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Role } from '@oktis-works/types';
|
|
2
|
+
export declare class RoleService {
|
|
3
|
+
list(tenantId?: string): Promise<Role[]>;
|
|
4
|
+
getById(id: string): Promise<Role | null>;
|
|
5
|
+
create(input: {
|
|
6
|
+
tenantId?: string;
|
|
7
|
+
name: string;
|
|
8
|
+
slug: string;
|
|
9
|
+
permissions?: string[];
|
|
10
|
+
}): Promise<Role>;
|
|
11
|
+
update(id: string, input: {
|
|
12
|
+
name?: string;
|
|
13
|
+
slug?: string;
|
|
14
|
+
permissions?: string[];
|
|
15
|
+
}): Promise<Role | null>;
|
|
16
|
+
delete(id: string): Promise<boolean>;
|
|
17
|
+
}
|
|
18
|
+
export declare const roleService: RoleService;
|
|
19
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/role/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C,qBAAa,WAAW;IAChB,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAkBxC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAMzC,MAAM,CAAC,KAAK,EAAE;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBX,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,GACA,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAkCjB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAW3C;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { getConnection } from '@oktis-works/database';
|
|
3
|
+
export class RoleService {
|
|
4
|
+
async list(tenantId) {
|
|
5
|
+
const sql = getConnection();
|
|
6
|
+
if (tenantId) {
|
|
7
|
+
const result = await sql.unsafe('SELECT * FROM roles WHERE tenant_id = $1 OR tenant_id IS NULL ORDER BY created_at ASC', [tenantId]);
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
const result = await sql.unsafe('SELECT * FROM roles WHERE tenant_id IS NULL ORDER BY created_at ASC', []);
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
async getById(id) {
|
|
14
|
+
const sql = getConnection();
|
|
15
|
+
const result = await sql.unsafe('SELECT * FROM roles WHERE id = $1', [id]);
|
|
16
|
+
return result[0] ?? null;
|
|
17
|
+
}
|
|
18
|
+
async create(input) {
|
|
19
|
+
const sql = getConnection();
|
|
20
|
+
const id = randomUUID();
|
|
21
|
+
const permissionsJson = JSON.stringify(input.permissions ?? []);
|
|
22
|
+
const isSystem = false;
|
|
23
|
+
const result = await sql.unsafe(`INSERT INTO roles (id, tenant_id, name, slug, is_system, permissions)
|
|
24
|
+
VALUES ($1, $2, $3, $4, $5, $6::jsonb)
|
|
25
|
+
RETURNING *`, [id, input.tenantId ?? null, input.name, input.slug, isSystem, permissionsJson]);
|
|
26
|
+
return result[0];
|
|
27
|
+
}
|
|
28
|
+
async update(id, input) {
|
|
29
|
+
const sql = getConnection();
|
|
30
|
+
const existing = await this.getById(id);
|
|
31
|
+
if (!existing)
|
|
32
|
+
return null;
|
|
33
|
+
const setClauses = [];
|
|
34
|
+
const setParams = [];
|
|
35
|
+
if (input.name !== undefined) {
|
|
36
|
+
setClauses.push(`name = $${setParams.length + 1}`);
|
|
37
|
+
setParams.push(input.name);
|
|
38
|
+
}
|
|
39
|
+
if (input.slug !== undefined) {
|
|
40
|
+
setClauses.push(`slug = $${setParams.length + 1}`);
|
|
41
|
+
setParams.push(input.slug);
|
|
42
|
+
}
|
|
43
|
+
if (input.permissions !== undefined) {
|
|
44
|
+
setClauses.push(`permissions = $${setParams.length + 1}::jsonb`);
|
|
45
|
+
setParams.push(JSON.stringify(input.permissions));
|
|
46
|
+
}
|
|
47
|
+
if (setClauses.length === 0)
|
|
48
|
+
return existing;
|
|
49
|
+
setParams.push(id);
|
|
50
|
+
const result = await sql.unsafe(`UPDATE roles SET ${setClauses.join(', ')} WHERE id = $${setParams.length} RETURNING *`, setParams);
|
|
51
|
+
return result[0] ?? null;
|
|
52
|
+
}
|
|
53
|
+
async delete(id) {
|
|
54
|
+
const sql = getConnection();
|
|
55
|
+
const existing = await this.getById(id);
|
|
56
|
+
if (!existing)
|
|
57
|
+
return false;
|
|
58
|
+
if (existing.isSystem)
|
|
59
|
+
return false;
|
|
60
|
+
await sql.unsafe('DELETE FROM roles WHERE id = $1', [id]);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export const roleService = new RoleService();
|
|
65
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/role/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Setting } from '@oktis-works/types';
|
|
2
|
+
export declare class SettingsService {
|
|
3
|
+
get(group?: string): Promise<Setting[]>;
|
|
4
|
+
getByKey(key: string): Promise<Setting | null>;
|
|
5
|
+
set(key: string, value: unknown, group?: string, type?: string): Promise<Setting>;
|
|
6
|
+
setMany(settings: Array<{
|
|
7
|
+
key: string;
|
|
8
|
+
value: unknown;
|
|
9
|
+
group?: string;
|
|
10
|
+
type?: string;
|
|
11
|
+
}>): Promise<void>;
|
|
12
|
+
delete(key: string): Promise<boolean>;
|
|
13
|
+
getGroup(group: string): Promise<Setting[]>;
|
|
14
|
+
}
|
|
15
|
+
export declare const settingsService: SettingsService;
|
|
16
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/settings/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,eAAe;IACpB,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAYvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAM9C,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,KAAK,CAAC,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IA0Cb,OAAO,CACX,QAAQ,EAAE,KAAK,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,GACD,OAAO,CAAC,IAAI,CAAC;IAMV,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAKlD;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { getConnection } from '@oktis-works/database';
|
|
3
|
+
export class SettingsService {
|
|
4
|
+
async get(group) {
|
|
5
|
+
const sql = getConnection();
|
|
6
|
+
if (group) {
|
|
7
|
+
const result = await sql.unsafe('SELECT * FROM settings WHERE "group" = $1 ORDER BY key', [group]);
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
const result = await sql.unsafe('SELECT * FROM settings ORDER BY "group", key');
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
async getByKey(key) {
|
|
14
|
+
const sql = getConnection();
|
|
15
|
+
const result = await sql.unsafe('SELECT * FROM settings WHERE key = $1', [key]);
|
|
16
|
+
return result[0] ?? null;
|
|
17
|
+
}
|
|
18
|
+
async set(key, value, group, type) {
|
|
19
|
+
const sql = getConnection();
|
|
20
|
+
const valueJson = JSON.stringify(value);
|
|
21
|
+
const existing = await this.getByKey(key);
|
|
22
|
+
if (existing) {
|
|
23
|
+
const setClauses = ['value = $1::jsonb'];
|
|
24
|
+
const setParams = [valueJson];
|
|
25
|
+
if (group !== undefined) {
|
|
26
|
+
setClauses.push(`"group" = $${setParams.length + 1}`);
|
|
27
|
+
setParams.push(group);
|
|
28
|
+
}
|
|
29
|
+
if (type !== undefined) {
|
|
30
|
+
setClauses.push(`type = $${setParams.length + 1}`);
|
|
31
|
+
setParams.push(type);
|
|
32
|
+
}
|
|
33
|
+
setClauses.push(`updated_at = NOW()`);
|
|
34
|
+
setParams.push(key);
|
|
35
|
+
const result = await sql.unsafe(`UPDATE settings SET ${setClauses.join(', ')} WHERE key = $${setParams.length} RETURNING *`, setParams);
|
|
36
|
+
return result[0];
|
|
37
|
+
}
|
|
38
|
+
const id = randomUUID();
|
|
39
|
+
const result = await sql.unsafe(`INSERT INTO settings (id, key, value, "group", type)
|
|
40
|
+
VALUES ($1, $2, $3::jsonb, $4, $5)
|
|
41
|
+
RETURNING *`, [id, key, valueJson, group ?? null, type ?? null]);
|
|
42
|
+
return result[0];
|
|
43
|
+
}
|
|
44
|
+
async setMany(settings) {
|
|
45
|
+
for (const setting of settings) {
|
|
46
|
+
await this.set(setting.key, setting.value, setting.group, setting.type);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async delete(key) {
|
|
50
|
+
const sql = getConnection();
|
|
51
|
+
const existing = await this.getByKey(key);
|
|
52
|
+
if (!existing)
|
|
53
|
+
return false;
|
|
54
|
+
await sql.unsafe('DELETE FROM settings WHERE key = $1', [key]);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
async getGroup(group) {
|
|
58
|
+
const sql = getConnection();
|
|
59
|
+
const result = await sql.unsafe('SELECT * FROM settings WHERE "group" = $1 ORDER BY key', [group]);
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export const settingsService = new SettingsService();
|
|
64
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/settings/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface StorageObject {
|
|
2
|
+
key: string;
|
|
3
|
+
body: Buffer;
|
|
4
|
+
contentType: string;
|
|
5
|
+
size: number;
|
|
6
|
+
etag?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface StorageDriver {
|
|
9
|
+
readonly name: 'local' | 's3' | 'r2' | 'minio';
|
|
10
|
+
put(key: string, body: Buffer, contentType: string): Promise<{
|
|
11
|
+
key: string;
|
|
12
|
+
etag?: string;
|
|
13
|
+
}>;
|
|
14
|
+
get(key: string): Promise<Buffer | null>;
|
|
15
|
+
delete(key: string): Promise<boolean>;
|
|
16
|
+
exists(key: string): Promise<boolean>;
|
|
17
|
+
list(prefix: string): Promise<string[]>;
|
|
18
|
+
publicUrl(key: string): string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/storage/driver.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;IAE/C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7F,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/storage/driver.ts"],"names":[],"mappings":"AAAA,iDAAiD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { StorageDriver } from '../driver.js';
|
|
2
|
+
export declare class LocalStorageDriver implements StorageDriver {
|
|
3
|
+
readonly name: "local";
|
|
4
|
+
private readonly root;
|
|
5
|
+
constructor(root?: string);
|
|
6
|
+
private resolve;
|
|
7
|
+
put(key: string, body: Buffer, _contentType: string): Promise<{
|
|
8
|
+
key: string;
|
|
9
|
+
etag?: string;
|
|
10
|
+
}>;
|
|
11
|
+
get(key: string): Promise<Buffer | null>;
|
|
12
|
+
delete(key: string): Promise<boolean>;
|
|
13
|
+
exists(key: string): Promise<boolean>;
|
|
14
|
+
list(prefix: string): Promise<string[]>;
|
|
15
|
+
publicUrl(key: string): string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/storage/drivers/local.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,qBAAa,kBAAmB,YAAW,aAAa;IACtD,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,IAAI,CAAC,EAAE,MAAM;IAIzB,OAAO,CAAC,OAAO;IAMT,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAa7F,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASxC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUrC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwB7C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAI/B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// @oktis-works/core - Local Filesystem Storage Driver
|
|
2
|
+
import { mkdir, readFile, writeFile, unlink, readdir, stat } from 'node:fs/promises';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
export class LocalStorageDriver {
|
|
6
|
+
name = 'local';
|
|
7
|
+
root;
|
|
8
|
+
constructor(root) {
|
|
9
|
+
this.root = root ?? process.env['STORAGE_LOCAL_PATH'] ?? '.data/storage';
|
|
10
|
+
}
|
|
11
|
+
resolve(key) {
|
|
12
|
+
const normalized = path.normalize(key).replace(/^(\.\.(\/|\\|$))+/, '');
|
|
13
|
+
const base = path.isAbsolute(this.root) ? this.root : path.join(process.cwd(), this.root);
|
|
14
|
+
return path.join(base, normalized);
|
|
15
|
+
}
|
|
16
|
+
async put(key, body, _contentType) {
|
|
17
|
+
void _contentType;
|
|
18
|
+
if (!key || key.trim() === '') {
|
|
19
|
+
throw new Error('[local] Storage key é obrigatória');
|
|
20
|
+
}
|
|
21
|
+
const target = this.resolve(key);
|
|
22
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
23
|
+
await writeFile(target, body);
|
|
24
|
+
return { key, etag: createHash('md5').update(body).digest('hex') };
|
|
25
|
+
}
|
|
26
|
+
async get(key) {
|
|
27
|
+
try {
|
|
28
|
+
return await readFile(this.resolve(key));
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error?.code === 'ENOENT')
|
|
32
|
+
return null;
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async delete(key) {
|
|
37
|
+
try {
|
|
38
|
+
await unlink(this.resolve(key));
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error?.code === 'ENOENT')
|
|
43
|
+
return false;
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async exists(key) {
|
|
48
|
+
if (!key || key.trim() === '')
|
|
49
|
+
return false;
|
|
50
|
+
try {
|
|
51
|
+
await stat(this.resolve(key));
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error?.code === 'ENOENT')
|
|
56
|
+
return false;
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async list(prefix) {
|
|
61
|
+
const dir = this.resolve(prefix);
|
|
62
|
+
const results = [];
|
|
63
|
+
const walk = async (current, relative) => {
|
|
64
|
+
try {
|
|
65
|
+
const entries = await readdir(current, { withFileTypes: true });
|
|
66
|
+
for (const entry of entries) {
|
|
67
|
+
const entryRelative = relative ? `${relative}/${entry.name}` : entry.name;
|
|
68
|
+
if (entry.isDirectory()) {
|
|
69
|
+
await walk(path.join(current, entry.name), entryRelative);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
results.push(entryRelative);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// directory does not exist
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
await walk(dir, prefix.replace(/\/$/, ''));
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
publicUrl(key) {
|
|
84
|
+
const basePath = (process.env['STORAGE_PUBLIC_BASE'] ?? '/storage').replace(/\/$/, '');
|
|
85
|
+
return `${basePath}/${key.split('/').map(encodeURIComponent).join('/')}`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/storage/drivers/local.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,OAAgB,CAAC;IAChB,IAAI,CAAS;IAE9B,YAAY,IAAa;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,eAAe,CAAC;IAC3E,CAAC;IAEO,OAAO,CAAC,GAAW;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAY,EAAE,YAAoB;QACvD,KAAK,YAAY,CAAC;QAClB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE9B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACtE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACtE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,IAAI,GAAG,KAAK,EAAE,OAAe,EAAE,QAAgB,EAAiB,EAAE;YACtE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;oBAC1E,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;oBAC5D,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvF,OAAO,GAAG,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3E,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { StorageDriver } from '../driver.js';
|
|
2
|
+
export declare class S3StorageDriver implements StorageDriver {
|
|
3
|
+
readonly name: 's3' | 'r2' | 'minio';
|
|
4
|
+
private readonly client;
|
|
5
|
+
private readonly bucket;
|
|
6
|
+
private readonly region;
|
|
7
|
+
private readonly endpoint?;
|
|
8
|
+
private readonly publicBase?;
|
|
9
|
+
constructor(config?: {
|
|
10
|
+
name?: 's3' | 'r2' | 'minio';
|
|
11
|
+
bucket?: string;
|
|
12
|
+
region?: string;
|
|
13
|
+
endpoint?: string;
|
|
14
|
+
accessKeyId?: string;
|
|
15
|
+
secretAccessKey?: string;
|
|
16
|
+
forcePathStyle?: boolean;
|
|
17
|
+
});
|
|
18
|
+
put(key: string, body: Buffer, contentType: string): Promise<{
|
|
19
|
+
key: string;
|
|
20
|
+
etag?: string;
|
|
21
|
+
}>;
|
|
22
|
+
get(key: string): Promise<Buffer | null>;
|
|
23
|
+
delete(key: string): Promise<boolean>;
|
|
24
|
+
exists(key: string): Promise<boolean>;
|
|
25
|
+
list(prefix: string): Promise<string[]>;
|
|
26
|
+
publicUrl(key: string): string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=s3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../../src/storage/drivers/s3.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IA+B9K,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAa5F,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAcxC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuB7C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAW/B"}
|