@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.
Files changed (201) hide show
  1. package/dist/bootstrap/index.d.ts +7 -0
  2. package/dist/bootstrap/index.d.ts.map +1 -0
  3. package/dist/bootstrap/index.js +16 -0
  4. package/dist/bootstrap/index.js.map +1 -0
  5. package/dist/build/service.d.ts +28 -0
  6. package/dist/build/service.d.ts.map +1 -0
  7. package/dist/build/service.js +71 -0
  8. package/dist/build/service.js.map +1 -0
  9. package/dist/cache/index.d.ts +31 -0
  10. package/dist/cache/index.d.ts.map +1 -0
  11. package/dist/cache/index.js +110 -0
  12. package/dist/cache/index.js.map +1 -0
  13. package/dist/category/service.d.ts +21 -0
  14. package/dist/category/service.d.ts.map +1 -0
  15. package/dist/category/service.js +67 -0
  16. package/dist/category/service.js.map +1 -0
  17. package/dist/content/field-resolver.d.ts +31 -0
  18. package/dist/content/field-resolver.d.ts.map +1 -0
  19. package/dist/content/field-resolver.js +40 -0
  20. package/dist/content/field-resolver.js.map +1 -0
  21. package/dist/content/post-types.d.ts +28 -0
  22. package/dist/content/post-types.d.ts.map +1 -0
  23. package/dist/content/post-types.js +127 -0
  24. package/dist/content/post-types.js.map +1 -0
  25. package/dist/content/publisher.d.ts +26 -0
  26. package/dist/content/publisher.d.ts.map +1 -0
  27. package/dist/content/publisher.js +156 -0
  28. package/dist/content/publisher.js.map +1 -0
  29. package/dist/content/service.d.ts +53 -0
  30. package/dist/content/service.d.ts.map +1 -0
  31. package/dist/content/service.js +335 -0
  32. package/dist/content/service.js.map +1 -0
  33. package/dist/deployment/service.d.ts +25 -0
  34. package/dist/deployment/service.d.ts.map +1 -0
  35. package/dist/deployment/service.js +102 -0
  36. package/dist/deployment/service.js.map +1 -0
  37. package/dist/events/bus.d.ts +25 -0
  38. package/dist/events/bus.d.ts.map +1 -0
  39. package/dist/events/bus.js +89 -0
  40. package/dist/events/bus.js.map +1 -0
  41. package/dist/events/store.d.ts +19 -0
  42. package/dist/events/store.d.ts.map +1 -0
  43. package/dist/events/store.js +52 -0
  44. package/dist/events/store.js.map +1 -0
  45. package/dist/fields/clone.d.ts +2 -0
  46. package/dist/fields/clone.d.ts.map +1 -0
  47. package/dist/fields/clone.js +3 -0
  48. package/dist/fields/clone.js.map +1 -0
  49. package/dist/fields/conditional.d.ts +2 -0
  50. package/dist/fields/conditional.d.ts.map +1 -0
  51. package/dist/fields/conditional.js +3 -0
  52. package/dist/fields/conditional.js.map +1 -0
  53. package/dist/fields/index.d.ts +5 -0
  54. package/dist/fields/index.d.ts.map +1 -0
  55. package/dist/fields/index.js +6 -0
  56. package/dist/fields/index.js.map +1 -0
  57. package/dist/fields/location-rules.d.ts +16 -0
  58. package/dist/fields/location-rules.d.ts.map +1 -0
  59. package/dist/fields/location-rules.js +22 -0
  60. package/dist/fields/location-rules.js.map +1 -0
  61. package/dist/fields/service.d.ts +77 -0
  62. package/dist/fields/service.d.ts.map +1 -0
  63. package/dist/fields/service.js +278 -0
  64. package/dist/fields/service.js.map +1 -0
  65. package/dist/fields/types/registry.d.ts +20 -0
  66. package/dist/fields/types/registry.d.ts.map +1 -0
  67. package/dist/fields/types/registry.js +68 -0
  68. package/dist/fields/types/registry.js.map +1 -0
  69. package/dist/fields/types/validators/basic.d.ts +2 -0
  70. package/dist/fields/types/validators/basic.d.ts.map +1 -0
  71. package/dist/fields/types/validators/basic.js +3 -0
  72. package/dist/fields/types/validators/basic.js.map +1 -0
  73. package/dist/fields/types/validators/choice.d.ts +2 -0
  74. package/dist/fields/types/validators/choice.d.ts.map +1 -0
  75. package/dist/fields/types/validators/choice.js +3 -0
  76. package/dist/fields/types/validators/choice.js.map +1 -0
  77. package/dist/fields/types/validators/client-validate.d.ts +2 -0
  78. package/dist/fields/types/validators/client-validate.d.ts.map +1 -0
  79. package/dist/fields/types/validators/client-validate.js +3 -0
  80. package/dist/fields/types/validators/client-validate.js.map +1 -0
  81. package/dist/fields/types/validators/index.d.ts +8 -0
  82. package/dist/fields/types/validators/index.d.ts.map +1 -0
  83. package/dist/fields/types/validators/index.js +10 -0
  84. package/dist/fields/types/validators/index.js.map +1 -0
  85. package/dist/fields/types/validators/media.d.ts +2 -0
  86. package/dist/fields/types/validators/media.d.ts.map +1 -0
  87. package/dist/fields/types/validators/media.js +3 -0
  88. package/dist/fields/types/validators/media.js.map +1 -0
  89. package/dist/fields/types/validators/relational.d.ts +2 -0
  90. package/dist/fields/types/validators/relational.d.ts.map +1 -0
  91. package/dist/fields/types/validators/relational.js +3 -0
  92. package/dist/fields/types/validators/relational.js.map +1 -0
  93. package/dist/fields/types/validators/structural.d.ts +2 -0
  94. package/dist/fields/types/validators/structural.d.ts.map +1 -0
  95. package/dist/fields/types/validators/structural.js +3 -0
  96. package/dist/fields/types/validators/structural.js.map +1 -0
  97. package/dist/fields/validation.d.ts +16 -0
  98. package/dist/fields/validation.d.ts.map +1 -0
  99. package/dist/fields/validation.js +123 -0
  100. package/dist/fields/validation.js.map +1 -0
  101. package/dist/hooks/catalog.d.ts +20 -0
  102. package/dist/hooks/catalog.d.ts.map +1 -0
  103. package/dist/hooks/catalog.js +59 -0
  104. package/dist/hooks/catalog.js.map +1 -0
  105. package/dist/hooks/points.d.ts +26 -0
  106. package/dist/hooks/points.d.ts.map +1 -0
  107. package/dist/hooks/points.js +33 -0
  108. package/dist/hooks/points.js.map +1 -0
  109. package/dist/index.d.ts +52 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +45 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/lifecycle/index.d.ts +17 -0
  114. package/dist/lifecycle/index.d.ts.map +1 -0
  115. package/dist/lifecycle/index.js +79 -0
  116. package/dist/lifecycle/index.js.map +1 -0
  117. package/dist/media/service.d.ts +32 -0
  118. package/dist/media/service.d.ts.map +1 -0
  119. package/dist/media/service.js +87 -0
  120. package/dist/media/service.js.map +1 -0
  121. package/dist/menu/service.d.ts +19 -0
  122. package/dist/menu/service.d.ts.map +1 -0
  123. package/dist/menu/service.js +64 -0
  124. package/dist/menu/service.js.map +1 -0
  125. package/dist/observability/audit.d.ts +26 -0
  126. package/dist/observability/audit.d.ts.map +1 -0
  127. package/dist/observability/audit.js +67 -0
  128. package/dist/observability/audit.js.map +1 -0
  129. package/dist/observability/event-audit.d.ts +8 -0
  130. package/dist/observability/event-audit.d.ts.map +1 -0
  131. package/dist/observability/event-audit.js +20 -0
  132. package/dist/observability/event-audit.js.map +1 -0
  133. package/dist/observability/index.d.ts +5 -0
  134. package/dist/observability/index.d.ts.map +1 -0
  135. package/dist/observability/index.js +6 -0
  136. package/dist/observability/index.js.map +1 -0
  137. package/dist/observability/logger.d.ts +13 -0
  138. package/dist/observability/logger.d.ts.map +1 -0
  139. package/dist/observability/logger.js +45 -0
  140. package/dist/observability/logger.js.map +1 -0
  141. package/dist/observability/metrics.d.ts +34 -0
  142. package/dist/observability/metrics.d.ts.map +1 -0
  143. package/dist/observability/metrics.js +56 -0
  144. package/dist/observability/metrics.js.map +1 -0
  145. package/dist/plugin/service.d.ts +32 -0
  146. package/dist/plugin/service.d.ts.map +1 -0
  147. package/dist/plugin/service.js +190 -0
  148. package/dist/plugin/service.js.map +1 -0
  149. package/dist/role/service.d.ts +19 -0
  150. package/dist/role/service.d.ts.map +1 -0
  151. package/dist/role/service.js +65 -0
  152. package/dist/role/service.js.map +1 -0
  153. package/dist/settings/service.d.ts +16 -0
  154. package/dist/settings/service.d.ts.map +1 -0
  155. package/dist/settings/service.js +64 -0
  156. package/dist/settings/service.js.map +1 -0
  157. package/dist/storage/driver.d.ts +20 -0
  158. package/dist/storage/driver.d.ts.map +1 -0
  159. package/dist/storage/driver.js +3 -0
  160. package/dist/storage/driver.js.map +1 -0
  161. package/dist/storage/drivers/local.d.ts +17 -0
  162. package/dist/storage/drivers/local.d.ts.map +1 -0
  163. package/dist/storage/drivers/local.js +88 -0
  164. package/dist/storage/drivers/local.js.map +1 -0
  165. package/dist/storage/drivers/s3.d.ts +28 -0
  166. package/dist/storage/drivers/s3.d.ts.map +1 -0
  167. package/dist/storage/drivers/s3.js +105 -0
  168. package/dist/storage/drivers/s3.js.map +1 -0
  169. package/dist/storage/index.d.ts +16 -0
  170. package/dist/storage/index.d.ts.map +1 -0
  171. package/dist/storage/index.js +58 -0
  172. package/dist/storage/index.js.map +1 -0
  173. package/dist/storage/migrator.d.ts +18 -0
  174. package/dist/storage/migrator.d.ts.map +1 -0
  175. package/dist/storage/migrator.js +46 -0
  176. package/dist/storage/migrator.js.map +1 -0
  177. package/dist/tag/service.d.ts +13 -0
  178. package/dist/tag/service.d.ts.map +1 -0
  179. package/dist/tag/service.js +37 -0
  180. package/dist/tag/service.js.map +1 -0
  181. package/dist/taxonomies/service.d.ts +50 -0
  182. package/dist/taxonomies/service.d.ts.map +1 -0
  183. package/dist/taxonomies/service.js +179 -0
  184. package/dist/taxonomies/service.js.map +1 -0
  185. package/dist/tenant/context.d.ts +9 -0
  186. package/dist/tenant/context.d.ts.map +1 -0
  187. package/dist/tenant/context.js +67 -0
  188. package/dist/tenant/context.js.map +1 -0
  189. package/dist/tenant/service.d.ts +31 -0
  190. package/dist/tenant/service.d.ts.map +1 -0
  191. package/dist/tenant/service.js +90 -0
  192. package/dist/tenant/service.js.map +1 -0
  193. package/dist/theme/service.d.ts +16 -0
  194. package/dist/theme/service.d.ts.map +1 -0
  195. package/dist/theme/service.js +57 -0
  196. package/dist/theme/service.js.map +1 -0
  197. package/dist/user/service.d.ts +31 -0
  198. package/dist/user/service.d.ts.map +1 -0
  199. package/dist/user/service.js +95 -0
  200. package/dist/user/service.js.map +1 -0
  201. 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"}