@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,105 @@
|
|
|
1
|
+
// @oktis-works/core - S3-Compatible Storage Driver
|
|
2
|
+
import { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, HeadObjectCommand, ListObjectsV2Command } from '@aws-sdk/client-s3';
|
|
3
|
+
export class S3StorageDriver {
|
|
4
|
+
name;
|
|
5
|
+
client;
|
|
6
|
+
bucket;
|
|
7
|
+
region;
|
|
8
|
+
endpoint;
|
|
9
|
+
publicBase;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.name = config?.name ?? 's3';
|
|
12
|
+
this.bucket = config?.bucket ?? process.env['STORAGE_S3_BUCKET'] ?? '';
|
|
13
|
+
if (!this.bucket) {
|
|
14
|
+
throw new Error(`[${this.name}] Bucket não configurado: defina config.bucket ou STORAGE_S3_BUCKET`);
|
|
15
|
+
}
|
|
16
|
+
this.region = config?.region ?? process.env['STORAGE_S3_REGION'] ?? 'us-east-1';
|
|
17
|
+
const region = this.region;
|
|
18
|
+
this.endpoint = config?.endpoint ?? process.env['STORAGE_S3_ENDPOINT'];
|
|
19
|
+
this.client = new S3Client({
|
|
20
|
+
region,
|
|
21
|
+
endpoint: this.endpoint,
|
|
22
|
+
credentials: config?.accessKeyId && config?.secretAccessKey
|
|
23
|
+
? {
|
|
24
|
+
accessKeyId: config.accessKeyId,
|
|
25
|
+
secretAccessKey: config.secretAccessKey,
|
|
26
|
+
}
|
|
27
|
+
: process.env['STORAGE_S3_ACCESS_KEY_ID'] && process.env['STORAGE_S3_SECRET_ACCESS_KEY']
|
|
28
|
+
? {
|
|
29
|
+
accessKeyId: process.env['STORAGE_S3_ACCESS_KEY_ID'],
|
|
30
|
+
secretAccessKey: process.env['STORAGE_S3_SECRET_ACCESS_KEY'],
|
|
31
|
+
}
|
|
32
|
+
: undefined,
|
|
33
|
+
forcePathStyle: config?.forcePathStyle ?? Boolean(process.env['STORAGE_S3_ENDPOINT']),
|
|
34
|
+
});
|
|
35
|
+
this.publicBase = process.env['STORAGE_PUBLIC_BASE'];
|
|
36
|
+
}
|
|
37
|
+
async put(key, body, contentType) {
|
|
38
|
+
const response = await this.client.send(new PutObjectCommand({
|
|
39
|
+
Bucket: this.bucket,
|
|
40
|
+
Key: key,
|
|
41
|
+
Body: body,
|
|
42
|
+
ContentType: contentType,
|
|
43
|
+
}));
|
|
44
|
+
return { key, etag: response.ETag };
|
|
45
|
+
}
|
|
46
|
+
async get(key) {
|
|
47
|
+
try {
|
|
48
|
+
const response = await this.client.send(new GetObjectCommand({ Bucket: this.bucket, Key: key }));
|
|
49
|
+
if (!response.Body)
|
|
50
|
+
return null;
|
|
51
|
+
return Buffer.from(await response.Body.transformToByteArray());
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async delete(key) {
|
|
58
|
+
try {
|
|
59
|
+
await this.client.send(new DeleteObjectCommand({ Bucket: this.bucket, Key: key }));
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async exists(key) {
|
|
67
|
+
try {
|
|
68
|
+
await this.client.send(new HeadObjectCommand({ Bucket: this.bucket, Key: key }));
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async list(prefix) {
|
|
76
|
+
const keys = [];
|
|
77
|
+
let continuationToken;
|
|
78
|
+
do {
|
|
79
|
+
const response = await this.client.send(new ListObjectsV2Command({
|
|
80
|
+
Bucket: this.bucket,
|
|
81
|
+
Prefix: prefix,
|
|
82
|
+
ContinuationToken: continuationToken,
|
|
83
|
+
}));
|
|
84
|
+
for (const object of response.Contents ?? []) {
|
|
85
|
+
if (object.Key)
|
|
86
|
+
keys.push(object.Key);
|
|
87
|
+
}
|
|
88
|
+
continuationToken = response.NextContinuationToken;
|
|
89
|
+
} while (continuationToken);
|
|
90
|
+
return keys;
|
|
91
|
+
}
|
|
92
|
+
publicUrl(key) {
|
|
93
|
+
const encodedKey = key.split('/').map(encodeURIComponent).join('/');
|
|
94
|
+
if (this.publicBase)
|
|
95
|
+
return `${this.publicBase.replace(/\/$/, '')}/${encodedKey}`;
|
|
96
|
+
if (this.endpoint) {
|
|
97
|
+
return `${this.endpoint.replace(/\/$/, '')}/${this.bucket}/${encodedKey}`;
|
|
98
|
+
}
|
|
99
|
+
if (this.name === 'r2') {
|
|
100
|
+
throw new Error('[r2] STORAGE_PUBLIC_BASE ou STORAGE_S3_ENDPOINT é obrigatório para publicUrl');
|
|
101
|
+
}
|
|
102
|
+
return `https://${this.bucket}.s3.${this.region}.amazonaws.com/${encodedKey}`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=s3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../../src/storage/drivers/s3.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { StorageDriver } from './driver.js';
|
|
2
|
+
export type StorageDriverName = 'local' | 's3' | 'r2' | 'minio';
|
|
3
|
+
/**
|
|
4
|
+
* Drivers S3-compatíveis com defaults por provedor:
|
|
5
|
+
* - s3: AWS (endpoint opcional)
|
|
6
|
+
* - r2: Cloudflare R2 (region auto, endpoint obrigatório via env)
|
|
7
|
+
* - minio: MinIO self-hosted (path-style sempre ligado)
|
|
8
|
+
*/
|
|
9
|
+
declare const S3_LIKE: Set<string>;
|
|
10
|
+
export declare function createStorageDriver(name?: string): StorageDriver;
|
|
11
|
+
export { S3_LIKE };
|
|
12
|
+
export declare const storage: StorageDriver;
|
|
13
|
+
export { StorageMigrator, createMigrator } from './migrator.js';
|
|
14
|
+
export type { MigrationResult } from './migrator.js';
|
|
15
|
+
export type { StorageDriver, StorageObject } from './driver.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;AAEhE;;;;;GAKG;AACH,QAAA,MAAM,OAAO,aAAiC,CAAC;AAsC/C,wBAAgB,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAahE;AAED,OAAO,EAAE,OAAO,EAAE,CAAC;AAEnB,eAAO,MAAM,OAAO,eAAwB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// @oktis-works/core - Storage Driver Factory
|
|
2
|
+
import { LocalStorageDriver } from './drivers/local.js';
|
|
3
|
+
import { S3StorageDriver } from './drivers/s3.js';
|
|
4
|
+
/**
|
|
5
|
+
* Drivers S3-compatíveis com defaults por provedor:
|
|
6
|
+
* - s3: AWS (endpoint opcional)
|
|
7
|
+
* - r2: Cloudflare R2 (region auto, endpoint obrigatório via env)
|
|
8
|
+
* - minio: MinIO self-hosted (path-style sempre ligado)
|
|
9
|
+
*/
|
|
10
|
+
const S3_LIKE = new Set(['s3', 'r2', 'minio']);
|
|
11
|
+
function resolveS3LikeConfig(name) {
|
|
12
|
+
if (name === 's3') {
|
|
13
|
+
return {
|
|
14
|
+
name: 's3',
|
|
15
|
+
bucket: process.env['STORAGE_S3_BUCKET'],
|
|
16
|
+
region: process.env['STORAGE_S3_REGION'] ?? 'us-east-1',
|
|
17
|
+
endpoint: process.env['STORAGE_S3_ENDPOINT'],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (name === 'r2') {
|
|
21
|
+
const accountId = process.env['STORAGE_R2_ACCOUNT_ID'];
|
|
22
|
+
const endpoint = process.env['STORAGE_R2_ENDPOINT'] ?? (accountId ? `https://${accountId}.r2.cloudflarestorage.com` : undefined);
|
|
23
|
+
if (!endpoint) {
|
|
24
|
+
throw new Error('R2 requer STORAGE_R2_ACCOUNT_ID ou STORAGE_R2_ENDPOINT');
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
name: 'r2',
|
|
28
|
+
bucket: process.env['STORAGE_R2_BUCKET'] ?? process.env['STORAGE_S3_BUCKET'],
|
|
29
|
+
region: 'auto',
|
|
30
|
+
endpoint,
|
|
31
|
+
forcePathStyle: true,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
name: 'minio',
|
|
36
|
+
bucket: process.env['STORAGE_MINIO_BUCKET'] ?? process.env['STORAGE_S3_BUCKET'],
|
|
37
|
+
region: process.env['STORAGE_MINIO_REGION'] ?? 'us-east-1',
|
|
38
|
+
endpoint: process.env['STORAGE_MINIO_ENDPOINT'] ?? 'http://localhost:9000',
|
|
39
|
+
forcePathStyle: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function createStorageDriver(name) {
|
|
43
|
+
const driver = name ?? process.env['STORAGE_DRIVER'] ?? 'local';
|
|
44
|
+
switch (driver) {
|
|
45
|
+
case 'local':
|
|
46
|
+
return new LocalStorageDriver();
|
|
47
|
+
case 's3':
|
|
48
|
+
case 'r2':
|
|
49
|
+
case 'minio':
|
|
50
|
+
return new S3StorageDriver(resolveS3LikeConfig(driver));
|
|
51
|
+
default:
|
|
52
|
+
throw new Error(`Storage driver "${driver}" não suportado (use: local, s3, r2, minio)`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export { S3_LIKE };
|
|
56
|
+
export const storage = createStorageDriver();
|
|
57
|
+
export { StorageMigrator, createMigrator } from './migrator.js';
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKlD;;;;;GAKG;AACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/C,SAAS,mBAAmB,CAAC,IAA2B;IACtD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YACxC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,WAAW;YACvD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,SAAS,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEjI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YAC5E,MAAM,EAAE,MAAM;YACd,QAAQ;YACR,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC/E,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,WAAW;QAC1D,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,uBAAuB;QAC1E,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC;IAEhE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,IAAI,kBAAkB,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC;QACV,KAAK,IAAI,CAAC;QACV,KAAK,OAAO;YACV,OAAO,IAAI,eAAe,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D;YACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,6CAA6C,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC;AAEnB,MAAM,CAAC,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StorageDriver } from './driver.js';
|
|
2
|
+
export interface MigrationResult {
|
|
3
|
+
migrated: number;
|
|
4
|
+
failed: number;
|
|
5
|
+
errors: Array<{
|
|
6
|
+
id: string;
|
|
7
|
+
filename: string;
|
|
8
|
+
error: string;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export declare class StorageMigrator {
|
|
12
|
+
private readonly source;
|
|
13
|
+
private readonly target;
|
|
14
|
+
constructor(source: StorageDriver, target: StorageDriver);
|
|
15
|
+
migrateAll(): Promise<MigrationResult>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createMigrator(fromDriver: string, toDriver: string): StorageMigrator;
|
|
18
|
+
//# sourceMappingURL=migrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/storage/migrator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa;IAGlC,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC;CAoC7C;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAEpF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// @oktis-works/core - Media Storage Migration
|
|
2
|
+
import { getConnection } from '@oktis-works/database';
|
|
3
|
+
import { createStorageDriver } from './index.js';
|
|
4
|
+
export class StorageMigrator {
|
|
5
|
+
source;
|
|
6
|
+
target;
|
|
7
|
+
constructor(source, target) {
|
|
8
|
+
this.source = source;
|
|
9
|
+
this.target = target;
|
|
10
|
+
}
|
|
11
|
+
async migrateAll() {
|
|
12
|
+
const sql = getConnection();
|
|
13
|
+
const result = { migrated: 0, failed: 0, errors: [] };
|
|
14
|
+
const rows = await sql.unsafe('SELECT id, path, mime_type, filename FROM media');
|
|
15
|
+
for (const row of rows) {
|
|
16
|
+
const id = String(row['id']);
|
|
17
|
+
const key = String(row['path']);
|
|
18
|
+
const mimeType = String(row['mime_type'] ?? 'application/octet-stream');
|
|
19
|
+
const filename = String(row['filename'] ?? key);
|
|
20
|
+
try {
|
|
21
|
+
if (!(await this.source.exists(key))) {
|
|
22
|
+
result.failed += 1;
|
|
23
|
+
result.errors.push({ id, filename, error: 'arquivo de origem não encontrado' });
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const body = await this.source.get(key);
|
|
27
|
+
if (!body) {
|
|
28
|
+
result.failed += 1;
|
|
29
|
+
result.errors.push({ id, filename, error: 'falha ao ler arquivo de origem' });
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
await this.target.put(key, body, mimeType);
|
|
33
|
+
result.migrated += 1;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
result.failed += 1;
|
|
37
|
+
result.errors.push({ id, filename, error: String(error instanceof Error ? error.message : error) });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function createMigrator(fromDriver, toDriver) {
|
|
44
|
+
return new StorageMigrator(createStorageDriver(fromDriver), createStorageDriver(toDriver));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=migrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrator.js","sourceRoot":"","sources":["../../src/storage/migrator.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AASjD,MAAM,OAAO,eAAe;IAEP;IACA;IAFnB,YACmB,MAAqB,EACrB,MAAqB;QADrB,WAAM,GAAN,MAAM,CAAe;QACrB,WAAM,GAAN,MAAM,CAAe;IACrC,CAAC;IAEJ,KAAK,CAAC,UAAU;QACd,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAoB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAEvE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,iDAAiD,CAA8C,CAAC;QAE9H,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,0BAA0B,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;YAEhD,IAAI,CAAC;gBACH,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACrC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;oBACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;oBAChF,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;oBACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC,CAAC;oBAC9E,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC3C,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;gBACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtG,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,QAAgB;IACjE,OAAO,IAAI,eAAe,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Tag } from '@oktis-works/types';
|
|
2
|
+
export declare class TagService {
|
|
3
|
+
list(): Promise<Tag[]>;
|
|
4
|
+
getById(id: string): Promise<Tag | null>;
|
|
5
|
+
getBySlug(slug: string): Promise<Tag | null>;
|
|
6
|
+
create(input: {
|
|
7
|
+
name: string;
|
|
8
|
+
slug: string;
|
|
9
|
+
}): Promise<Tag>;
|
|
10
|
+
delete(id: string): Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
export declare const tagService: TagService;
|
|
13
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tag/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,qBAAa,UAAU;IACf,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAMtB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAMxC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAM5C,MAAM,CAAC,KAAK,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,GAAG,CAAC;IAcV,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAU3C;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { getConnection } from '@oktis-works/database';
|
|
3
|
+
export class TagService {
|
|
4
|
+
async list() {
|
|
5
|
+
const sql = getConnection();
|
|
6
|
+
const result = await sql.unsafe('SELECT * FROM tags ORDER BY name ASC');
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
async getById(id) {
|
|
10
|
+
const sql = getConnection();
|
|
11
|
+
const result = await sql.unsafe('SELECT * FROM tags WHERE id = $1', [id]);
|
|
12
|
+
return result[0] ?? null;
|
|
13
|
+
}
|
|
14
|
+
async getBySlug(slug) {
|
|
15
|
+
const sql = getConnection();
|
|
16
|
+
const result = await sql.unsafe('SELECT * FROM tags WHERE slug = $1', [slug]);
|
|
17
|
+
return result[0] ?? null;
|
|
18
|
+
}
|
|
19
|
+
async create(input) {
|
|
20
|
+
const sql = getConnection();
|
|
21
|
+
const id = randomUUID();
|
|
22
|
+
const result = await sql.unsafe(`INSERT INTO tags (id, name, slug)
|
|
23
|
+
VALUES ($1, $2, $3)
|
|
24
|
+
RETURNING *`, [id, input.name, input.slug]);
|
|
25
|
+
return result[0];
|
|
26
|
+
}
|
|
27
|
+
async delete(id) {
|
|
28
|
+
const sql = getConnection();
|
|
29
|
+
const existing = await this.getById(id);
|
|
30
|
+
if (!existing)
|
|
31
|
+
return false;
|
|
32
|
+
await sql.unsafe('DELETE FROM tags WHERE id = $1', [id]);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export const tagService = new TagService();
|
|
37
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/tag/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,OAAO,UAAU;IACrB,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;QACxE,OAAO,MAA0B,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,kCAAkC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,OAAQ,MAAM,CAAC,CAAC,CAAoB,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,oCAAoC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,OAAQ,MAAM,CAAC,CAAC,CAAoB,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAGZ;QACC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAExB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAC7B;;mBAEa,EACb,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAC7B,CAAC;QAEF,OAAO,MAAM,CAAC,CAAC,CAAmB,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5B,MAAM,GAAG,CAAC,MAAM,CAAC,gCAAgC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface CustomTaxonomy {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
slug: string;
|
|
5
|
+
hierarchical: boolean;
|
|
6
|
+
attachTo: string[];
|
|
7
|
+
labels: Record<string, string>;
|
|
8
|
+
meta: Record<string, unknown>;
|
|
9
|
+
source: 'CORE' | 'PLUGIN' | 'ADMIN';
|
|
10
|
+
}
|
|
11
|
+
export interface TaxonomyTerm {
|
|
12
|
+
id: string;
|
|
13
|
+
taxonomyId: string;
|
|
14
|
+
name: string;
|
|
15
|
+
slug: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
parentId?: string | null;
|
|
18
|
+
meta: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export declare class TaxonomyService {
|
|
21
|
+
list(): Promise<CustomTaxonomy[]>;
|
|
22
|
+
getBySlug(slug: string): Promise<CustomTaxonomy | null>;
|
|
23
|
+
create(input: {
|
|
24
|
+
name: string;
|
|
25
|
+
slug?: string;
|
|
26
|
+
hierarchical?: boolean;
|
|
27
|
+
attachTo?: string[];
|
|
28
|
+
labels?: Record<string, string>;
|
|
29
|
+
meta?: Record<string, unknown>;
|
|
30
|
+
source?: 'PLUGIN' | 'ADMIN';
|
|
31
|
+
}): Promise<CustomTaxonomy>;
|
|
32
|
+
update(slug: string, patch: Partial<CustomTaxonomy>): Promise<CustomTaxonomy | null>;
|
|
33
|
+
delete(slug: string): Promise<boolean>;
|
|
34
|
+
attach(contentTypeSlug: string, taxonomySlug: string): Promise<void>;
|
|
35
|
+
detach(contentTypeSlug: string, taxonomySlug: string): Promise<void>;
|
|
36
|
+
listTerms(taxonomySlug: string): Promise<TaxonomyTerm[]>;
|
|
37
|
+
createTerm(taxonomySlug: string, input: {
|
|
38
|
+
name: string;
|
|
39
|
+
slug?: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
parentId?: string;
|
|
42
|
+
meta?: Record<string, unknown>;
|
|
43
|
+
}): Promise<TaxonomyTerm>;
|
|
44
|
+
setTermsForContent(contentId: string, taxonomySlug: string, termIds: string[]): Promise<void>;
|
|
45
|
+
getTermsForContent(contentId: string, taxonomySlug?: string): Promise<TaxonomyTerm[]>;
|
|
46
|
+
private rowToTaxonomy;
|
|
47
|
+
private rowToTerm;
|
|
48
|
+
}
|
|
49
|
+
export declare const taxonomyService: TaxonomyService;
|
|
50
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/taxonomies/service.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,qBAAa,eAAe;IACpB,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAOjC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAQvD,MAAM,CAAC,KAAK,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;KAC7B,GAAG,OAAO,CAAC,cAAc,CAAC;IA6CrB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA2BpF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtC,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpE,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAaxD,UAAU,CACd,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAC9G,OAAO,CAAC,YAAY,CAAC;IA2BlB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B7F,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAuB3F,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,SAAS;CAWlB;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// @oktis-works/core - Taxonomy Service (Custom Taxonomies)
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { getConnection } from '@oktis-works/database';
|
|
4
|
+
import { getEventBus } from '../events/bus.js';
|
|
5
|
+
export class TaxonomyService {
|
|
6
|
+
async list() {
|
|
7
|
+
const sql = getConnection();
|
|
8
|
+
const rows = await sql.unsafe('SELECT * FROM taxonomies ORDER BY name ASC');
|
|
9
|
+
return rows.map((row) => this.rowToTaxonomy(row));
|
|
10
|
+
}
|
|
11
|
+
async getBySlug(slug) {
|
|
12
|
+
const sql = getConnection();
|
|
13
|
+
const rows = await sql.unsafe('SELECT * FROM taxonomies WHERE slug = $1 LIMIT 1', [slug]);
|
|
14
|
+
const row = rows[0];
|
|
15
|
+
return row ? this.rowToTaxonomy(row) : null;
|
|
16
|
+
}
|
|
17
|
+
async create(input) {
|
|
18
|
+
const sql = getConnection();
|
|
19
|
+
const slug = input.slug ??
|
|
20
|
+
input.name
|
|
21
|
+
.toLowerCase()
|
|
22
|
+
.normalize('NFD')
|
|
23
|
+
.replace(/[̀-ͯ]/g, '')
|
|
24
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
25
|
+
.replace(/(^_|_$)/g, '');
|
|
26
|
+
const existing = await this.getBySlug(slug);
|
|
27
|
+
if (existing)
|
|
28
|
+
throw new Error(`Taxonomia "${slug}" já existe`);
|
|
29
|
+
const id = randomUUID();
|
|
30
|
+
await sql.unsafe(`INSERT INTO taxonomies (id, name, slug, hierarchical, attach_to, labels, meta, source)
|
|
31
|
+
VALUES ($1, $2, $3, $4, $5::jsonb, $6::jsonb, $7::jsonb, $8)
|
|
32
|
+
RETURNING *`, [
|
|
33
|
+
id,
|
|
34
|
+
input.name,
|
|
35
|
+
slug,
|
|
36
|
+
input.hierarchical ?? false,
|
|
37
|
+
JSON.stringify(input.attachTo ?? []),
|
|
38
|
+
JSON.stringify(input.labels ?? {}),
|
|
39
|
+
JSON.stringify(input.meta ?? {}),
|
|
40
|
+
input.source ?? 'ADMIN',
|
|
41
|
+
]);
|
|
42
|
+
await getEventBus().emit({
|
|
43
|
+
id: randomUUID(),
|
|
44
|
+
type: 'taxonomy.created',
|
|
45
|
+
aggregateType: 'taxonomy',
|
|
46
|
+
aggregateId: id,
|
|
47
|
+
payload: { slug },
|
|
48
|
+
processed: false,
|
|
49
|
+
createdAt: new Date(),
|
|
50
|
+
});
|
|
51
|
+
return (await this.getBySlug(slug));
|
|
52
|
+
}
|
|
53
|
+
async update(slug, patch) {
|
|
54
|
+
const sql = getConnection();
|
|
55
|
+
const existing = await this.getBySlug(slug);
|
|
56
|
+
if (!existing)
|
|
57
|
+
return null;
|
|
58
|
+
await sql.unsafe(`UPDATE taxonomies SET
|
|
59
|
+
name = $1,
|
|
60
|
+
hierarchical = $2,
|
|
61
|
+
attach_to = $3::jsonb,
|
|
62
|
+
labels = $4::jsonb,
|
|
63
|
+
meta = $5::jsonb,
|
|
64
|
+
updated_at = NOW()
|
|
65
|
+
WHERE slug = $6`, [
|
|
66
|
+
patch.name ?? existing.name,
|
|
67
|
+
patch.hierarchical ?? existing.hierarchical,
|
|
68
|
+
JSON.stringify(patch.attachTo ?? existing.attachTo),
|
|
69
|
+
JSON.stringify(patch.labels ?? existing.labels),
|
|
70
|
+
JSON.stringify(patch.meta ?? existing.meta),
|
|
71
|
+
slug,
|
|
72
|
+
]);
|
|
73
|
+
return this.getBySlug(slug);
|
|
74
|
+
}
|
|
75
|
+
async delete(slug) {
|
|
76
|
+
const sql = getConnection();
|
|
77
|
+
const result = await sql.unsafe('DELETE FROM taxonomies WHERE slug = $1 RETURNING id', [slug]);
|
|
78
|
+
return result.length > 0;
|
|
79
|
+
}
|
|
80
|
+
async attach(contentTypeSlug, taxonomySlug) {
|
|
81
|
+
const taxonomy = await this.getBySlug(taxonomySlug);
|
|
82
|
+
if (!taxonomy)
|
|
83
|
+
throw new Error(`Taxonomia "${taxonomySlug}" não encontrada`);
|
|
84
|
+
if (taxonomy.attachTo.includes(contentTypeSlug))
|
|
85
|
+
return;
|
|
86
|
+
await this.update(taxonomySlug, {
|
|
87
|
+
attachTo: [...taxonomy.attachTo, contentTypeSlug],
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async detach(contentTypeSlug, taxonomySlug) {
|
|
91
|
+
const taxonomy = await this.getBySlug(taxonomySlug);
|
|
92
|
+
if (!taxonomy)
|
|
93
|
+
throw new Error(`Taxonomia "${taxonomySlug}" não encontrada`);
|
|
94
|
+
await this.update(taxonomySlug, {
|
|
95
|
+
attachTo: taxonomy.attachTo.filter((type) => type !== contentTypeSlug),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async listTerms(taxonomySlug) {
|
|
99
|
+
const sql = getConnection();
|
|
100
|
+
const rows = await sql.unsafe(`SELECT t.* FROM taxonomy_terms t
|
|
101
|
+
JOIN taxonomies tx ON tx.id = t.taxonomy_id
|
|
102
|
+
WHERE tx.slug = $1
|
|
103
|
+
ORDER BY t.name ASC`, [taxonomySlug]);
|
|
104
|
+
return rows.map((row) => this.rowToTerm(row));
|
|
105
|
+
}
|
|
106
|
+
async createTerm(taxonomySlug, input) {
|
|
107
|
+
const sql = getConnection();
|
|
108
|
+
const taxonomy = await this.getBySlug(taxonomySlug);
|
|
109
|
+
if (!taxonomy)
|
|
110
|
+
throw new Error(`Taxonomia "${taxonomySlug}" não encontrada`);
|
|
111
|
+
const termSlug = input.slug ??
|
|
112
|
+
input.name
|
|
113
|
+
.toLowerCase()
|
|
114
|
+
.normalize('NFD')
|
|
115
|
+
.replace(/[̀-ͯ]/g, '')
|
|
116
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
117
|
+
.replace(/(^-|-$)/g, '');
|
|
118
|
+
const id = randomUUID();
|
|
119
|
+
await sql.unsafe(`INSERT INTO taxonomy_terms (id, taxonomy_id, name, slug, description, parent_id, meta)
|
|
120
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb)
|
|
121
|
+
RETURNING *`, [id, taxonomy.id, input.name, termSlug, input.description ?? null, input.parentId ?? null, JSON.stringify(input.meta ?? {})]);
|
|
122
|
+
const rows = await sql.unsafe('SELECT * FROM taxonomy_terms WHERE id = $1', [id]);
|
|
123
|
+
return this.rowToTerm(rows[0]);
|
|
124
|
+
}
|
|
125
|
+
async setTermsForContent(contentId, taxonomySlug, termIds) {
|
|
126
|
+
const sql = getConnection();
|
|
127
|
+
const taxonomy = await this.getBySlug(taxonomySlug);
|
|
128
|
+
if (!taxonomy)
|
|
129
|
+
throw new Error(`Taxonomia "${taxonomySlug}" não encontrada`);
|
|
130
|
+
const validTerms = await sql.unsafe('SELECT id FROM taxonomy_terms WHERE taxonomy_id = $1', [taxonomy.id]);
|
|
131
|
+
const validIds = new Set(validTerms.map((term) => String(term.id)));
|
|
132
|
+
await sql.unsafe(`DELETE FROM content_taxonomy_terms
|
|
133
|
+
WHERE content_id = $1 AND term_id IN (SELECT id FROM taxonomy_terms WHERE taxonomy_id = $2)`, [contentId, taxonomy.id]);
|
|
134
|
+
for (const termId of termIds) {
|
|
135
|
+
if (!validIds.has(termId))
|
|
136
|
+
continue;
|
|
137
|
+
await sql.unsafe('INSERT INTO content_taxonomy_terms (content_id, term_id) VALUES ($1, $2) ON CONFLICT DO NOTHING', [contentId, termId]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async getTermsForContent(contentId, taxonomySlug) {
|
|
141
|
+
const sql = getConnection();
|
|
142
|
+
if (taxonomySlug) {
|
|
143
|
+
const rows = await sql.unsafe(`SELECT t.* FROM taxonomy_terms t
|
|
144
|
+
JOIN content_taxonomy_terms ct ON ct.term_id = t.id
|
|
145
|
+
JOIN taxonomies tx ON tx.id = t.taxonomy_id
|
|
146
|
+
WHERE ct.content_id = $1 AND tx.slug = $2`, [contentId, taxonomySlug]);
|
|
147
|
+
return rows.map((row) => this.rowToTerm(row));
|
|
148
|
+
}
|
|
149
|
+
const rows = await sql.unsafe(`SELECT t.* FROM taxonomy_terms t
|
|
150
|
+
JOIN content_taxonomy_terms ct ON ct.term_id = t.id
|
|
151
|
+
WHERE ct.content_id = $1`, [contentId]);
|
|
152
|
+
return rows.map((row) => this.rowToTerm(row));
|
|
153
|
+
}
|
|
154
|
+
rowToTaxonomy(row) {
|
|
155
|
+
return {
|
|
156
|
+
id: String(row['id']),
|
|
157
|
+
name: String(row['name']),
|
|
158
|
+
slug: String(row['slug']),
|
|
159
|
+
hierarchical: Boolean(row['hierarchical']),
|
|
160
|
+
attachTo: row['attach_to'] ?? [],
|
|
161
|
+
labels: row['labels'] ?? {},
|
|
162
|
+
meta: row['meta'] ?? {},
|
|
163
|
+
source: row['source'] ?? 'ADMIN',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
rowToTerm(row) {
|
|
167
|
+
return {
|
|
168
|
+
id: String(row['id']),
|
|
169
|
+
taxonomyId: String(row['taxonomy_id']),
|
|
170
|
+
name: String(row['name']),
|
|
171
|
+
slug: String(row['slug']),
|
|
172
|
+
description: row['description'] ?? undefined,
|
|
173
|
+
parentId: row['parent_id'] ?? null,
|
|
174
|
+
meta: row['meta'] ?? {},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export const taxonomyService = new TaxonomyService();
|
|
179
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/taxonomies/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface TenantContext {
|
|
2
|
+
tenantId: string;
|
|
3
|
+
userId?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function establishTenantContext(tenantId: string, userId?: string): Promise<TenantContext>;
|
|
6
|
+
export declare function getCurrentContext(): Promise<TenantContext | null>;
|
|
7
|
+
export declare function clearCurrentContext(): Promise<void>;
|
|
8
|
+
export declare function requireTenantContext(): TenantContext;
|
|
9
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tenant/context.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4CD,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAKtG;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAYvE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGzD;AAED,wBAAgB,oBAAoB,IAAI,aAAa,CAKpD"}
|