@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 @@
1
+ {"version":3,"file":"post-types.js","sourceRoot":"","sources":["../../src/content/post-types.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAgB7C,MAAM,UAAU,GAA4B;IAC1C;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,OAAO;QACpB,aAAa,EAAE,MAAM;QACrB,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;QAClE,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,IAAI;KACb;IACD;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,SAAS;QACtB,aAAa,EAAE,QAAQ;QACvB,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;QACvD,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,IAAI;KACb;CACF,CAAC;AAEF,MAAM,OAAO,gBAAgB;IACnB,QAAQ,GAAG,mBAAmB,CAAC;IAEvC,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAC7B,mEAAmE,CACpE,CAAC;QAEF,MAAM,OAAO,GAAI,MAAoD,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAChF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAC1B,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiC,CAAC;QACxD,KAAK,MAAM,QAAQ,IAAI,UAAU;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACvE,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAE7G,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAwG;QACnH,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC;QAExE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAExB,MAAM,GAAG,CAAC,MAAM,CACd;sDACgD,EAChD;YACE,EAAE;YACF,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,MAAM,IAAI,OAAO;YACvB,KAAK,CAAC,QAAQ,IAAI,IAAI;YACtB,IAAI,CAAC,SAAS,CAAC;gBACb,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC;gBAC5D,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK;gBACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK;gBACjC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;aAC7B,CAAC;YACF,KAAK,CAAC,WAAW;YACjB,KAAK,CAAC,aAAa;SACpB,CACF,CAAC;QAEF,MAAM,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,KAAqC;QAC9D,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,6CAA6C,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5F,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAwC,CAAC;QAElE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qCAAqC,CAAC,CAAC;QAEtF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAA0B,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;QAErE,MAAM,GAAG,CAAC,MAAM,CACd;uBACiB,EACjB;YACE,IAAI,CAAC,SAAS,CAAC;gBACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK;gBACtC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;aAC9B,CAAC;YACF,MAAM,CAAC,WAAW;YAClB,MAAM,CAAC,aAAa;YACpB,IAAI;SACL,CACF,CAAC;QAEF,MAAM,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qCAAqC,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,wDAAwD,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAClG,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAElC,IAAI,OAAO;YAAE,MAAM,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,SAAS,CAAC,KAAa,EAAE,MAA6B;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,eAAe,CAAC,GAA4B;QAClD,MAAM,UAAU,GAAI,GAAG,CAAC,QAAQ,CAA6B,IAAI,EAAE,CAAC;QAEpE,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACxC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC5C,MAAM,EAAG,GAAG,CAAC,QAAQ,CAAqC,IAAI,OAAO;YACrE,QAAQ,EAAG,GAAG,CAAC,WAAW,CAAmB,IAAI,IAAI;YACrD,QAAQ,EAAG,UAAU,CAAC,UAAU,CAAuC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC9F,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAC7C,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAuB;YACtD,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,KAAK;SACvC,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Content, ContentStatus } from '@oktis-works/types';
2
+ export interface PublishResult {
3
+ content: Content;
4
+ previousStatus: ContentStatus;
5
+ }
6
+ export declare class ContentPublisher {
7
+ /**
8
+ * Publish content: change status from DRAFT to PUBLISHED
9
+ */
10
+ publish(contentId: string, userId: string): Promise<PublishResult>;
11
+ /**
12
+ * Unpublish content: change status from PUBLISHED back to DRAFT
13
+ */
14
+ unpublish(contentId: string, userId: string): Promise<PublishResult>;
15
+ /**
16
+ * Archive content: change status to ARCHIVED
17
+ */
18
+ archive(contentId: string, userId: string): Promise<PublishResult>;
19
+ /**
20
+ * Restore content from TRASHED to DRAFT
21
+ */
22
+ restore(contentId: string, userId: string): Promise<PublishResult>;
23
+ private createVersionSnapshot;
24
+ }
25
+ export declare const contentPublisher: ContentPublisher;
26
+ //# sourceMappingURL=publisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../src/content/publisher.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMjE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,aAAa,CAAC;CAC/B;AAED,qBAAa,gBAAgB;IAC3B;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAsDxE;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAkD1E;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAyCxE;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAmC1D,qBAAqB;CAepC;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
@@ -0,0 +1,156 @@
1
+ // @oktis-works/core - Content Publisher
2
+ // Handles publish/unpublish workflow with versioning
3
+ import { randomUUID } from 'node:crypto';
4
+ import { getConnection } from '@oktis-works/database';
5
+ import { getHookRegistry } from '@oktis-works/plugin-runtime';
6
+ import { getEventBus } from '../events/bus.js';
7
+ import { getCache } from '../cache/index.js';
8
+ import { HOOK_POINTS } from '../hooks/points.js';
9
+ export class ContentPublisher {
10
+ /**
11
+ * Publish content: change status from DRAFT to PUBLISHED
12
+ */
13
+ async publish(contentId, userId) {
14
+ const sql = getConnection();
15
+ const existing = await sql.unsafe('SELECT * FROM content WHERE id = $1', [contentId]);
16
+ if (existing.length === 0) {
17
+ throw new Error('Content not found');
18
+ }
19
+ const content = existing[0];
20
+ const previousStatus = content.status;
21
+ if (previousStatus === 'PUBLISHED') {
22
+ throw new Error('Content is already published');
23
+ }
24
+ await getHookRegistry().doAction(HOOK_POINTS.BEFORE_PUBLISH_CONTENT(content.type), content);
25
+ const newVersion = content.version + 1;
26
+ const result = await sql.unsafe(`UPDATE content
27
+ SET status = 'PUBLISHED', published_at = NOW(), version = $1, updated_at = NOW()
28
+ WHERE id = $2
29
+ RETURNING *`, [String(newVersion), contentId]);
30
+ const updatedContent = result[0];
31
+ // Create version snapshot
32
+ await this.createVersionSnapshot(updatedContent, newVersion, userId);
33
+ await getHookRegistry().doAction(HOOK_POINTS.AFTER_PUBLISH_CONTENT(content.type), updatedContent, { previousStatus });
34
+ // Emit event
35
+ const eventBus = getEventBus();
36
+ await eventBus.emit({
37
+ id: randomUUID(),
38
+ type: 'content.published',
39
+ aggregateType: 'content',
40
+ aggregateId: contentId,
41
+ payload: { content: updatedContent, previousStatus },
42
+ processed: false,
43
+ createdAt: new Date(),
44
+ });
45
+ // Invalidate cache
46
+ const cache = getCache();
47
+ await cache.del(`content:${contentId}`);
48
+ await cache.del(`content:slug:${updatedContent.slug}`);
49
+ return { content: updatedContent, previousStatus };
50
+ }
51
+ /**
52
+ * Unpublish content: change status from PUBLISHED back to DRAFT
53
+ */
54
+ async unpublish(contentId, userId) {
55
+ const sql = getConnection();
56
+ const existing = await sql.unsafe('SELECT * FROM content WHERE id = $1', [contentId]);
57
+ if (existing.length === 0) {
58
+ throw new Error('Content not found');
59
+ }
60
+ const content = existing[0];
61
+ const previousStatus = content.status;
62
+ if (previousStatus !== 'PUBLISHED') {
63
+ throw new Error('Content is not published');
64
+ }
65
+ const newVersion = content.version + 1;
66
+ const result = await sql.unsafe(`UPDATE content
67
+ SET status = 'DRAFT', published_at = NULL, version = $1, updated_at = NOW()
68
+ WHERE id = $2
69
+ RETURNING *`, [String(newVersion), contentId]);
70
+ const updatedContent = result[0];
71
+ // Create version snapshot
72
+ await this.createVersionSnapshot(updatedContent, newVersion, userId);
73
+ // Emit event
74
+ const eventBus = getEventBus();
75
+ await eventBus.emit({
76
+ id: randomUUID(),
77
+ type: 'content.unpublished',
78
+ aggregateType: 'content',
79
+ aggregateId: contentId,
80
+ payload: { content: updatedContent, previousStatus },
81
+ processed: false,
82
+ createdAt: new Date(),
83
+ });
84
+ // Invalidate cache
85
+ const cache = getCache();
86
+ await cache.del(`content:${contentId}`);
87
+ await cache.del(`content:slug:${updatedContent.slug}`);
88
+ return { content: updatedContent, previousStatus };
89
+ }
90
+ /**
91
+ * Archive content: change status to ARCHIVED
92
+ */
93
+ async archive(contentId, userId) {
94
+ const sql = getConnection();
95
+ const existing = await sql.unsafe('SELECT * FROM content WHERE id = $1', [contentId]);
96
+ if (existing.length === 0) {
97
+ throw new Error('Content not found');
98
+ }
99
+ const content = existing[0];
100
+ const previousStatus = content.status;
101
+ const newVersion = content.version + 1;
102
+ const result = await sql.unsafe(`UPDATE content
103
+ SET status = 'ARCHIVED', version = $1, updated_at = NOW()
104
+ WHERE id = $2
105
+ RETURNING *`, [String(newVersion), contentId]);
106
+ const updatedContent = result[0];
107
+ await this.createVersionSnapshot(updatedContent, newVersion, userId);
108
+ const eventBus = getEventBus();
109
+ await eventBus.emit({
110
+ id: randomUUID(),
111
+ type: 'content.archived',
112
+ aggregateType: 'content',
113
+ aggregateId: contentId,
114
+ payload: { content: updatedContent, previousStatus },
115
+ processed: false,
116
+ createdAt: new Date(),
117
+ });
118
+ const cache = getCache();
119
+ await cache.del(`content:${contentId}`);
120
+ return { content: updatedContent, previousStatus };
121
+ }
122
+ /**
123
+ * Restore content from TRASHED to DRAFT
124
+ */
125
+ async restore(contentId, userId) {
126
+ const sql = getConnection();
127
+ const existing = await sql.unsafe('SELECT * FROM content WHERE id = $1', [contentId]);
128
+ if (existing.length === 0) {
129
+ throw new Error('Content not found');
130
+ }
131
+ const content = existing[0];
132
+ const previousStatus = content.status;
133
+ if (previousStatus !== 'TRASHED') {
134
+ throw new Error('Content is not trashed');
135
+ }
136
+ const newVersion = content.version + 1;
137
+ const result = await sql.unsafe(`UPDATE content
138
+ SET status = 'DRAFT', version = $1, updated_at = NOW()
139
+ WHERE id = $2
140
+ RETURNING *`, [String(newVersion), contentId]);
141
+ const updatedContent = result[0];
142
+ await this.createVersionSnapshot(updatedContent, newVersion, userId);
143
+ const cache = getCache();
144
+ await cache.del(`content:${contentId}`);
145
+ return { content: updatedContent, previousStatus };
146
+ }
147
+ async createVersionSnapshot(content, version, authorId) {
148
+ const sql = getConnection();
149
+ const bodyJson = content.body ? JSON.stringify(content.body) : null;
150
+ const metadataJson = content.metadata ? JSON.stringify(content.metadata) : '{}';
151
+ await sql.unsafe(`INSERT INTO content_versions (id, content_id, version, title, body, metadata, author_id)
152
+ VALUES ($1, $2, $3, $4, $5::jsonb, $6::jsonb, $7)`, [randomUUID(), content.id, String(version), content.title, bodyJson, metadataJson, authorId]);
153
+ }
154
+ }
155
+ export const contentPublisher = new ContentPublisher();
156
+ //# sourceMappingURL=publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/content/publisher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { Content, ContentVersion, ContentStatus } from '@oktis-works/types';
2
+ export interface CreateContentInput {
3
+ type: string;
4
+ title: string;
5
+ slug?: string;
6
+ body?: Record<string, unknown>;
7
+ excerpt?: string;
8
+ status?: ContentStatus;
9
+ authorId: string;
10
+ featuredImageId?: string;
11
+ seoTitle?: string;
12
+ seoDescription?: string;
13
+ metadata?: Record<string, unknown>;
14
+ /** Override de layout/template (content.layout) resolvido pelo theme runtime. */
15
+ layout?: string | null;
16
+ }
17
+ export interface UpdateContentInput {
18
+ title?: string;
19
+ slug?: string;
20
+ body?: Record<string, unknown>;
21
+ excerpt?: string;
22
+ status?: ContentStatus;
23
+ featuredImageId?: string;
24
+ seoTitle?: string;
25
+ seoDescription?: string;
26
+ metadata?: Record<string, unknown>;
27
+ /** Override de layout/template (content.layout); string vazia limpa o override. */
28
+ layout?: string | null;
29
+ }
30
+ export declare class ContentService {
31
+ list(options: {
32
+ page?: number;
33
+ limit?: number;
34
+ type?: string;
35
+ status?: ContentStatus;
36
+ search?: string;
37
+ }): Promise<{
38
+ data: Content[];
39
+ total: number;
40
+ }>;
41
+ getById(id: string): Promise<Content | null>;
42
+ getByIdBatch(ids: string[]): Promise<Map<string, Content>>;
43
+ getBySlug(slug: string, type?: string): Promise<Content | null>;
44
+ create(rawInput: CreateContentInput): Promise<Content>;
45
+ update(id: string, input: UpdateContentInput): Promise<Content | null>;
46
+ delete(id: string): Promise<boolean>;
47
+ getVersions(contentId: string): Promise<ContentVersion[]>;
48
+ getRevisions(contentId: string): Promise<ContentVersion[]>;
49
+ restoreRevision(contentId: string, revisionIdOrVersion: string): Promise<Content | null>;
50
+ private recordSnapshot;
51
+ }
52
+ export declare const contentService: ContentService;
53
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/content/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOjF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAqCD,qBAAa,cAAc;IACnB,IAAI,CAAC,OAAO,EAAE;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,aAAa,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAyCzC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAuB5C,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAkB1D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAU/D,MAAM,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAmDtD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAuGtE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+BpC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAYzD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAI1D,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YAoEhF,cAAc;CAyB7B;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -0,0 +1,335 @@
1
+ // @oktis-works/core - Content Service
2
+ import { randomUUID } from 'node:crypto';
3
+ import { getConnection } from '@oktis-works/database';
4
+ import { getHookRegistry } from '@oktis-works/plugin-runtime';
5
+ import { getEventBus } from '../events/bus.js';
6
+ import { getCache } from '../cache/index.js';
7
+ import { HOOK_POINTS } from '../hooks/points.js';
8
+ import { postTypeRegistry } from './post-types.js';
9
+ const FIELD_SUPPORT_REQUIREMENT = {
10
+ title: 'title',
11
+ body: 'editor',
12
+ excerpt: 'excerpt',
13
+ featuredImageId: 'thumbnail',
14
+ };
15
+ async function stripUnsupportedFields(type, input) {
16
+ const result = { ...input };
17
+ const definition = await postTypeRegistry.getBySlug(type);
18
+ const supports = new Set(definition?.supports ?? ['title', 'editor']);
19
+ for (const [field, support] of Object.entries(FIELD_SUPPORT_REQUIREMENT)) {
20
+ if (!supports.has(support))
21
+ delete result[field];
22
+ }
23
+ return result;
24
+ }
25
+ async function typeSupports(type, support) {
26
+ if (!type)
27
+ return false;
28
+ const definition = await postTypeRegistry.getBySlug(type);
29
+ return definition?.supports?.includes(support) ?? false;
30
+ }
31
+ function generateSlug(title) {
32
+ return title
33
+ .toLowerCase()
34
+ .normalize('NFD')
35
+ .replace(/[\u0300-\u036f]/g, '')
36
+ .replace(/[^a-z0-9]+/g, '-')
37
+ .replace(/(^-|-$)/g, '');
38
+ }
39
+ export class ContentService {
40
+ async list(options) {
41
+ const sql = getConnection();
42
+ const { page = 1, limit = 20, type, status, search } = options;
43
+ const offset = (page - 1) * limit;
44
+ let whereClause = 'WHERE 1=1';
45
+ const params = [];
46
+ if (type) {
47
+ whereClause += ` AND type = $${params.length + 1}`;
48
+ params.push(type);
49
+ }
50
+ if (status) {
51
+ whereClause += ` AND status = $${params.length + 1}`;
52
+ params.push(status);
53
+ }
54
+ if (search) {
55
+ whereClause += ` AND (title ILIKE $${params.length + 1} OR slug ILIKE $${params.length + 2})`;
56
+ params.push(`%${search}%`);
57
+ params.push(`%${search}%`);
58
+ }
59
+ // Lista com JOIN opcional para evitar N+1 em author/media quando expand=true (query param futuro)
60
+ const dataResult = await sql.unsafe(`SELECT c.* FROM content c ${whereClause} ORDER BY c.created_at DESC LIMIT ${limit} OFFSET ${offset}`.replace('WHERE 1=1', 'WHERE 1=1'), params);
61
+ const countResult = await sql.unsafe(`SELECT COUNT(*)::int as total FROM content ${whereClause}`, params);
62
+ const registry = getHookRegistry();
63
+ const filteredData = (await registry.applyFiltersAsync(HOOK_POINTS.CONTENT_QUERY, dataResult));
64
+ return {
65
+ data: filteredData,
66
+ total: Number(countResult[0]?.['total'] ?? 0),
67
+ };
68
+ }
69
+ async getById(id) {
70
+ const sql = getConnection();
71
+ const cache = getCache();
72
+ const cacheKey = `content:${id}`;
73
+ const cached = await cache.get(cacheKey);
74
+ if (cached)
75
+ return cached;
76
+ // Eager loading: content + author + featuredImage metadata em query única (evita N+1)
77
+ const result = await sql.unsafe(`SELECT c.*,
78
+ json_build_object('id', u.id, 'name', u.name, 'email', u.email) AS author,
79
+ json_build_object('id', m.id, 'url', m.url, 'mimeType', m.mime_type) AS featuredImage
80
+ FROM content c
81
+ LEFT JOIN users u ON u.id = c.author_id
82
+ LEFT JOIN media m ON m.id = c.featured_image_id
83
+ WHERE c.id = $1`, [id]);
84
+ const content = result[0] ?? null;
85
+ if (content)
86
+ await cache.set(cacheKey, content, 60);
87
+ return content;
88
+ }
89
+ async getByIdBatch(ids) {
90
+ if (ids.length === 0)
91
+ return new Map();
92
+ const sql = getConnection();
93
+ const result = await sql.unsafe(`SELECT c.*,
94
+ json_build_object('id', u.id, 'name', u.name) AS author
95
+ FROM content c LEFT JOIN users u ON u.id = c.author_id
96
+ WHERE c.id = ANY($1::uuid[])`, [ids]);
97
+ const map = new Map();
98
+ for (const row of result) {
99
+ const r = row;
100
+ map.set(String(r['id']), row);
101
+ }
102
+ return map;
103
+ }
104
+ async getBySlug(slug, type) {
105
+ const sql = getConnection();
106
+ if (type) {
107
+ const result = await sql.unsafe('SELECT * FROM content WHERE slug = $1 AND type = $2', [slug, type]);
108
+ return result[0] ?? null;
109
+ }
110
+ const result = await sql.unsafe('SELECT * FROM content WHERE slug = $1', [slug]);
111
+ return result[0] ?? null;
112
+ }
113
+ async create(rawInput) {
114
+ const sql = getConnection();
115
+ const registry = getHookRegistry();
116
+ const input = (await stripUnsupportedFields(rawInput.type, rawInput));
117
+ const filteredInput = (await registry.applyFiltersAsync(HOOK_POINTS.BEFORE_SAVE_CONTENT(input.type), input.body ?? {}, { operation: 'create', title: input.title, slug: input.slug }));
118
+ const id = randomUUID();
119
+ const slug = input.slug ?? generateSlug(input.title);
120
+ const status = input.status ?? 'DRAFT';
121
+ const bodyJson = JSON.stringify(filteredInput);
122
+ const metadataJson = JSON.stringify(input.metadata ?? {});
123
+ const result = await sql.unsafe(`INSERT INTO content (id, tenant_id, type, title, slug, body, excerpt, status, author_id, featured_image_id, seo_title, seo_description, metadata, layout)
124
+ VALUES ($1, $2, $3, $4, $5, $6::jsonb, $7, $8, $9, $10, $11, $12, $13::jsonb, $14)
125
+ RETURNING *`, [id, input.authorId, input.type, input.title, slug, bodyJson, input.excerpt ?? null, status, input.authorId, input.featuredImageId ?? null, input.seoTitle ?? null, input.seoDescription ?? null, metadataJson, input.layout ?? null]);
126
+ const content = result[0];
127
+ if (await typeSupports(content.type, 'revisions')) {
128
+ await this.recordSnapshot(content);
129
+ }
130
+ await registry.doAction(HOOK_POINTS.AFTER_SAVE_CONTENT(input.type), content, { operation: 'create' });
131
+ const eventBus = getEventBus();
132
+ await eventBus.emit({
133
+ id: randomUUID(),
134
+ type: 'content.created',
135
+ aggregateType: 'content',
136
+ aggregateId: content.id,
137
+ payload: { content },
138
+ processed: false,
139
+ createdAt: new Date(),
140
+ });
141
+ const cache = getCache();
142
+ await cache.del(`content:${content.id}`);
143
+ await cache.del(`content:slug:${content.slug}`);
144
+ return content;
145
+ }
146
+ async update(id, input) {
147
+ const sql = getConnection();
148
+ const registry = getHookRegistry();
149
+ const existing = await this.getById(id);
150
+ if (!existing)
151
+ return null;
152
+ input = (await stripUnsupportedFields(existing.type, input));
153
+ if (input.body !== undefined) {
154
+ input.body = (await registry.applyFiltersAsync(HOOK_POINTS.BEFORE_SAVE_CONTENT(existing.type), input.body, { operation: 'update', title: input.title, slug: input.slug, id }));
155
+ }
156
+ if (await typeSupports(existing.type, 'revisions')) {
157
+ await this.recordSnapshot(existing);
158
+ }
159
+ const newVersion = existing.version + 1;
160
+ const setClauses = [];
161
+ const setParams = [];
162
+ if (input.title !== undefined) {
163
+ setClauses.push(`title = $${setParams.length + 1}`);
164
+ setParams.push(input.title);
165
+ }
166
+ if (input.slug !== undefined) {
167
+ setClauses.push(`slug = $${setParams.length + 1}`);
168
+ setParams.push(input.slug);
169
+ }
170
+ if (input.body !== undefined) {
171
+ setClauses.push(`body = $${setParams.length + 1}::jsonb`);
172
+ setParams.push(JSON.stringify(input.body));
173
+ }
174
+ if (input.excerpt !== undefined) {
175
+ setClauses.push(`excerpt = $${setParams.length + 1}`);
176
+ setParams.push(input.excerpt);
177
+ }
178
+ if (input.status !== undefined) {
179
+ setClauses.push(`status = $${setParams.length + 1}`);
180
+ setParams.push(input.status);
181
+ }
182
+ if (input.featuredImageId !== undefined) {
183
+ setClauses.push(`featured_image_id = $${setParams.length + 1}`);
184
+ setParams.push(input.featuredImageId);
185
+ }
186
+ if (input.seoTitle !== undefined) {
187
+ setClauses.push(`seo_title = $${setParams.length + 1}`);
188
+ setParams.push(input.seoTitle);
189
+ }
190
+ if (input.seoDescription !== undefined) {
191
+ setClauses.push(`seo_description = $${setParams.length + 1}`);
192
+ setParams.push(input.seoDescription);
193
+ }
194
+ if (input.metadata !== undefined) {
195
+ setClauses.push(`metadata = $${setParams.length + 1}::jsonb`);
196
+ setParams.push(JSON.stringify(input.metadata));
197
+ }
198
+ if (input.layout !== undefined) {
199
+ setClauses.push(`layout = $${setParams.length + 1}`);
200
+ setParams.push(input.layout ? input.layout : null);
201
+ }
202
+ setClauses.push(`version = $${setParams.length + 1}`);
203
+ setParams.push(String(newVersion));
204
+ if (input.status === 'PUBLISHED') {
205
+ setClauses.push(`published_at = CASE WHEN status != 'PUBLISHED' THEN NOW() ELSE published_at END`);
206
+ }
207
+ setParams.push(id);
208
+ const whereParam = setParams.length;
209
+ const result = await sql.unsafe(`UPDATE content SET ${setClauses.join(', ')} WHERE id = $${whereParam} RETURNING *`, setParams);
210
+ const content = result[0];
211
+ await registry.doAction(HOOK_POINTS.AFTER_SAVE_CONTENT(content.type), content, { operation: 'update', previousVersion: existing.version });
212
+ const eventBus = getEventBus();
213
+ await eventBus.emit({
214
+ id: randomUUID(),
215
+ type: 'content.updated',
216
+ aggregateType: 'content',
217
+ aggregateId: content.id,
218
+ payload: { content, previousVersion: existing.version },
219
+ processed: false,
220
+ createdAt: new Date(),
221
+ });
222
+ const cache = getCache();
223
+ await cache.del(`content:${content.id}`);
224
+ await cache.del(`content:slug:${content.slug}`);
225
+ return content;
226
+ }
227
+ async delete(id) {
228
+ const sql = getConnection();
229
+ const registry = getHookRegistry();
230
+ const existing = await this.getById(id);
231
+ if (!existing)
232
+ return false;
233
+ await registry.doAction(HOOK_POINTS.BEFORE_DELETE_CONTENT(existing.type), existing);
234
+ await sql.unsafe('UPDATE content SET status = $1 WHERE id = $2', ['TRASHED', id]);
235
+ await registry.doAction(HOOK_POINTS.AFTER_DELETE_CONTENT(existing.type), existing);
236
+ const eventBus = getEventBus();
237
+ await eventBus.emit({
238
+ id: randomUUID(),
239
+ type: 'content.deleted',
240
+ aggregateType: 'content',
241
+ aggregateId: id,
242
+ payload: { content: existing },
243
+ processed: false,
244
+ createdAt: new Date(),
245
+ });
246
+ const cache = getCache();
247
+ await cache.del(`content:${id}`);
248
+ await cache.del(`content:slug:${existing.slug}`);
249
+ return true;
250
+ }
251
+ async getVersions(contentId) {
252
+ const sql = getConnection();
253
+ const result = await sql.unsafe(`SELECT id, content_id AS "contentId", version, title, slug, body, excerpt,
254
+ featured_image_id AS "featuredImageId", seo_title AS "seoTitle",
255
+ seo_description AS "seoDescription", metadata, author_id AS "authorId", created_at AS "createdAt"
256
+ FROM content_versions WHERE content_id = $1 ORDER BY version DESC`, [contentId]);
257
+ return result;
258
+ }
259
+ async getRevisions(contentId) {
260
+ return this.getVersions(contentId);
261
+ }
262
+ async restoreRevision(contentId, revisionIdOrVersion) {
263
+ const sql = getConnection();
264
+ const current = await this.getById(contentId);
265
+ if (!current)
266
+ return null;
267
+ const revisionResult = await sql.unsafe('SELECT * FROM content_versions WHERE id::text = $1 AND content_id = $2 LIMIT 1', [revisionIdOrVersion, contentId]);
268
+ let revision = revisionResult[0] ?? null;
269
+ if (!revision && /^\d+$/.test(revisionIdOrVersion)) {
270
+ const byVersion = await sql.unsafe('SELECT * FROM content_versions WHERE version = $1 AND content_id = $2 ORDER BY created_at DESC LIMIT 1', [Number(revisionIdOrVersion), contentId]);
271
+ revision = byVersion[0] ?? null;
272
+ }
273
+ if (!revision)
274
+ return null;
275
+ await this.recordSnapshot(current);
276
+ const result = await sql.unsafe(`UPDATE content SET
277
+ title = $1,
278
+ slug = $2,
279
+ body = $3::jsonb,
280
+ excerpt = $4,
281
+ featured_image_id = $5,
282
+ seo_title = $6,
283
+ seo_description = $7,
284
+ metadata = $8::jsonb,
285
+ updated_at = NOW()
286
+ WHERE id = $9 RETURNING *`, [
287
+ String(revision['title']),
288
+ revision['slug'] != null ? String(revision['slug']) : current.slug,
289
+ revision['body'] != null ? JSON.stringify(revision['body']) : null,
290
+ revision['excerpt'] != null ? String(revision['excerpt']) : null,
291
+ revision['featured_image_id'] != null ? String(revision['featured_image_id']) : null,
292
+ revision['seo_title'] != null ? String(revision['seo_title']) : null,
293
+ revision['seo_description'] != null ? String(revision['seo_description']) : null,
294
+ revision['metadata'] != null ? JSON.stringify(revision['metadata']) : '{}',
295
+ contentId,
296
+ ]);
297
+ const restored = result[0];
298
+ const eventBus = getEventBus();
299
+ await eventBus.emit({
300
+ id: randomUUID(),
301
+ type: 'content.revision.restored',
302
+ aggregateType: 'content',
303
+ aggregateId: contentId,
304
+ payload: { contentId, revisionId: String(revision['id']), restoredBy: restored.version },
305
+ processed: false,
306
+ createdAt: new Date(),
307
+ });
308
+ const cache = getCache();
309
+ await cache.del(`content:${contentId}`);
310
+ await cache.del(`content:slug:${restored.slug}`);
311
+ return restored;
312
+ }
313
+ async recordSnapshot(content) {
314
+ const sql = getConnection();
315
+ const raw = content;
316
+ const values = [
317
+ randomUUID(),
318
+ content.id,
319
+ Number(content.version),
320
+ content.title,
321
+ typeof raw['slug'] === 'string' ? raw['slug'] : null,
322
+ content.body ? JSON.stringify(content.body) : null,
323
+ typeof raw['excerpt'] === 'string' ? raw['excerpt'] : null,
324
+ typeof raw['featured_image_id'] === 'string' ? raw['featured_image_id'] : null,
325
+ typeof raw['seo_title'] === 'string' ? raw['seo_title'] : null,
326
+ typeof raw['seo_description'] === 'string' ? raw['seo_description'] : null,
327
+ JSON.stringify(content.metadata ?? {}),
328
+ content.authorId ?? null,
329
+ ];
330
+ await sql.unsafe(`INSERT INTO content_versions (id, content_id, version, title, slug, body, excerpt, featured_image_id, seo_title, seo_description, metadata, author_id)
331
+ VALUES ($1, $2, $3, $4, $5, $6::jsonb, $7, $8, $9, $10, $11::jsonb, $12)`, values);
332
+ }
333
+ }
334
+ export const contentService = new ContentService();
335
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/content/service.ts"],"names":[],"mappings":"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"}