@endora-commerce/mod-blog 0.100.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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/admin/api/blog-client.d.ts +70 -0
  4. package/dist/admin/api/blog-client.d.ts.map +1 -0
  5. package/dist/admin/api/blog-client.js +137 -0
  6. package/dist/admin/api/blog-client.js.map +1 -0
  7. package/dist/admin/components/CategoryTreeNode.d.ts +25 -0
  8. package/dist/admin/components/CategoryTreeNode.d.ts.map +1 -0
  9. package/dist/admin/components/CategoryTreeNode.js +14 -0
  10. package/dist/admin/components/CategoryTreeNode.js.map +1 -0
  11. package/dist/admin/components/PostStatusBadge.d.ts +7 -0
  12. package/dist/admin/components/PostStatusBadge.d.ts.map +1 -0
  13. package/dist/admin/components/PostStatusBadge.js +16 -0
  14. package/dist/admin/components/PostStatusBadge.js.map +1 -0
  15. package/dist/admin/components/RelatedPostsPicker.d.ts +11 -0
  16. package/dist/admin/components/RelatedPostsPicker.d.ts.map +1 -0
  17. package/dist/admin/components/RelatedPostsPicker.js +77 -0
  18. package/dist/admin/components/RelatedPostsPicker.js.map +1 -0
  19. package/dist/admin/components/RelatedProductsPicker.d.ts +9 -0
  20. package/dist/admin/components/RelatedProductsPicker.d.ts.map +1 -0
  21. package/dist/admin/components/RelatedProductsPicker.js +66 -0
  22. package/dist/admin/components/RelatedProductsPicker.js.map +1 -0
  23. package/dist/admin/components/TagPicker.d.ts +9 -0
  24. package/dist/admin/components/TagPicker.d.ts.map +1 -0
  25. package/dist/admin/components/TagPicker.js +66 -0
  26. package/dist/admin/components/TagPicker.js.map +1 -0
  27. package/dist/admin/index.d.ts +33 -0
  28. package/dist/admin/index.d.ts.map +1 -0
  29. package/dist/admin/index.js +114 -0
  30. package/dist/admin/index.js.map +1 -0
  31. package/dist/admin/pages/BlogCategoryEditor.d.ts +9 -0
  32. package/dist/admin/pages/BlogCategoryEditor.d.ts.map +1 -0
  33. package/dist/admin/pages/BlogCategoryEditor.js +196 -0
  34. package/dist/admin/pages/BlogCategoryEditor.js.map +1 -0
  35. package/dist/admin/pages/BlogCategoryTreePage.d.ts +9 -0
  36. package/dist/admin/pages/BlogCategoryTreePage.d.ts.map +1 -0
  37. package/dist/admin/pages/BlogCategoryTreePage.js +122 -0
  38. package/dist/admin/pages/BlogCategoryTreePage.js.map +1 -0
  39. package/dist/admin/pages/BlogPostEditor.d.ts +9 -0
  40. package/dist/admin/pages/BlogPostEditor.d.ts.map +1 -0
  41. package/dist/admin/pages/BlogPostEditor.js +314 -0
  42. package/dist/admin/pages/BlogPostEditor.js.map +1 -0
  43. package/dist/admin/pages/BlogPostListPage.d.ts +9 -0
  44. package/dist/admin/pages/BlogPostListPage.d.ts.map +1 -0
  45. package/dist/admin/pages/BlogPostListPage.js +75 -0
  46. package/dist/admin/pages/BlogPostListPage.js.map +1 -0
  47. package/dist/admin/pages/BlogTagListPage.d.ts +9 -0
  48. package/dist/admin/pages/BlogTagListPage.d.ts.map +1 -0
  49. package/dist/admin/pages/BlogTagListPage.js +145 -0
  50. package/dist/admin/pages/BlogTagListPage.js.map +1 -0
  51. package/dist/backend/entities/blog-category-language.entity.d.ts +11 -0
  52. package/dist/backend/entities/blog-category-language.entity.d.ts.map +1 -0
  53. package/dist/backend/entities/blog-category-language.entity.js +35 -0
  54. package/dist/backend/entities/blog-category-language.entity.js.map +1 -0
  55. package/dist/backend/entities/blog-category-sales-channel.entity.d.ts +17 -0
  56. package/dist/backend/entities/blog-category-sales-channel.entity.d.ts.map +1 -0
  57. package/dist/backend/entities/blog-category-sales-channel.entity.js +48 -0
  58. package/dist/backend/entities/blog-category-sales-channel.entity.js.map +1 -0
  59. package/dist/backend/entities/blog-category.entity.d.ts +32 -0
  60. package/dist/backend/entities/blog-category.entity.d.ts.map +1 -0
  61. package/dist/backend/entities/blog-category.entity.js +113 -0
  62. package/dist/backend/entities/blog-category.entity.js.map +1 -0
  63. package/dist/backend/entities/blog-post-category.entity.d.ts +10 -0
  64. package/dist/backend/entities/blog-post-category.entity.d.ts.map +1 -0
  65. package/dist/backend/entities/blog-post-category.entity.js +34 -0
  66. package/dist/backend/entities/blog-post-category.entity.js.map +1 -0
  67. package/dist/backend/entities/blog-post-language.entity.d.ts +9 -0
  68. package/dist/backend/entities/blog-post-language.entity.d.ts.map +1 -0
  69. package/dist/backend/entities/blog-post-language.entity.js +33 -0
  70. package/dist/backend/entities/blog-post-language.entity.js.map +1 -0
  71. package/dist/backend/entities/blog-post-related-post.entity.d.ts +15 -0
  72. package/dist/backend/entities/blog-post-related-post.entity.d.ts.map +1 -0
  73. package/dist/backend/entities/blog-post-related-post.entity.js +42 -0
  74. package/dist/backend/entities/blog-post-related-post.entity.js.map +1 -0
  75. package/dist/backend/entities/blog-post-related-product.entity.d.ts +14 -0
  76. package/dist/backend/entities/blog-post-related-product.entity.d.ts.map +1 -0
  77. package/dist/backend/entities/blog-post-related-product.entity.js +41 -0
  78. package/dist/backend/entities/blog-post-related-product.entity.js.map +1 -0
  79. package/dist/backend/entities/blog-post-sales-channel.entity.d.ts +16 -0
  80. package/dist/backend/entities/blog-post-sales-channel.entity.d.ts.map +1 -0
  81. package/dist/backend/entities/blog-post-sales-channel.entity.js +47 -0
  82. package/dist/backend/entities/blog-post-sales-channel.entity.js.map +1 -0
  83. package/dist/backend/entities/blog-post-tag.entity.d.ts +14 -0
  84. package/dist/backend/entities/blog-post-tag.entity.d.ts.map +1 -0
  85. package/dist/backend/entities/blog-post-tag.entity.js +41 -0
  86. package/dist/backend/entities/blog-post-tag.entity.js.map +1 -0
  87. package/dist/backend/entities/blog-post.entity.d.ts +31 -0
  88. package/dist/backend/entities/blog-post.entity.d.ts.map +1 -0
  89. package/dist/backend/entities/blog-post.entity.js +106 -0
  90. package/dist/backend/entities/blog-post.entity.js.map +1 -0
  91. package/dist/backend/entities/blog-tag.entity.d.ts +18 -0
  92. package/dist/backend/entities/blog-tag.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/blog-tag.entity.js +66 -0
  94. package/dist/backend/entities/blog-tag.entity.js.map +1 -0
  95. package/dist/backend/index.d.ts +100 -0
  96. package/dist/backend/index.d.ts.map +1 -0
  97. package/dist/backend/index.js +182 -0
  98. package/dist/backend/index.js.map +1 -0
  99. package/dist/backend/routes.admin.d.ts +12 -0
  100. package/dist/backend/routes.admin.d.ts.map +1 -0
  101. package/dist/backend/routes.admin.js +148 -0
  102. package/dist/backend/routes.admin.js.map +1 -0
  103. package/dist/backend/routes.storefront.d.ts +6 -0
  104. package/dist/backend/routes.storefront.d.ts.map +1 -0
  105. package/dist/backend/routes.storefront.js +72 -0
  106. package/dist/backend/routes.storefront.js.map +1 -0
  107. package/dist/backend/services/blog-asset-references.d.ts +4 -0
  108. package/dist/backend/services/blog-asset-references.d.ts.map +1 -0
  109. package/dist/backend/services/blog-asset-references.js +79 -0
  110. package/dist/backend/services/blog-asset-references.js.map +1 -0
  111. package/dist/backend/services/blog-cache.d.ts +55 -0
  112. package/dist/backend/services/blog-cache.d.ts.map +1 -0
  113. package/dist/backend/services/blog-cache.js +111 -0
  114. package/dist/backend/services/blog-cache.js.map +1 -0
  115. package/dist/backend/services/blog-category-service.d.ts +53 -0
  116. package/dist/backend/services/blog-category-service.d.ts.map +1 -0
  117. package/dist/backend/services/blog-category-service.js +446 -0
  118. package/dist/backend/services/blog-category-service.js.map +1 -0
  119. package/dist/backend/services/blog-language-reference.d.ts +18 -0
  120. package/dist/backend/services/blog-language-reference.d.ts.map +1 -0
  121. package/dist/backend/services/blog-language-reference.js +43 -0
  122. package/dist/backend/services/blog-language-reference.js.map +1 -0
  123. package/dist/backend/services/blog-post-service.d.ts +79 -0
  124. package/dist/backend/services/blog-post-service.d.ts.map +1 -0
  125. package/dist/backend/services/blog-post-service.js +539 -0
  126. package/dist/backend/services/blog-post-service.js.map +1 -0
  127. package/dist/backend/services/blog-settings-resolver.d.ts +36 -0
  128. package/dist/backend/services/blog-settings-resolver.d.ts.map +1 -0
  129. package/dist/backend/services/blog-settings-resolver.js +68 -0
  130. package/dist/backend/services/blog-settings-resolver.js.map +1 -0
  131. package/dist/backend/services/blog-slug-collision.d.ts +35 -0
  132. package/dist/backend/services/blog-slug-collision.d.ts.map +1 -0
  133. package/dist/backend/services/blog-slug-collision.js +84 -0
  134. package/dist/backend/services/blog-slug-collision.js.map +1 -0
  135. package/dist/backend/services/blog-storefront-resolver.d.ts +107 -0
  136. package/dist/backend/services/blog-storefront-resolver.d.ts.map +1 -0
  137. package/dist/backend/services/blog-storefront-resolver.js +492 -0
  138. package/dist/backend/services/blog-storefront-resolver.js.map +1 -0
  139. package/dist/backend/services/blog-tag-service.d.ts +45 -0
  140. package/dist/backend/services/blog-tag-service.d.ts.map +1 -0
  141. package/dist/backend/services/blog-tag-service.js +198 -0
  142. package/dist/backend/services/blog-tag-service.js.map +1 -0
  143. package/dist/backend/services/seed-default-category.d.ts +25 -0
  144. package/dist/backend/services/seed-default-category.d.ts.map +1 -0
  145. package/dist/backend/services/seed-default-category.js +48 -0
  146. package/dist/backend/services/seed-default-category.js.map +1 -0
  147. package/dist/backend/services/seed-roles.d.ts +41 -0
  148. package/dist/backend/services/seed-roles.d.ts.map +1 -0
  149. package/dist/backend/services/seed-roles.js +98 -0
  150. package/dist/backend/services/seed-roles.js.map +1 -0
  151. package/dist/manifest.d.ts +226 -0
  152. package/dist/manifest.d.ts.map +1 -0
  153. package/dist/manifest.js +236 -0
  154. package/dist/manifest.js.map +1 -0
  155. package/dist/migrations/20260506T081055_blog_init.d.ts +33 -0
  156. package/dist/migrations/20260506T081055_blog_init.d.ts.map +1 -0
  157. package/dist/migrations/20260506T081055_blog_init.js +260 -0
  158. package/dist/migrations/20260506T081055_blog_init.js.map +1 -0
  159. package/dist/migrations/20260903T101744_blog_namespace_block_names.d.ts +6 -0
  160. package/dist/migrations/20260903T101744_blog_namespace_block_names.d.ts.map +1 -0
  161. package/dist/migrations/20260903T101744_blog_namespace_block_names.js +58 -0
  162. package/dist/migrations/20260903T101744_blog_namespace_block_names.js.map +1 -0
  163. package/dist/migrations/index.d.ts +34 -0
  164. package/dist/migrations/index.d.ts.map +1 -0
  165. package/dist/migrations/index.js +37 -0
  166. package/dist/migrations/index.js.map +1 -0
  167. package/docs/blog/index.md +199 -0
  168. package/i18n/en.json +166 -0
  169. package/i18n/pl.json +166 -0
  170. package/package.json +108 -0
  171. package/tailwind.css +14 -0
@@ -0,0 +1,18 @@
1
+ import type { DictionaryReferenceRegistryPort } from '@endora-commerce/contracts';
2
+ import type { EntityManager } from '@mikro-orm/postgresql';
3
+ /**
4
+ * Who in `blog` still points at a language (feature 077, D-87).
5
+ *
6
+ * Two descriptors, one per table: `languages` used to count both itself, and
7
+ * `dictionaries`' orphan report joined both a second time. Both statements
8
+ * named this module's tables in strings no import-level boundary check can
9
+ * see.
10
+ *
11
+ * Contributed whatever this module's effective state, and blocking while it
12
+ * is off: a switched-off blog still owns rows carrying the language code, so
13
+ * deleting the language would leave them dangling the moment an operator
14
+ * switches the blog back on. That is the registry's stated enumeration
15
+ * policy, and the reason it is `honour` rather than `skip`.
16
+ */
17
+ export declare function registerBlogLanguageReferences(registry: DictionaryReferenceRegistryPort, emFactory: () => EntityManager): void;
18
+ //# sourceMappingURL=blog-language-reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-language-reference.d.ts","sourceRoot":"","sources":["../../../src/backend/services/blog-language-reference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,+BAA+B,EACzC,SAAS,EAAE,MAAM,aAAa,GAC7B,IAAI,CAuCN"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Who in `blog` still points at a language (feature 077, D-87).
3
+ *
4
+ * Two descriptors, one per table: `languages` used to count both itself, and
5
+ * `dictionaries`' orphan report joined both a second time. Both statements
6
+ * named this module's tables in strings no import-level boundary check can
7
+ * see.
8
+ *
9
+ * Contributed whatever this module's effective state, and blocking while it
10
+ * is off: a switched-off blog still owns rows carrying the language code, so
11
+ * deleting the language would leave them dangling the moment an operator
12
+ * switches the blog back on. That is the registry's stated enumeration
13
+ * policy, and the reason it is `honour` rather than `skip`.
14
+ */
15
+ export function registerBlogLanguageReferences(registry, emFactory) {
16
+ registry.register({
17
+ ownerModuleId: 'blog',
18
+ consumer: 'blog',
19
+ tableName: 'blog_post_languages',
20
+ columnName: 'language',
21
+ blocking: true,
22
+ countReferences: async (code) => {
23
+ const rows = (await emFactory().execute(`select count(*)::int as n from "blog_post_languages" where "language" = ?`, [code]));
24
+ return rows[0]?.n ?? 0;
25
+ },
26
+ usedCodes: async () => (await emFactory().execute(`select "language" as code, count(*)::int as count
27
+ from "blog_post_languages" where "language" is not null group by "language"`)),
28
+ });
29
+ registry.register({
30
+ ownerModuleId: 'blog',
31
+ consumer: 'blog',
32
+ tableName: 'blog_category_languages',
33
+ columnName: 'language',
34
+ blocking: true,
35
+ countReferences: async (code) => {
36
+ const rows = (await emFactory().execute(`select count(*)::int as n from "blog_category_languages" where "language" = ?`, [code]));
37
+ return rows[0]?.n ?? 0;
38
+ },
39
+ usedCodes: async () => (await emFactory().execute(`select "language" as code, count(*)::int as count
40
+ from "blog_category_languages" where "language" is not null group by "language"`)),
41
+ });
42
+ }
43
+ //# sourceMappingURL=blog-language-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-language-reference.js","sourceRoot":"","sources":["../../../src/backend/services/blog-language-reference.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,8BAA8B,CAC5C,QAAyC,EACzC,SAA8B;IAE9B,QAAQ,CAAC,QAAQ,CAAC;QAChB,aAAa,EAAE,MAAM;QACrB,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,qBAAqB;QAChC,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,SAAS,EAAE,CAAC,OAAO,CACrC,2EAA2E,EAC3E,CAAC,IAAI,CAAC,CACP,CAAyB,CAAC;YAC3B,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,SAAS,EAAE,KAAK,IAAI,EAAE,CACpB,CAAC,MAAM,SAAS,EAAE,CAAC,OAAO,CACxB;uFAC+E,CAChF,CAA2C;KAC/C,CAAC,CAAC;IACH,QAAQ,CAAC,QAAQ,CAAC;QAChB,aAAa,EAAE,MAAM;QACrB,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,yBAAyB;QACpC,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,SAAS,EAAE,CAAC,OAAO,CACrC,+EAA+E,EAC/E,CAAC,IAAI,CAAC,CACP,CAAyB,CAAC;YAC3B,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,SAAS,EAAE,KAAK,IAAI,EAAE,CACpB,CAAC,MAAM,SAAS,EAAE,CAAC,OAAO,CACxB;2FACmF,CACpF,CAA2C;KAC/C,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,79 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import { type BlogPostDetail, type BlogPostInboundReferencesResponse, type BlogPostStatus, type BlogPostSummary, type CreateBlogPostRequest, type DictionaryValidator, type PatchBlogPostRequest, type PutBlogPostContentRequest } from '@endora-commerce/contracts';
3
+ import type { BlogCacheService } from './blog-cache.js';
4
+ type PostListFilters = {
5
+ q?: string | undefined;
6
+ status?: BlogPostStatus | undefined;
7
+ salesChannelId?: string | undefined;
8
+ categoryId?: string | undefined;
9
+ tagId?: string | undefined;
10
+ language?: string | undefined;
11
+ page?: number | undefined;
12
+ perPage?: number | undefined;
13
+ };
14
+ /**
15
+ * BlogPostService — feature 016 / T033.
16
+ *
17
+ * Owns the full BlogPost CRUD + lifecycle + relations contract documented
18
+ * in `contracts/blog-admin-http.contract.md`. The service runs every
19
+ * write inside an `em.transactional(...)` block; the slug-collision
20
+ * helper acquires per-(channel, slug) advisory locks so a concurrent
21
+ * write cannot squeeze a duplicate past the partial unique indexes.
22
+ *
23
+ * The status state machine is documented in `data-model.md` § State
24
+ * transitions: draft → published (sets published_at if null), published
25
+ * → draft (preserves published_at), published ↔ archived. softDelete
26
+ * additionally detaches every blog_post_related_posts row where
27
+ * related_post_id = id (FR-028 / R5) so deleting an article does not
28
+ * orphan a parent post's strip — the storefront just sees a shorter
29
+ * list and the admin's confirmation dialog has already surfaced the
30
+ * affected parents.
31
+ */
32
+ export declare class BlogPostService {
33
+ private readonly emFactory;
34
+ private readonly cache?;
35
+ private readonly dictionaryValidator?;
36
+ constructor(emFactory: () => EntityManager, cache?: BlogCacheService | undefined, dictionaryValidator?: DictionaryValidator | undefined);
37
+ list(filters: PostListFilters): Promise<{
38
+ data: BlogPostSummary[];
39
+ pagination: {
40
+ page: number;
41
+ perPage: number;
42
+ totalPages: number;
43
+ totalItems: number;
44
+ };
45
+ }>;
46
+ create(input: CreateBlogPostRequest): Promise<BlogPostDetail>;
47
+ getById(id: string): Promise<BlogPostDetail>;
48
+ patch(id: string, input: PatchBlogPostRequest): Promise<BlogPostDetail>;
49
+ setContent(id: string, input: PutBlogPostContentRequest): Promise<BlogPostDetail>;
50
+ setTags(id: string, tagIds: string[], version: number): Promise<BlogPostDetail>;
51
+ setRelatedPosts(id: string, relatedPostIds: string[], version: number): Promise<BlogPostDetail>;
52
+ setRelatedProducts(id: string, productIds: string[], version: number): Promise<BlogPostDetail>;
53
+ publish(id: string, version: number): Promise<BlogPostDetail>;
54
+ unpublish(id: string, version: number): Promise<BlogPostDetail>;
55
+ archive(id: string, version: number): Promise<BlogPostDetail>;
56
+ softDelete(id: string, version: number): Promise<{
57
+ detachedFromParents: string[];
58
+ }>;
59
+ getInboundReferences(id: string): Promise<BlogPostInboundReferencesResponse>;
60
+ private transitionStatus;
61
+ private findRow;
62
+ private assertVersion;
63
+ private getByIdInTx;
64
+ private toSummary;
65
+ private normaliseContent;
66
+ private toIso;
67
+ private toIsoNonNull;
68
+ private loadChannelIds;
69
+ private loadLanguages;
70
+ private validateLanguages;
71
+ private replaceChannels;
72
+ private replaceLanguages;
73
+ private replaceCategories;
74
+ private replaceTags;
75
+ private fallbackToDefaultCategory;
76
+ private invalidateCacheForPost;
77
+ }
78
+ export {};
79
+ //# sourceMappingURL=blog-post-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/blog-post-service.ts"],"names":[],"mappings":"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"}