@s-hirano-ist/s-core 0.0.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 (232) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +124 -0
  3. package/dist/articles/entities/article-entity.d.ts +75 -0
  4. package/dist/articles/entities/article-entity.d.ts.map +1 -0
  5. package/dist/articles/entities/article-entity.js +84 -0
  6. package/dist/articles/entities/article-entity.js.map +1 -0
  7. package/dist/articles/events/article-created-event.d.ts +12 -0
  8. package/dist/articles/events/article-created-event.d.ts.map +1 -0
  9. package/dist/articles/events/article-created-event.js +15 -0
  10. package/dist/articles/events/article-created-event.js.map +1 -0
  11. package/dist/articles/events/article-deleted-event.d.ts +9 -0
  12. package/dist/articles/events/article-deleted-event.d.ts.map +1 -0
  13. package/dist/articles/events/article-deleted-event.js +12 -0
  14. package/dist/articles/events/article-deleted-event.js.map +1 -0
  15. package/dist/articles/events/article-updated-event.d.ts +12 -0
  16. package/dist/articles/events/article-updated-event.d.ts.map +1 -0
  17. package/dist/articles/events/article-updated-event.js +15 -0
  18. package/dist/articles/events/article-updated-event.js.map +1 -0
  19. package/dist/articles/index.d.ts +12 -0
  20. package/dist/articles/index.d.ts.map +1 -0
  21. package/dist/articles/index.js +17 -0
  22. package/dist/articles/index.js.map +1 -0
  23. package/dist/articles/repositories/articles-command-repository.interface.d.ts +8 -0
  24. package/dist/articles/repositories/articles-command-repository.interface.d.ts.map +1 -0
  25. package/dist/articles/repositories/articles-command-repository.interface.js +2 -0
  26. package/dist/articles/repositories/articles-command-repository.interface.js.map +1 -0
  27. package/dist/articles/repositories/articles-query-repository.interface.d.ts +44 -0
  28. package/dist/articles/repositories/articles-query-repository.interface.d.ts.map +1 -0
  29. package/dist/articles/repositories/articles-query-repository.interface.js +2 -0
  30. package/dist/articles/repositories/articles-query-repository.interface.js.map +1 -0
  31. package/dist/articles/repositories/category-query-repository.interface.d.ts +9 -0
  32. package/dist/articles/repositories/category-query-repository.interface.d.ts.map +1 -0
  33. package/dist/articles/repositories/category-query-repository.interface.js +2 -0
  34. package/dist/articles/repositories/category-query-repository.interface.js.map +1 -0
  35. package/dist/articles/services/articles-domain-service.d.ts +18 -0
  36. package/dist/articles/services/articles-domain-service.d.ts.map +1 -0
  37. package/dist/articles/services/articles-domain-service.js +58 -0
  38. package/dist/articles/services/articles-domain-service.js.map +1 -0
  39. package/dist/articles/types/cache-strategy.d.ts +6 -0
  40. package/dist/articles/types/cache-strategy.d.ts.map +1 -0
  41. package/dist/articles/types/cache-strategy.js +2 -0
  42. package/dist/articles/types/cache-strategy.js.map +1 -0
  43. package/dist/articles/types/query-params.d.ts +23 -0
  44. package/dist/articles/types/query-params.d.ts.map +1 -0
  45. package/dist/articles/types/query-params.js +2 -0
  46. package/dist/articles/types/query-params.js.map +1 -0
  47. package/dist/articles/types/sort-order.d.ts +2 -0
  48. package/dist/articles/types/sort-order.d.ts.map +1 -0
  49. package/dist/articles/types/sort-order.js +2 -0
  50. package/dist/articles/types/sort-order.js.map +1 -0
  51. package/dist/books/entities/books-entity.d.ts +84 -0
  52. package/dist/books/entities/books-entity.d.ts.map +1 -0
  53. package/dist/books/entities/books-entity.js +71 -0
  54. package/dist/books/entities/books-entity.js.map +1 -0
  55. package/dist/books/events/book-created-event.d.ts +10 -0
  56. package/dist/books/events/book-created-event.d.ts.map +1 -0
  57. package/dist/books/events/book-created-event.js +13 -0
  58. package/dist/books/events/book-created-event.js.map +1 -0
  59. package/dist/books/events/book-deleted-event.d.ts +9 -0
  60. package/dist/books/events/book-deleted-event.d.ts.map +1 -0
  61. package/dist/books/events/book-deleted-event.js +12 -0
  62. package/dist/books/events/book-deleted-event.js.map +1 -0
  63. package/dist/books/events/book-updated-event.d.ts +10 -0
  64. package/dist/books/events/book-updated-event.d.ts.map +1 -0
  65. package/dist/books/events/book-updated-event.js +13 -0
  66. package/dist/books/events/book-updated-event.js.map +1 -0
  67. package/dist/books/index.d.ts +11 -0
  68. package/dist/books/index.d.ts.map +1 -0
  69. package/dist/books/index.js +16 -0
  70. package/dist/books/index.js.map +1 -0
  71. package/dist/books/repositories/books-command-repository.interface.d.ts +9 -0
  72. package/dist/books/repositories/books-command-repository.interface.d.ts.map +1 -0
  73. package/dist/books/repositories/books-command-repository.interface.js +2 -0
  74. package/dist/books/repositories/books-command-repository.interface.js.map +1 -0
  75. package/dist/books/repositories/books-query-repository.interface.d.ts +54 -0
  76. package/dist/books/repositories/books-query-repository.interface.d.ts.map +1 -0
  77. package/dist/books/repositories/books-query-repository.interface.js +2 -0
  78. package/dist/books/repositories/books-query-repository.interface.js.map +1 -0
  79. package/dist/books/services/books-domain-service.d.ts +18 -0
  80. package/dist/books/services/books-domain-service.d.ts.map +1 -0
  81. package/dist/books/services/books-domain-service.js +57 -0
  82. package/dist/books/services/books-domain-service.js.map +1 -0
  83. package/dist/books/types/cache-strategy.d.ts +6 -0
  84. package/dist/books/types/cache-strategy.d.ts.map +1 -0
  85. package/dist/books/types/cache-strategy.js +2 -0
  86. package/dist/books/types/cache-strategy.js.map +1 -0
  87. package/dist/books/types/query-params.d.ts +14 -0
  88. package/dist/books/types/query-params.d.ts.map +1 -0
  89. package/dist/books/types/query-params.js +2 -0
  90. package/dist/books/types/query-params.js.map +1 -0
  91. package/dist/books/types/sort-order.d.ts +2 -0
  92. package/dist/books/types/sort-order.d.ts.map +1 -0
  93. package/dist/books/types/sort-order.js +2 -0
  94. package/dist/books/types/sort-order.js.map +1 -0
  95. package/dist/common/entities/common-entity.d.ts +25 -0
  96. package/dist/common/entities/common-entity.d.ts.map +1 -0
  97. package/dist/common/entities/common-entity.js +38 -0
  98. package/dist/common/entities/common-entity.js.map +1 -0
  99. package/dist/common/events/base-domain-event.d.ts +15 -0
  100. package/dist/common/events/base-domain-event.d.ts.map +1 -0
  101. package/dist/common/events/base-domain-event.js +14 -0
  102. package/dist/common/events/base-domain-event.js.map +1 -0
  103. package/dist/common/events/domain-event.interface.d.ts +13 -0
  104. package/dist/common/events/domain-event.interface.d.ts.map +1 -0
  105. package/dist/common/events/domain-event.interface.js +2 -0
  106. package/dist/common/events/domain-event.interface.js.map +1 -0
  107. package/dist/common/events/system-error-event.d.ts +12 -0
  108. package/dist/common/events/system-error-event.d.ts.map +1 -0
  109. package/dist/common/events/system-error-event.js +15 -0
  110. package/dist/common/events/system-error-event.js.map +1 -0
  111. package/dist/common/events/system-warning-event.d.ts +12 -0
  112. package/dist/common/events/system-warning-event.d.ts.map +1 -0
  113. package/dist/common/events/system-warning-event.js +15 -0
  114. package/dist/common/events/system-warning-event.js.map +1 -0
  115. package/dist/common/index.d.ts +9 -0
  116. package/dist/common/index.d.ts.map +1 -0
  117. package/dist/common/index.js +13 -0
  118. package/dist/common/index.js.map +1 -0
  119. package/dist/common/services/entity-factory.d.ts +2 -0
  120. package/dist/common/services/entity-factory.d.ts.map +1 -0
  121. package/dist/common/services/entity-factory.js +13 -0
  122. package/dist/common/services/entity-factory.js.map +1 -0
  123. package/dist/common/services/id-generator.d.ts +5 -0
  124. package/dist/common/services/id-generator.d.ts.map +1 -0
  125. package/dist/common/services/id-generator.js +4 -0
  126. package/dist/common/services/id-generator.js.map +1 -0
  127. package/dist/common/types/search-types.d.ts +31 -0
  128. package/dist/common/types/search-types.d.ts.map +1 -0
  129. package/dist/common/types/search-types.js +2 -0
  130. package/dist/common/types/search-types.js.map +1 -0
  131. package/dist/errors/error-classes.d.ts +16 -0
  132. package/dist/errors/error-classes.d.ts.map +1 -0
  133. package/dist/errors/error-classes.js +31 -0
  134. package/dist/errors/error-classes.js.map +1 -0
  135. package/dist/errors/index.d.ts +2 -0
  136. package/dist/errors/index.d.ts.map +1 -0
  137. package/dist/errors/index.js +3 -0
  138. package/dist/errors/index.js.map +1 -0
  139. package/dist/images/entities/image-entity.d.ts +98 -0
  140. package/dist/images/entities/image-entity.d.ts.map +1 -0
  141. package/dist/images/entities/image-entity.js +90 -0
  142. package/dist/images/entities/image-entity.js.map +1 -0
  143. package/dist/images/events/image-created-event.d.ts +9 -0
  144. package/dist/images/events/image-created-event.d.ts.map +1 -0
  145. package/dist/images/events/image-created-event.js +12 -0
  146. package/dist/images/events/image-created-event.js.map +1 -0
  147. package/dist/images/events/image-deleted-event.d.ts +9 -0
  148. package/dist/images/events/image-deleted-event.d.ts.map +1 -0
  149. package/dist/images/events/image-deleted-event.js +12 -0
  150. package/dist/images/events/image-deleted-event.js.map +1 -0
  151. package/dist/images/events/image-updated-event.d.ts +10 -0
  152. package/dist/images/events/image-updated-event.d.ts.map +1 -0
  153. package/dist/images/events/image-updated-event.js +13 -0
  154. package/dist/images/events/image-updated-event.js.map +1 -0
  155. package/dist/images/index.d.ts +11 -0
  156. package/dist/images/index.d.ts.map +1 -0
  157. package/dist/images/index.js +16 -0
  158. package/dist/images/index.js.map +1 -0
  159. package/dist/images/repositories/images-command-repository.interface.d.ts +9 -0
  160. package/dist/images/repositories/images-command-repository.interface.d.ts.map +1 -0
  161. package/dist/images/repositories/images-command-repository.interface.js +2 -0
  162. package/dist/images/repositories/images-command-repository.interface.js.map +1 -0
  163. package/dist/images/repositories/images-query-repository.interface.d.ts +26 -0
  164. package/dist/images/repositories/images-query-repository.interface.d.ts.map +1 -0
  165. package/dist/images/repositories/images-query-repository.interface.js +2 -0
  166. package/dist/images/repositories/images-query-repository.interface.js.map +1 -0
  167. package/dist/images/services/images-domain-service.d.ts +17 -0
  168. package/dist/images/services/images-domain-service.d.ts.map +1 -0
  169. package/dist/images/services/images-domain-service.js +42 -0
  170. package/dist/images/services/images-domain-service.js.map +1 -0
  171. package/dist/images/types/cache-strategy.d.ts +6 -0
  172. package/dist/images/types/cache-strategy.d.ts.map +1 -0
  173. package/dist/images/types/cache-strategy.js +2 -0
  174. package/dist/images/types/cache-strategy.js.map +1 -0
  175. package/dist/images/types/query-params.d.ts +14 -0
  176. package/dist/images/types/query-params.d.ts.map +1 -0
  177. package/dist/images/types/query-params.js +2 -0
  178. package/dist/images/types/query-params.js.map +1 -0
  179. package/dist/images/types/sort-order.d.ts +2 -0
  180. package/dist/images/types/sort-order.d.ts.map +1 -0
  181. package/dist/images/types/sort-order.js +2 -0
  182. package/dist/images/types/sort-order.js.map +1 -0
  183. package/dist/index.d.ts +7 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +8 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/notes/entities/note-entity.d.ts +43 -0
  188. package/dist/notes/entities/note-entity.d.ts.map +1 -0
  189. package/dist/notes/entities/note-entity.js +48 -0
  190. package/dist/notes/entities/note-entity.js.map +1 -0
  191. package/dist/notes/events/note-created-event.d.ts +10 -0
  192. package/dist/notes/events/note-created-event.d.ts.map +1 -0
  193. package/dist/notes/events/note-created-event.js +13 -0
  194. package/dist/notes/events/note-created-event.js.map +1 -0
  195. package/dist/notes/events/note-deleted-event.d.ts +9 -0
  196. package/dist/notes/events/note-deleted-event.d.ts.map +1 -0
  197. package/dist/notes/events/note-deleted-event.js +12 -0
  198. package/dist/notes/events/note-deleted-event.js.map +1 -0
  199. package/dist/notes/events/note-updated-event.d.ts +10 -0
  200. package/dist/notes/events/note-updated-event.d.ts.map +1 -0
  201. package/dist/notes/events/note-updated-event.js +13 -0
  202. package/dist/notes/events/note-updated-event.js.map +1 -0
  203. package/dist/notes/index.d.ts +11 -0
  204. package/dist/notes/index.d.ts.map +1 -0
  205. package/dist/notes/index.js +16 -0
  206. package/dist/notes/index.js.map +1 -0
  207. package/dist/notes/repositories/notes-command-repository.interface.d.ts +8 -0
  208. package/dist/notes/repositories/notes-command-repository.interface.d.ts.map +1 -0
  209. package/dist/notes/repositories/notes-command-repository.interface.js +2 -0
  210. package/dist/notes/repositories/notes-command-repository.interface.js.map +1 -0
  211. package/dist/notes/repositories/notes-query-repository.interface.d.ts +22 -0
  212. package/dist/notes/repositories/notes-query-repository.interface.d.ts.map +1 -0
  213. package/dist/notes/repositories/notes-query-repository.interface.js +2 -0
  214. package/dist/notes/repositories/notes-query-repository.interface.js.map +1 -0
  215. package/dist/notes/services/notes-domain-service.d.ts +15 -0
  216. package/dist/notes/services/notes-domain-service.d.ts.map +1 -0
  217. package/dist/notes/services/notes-domain-service.js +42 -0
  218. package/dist/notes/services/notes-domain-service.js.map +1 -0
  219. package/dist/notes/types/cache-strategy.d.ts +6 -0
  220. package/dist/notes/types/cache-strategy.d.ts.map +1 -0
  221. package/dist/notes/types/cache-strategy.js +2 -0
  222. package/dist/notes/types/cache-strategy.js.map +1 -0
  223. package/dist/notes/types/query-params.d.ts +14 -0
  224. package/dist/notes/types/query-params.d.ts.map +1 -0
  225. package/dist/notes/types/query-params.js +2 -0
  226. package/dist/notes/types/query-params.js.map +1 -0
  227. package/dist/notes/types/sort-order.d.ts +2 -0
  228. package/dist/notes/types/sort-order.d.ts.map +1 -0
  229. package/dist/notes/types/sort-order.js +2 -0
  230. package/dist/notes/types/sort-order.js.map +1 -0
  231. package/dist/tsconfig.tsbuildinfo +1 -0
  232. package/package.json +70 -0
package/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # @s-hirano-ist/s-core
2
+
3
+ Domain layer for s-private application, following Clean Architecture and Domain-Driven Design principles.
4
+
5
+ ## Overview
6
+
7
+ This package contains the core domain logic for the s-private content management system, including:
8
+
9
+ - **Domain Entities**: Core business objects with their invariants
10
+ - **Repository Interfaces**: Abstraction for data access (dependency inversion)
11
+ - **Domain Services**: Complex business logic that doesn't belong to a single entity
12
+ - **Domain Events**: Events emitted during domain operations
13
+ - **Value Objects & Types**: Domain-specific types and constants
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ npm install @s-hirano-ist/s-core
19
+ # or
20
+ pnpm add @s-hirano-ist/s-core
21
+ # or
22
+ yarn add @s-hirano-ist/s-core
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ### Import all domains (with namespaces)
28
+
29
+ ```typescript
30
+ import { Articles, Books, Notes, Images, Common, Errors } from "@s-hirano-ist/s-core";
31
+
32
+ // Usage
33
+ const article = new Articles.ArticleEntity(...);
34
+ const book = new Books.BooksEntity(...);
35
+ const note = new Notes.NoteEntity(...);
36
+ const image = new Images.ImageEntity(...);
37
+ ```
38
+
39
+ ### Import specific domain (recommended)
40
+
41
+ ```typescript
42
+ // Articles domain
43
+ import { ArticleEntity, ArticlesDomainService } from "@s-hirano-ist/s-core/articles";
44
+
45
+ // Books domain
46
+ import { BooksEntity, BooksDomainService } from "@s-hirano-ist/s-core/books";
47
+
48
+ // Notes domain
49
+ import { NoteEntity, NotesDomainService } from "@s-hirano-ist/s-core/notes";
50
+
51
+ // Images domain
52
+ import { ImageEntity, ImagesDomainService } from "@s-hirano-ist/s-core/images";
53
+
54
+ // Common utilities
55
+ import { CommonEntity, IdGenerator } from "@s-hirano-ist/s-core/common";
56
+
57
+ // Error classes
58
+ import { DomainError } from "@s-hirano-ist/s-core/errors";
59
+ ```
60
+
61
+ ### Importing specific exports from domain
62
+
63
+ ```typescript
64
+ // Direct import from domain module
65
+ import * as Articles from "@s-hirano-ist/s-core/articles";
66
+
67
+ // Use the exports
68
+ const service = new Articles.ArticlesDomainService();
69
+ const entity = new Articles.ArticleEntity(...);
70
+ ```
71
+
72
+ ## Package Structure
73
+
74
+ ```
75
+ @s-hirano-ist/s-core/
76
+ ├── articles/ # Article domain (news/link management)
77
+ ├── books/ # Book domain (ISBN-based tracking)
78
+ ├── common/ # Shared domain utilities
79
+ ├── errors/ # Domain error classes
80
+ ├── images/ # Image domain (file metadata)
81
+ └── notes/ # Note domain (markdown content)
82
+ ```
83
+
84
+ Each domain module contains:
85
+ - `entities/` - Domain entities
86
+ - `events/` - Domain events
87
+ - `repositories/` - Repository interfaces
88
+ - `services/` - Domain services
89
+ - `types/` - Domain-specific types
90
+
91
+ ## Architecture
92
+
93
+ This package follows Clean Architecture principles:
94
+
95
+ - **Dependency Inversion**: Repository interfaces defined in domain, implementations elsewhere
96
+ - **Domain Independence**: No dependencies on frameworks or infrastructure
97
+ - **Business Logic Isolation**: Pure TypeScript domain logic
98
+
99
+ ## Dependencies
100
+
101
+ - `zod` - Runtime validation
102
+ - `uuid` - ID generation
103
+ - `sharp` - Image processing types
104
+
105
+ ## Development
106
+
107
+ ```bash
108
+ # Build the package
109
+ pnpm build
110
+
111
+ # Clean build artifacts
112
+ pnpm clean
113
+
114
+ # Run tests (from workspace root)
115
+ pnpm test:domains
116
+ ```
117
+
118
+ ## License
119
+
120
+ AGPL-3.0
121
+
122
+ ## Repository
123
+
124
+ https://github.com/s-hirano-ist/s-private
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import { UserId } from "../../common/entities/common-entity";
3
+ declare const CategoryName: z.core.$ZodBranded<z.ZodString, "CategoryName">;
4
+ export type CategoryName = z.infer<typeof CategoryName>;
5
+ export declare const makeCategoryName: (v: string) => CategoryName;
6
+ declare const ArticleTitle: z.core.$ZodBranded<z.ZodString, "ArticleTitle">;
7
+ export type ArticleTitle = z.infer<typeof ArticleTitle>;
8
+ export declare const makeArticleTitle: (v: string) => ArticleTitle;
9
+ declare const Quote: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "Quote">;
10
+ export type Quote = z.infer<typeof Quote>;
11
+ export declare const makeQuote: (v: string | null | undefined) => Quote;
12
+ declare const Url: z.core.$ZodBranded<z.ZodURL, "Url">;
13
+ export type Url = z.infer<typeof Url>;
14
+ export declare const makeUrl: (v: string) => Url;
15
+ declare const OgTitle: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "OgTitle">;
16
+ export type OgTitle = z.infer<typeof OgTitle>;
17
+ export declare const makeOgTitle: (v: string | null | undefined) => OgTitle;
18
+ declare const OgDescription: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "OgDescription">;
19
+ export type OgDescription = z.infer<typeof OgDescription>;
20
+ export declare const makeOgDescription: (v: string | null | undefined) => OgDescription;
21
+ declare const OgImageUrl: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "OgImageUrl">;
22
+ export type OgImageUrl = z.infer<typeof OgImageUrl>;
23
+ export declare const makeOgImageUrl: (v: string | null | undefined) => OgImageUrl;
24
+ export declare const UnexportedArticle: z.ZodObject<{
25
+ id: z.core.$ZodBranded<z.ZodDefault<z.ZodUUID>, "Id">;
26
+ userId: z.core.$ZodBranded<z.ZodString, "UserId">;
27
+ categoryName: z.core.$ZodBranded<z.ZodString, "CategoryName">;
28
+ categoryId: z.core.$ZodBranded<z.ZodDefault<z.ZodUUID>, "Id">;
29
+ title: z.core.$ZodBranded<z.ZodString, "ArticleTitle">;
30
+ quote: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "Quote">;
31
+ url: z.core.$ZodBranded<z.ZodURL, "Url">;
32
+ createdAt: z.core.$ZodBranded<z.ZodDate, "CreatedAt">;
33
+ ogTitle: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "OgTitle">;
34
+ ogDescription: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "OgDescription">;
35
+ ogImageUrl: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "OgImageUrl">;
36
+ status: z.ZodLiteral<"UNEXPORTED">;
37
+ }, z.core.$strip>;
38
+ export type UnexportedArticle = Readonly<z.infer<typeof UnexportedArticle>>;
39
+ declare const ExportedArticle: z.ZodObject<{
40
+ id: z.core.$ZodBranded<z.ZodDefault<z.ZodUUID>, "Id">;
41
+ userId: z.core.$ZodBranded<z.ZodString, "UserId">;
42
+ categoryName: z.core.$ZodBranded<z.ZodString, "CategoryName">;
43
+ categoryId: z.core.$ZodBranded<z.ZodDefault<z.ZodUUID>, "Id">;
44
+ title: z.core.$ZodBranded<z.ZodString, "ArticleTitle">;
45
+ quote: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "Quote">;
46
+ url: z.core.$ZodBranded<z.ZodURL, "Url">;
47
+ createdAt: z.core.$ZodBranded<z.ZodDate, "CreatedAt">;
48
+ ogTitle: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "OgTitle">;
49
+ ogDescription: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "OgDescription">;
50
+ ogImageUrl: z.core.$ZodBranded<z.ZodOptional<z.ZodNullable<z.ZodString>>, "OgImageUrl">;
51
+ status: z.ZodLiteral<"EXPORTED">;
52
+ exportedAt: z.core.$ZodBranded<z.ZodDate, "ExportedAt">;
53
+ }, z.core.$strip>;
54
+ type ExportedArticle = Readonly<z.infer<typeof ExportedArticle>>;
55
+ type CreateArticleArgs = Readonly<{
56
+ userId: UserId;
57
+ categoryName: CategoryName;
58
+ title: ArticleTitle;
59
+ quote?: Quote;
60
+ url: Url;
61
+ }>;
62
+ type UpdateArticleArgs = Readonly<{
63
+ title: ArticleTitle;
64
+ quote: Quote;
65
+ ogTitle: OgTitle;
66
+ ogDescription: OgDescription;
67
+ ogImageUrl: OgImageUrl;
68
+ }>;
69
+ export declare const articleEntity: {
70
+ create: (args: CreateArticleArgs) => UnexportedArticle;
71
+ update: (article: UnexportedArticle, args: UpdateArticleArgs) => UnexportedArticle;
72
+ export: (article: UnexportedArticle) => ExportedArticle;
73
+ };
74
+ export {};
75
+ //# sourceMappingURL=article-entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-entity.d.ts","sourceRoot":"","sources":["../../../articles/entities/article-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAQN,MAAM,EACN,MAAM,qCAAqC,CAAC;AAK7C,QAAA,MAAM,YAAY,iDAKO,CAAC;AAC1B,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,eAAO,MAAM,gBAAgB,GAAI,GAAG,MAAM,KAAG,YACvB,CAAC;AAEvB,QAAA,MAAM,YAAY,iDAIO,CAAC;AAC1B,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,eAAO,MAAM,gBAAgB,GAAI,GAAG,MAAM,KAAG,YACvB,CAAC;AAEvB,QAAA,MAAM,KAAK,wEAKO,CAAC;AACnB,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;AAC1C,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,KAC1C,CAAC;AAEhB,QAAA,MAAM,GAAG,qCAgBO,CAAC;AACjB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACtC,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,GAAmB,CAAC;AAExD,QAAA,MAAM,OAAO,0EAAsD,CAAC;AACpE,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAC9C,eAAO,MAAM,WAAW,GAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,OAC1C,CAAC;AAElB,QAAA,MAAM,aAAa,gFAA4D,CAAC;AAChF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,eAAO,MAAM,iBAAiB,GAC7B,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAC1B,aAAuC,CAAC;AAE3C,QAAA,MAAM,UAAU,6EAAyD,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AACpD,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,UAC1C,CAAC;AAkBrB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;iBAA4C,CAAC;AAC3E,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC;AAE5E,QAAA,MAAM,eAAe;;;;;;;;;;;;;;iBAAoC,CAAC;AAC1D,KAAK,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;AAEjE,KAAK,iBAAiB,GAAG,QAAQ,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,GAAG,EAAE,GAAG,CAAC;CACT,CAAC,CAAC;AAEH,KAAK,iBAAiB,GAAG,QAAQ,CAAC;IACjC,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;CACvB,CAAC,CAAC;AAEH,eAAO,MAAM,aAAa;mBACV,iBAAiB,KAAG,iBAAiB;sBAY1C,iBAAiB,QACpB,iBAAiB,KACrB,iBAAiB;sBAKF,iBAAiB,KAAG,eAAe;CASrD,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { z } from "zod";
2
+ import { CreatedAt, ExportedStatus, Id, makeCreatedAt, makeExportedStatus, makeId, UnexportedStatus, UserId, } from "../../common/entities/common-entity";
3
+ import { createEntityWithErrorHandling } from "../../common/services/entity-factory";
4
+ // Value objects
5
+ const CategoryName = z
6
+ .string({ message: "required" })
7
+ .trim()
8
+ .min(1, { message: "required" })
9
+ .max(16, { message: "tooLong" })
10
+ .brand();
11
+ export const makeCategoryName = (v) => CategoryName.parse(v);
12
+ const ArticleTitle = z
13
+ .string({ message: "required" })
14
+ .min(1, { message: "required" })
15
+ .max(128, { message: "tooLong" })
16
+ .brand();
17
+ export const makeArticleTitle = (v) => ArticleTitle.parse(v);
18
+ const Quote = z
19
+ .string()
20
+ .max(512, { message: "tooLong" })
21
+ .nullable()
22
+ .optional()
23
+ .brand();
24
+ export const makeQuote = (v) => Quote.parse(v);
25
+ const Url = z
26
+ .url({ message: "invalidFormat" })
27
+ .min(1, { message: "required" })
28
+ .refine((url) => {
29
+ try {
30
+ const urlObject = new URL(url);
31
+ return (urlObject.protocol === "http:" || urlObject.protocol === "https:");
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }, { message: "invalidFormat" })
37
+ .brand();
38
+ export const makeUrl = (v) => Url.parse(v);
39
+ const OgTitle = z.string().nullable().optional().brand();
40
+ export const makeOgTitle = (v) => OgTitle.parse(v);
41
+ const OgDescription = z.string().nullable().optional().brand();
42
+ export const makeOgDescription = (v) => OgDescription.parse(v);
43
+ const OgImageUrl = z.string().nullable().optional().brand();
44
+ export const makeOgImageUrl = (v) => OgImageUrl.parse(v);
45
+ // Entities
46
+ const Base = z.object({
47
+ id: Id,
48
+ userId: UserId,
49
+ categoryName: CategoryName,
50
+ categoryId: Id,
51
+ title: ArticleTitle,
52
+ quote: Quote,
53
+ url: Url,
54
+ createdAt: CreatedAt,
55
+ ogTitle: OgTitle,
56
+ ogDescription: OgDescription,
57
+ ogImageUrl: OgImageUrl,
58
+ });
59
+ export const UnexportedArticle = Base.extend({ status: UnexportedStatus });
60
+ const ExportedArticle = Base.extend(ExportedStatus.shape);
61
+ export const articleEntity = {
62
+ create: (args) => {
63
+ return createEntityWithErrorHandling(() => Object.freeze({
64
+ id: makeId(),
65
+ status: "UNEXPORTED",
66
+ categoryId: makeId(),
67
+ createdAt: makeCreatedAt(),
68
+ ...args,
69
+ }));
70
+ },
71
+ update: (article, args) => {
72
+ return createEntityWithErrorHandling(() => Object.freeze({ ...article, ...args }));
73
+ },
74
+ export: (article) => {
75
+ return createEntityWithErrorHandling(() => {
76
+ const exportedStatus = makeExportedStatus();
77
+ return Object.freeze({
78
+ ...article,
79
+ ...exportedStatus,
80
+ });
81
+ });
82
+ },
83
+ };
84
+ //# sourceMappingURL=article-entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-entity.js","sourceRoot":"","sources":["../../../articles/entities/article-entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { BaseDomainEvent } from "../../common/events/base-domain-event";
2
+ export declare class ArticleCreatedEvent extends BaseDomainEvent {
3
+ constructor(data: {
4
+ title: string;
5
+ url: string;
6
+ quote: string;
7
+ categoryName: string;
8
+ userId: string;
9
+ caller: string;
10
+ });
11
+ }
12
+ //# sourceMappingURL=article-created-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-created-event.d.ts","sourceRoot":"","sources":["../../../articles/events/article-created-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,qBAAa,mBAAoB,SAAQ,eAAe;gBAC3C,IAAI,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KACf;CAeD"}
@@ -0,0 +1,15 @@
1
+ import { BaseDomainEvent } from "../../common/events/base-domain-event";
2
+ export class ArticleCreatedEvent extends BaseDomainEvent {
3
+ constructor(data) {
4
+ super("article.created", {
5
+ title: data.title,
6
+ url: data.url,
7
+ quote: data.quote,
8
+ categoryName: data.categoryName,
9
+ }, {
10
+ caller: data.caller,
11
+ userId: data.userId,
12
+ });
13
+ }
14
+ }
15
+ //# sourceMappingURL=article-created-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-created-event.js","sourceRoot":"","sources":["../../../articles/events/article-created-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACvD,YAAY,IAOX;QACA,KAAK,CACJ,iBAAiB,EACjB;YACC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;SAC/B,EACD;YACC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACnB,CACD,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,9 @@
1
+ import { BaseDomainEvent } from "../../common/events/base-domain-event";
2
+ export declare class ArticleDeletedEvent extends BaseDomainEvent {
3
+ constructor(data: {
4
+ title: string;
5
+ userId: string;
6
+ caller: string;
7
+ });
8
+ }
9
+ //# sourceMappingURL=article-deleted-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-deleted-event.d.ts","sourceRoot":"","sources":["../../../articles/events/article-deleted-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,qBAAa,mBAAoB,SAAQ,eAAe;gBAC3C,IAAI,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KACf;CAYD"}
@@ -0,0 +1,12 @@
1
+ import { BaseDomainEvent } from "../../common/events/base-domain-event";
2
+ export class ArticleDeletedEvent extends BaseDomainEvent {
3
+ constructor(data) {
4
+ super("article.deleted", {
5
+ title: data.title,
6
+ }, {
7
+ caller: data.caller,
8
+ userId: data.userId,
9
+ });
10
+ }
11
+ }
12
+ //# sourceMappingURL=article-deleted-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-deleted-event.js","sourceRoot":"","sources":["../../../articles/events/article-deleted-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACvD,YAAY,IAIX;QACA,KAAK,CACJ,iBAAiB,EACjB;YACC,KAAK,EAAE,IAAI,CAAC,KAAK;SACjB,EACD;YACC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACnB,CACD,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,12 @@
1
+ import { BaseDomainEvent } from "../../common/events/base-domain-event";
2
+ export declare class ArticleUpdatedEvent extends BaseDomainEvent {
3
+ constructor(data: {
4
+ title: string;
5
+ url: string;
6
+ quote: string;
7
+ categoryName: string;
8
+ userId: string;
9
+ caller: string;
10
+ });
11
+ }
12
+ //# sourceMappingURL=article-updated-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-updated-event.d.ts","sourceRoot":"","sources":["../../../articles/events/article-updated-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,qBAAa,mBAAoB,SAAQ,eAAe;gBAC3C,IAAI,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KACf;CAeD"}
@@ -0,0 +1,15 @@
1
+ import { BaseDomainEvent } from "../../common/events/base-domain-event";
2
+ export class ArticleUpdatedEvent extends BaseDomainEvent {
3
+ constructor(data) {
4
+ super("article.updated", {
5
+ title: data.title,
6
+ url: data.url,
7
+ quote: data.quote,
8
+ categoryName: data.categoryName,
9
+ }, {
10
+ caller: data.caller,
11
+ userId: data.userId,
12
+ });
13
+ }
14
+ }
15
+ //# sourceMappingURL=article-updated-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article-updated-event.js","sourceRoot":"","sources":["../../../articles/events/article-updated-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACvD,YAAY,IAOX;QACA,KAAK,CACJ,iBAAiB,EACjB;YACC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;SAC/B,EACD;YACC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACnB,CACD,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,12 @@
1
+ export * from "./entities/article-entity";
2
+ export * from "./events/article-created-event";
3
+ export * from "./events/article-deleted-event";
4
+ export * from "./events/article-updated-event";
5
+ export * from "./repositories/articles-command-repository.interface";
6
+ export * from "./repositories/articles-query-repository.interface";
7
+ export * from "./repositories/category-query-repository.interface";
8
+ export * from "./services/articles-domain-service";
9
+ export * from "./types/cache-strategy";
10
+ export * from "./types/query-params";
11
+ export * from "./types/sort-order";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../articles/index.ts"],"names":[],"mappings":"AACA,cAAc,2BAA2B,CAAC;AAG1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,sDAAsD,CAAC;AACrE,cAAc,oDAAoD,CAAC;AACnE,cAAc,oDAAoD,CAAC;AAGnE,cAAc,oCAAoC,CAAC;AAGnD,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,17 @@
1
+ // Entities
2
+ export * from "./entities/article-entity";
3
+ // Events
4
+ export * from "./events/article-created-event";
5
+ export * from "./events/article-deleted-event";
6
+ export * from "./events/article-updated-event";
7
+ // Repositories
8
+ export * from "./repositories/articles-command-repository.interface";
9
+ export * from "./repositories/articles-query-repository.interface";
10
+ export * from "./repositories/category-query-repository.interface";
11
+ // Services
12
+ export * from "./services/articles-domain-service";
13
+ // Types
14
+ export * from "./types/cache-strategy";
15
+ export * from "./types/query-params";
16
+ export * from "./types/sort-order";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../articles/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,cAAc,2BAA2B,CAAC;AAE1C,SAAS;AACT,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAE/C,eAAe;AACf,cAAc,sDAAsD,CAAC;AACrE,cAAc,oDAAoD,CAAC;AACnE,cAAc,oDAAoD,CAAC;AAEnE,WAAW;AACX,cAAc,oCAAoC,CAAC;AAEnD,QAAQ;AACR,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Id, Status, UserId } from "../../common/entities/common-entity";
2
+ import type { UnexportedArticle, Url } from "../entities/article-entity";
3
+ export type IArticlesCommandRepository = {
4
+ create(data: UnexportedArticle): Promise<void>;
5
+ update(url: Url, userId: UserId, data: UnexportedArticle): Promise<void>;
6
+ deleteById(id: Id, userId: UserId, status: Status): Promise<void>;
7
+ };
8
+ //# sourceMappingURL=articles-command-repository.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"articles-command-repository.interface.d.ts","sourceRoot":"","sources":["../../../articles/repositories/articles-command-repository.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAEzE,MAAM,MAAM,0BAA0B,GAAG;IACxC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=articles-command-repository.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"articles-command-repository.interface.js","sourceRoot":"","sources":["../../../articles/repositories/articles-command-repository.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import type { Status, UserId } from "../../common/entities/common-entity";
2
+ import type { Url } from "../entities/article-entity";
3
+ import type { ArticlesFindManyParams } from "../types/query-params";
4
+ export type IArticlesQueryRepository = {
5
+ findByUrl(url: Url, userId: UserId): Promise<{
6
+ title: string;
7
+ url: string;
8
+ quote: string | null;
9
+ ogTitle: string | null;
10
+ ogDescription: string | null;
11
+ ogImageUrl: string | null;
12
+ status: string;
13
+ Category: {
14
+ id: string;
15
+ name: string;
16
+ };
17
+ } | null>;
18
+ findMany(userId: UserId, status: Status, params: ArticlesFindManyParams): Promise<{
19
+ id: string;
20
+ title: string;
21
+ url: string;
22
+ quote: string | null;
23
+ ogTitle: string | null;
24
+ ogDescription: string | null;
25
+ Category: {
26
+ id: string;
27
+ name: string;
28
+ };
29
+ }[]>;
30
+ count(userId: UserId, status: Status): Promise<number>;
31
+ search(query: string, userId: UserId, limit?: number): Promise<{
32
+ id: string;
33
+ title: string;
34
+ url: string;
35
+ quote: string | null;
36
+ ogTitle: string | null;
37
+ ogDescription: string | null;
38
+ Category: {
39
+ id: string;
40
+ name: string;
41
+ };
42
+ }[]>;
43
+ };
44
+ //# sourceMappingURL=articles-query-repository.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"articles-query-repository.interface.d.ts","sourceRoot":"","sources":["../../../articles/repositories/articles-query-repository.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,MAAM,wBAAwB,GAAG;IACtC,SAAS,CACR,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE;YACT,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;SACb,CAAC;KACF,GAAG,IAAI,CAAC,CAAC;IACV,QAAQ,CACP,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,sBAAsB,GAC5B,OAAO,CACT;QACC,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,EAAE;YACT,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;SACb,CAAC;KACF,EAAE,CACH,CAAC;IACF,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,CACL,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACZ,OAAO,CACT;QACC,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KACvC,EAAE,CACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=articles-query-repository.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"articles-query-repository.interface.js","sourceRoot":"","sources":["../../../articles/repositories/articles-query-repository.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import type { UserId } from "../../common/entities/common-entity";
2
+ import type { CategoryFindManyParams } from "../types/query-params";
3
+ export type ICategoryQueryRepository = {
4
+ findMany(userId: UserId, params?: CategoryFindManyParams): Promise<{
5
+ id: string;
6
+ name: string;
7
+ }[]>;
8
+ };
9
+ //# sourceMappingURL=category-query-repository.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-query-repository.interface.d.ts","sourceRoot":"","sources":["../../../articles/repositories/category-query-repository.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,MAAM,wBAAwB,GAAG;IACtC,QAAQ,CACP,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,sBAAsB,GAC7B,OAAO,CACT;QACC,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACb,EAAE,CACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=category-query-repository.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-query-repository.interface.js","sourceRoot":"","sources":["../../../articles/repositories/category-query-repository.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import type { UserId } from "../../common/entities/common-entity";
2
+ import { type ArticleTitle, type CategoryName, type OgDescription, type OgImageUrl, type OgTitle, type Quote, UnexportedArticle, type Url } from "../entities/article-entity";
3
+ import type { IArticlesQueryRepository } from "../repositories/articles-query-repository.interface";
4
+ type ArticleStatus = "NEED_CREATE" | "NEED_UPDATE";
5
+ type ReturnType = {
6
+ status: ArticleStatus;
7
+ data: UnexportedArticle;
8
+ } | {
9
+ status: "NO_UPDATE";
10
+ };
11
+ export declare class ArticlesDomainService {
12
+ private readonly articlesQueryRepository;
13
+ constructor(articlesQueryRepository: IArticlesQueryRepository);
14
+ ensureNoDuplicate(url: Url, userId: UserId): Promise<void>;
15
+ updateArticle(url: Url, categoryName: CategoryName, userId: UserId, title: ArticleTitle, quote: Quote, ogTitle: OgTitle, ogDescription: OgDescription, ogImageUrl: OgImageUrl): Promise<ReturnType>;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=articles-domain-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"articles-domain-service.d.ts","sourceRoot":"","sources":["../../../articles/services/articles-domain-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAElE,OAAO,EACN,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,iBAAiB,EACjB,KAAK,GAAG,EACR,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAC;AAapG,KAAK,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;AACnD,KAAK,UAAU,GACZ;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAoD3B,qBAAa,qBAAqB;IAEhC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;gBAAvB,uBAAuB,EAAE,wBAAwB;IAGtD,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM;IAI1C,aAAa,CACzB,GAAG,EAAE,GAAG,EACR,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU;CAcvB"}
@@ -0,0 +1,58 @@
1
+ import { DuplicateError, UnexpectedError } from "../../errors/error-classes";
2
+ import { articleEntity, UnexportedArticle, } from "../entities/article-entity";
3
+ async function ensureNoDuplicateArticle(articlesQueryRepository, url, userId) {
4
+ const exists = await articlesQueryRepository.findByUrl(url, userId);
5
+ if (exists !== null) {
6
+ throw new DuplicateError();
7
+ }
8
+ }
9
+ async function updateArticle(articlesQueryRepository, url, categoryName, userId, title, quote, ogTitle, ogDescription, ogImageUrl) {
10
+ const data = await articlesQueryRepository.findByUrl(url, userId);
11
+ if (data?.status !== "UNEXPORTED")
12
+ return { status: "NO_UPDATE" };
13
+ if (!data) {
14
+ return {
15
+ status: "NEED_CREATE",
16
+ data: articleEntity.create({
17
+ userId,
18
+ title,
19
+ quote,
20
+ url,
21
+ categoryName,
22
+ }),
23
+ };
24
+ }
25
+ const newData = UnexportedArticle.safeParse(data);
26
+ if (!newData.success)
27
+ throw new UnexpectedError();
28
+ if (data.title !== title ||
29
+ data.quote !== quote ||
30
+ data.ogTitle !== ogTitle ||
31
+ data.ogDescription !== ogDescription ||
32
+ data.ogImageUrl !== ogImageUrl) {
33
+ return {
34
+ status: "NEED_UPDATE",
35
+ data: articleEntity.update(newData.data, {
36
+ title,
37
+ quote,
38
+ ogTitle,
39
+ ogDescription,
40
+ ogImageUrl,
41
+ }),
42
+ };
43
+ }
44
+ return { status: "NO_UPDATE" };
45
+ }
46
+ export class ArticlesDomainService {
47
+ articlesQueryRepository;
48
+ constructor(articlesQueryRepository) {
49
+ this.articlesQueryRepository = articlesQueryRepository;
50
+ }
51
+ async ensureNoDuplicate(url, userId) {
52
+ return ensureNoDuplicateArticle(this.articlesQueryRepository, url, userId);
53
+ }
54
+ async updateArticle(url, categoryName, userId, title, quote, ogTitle, ogDescription, ogImageUrl) {
55
+ return updateArticle(this.articlesQueryRepository, url, categoryName, userId, title, quote, ogTitle, ogDescription, ogImageUrl);
56
+ }
57
+ }
58
+ //# sourceMappingURL=articles-domain-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"articles-domain-service.js","sourceRoot":"","sources":["../../../articles/services/articles-domain-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAEN,aAAa,EAMb,iBAAiB,GAEjB,MAAM,4BAA4B,CAAC;AAGpC,KAAK,UAAU,wBAAwB,CACtC,uBAAiD,EACjD,GAAQ,EACR,MAAc;IAEd,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,cAAc,EAAE,CAAC;IAC5B,CAAC;AACF,CAAC;AAOD,KAAK,UAAU,aAAa,CAC3B,uBAAiD,EACjD,GAAQ,EACR,YAA0B,EAC1B,MAAc,EACd,KAAmB,EACnB,KAAY,EACZ,OAAgB,EAChB,aAA4B,EAC5B,UAAsB;IAEtB,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClE,IAAI,IAAI,EAAE,MAAM,KAAK,YAAY;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAElE,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO;YACN,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC;gBAC1B,MAAM;gBACN,KAAK;gBACL,KAAK;gBACL,GAAG;gBACH,YAAY;aACZ,CAAC;SACF,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,MAAM,IAAI,eAAe,EAAE,CAAC;IAElD,IACC,IAAI,CAAC,KAAK,KAAK,KAAK;QACpB,IAAI,CAAC,KAAK,KAAK,KAAK;QACpB,IAAI,CAAC,OAAO,KAAK,OAAO;QACxB,IAAI,CAAC,aAAa,KAAK,aAAa;QACpC,IAAI,CAAC,UAAU,KAAK,UAAU,EAC7B,CAAC;QACF,OAAO;YACN,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;gBACxC,KAAK;gBACL,KAAK;gBACL,OAAO;gBACP,aAAa;gBACb,UAAU;aACV,CAAC;SACF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,OAAO,qBAAqB;IAEf;IADlB,YACkB,uBAAiD;QAAjD,4BAAuB,GAAvB,uBAAuB,CAA0B;IAChE,CAAC;IAEG,KAAK,CAAC,iBAAiB,CAAC,GAAQ,EAAE,MAAc;QACtD,OAAO,wBAAwB,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAEM,KAAK,CAAC,aAAa,CACzB,GAAQ,EACR,YAA0B,EAC1B,MAAc,EACd,KAAmB,EACnB,KAAY,EACZ,OAAgB,EAChB,aAA4B,EAC5B,UAAsB;QAEtB,OAAO,aAAa,CACnB,IAAI,CAAC,uBAAuB,EAC5B,GAAG,EACH,YAAY,EACZ,MAAM,EACN,KAAK,EACL,KAAK,EACL,OAAO,EACP,aAAa,EACb,UAAU,CACV,CAAC;IACH,CAAC;CACD"}