@cravery/firebase 0.0.36 → 0.0.37

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 (314) hide show
  1. package/dist/converters/equipment/content.d.ts +4 -0
  2. package/dist/converters/equipment/content.d.ts.map +1 -0
  3. package/dist/converters/equipment/content.js +13 -0
  4. package/dist/converters/equipment/content.js.map +1 -0
  5. package/dist/converters/equipment/index.d.ts +4 -0
  6. package/dist/converters/equipment/index.d.ts.map +1 -0
  7. package/dist/{iam → converters/equipment}/index.js +3 -2
  8. package/dist/converters/equipment/index.js.map +1 -0
  9. package/dist/converters/equipment/meta.d.ts +4 -0
  10. package/dist/converters/equipment/meta.d.ts.map +1 -0
  11. package/dist/converters/equipment/meta.js +26 -0
  12. package/dist/converters/equipment/meta.js.map +1 -0
  13. package/dist/converters/equipment/user.d.ts +4 -0
  14. package/dist/converters/equipment/user.d.ts.map +1 -0
  15. package/dist/converters/equipment/user.js +26 -0
  16. package/dist/converters/equipment/user.js.map +1 -0
  17. package/dist/converters/index.d.ts +8 -0
  18. package/dist/converters/index.d.ts.map +1 -0
  19. package/dist/{repository → converters}/index.js +6 -6
  20. package/dist/converters/index.js.map +1 -0
  21. package/dist/converters/ingredients/content.d.ts +4 -0
  22. package/dist/converters/ingredients/content.d.ts.map +1 -0
  23. package/dist/converters/ingredients/content.js +13 -0
  24. package/dist/converters/ingredients/content.js.map +1 -0
  25. package/dist/converters/ingredients/index.d.ts +4 -0
  26. package/dist/converters/ingredients/index.d.ts.map +1 -0
  27. package/dist/{equipment → converters/ingredients}/index.js +3 -1
  28. package/dist/converters/ingredients/index.js.map +1 -0
  29. package/dist/converters/ingredients/meta.d.ts +4 -0
  30. package/dist/converters/ingredients/meta.d.ts.map +1 -0
  31. package/dist/converters/ingredients/meta.js +26 -0
  32. package/dist/converters/ingredients/meta.js.map +1 -0
  33. package/dist/converters/ingredients/user.d.ts +4 -0
  34. package/dist/converters/ingredients/user.d.ts.map +1 -0
  35. package/dist/converters/ingredients/user.js +26 -0
  36. package/dist/converters/ingredients/user.js.map +1 -0
  37. package/dist/converters/recipes/comment.d.ts.map +1 -0
  38. package/dist/{converter → converters/recipes}/comment.js +4 -14
  39. package/dist/converters/recipes/comment.js.map +1 -0
  40. package/dist/converters/recipes/content.d.ts +4 -0
  41. package/dist/converters/recipes/content.d.ts.map +1 -0
  42. package/dist/converters/recipes/content.js +13 -0
  43. package/dist/converters/recipes/content.js.map +1 -0
  44. package/dist/converters/recipes/index.d.ts +4 -0
  45. package/dist/converters/recipes/index.d.ts.map +1 -0
  46. package/dist/converters/recipes/index.js +20 -0
  47. package/dist/converters/recipes/index.js.map +1 -0
  48. package/dist/converters/recipes/meta.d.ts +4 -0
  49. package/dist/converters/recipes/meta.d.ts.map +1 -0
  50. package/dist/converters/recipes/meta.js +26 -0
  51. package/dist/converters/recipes/meta.js.map +1 -0
  52. package/dist/converters/reports/index.d.ts +3 -0
  53. package/dist/converters/reports/index.d.ts.map +1 -0
  54. package/dist/{ingredient → converters/reports}/index.js +2 -1
  55. package/dist/converters/reports/index.js.map +1 -0
  56. package/dist/converters/reports/report.d.ts.map +1 -0
  57. package/dist/converters/reports/report.js +26 -0
  58. package/dist/converters/reports/report.js.map +1 -0
  59. package/dist/converters/reports/update.d.ts +4 -0
  60. package/dist/converters/reports/update.d.ts.map +1 -0
  61. package/dist/converters/reports/update.js +26 -0
  62. package/dist/converters/reports/update.js.map +1 -0
  63. package/dist/converters/settings/index.d.ts +2 -0
  64. package/dist/converters/settings/index.d.ts.map +1 -0
  65. package/dist/{transform → converters/settings}/index.js +1 -1
  66. package/dist/converters/settings/index.js.map +1 -0
  67. package/dist/converters/settings/settings.d.ts.map +1 -0
  68. package/dist/converters/settings/settings.js +26 -0
  69. package/dist/converters/settings/settings.js.map +1 -0
  70. package/dist/converters/subscriptions/index.d.ts +2 -0
  71. package/dist/converters/subscriptions/index.d.ts.map +1 -0
  72. package/dist/{asset → converters/subscriptions}/index.js +1 -1
  73. package/dist/converters/subscriptions/index.js.map +1 -0
  74. package/dist/converters/subscriptions/subscription.d.ts +4 -0
  75. package/dist/converters/subscriptions/subscription.d.ts.map +1 -0
  76. package/dist/converters/subscriptions/subscription.js +34 -0
  77. package/dist/converters/subscriptions/subscription.js.map +1 -0
  78. package/dist/converters/users/bookmark.d.ts +4 -0
  79. package/dist/converters/users/bookmark.d.ts.map +1 -0
  80. package/dist/converters/users/bookmark.js +26 -0
  81. package/dist/converters/users/bookmark.js.map +1 -0
  82. package/dist/converters/users/index.d.ts +4 -0
  83. package/dist/converters/users/index.d.ts.map +1 -0
  84. package/dist/converters/users/index.js +20 -0
  85. package/dist/converters/users/index.js.map +1 -0
  86. package/dist/converters/users/profile.d.ts.map +1 -0
  87. package/dist/converters/users/profile.js +26 -0
  88. package/dist/converters/users/profile.js.map +1 -0
  89. package/dist/converters/users/user.d.ts.map +1 -0
  90. package/dist/converters/users/user.js +26 -0
  91. package/dist/converters/users/user.js.map +1 -0
  92. package/dist/index.d.ts +2 -4
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +2 -4
  95. package/dist/index.js.map +1 -1
  96. package/dist/lib/index.d.ts +2 -1
  97. package/dist/lib/index.d.ts.map +1 -1
  98. package/dist/lib/index.js +2 -1
  99. package/dist/lib/index.js.map +1 -1
  100. package/dist/lib/strip-undefined.d.ts.map +1 -0
  101. package/dist/lib/strip-undefined.js.map +1 -0
  102. package/dist/lib/timestamp.d.ts.map +1 -0
  103. package/dist/{utils → lib}/timestamp.js +0 -4
  104. package/dist/lib/timestamp.js.map +1 -0
  105. package/package.json +33 -59
  106. package/src/converters/equipment/content.ts +17 -0
  107. package/src/converters/equipment/index.ts +3 -0
  108. package/src/converters/equipment/meta.ts +36 -0
  109. package/src/converters/equipment/user.ts +36 -0
  110. package/src/converters/index.ts +7 -0
  111. package/src/converters/ingredients/content.ts +17 -0
  112. package/src/converters/ingredients/index.ts +3 -0
  113. package/src/converters/ingredients/meta.ts +36 -0
  114. package/src/converters/ingredients/user.ts +38 -0
  115. package/src/{converter → converters/recipes}/comment.ts +36 -41
  116. package/src/converters/recipes/content.ts +17 -0
  117. package/src/converters/recipes/index.ts +3 -0
  118. package/src/converters/recipes/meta.ts +36 -0
  119. package/src/converters/reports/index.ts +2 -0
  120. package/src/converters/reports/report.ts +36 -0
  121. package/src/converters/reports/update.ts +36 -0
  122. package/src/converters/settings/index.ts +1 -0
  123. package/src/{converter → converters/settings}/settings.ts +36 -49
  124. package/src/converters/subscriptions/index.ts +1 -0
  125. package/src/converters/subscriptions/subscription.ts +85 -0
  126. package/src/converters/users/bookmark.ts +36 -0
  127. package/src/converters/users/index.ts +3 -0
  128. package/src/{converter → converters/users}/profile.ts +36 -44
  129. package/src/{converter → converters/users}/user.ts +36 -43
  130. package/src/index.ts +2 -4
  131. package/src/{utils → lib}/index.ts +2 -3
  132. package/src/{utils → lib}/strip-undefined.ts +32 -32
  133. package/src/{utils → lib}/timestamp.ts +44 -48
  134. package/dist/asset/index.d.ts +0 -2
  135. package/dist/asset/index.d.ts.map +0 -1
  136. package/dist/asset/index.js.map +0 -1
  137. package/dist/asset/repository.d.ts +0 -41
  138. package/dist/asset/repository.d.ts.map +0 -1
  139. package/dist/asset/repository.js +0 -96
  140. package/dist/asset/repository.js.map +0 -1
  141. package/dist/converter/comment.d.ts.map +0 -1
  142. package/dist/converter/comment.js.map +0 -1
  143. package/dist/converter/equipment.d.ts +0 -5
  144. package/dist/converter/equipment.d.ts.map +0 -1
  145. package/dist/converter/equipment.js +0 -52
  146. package/dist/converter/equipment.js.map +0 -1
  147. package/dist/converter/index.d.ts +0 -10
  148. package/dist/converter/index.d.ts.map +0 -1
  149. package/dist/converter/index.js +0 -26
  150. package/dist/converter/index.js.map +0 -1
  151. package/dist/converter/ingredient.d.ts +0 -5
  152. package/dist/converter/ingredient.d.ts.map +0 -1
  153. package/dist/converter/ingredient.js +0 -54
  154. package/dist/converter/ingredient.js.map +0 -1
  155. package/dist/converter/profile.d.ts.map +0 -1
  156. package/dist/converter/profile.js +0 -40
  157. package/dist/converter/profile.js.map +0 -1
  158. package/dist/converter/recipe.d.ts +0 -5
  159. package/dist/converter/recipe.d.ts.map +0 -1
  160. package/dist/converter/recipe.js +0 -77
  161. package/dist/converter/recipe.js.map +0 -1
  162. package/dist/converter/report.d.ts.map +0 -1
  163. package/dist/converter/report.js +0 -46
  164. package/dist/converter/report.js.map +0 -1
  165. package/dist/converter/settings.d.ts.map +0 -1
  166. package/dist/converter/settings.js +0 -44
  167. package/dist/converter/settings.js.map +0 -1
  168. package/dist/converter/submission.d.ts +0 -4
  169. package/dist/converter/submission.d.ts.map +0 -1
  170. package/dist/converter/submission.js +0 -41
  171. package/dist/converter/submission.js.map +0 -1
  172. package/dist/converter/user.d.ts.map +0 -1
  173. package/dist/converter/user.js +0 -39
  174. package/dist/converter/user.js.map +0 -1
  175. package/dist/equipment/equipment.repository.d.ts +0 -6
  176. package/dist/equipment/equipment.repository.d.ts.map +0 -1
  177. package/dist/equipment/equipment.repository.js +0 -11
  178. package/dist/equipment/equipment.repository.js.map +0 -1
  179. package/dist/equipment/index.d.ts +0 -2
  180. package/dist/equipment/index.d.ts.map +0 -1
  181. package/dist/equipment/index.js.map +0 -1
  182. package/dist/iam/converters.d.ts +0 -4
  183. package/dist/iam/converters.d.ts.map +0 -1
  184. package/dist/iam/converters.js +0 -39
  185. package/dist/iam/converters.js.map +0 -1
  186. package/dist/iam/index.d.ts +0 -3
  187. package/dist/iam/index.d.ts.map +0 -1
  188. package/dist/iam/index.js.map +0 -1
  189. package/dist/iam/profile.converter.d.ts +0 -4
  190. package/dist/iam/profile.converter.d.ts.map +0 -1
  191. package/dist/iam/profile.converter.js +0 -40
  192. package/dist/iam/profile.converter.js.map +0 -1
  193. package/dist/iam/user.converter.d.ts +0 -4
  194. package/dist/iam/user.converter.d.ts.map +0 -1
  195. package/dist/iam/user.converter.js +0 -39
  196. package/dist/iam/user.converter.js.map +0 -1
  197. package/dist/ingredient/index.d.ts +0 -2
  198. package/dist/ingredient/index.d.ts.map +0 -1
  199. package/dist/ingredient/index.js.map +0 -1
  200. package/dist/ingredient/ingredient.repository.d.ts +0 -6
  201. package/dist/ingredient/ingredient.repository.d.ts.map +0 -1
  202. package/dist/ingredient/ingredient.repository.js +0 -11
  203. package/dist/ingredient/ingredient.repository.js.map +0 -1
  204. package/dist/lib/asset.repository.d.ts +0 -13
  205. package/dist/lib/asset.repository.d.ts.map +0 -1
  206. package/dist/lib/asset.repository.js +0 -65
  207. package/dist/lib/asset.repository.js.map +0 -1
  208. package/dist/recipe/converters.d.ts +0 -5
  209. package/dist/recipe/converters.d.ts.map +0 -1
  210. package/dist/recipe/converters.js +0 -90
  211. package/dist/recipe/converters.js.map +0 -1
  212. package/dist/recipe/index.d.ts +0 -6
  213. package/dist/recipe/index.d.ts.map +0 -1
  214. package/dist/recipe/index.js +0 -22
  215. package/dist/recipe/index.js.map +0 -1
  216. package/dist/recipe/recipe.converter.d.ts +0 -5
  217. package/dist/recipe/recipe.converter.d.ts.map +0 -1
  218. package/dist/recipe/recipe.converter.js +0 -86
  219. package/dist/recipe/recipe.converter.js.map +0 -1
  220. package/dist/recipe/recipe.repository.d.ts +0 -22
  221. package/dist/recipe/recipe.repository.d.ts.map +0 -1
  222. package/dist/recipe/recipe.repository.js +0 -210
  223. package/dist/recipe/recipe.repository.js.map +0 -1
  224. package/dist/recipe/repository.d.ts +0 -26
  225. package/dist/recipe/repository.d.ts.map +0 -1
  226. package/dist/recipe/repository.js +0 -200
  227. package/dist/recipe/repository.js.map +0 -1
  228. package/dist/recipe/stats_repository.d.ts +0 -18
  229. package/dist/recipe/stats_repository.d.ts.map +0 -1
  230. package/dist/recipe/stats_repository.js +0 -195
  231. package/dist/recipe/stats_repository.js.map +0 -1
  232. package/dist/recipe/user_recipe_repository.d.ts +0 -26
  233. package/dist/recipe/user_recipe_repository.d.ts.map +0 -1
  234. package/dist/recipe/user_recipe_repository.js +0 -180
  235. package/dist/recipe/user_recipe_repository.js.map +0 -1
  236. package/dist/recipe/utils.d.ts +0 -7
  237. package/dist/recipe/utils.d.ts.map +0 -1
  238. package/dist/recipe/utils.js +0 -118
  239. package/dist/recipe/utils.js.map +0 -1
  240. package/dist/repository/base.d.ts +0 -36
  241. package/dist/repository/base.d.ts.map +0 -1
  242. package/dist/repository/base.js +0 -215
  243. package/dist/repository/base.js.map +0 -1
  244. package/dist/repository/equipment.d.ts +0 -14
  245. package/dist/repository/equipment.d.ts.map +0 -1
  246. package/dist/repository/equipment.js +0 -40
  247. package/dist/repository/equipment.js.map +0 -1
  248. package/dist/repository/index.d.ts +0 -8
  249. package/dist/repository/index.d.ts.map +0 -1
  250. package/dist/repository/index.js.map +0 -1
  251. package/dist/repository/ingredient.d.ts +0 -15
  252. package/dist/repository/ingredient.d.ts.map +0 -1
  253. package/dist/repository/ingredient.js +0 -46
  254. package/dist/repository/ingredient.js.map +0 -1
  255. package/dist/repository/recipe.d.ts +0 -17
  256. package/dist/repository/recipe.d.ts.map +0 -1
  257. package/dist/repository/recipe.js +0 -92
  258. package/dist/repository/recipe.js.map +0 -1
  259. package/dist/repository/recipe_stats.d.ts +0 -19
  260. package/dist/repository/recipe_stats.d.ts.map +0 -1
  261. package/dist/repository/recipe_stats.js +0 -121
  262. package/dist/repository/recipe_stats.js.map +0 -1
  263. package/dist/repository/report.d.ts +0 -15
  264. package/dist/repository/report.d.ts.map +0 -1
  265. package/dist/repository/report.js +0 -111
  266. package/dist/repository/report.js.map +0 -1
  267. package/dist/repository/user_recipe.d.ts +0 -39
  268. package/dist/repository/user_recipe.d.ts.map +0 -1
  269. package/dist/repository/user_recipe.js +0 -170
  270. package/dist/repository/user_recipe.js.map +0 -1
  271. package/dist/transform/index.d.ts +0 -2
  272. package/dist/transform/index.d.ts.map +0 -1
  273. package/dist/transform/index.js.map +0 -1
  274. package/dist/transform/recipe.d.ts +0 -7
  275. package/dist/transform/recipe.d.ts.map +0 -1
  276. package/dist/transform/recipe.js +0 -124
  277. package/dist/transform/recipe.js.map +0 -1
  278. package/dist/utils/cursor.d.ts +0 -14
  279. package/dist/utils/cursor.d.ts.map +0 -1
  280. package/dist/utils/cursor.js +0 -37
  281. package/dist/utils/cursor.js.map +0 -1
  282. package/dist/utils/index.d.ts +0 -4
  283. package/dist/utils/index.d.ts.map +0 -1
  284. package/dist/utils/index.js +0 -20
  285. package/dist/utils/index.js.map +0 -1
  286. package/dist/utils/strip-undefined.d.ts.map +0 -1
  287. package/dist/utils/strip-undefined.js.map +0 -1
  288. package/dist/utils/timestamp.d.ts.map +0 -1
  289. package/dist/utils/timestamp.js.map +0 -1
  290. package/src/converter/equipment.ts +0 -65
  291. package/src/converter/index.ts +0 -9
  292. package/src/converter/ingredient.ts +0 -67
  293. package/src/converter/recipe.ts +0 -86
  294. package/src/converter/report.ts +0 -53
  295. package/src/converter/submission.ts +0 -48
  296. package/src/repository/base.ts +0 -356
  297. package/src/repository/equipment.ts +0 -85
  298. package/src/repository/index.ts +0 -7
  299. package/src/repository/ingredient.ts +0 -107
  300. package/src/repository/recipe.ts +0 -149
  301. package/src/repository/recipe_stats.ts +0 -192
  302. package/src/repository/report.ts +0 -163
  303. package/src/repository/user_recipe.ts +0 -249
  304. package/src/transform/index.ts +0 -1
  305. package/src/transform/recipe.ts +0 -151
  306. package/src/utils/cursor.ts +0 -43
  307. /package/dist/{converter → converters/recipes}/comment.d.ts +0 -0
  308. /package/dist/{converter → converters/reports}/report.d.ts +0 -0
  309. /package/dist/{converter → converters/settings}/settings.d.ts +0 -0
  310. /package/dist/{converter → converters/users}/profile.d.ts +0 -0
  311. /package/dist/{converter → converters/users}/user.d.ts +0 -0
  312. /package/dist/{utils → lib}/strip-undefined.d.ts +0 -0
  313. /package/dist/{utils → lib}/strip-undefined.js +0 -0
  314. /package/dist/{utils → lib}/timestamp.d.ts +0 -0
@@ -1,92 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RecipeRepository = void 0;
4
- const firestore_1 = require("firebase-admin/firestore");
5
- const core_1 = require("@cravery/core");
6
- const base_1 = require("./base");
7
- const converter_1 = require("../converter");
8
- const transform_1 = require("../transform");
9
- const utils_1 = require("../utils");
10
- class RecipeRepository extends base_1.BaseRepository {
11
- constructor(db) {
12
- super(db);
13
- this.collectionName = core_1.COLLECTIONS.Recipes;
14
- this.entityName = "Recipe";
15
- this.metaConverter = converter_1.recipeMetaConverter;
16
- this.contentConverter = converter_1.recipeContentConverter;
17
- }
18
- merge(meta, content) {
19
- return (0, transform_1.mergeRecipe)(meta, content);
20
- }
21
- split(recipe) {
22
- return (0, transform_1.splitRecipe)(recipe);
23
- }
24
- async updateMeta(recipeId, updates) {
25
- await this.metaCollection.doc(recipeId).update(Object.assign(Object.assign({}, updates), { updatedAt: firestore_1.Timestamp.now() }));
26
- }
27
- async updateContent(recipeId, locale, content) {
28
- await this.contentCollection(recipeId)
29
- .doc(locale)
30
- .set(Object.assign(Object.assign({}, content), { locale }), { merge: true });
31
- }
32
- async getByStatus(statuses, locale, limit = 20, cursor, direction = "forward") {
33
- const isForward = direction === "forward";
34
- const sortDir = isForward ? "desc" : "asc";
35
- let query = this.metaCollection
36
- .where("status", "in", statuses)
37
- .orderBy("createdAt", sortDir)
38
- .orderBy(firestore_1.FieldPath.documentId(), sortDir);
39
- if (cursor) {
40
- const [timestamp, id] = (0, utils_1.cursorToFirestoreValues)(cursor);
41
- query = query.startAfter(timestamp, id);
42
- }
43
- const snapshot = await query.limit(limit + 1).get();
44
- const hasMore = snapshot.docs.length > limit;
45
- let docs = hasMore ? snapshot.docs.slice(0, -1) : snapshot.docs;
46
- if (!isForward) {
47
- docs = docs.reverse();
48
- }
49
- if (docs.length === 0) {
50
- return {
51
- data: [],
52
- startCursor: null,
53
- endCursor: null,
54
- hasNextPage: false,
55
- hasPreviousPage: false,
56
- };
57
- }
58
- const recipes = await this.hydrate(docs, locale);
59
- const firstDoc = docs[0];
60
- const lastDoc = docs[docs.length - 1];
61
- const firstCreatedAt = firstDoc.get("createdAt");
62
- const lastCreatedAt = lastDoc.get("createdAt");
63
- return {
64
- data: recipes,
65
- startCursor: (0, utils_1.encodeCursor)(firstCreatedAt, firstDoc.id),
66
- endCursor: (0, utils_1.encodeCursor)(lastCreatedAt, lastDoc.id),
67
- hasNextPage: isForward ? hasMore : !!cursor,
68
- hasPreviousPage: isForward ? !!cursor : hasMore,
69
- };
70
- }
71
- async findBySourceUrl(sourceUrl, locale) {
72
- const metaSnapshot = await this.metaCollection
73
- .where("sourceUrl", "==", sourceUrl)
74
- .limit(1)
75
- .get();
76
- if (metaSnapshot.empty) {
77
- return null;
78
- }
79
- const metaDoc = metaSnapshot.docs[0];
80
- const meta = metaDoc.data();
81
- const contentDoc = await this.contentCollection(metaDoc.id)
82
- .doc(locale)
83
- .get();
84
- if (!contentDoc.exists) {
85
- throw new Error(`Recipe ${metaDoc.id} has no content for locale ${locale}`);
86
- }
87
- const content = contentDoc.data();
88
- return this.merge(meta, content);
89
- }
90
- }
91
- exports.RecipeRepository = RecipeRepository;
92
- //# sourceMappingURL=recipe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../src/repository/recipe.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- import { Database } from "firebase-admin/database";
2
- import { type RecipeStats } from "@cravery/core";
3
- export declare class RecipeStatsRepository {
4
- private db;
5
- constructor(db: Database);
6
- private defaultStats;
7
- private getRef;
8
- get(recipeId: string): Promise<RecipeStats>;
9
- initialize(recipeId: string): Promise<RecipeStats>;
10
- incrementViews(recipeId: string): Promise<RecipeStats>;
11
- incrementLikes(recipeId: string): Promise<RecipeStats>;
12
- decrementLikes(recipeId: string): Promise<RecipeStats>;
13
- incrementSaves(recipeId: string): Promise<RecipeStats>;
14
- decrementSaves(recipeId: string): Promise<RecipeStats>;
15
- addRating(recipeId: string, rating: number, previousRating?: number): Promise<RecipeStats>;
16
- incrementComments(recipeId: string): Promise<RecipeStats>;
17
- decrementComments(recipeId: string): Promise<RecipeStats>;
18
- }
19
- //# sourceMappingURL=recipe_stats.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recipe_stats.d.ts","sourceRoot":"","sources":["../../src/repository/recipe_stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE7D,qBAAa,qBAAqB;IACpB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEhC,OAAO,CAAC,YAAY,CAQlB;IAEF,OAAO,CAAC,MAAM;IAIR,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAU3C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAalD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IActD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAetD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAetD,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC;IAgCjB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBzD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAchE"}
@@ -1,121 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RecipeStatsRepository = void 0;
4
- const core_1 = require("@cravery/core");
5
- class RecipeStatsRepository {
6
- constructor(db) {
7
- this.db = db;
8
- this.defaultStats = {
9
- comments: 0,
10
- likes: 0,
11
- ratingCount: 0,
12
- ratingSum: 0,
13
- saves: 0,
14
- updatedAt: Date.now(),
15
- views: 0,
16
- };
17
- }
18
- getRef(recipeId) {
19
- return this.db.ref(`${core_1.RTDB_PATHS.RecipeStats}/${recipeId}`);
20
- }
21
- async get(recipeId) {
22
- const snapshot = await this.getRef(recipeId).get();
23
- if (!snapshot.exists()) {
24
- return this.defaultStats;
25
- }
26
- return snapshot.val();
27
- }
28
- async initialize(recipeId) {
29
- const initialStats = this.defaultStats;
30
- const ref = this.getRef(recipeId);
31
- const snapshot = await ref.get();
32
- if (!snapshot.exists()) {
33
- await ref.set(initialStats);
34
- }
35
- return initialStats;
36
- }
37
- async incrementViews(recipeId) {
38
- await this.getRef(recipeId).transaction((current) => {
39
- if (!current) {
40
- return Object.assign(Object.assign({}, this.defaultStats), { views: 1 });
41
- }
42
- return Object.assign(Object.assign({}, current), { views: current.views + 1, updatedAt: Date.now() });
43
- });
44
- return this.get(recipeId);
45
- }
46
- async incrementLikes(recipeId) {
47
- await this.getRef(recipeId).transaction((current) => {
48
- if (!current) {
49
- return Object.assign(Object.assign({}, this.defaultStats), { likes: 1 });
50
- }
51
- return Object.assign(Object.assign({}, current), { likes: Math.max(0, current.likes + 1), updatedAt: Date.now() });
52
- });
53
- return this.get(recipeId);
54
- }
55
- async decrementLikes(recipeId) {
56
- await this.getRef(recipeId).transaction((current) => {
57
- if (!current) {
58
- return this.defaultStats;
59
- }
60
- return Object.assign(Object.assign({}, current), { likes: Math.max(0, current.likes - 1), updatedAt: Date.now() });
61
- });
62
- return this.get(recipeId);
63
- }
64
- async incrementSaves(recipeId) {
65
- await this.getRef(recipeId).transaction((current) => {
66
- if (!current) {
67
- return Object.assign(Object.assign({}, this.defaultStats), { saves: 1 });
68
- }
69
- return Object.assign(Object.assign({}, current), { saves: Math.max(0, current.saves + 1), updatedAt: Date.now() });
70
- });
71
- return this.get(recipeId);
72
- }
73
- async decrementSaves(recipeId) {
74
- await this.getRef(recipeId).transaction((current) => {
75
- if (!current) {
76
- return this.defaultStats;
77
- }
78
- return Object.assign(Object.assign({}, current), { saves: Math.max(0, current.saves - 1), updatedAt: Date.now() });
79
- });
80
- return this.get(recipeId);
81
- }
82
- async addRating(recipeId, rating, previousRating) {
83
- await this.getRef(recipeId).transaction((current) => {
84
- if (!current) {
85
- return Object.assign(Object.assign({}, this.defaultStats), { rating, ratingCount: 1 });
86
- }
87
- let newCount = current.ratingCount;
88
- let newRating;
89
- if (previousRating !== undefined) {
90
- const totalRating = current.rating * current.ratingCount;
91
- newRating = (totalRating - previousRating + rating) / newCount;
92
- }
93
- else {
94
- newCount = current.ratingCount + 1;
95
- newRating = (current.rating * current.ratingCount + rating) / newCount;
96
- }
97
- return Object.assign(Object.assign({}, current), { rating: newRating, ratingCount: newCount, updatedAt: Date.now() });
98
- });
99
- return this.get(recipeId);
100
- }
101
- async incrementComments(recipeId) {
102
- await this.getRef(recipeId).transaction((current) => {
103
- if (!current) {
104
- return Object.assign(Object.assign({}, this.defaultStats), { comments: 1 });
105
- }
106
- return Object.assign(Object.assign({}, current), { comments: Math.max(0, current.comments + 1), updatedAt: Date.now() });
107
- });
108
- return this.get(recipeId);
109
- }
110
- async decrementComments(recipeId) {
111
- await this.getRef(recipeId).transaction((current) => {
112
- if (!current) {
113
- return this.defaultStats;
114
- }
115
- return Object.assign(Object.assign({}, current), { comments: Math.max(0, current.comments - 1), updatedAt: Date.now() });
116
- });
117
- return this.get(recipeId);
118
- }
119
- }
120
- exports.RecipeStatsRepository = RecipeStatsRepository;
121
- //# sourceMappingURL=recipe_stats.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recipe_stats.js","sourceRoot":"","sources":["../../src/repository/recipe_stats.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import { Firestore } from "firebase-admin/firestore";
2
- import { type Report, type ReportTargetType, type ReportStatus, type CursorPaginatedResult, type PaginationDirection } from "@cravery/core";
3
- export declare class ReportRepository {
4
- private db;
5
- constructor(db: Firestore);
6
- private get collection();
7
- create(report: Omit<Report, "id" | "createdAt" | "updatedAt" | "deletedAt" | "status">): Promise<Report>;
8
- getById(id: string): Promise<Report | null>;
9
- getByUserId(userId: string, limit?: number): Promise<Report[]>;
10
- getByTargetType(targetType: ReportTargetType, limit?: number): Promise<Report[]>;
11
- getByTargetId(targetId: string): Promise<Report[]>;
12
- updateStatus(id: string, reportStatus: Report["reportStatus"], reviewedBy?: string, resolution?: string): Promise<void>;
13
- getPaginated(limit?: number, cursor?: string, direction?: PaginationDirection, statusFilter?: ReportStatus, targetTypeFilter?: ReportTargetType): Promise<CursorPaginatedResult<Report>>;
14
- }
15
- //# sourceMappingURL=report.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/repository/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAa,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAEjB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AAIvB,qBAAa,gBAAgB;IACf,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,SAAS;IAEjC,OAAO,KAAK,UAAU,GAIrB;IAEK,MAAM,CACV,MAAM,EAAE,IAAI,CACV,MAAM,EACN,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAC1D,GACA,OAAO,CAAC,MAAM,CAAC;IAcZ,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK3C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS1D,eAAe,CACnB,UAAU,EAAE,gBAAgB,EAC5B,KAAK,SAAK,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IASd,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQlD,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC,EACpC,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAqBV,YAAY,CAChB,KAAK,SAAK,EACV,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,GAAE,mBAA+B,EAC1C,YAAY,CAAC,EAAE,YAAY,EAC3B,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;CAuD1C"}
@@ -1,111 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ReportRepository = void 0;
4
- const firestore_1 = require("firebase-admin/firestore");
5
- const core_1 = require("@cravery/core");
6
- const converter_1 = require("../converter");
7
- const cursor_1 = require("../utils/cursor");
8
- class ReportRepository {
9
- constructor(db) {
10
- this.db = db;
11
- }
12
- get collection() {
13
- return this.db
14
- .collection(core_1.COLLECTIONS.Reports)
15
- .withConverter(converter_1.reportConverter);
16
- }
17
- async create(report) {
18
- const docRef = this.db.collection(core_1.COLLECTIONS.Reports).doc();
19
- const now = firestore_1.Timestamp.now();
20
- const newReport = Object.assign(Object.assign({}, report), { id: docRef.id, status: "active", createdAt: { seconds: now.seconds, nanoseconds: now.nanoseconds }, updatedAt: { seconds: now.seconds, nanoseconds: now.nanoseconds } });
21
- await docRef.withConverter(converter_1.reportConverter).set(newReport);
22
- return newReport;
23
- }
24
- async getById(id) {
25
- const doc = await this.collection.doc(id).get();
26
- return doc.exists ? doc.data() : null;
27
- }
28
- async getByUserId(userId, limit = 50) {
29
- const snapshot = await this.collection
30
- .where("userId", "==", userId)
31
- .orderBy("createdAt", "desc")
32
- .limit(limit)
33
- .get();
34
- return snapshot.docs.map((doc) => doc.data());
35
- }
36
- async getByTargetType(targetType, limit = 50) {
37
- const snapshot = await this.collection
38
- .where("targetType", "==", targetType)
39
- .orderBy("createdAt", "desc")
40
- .limit(limit)
41
- .get();
42
- return snapshot.docs.map((doc) => doc.data());
43
- }
44
- async getByTargetId(targetId) {
45
- const snapshot = await this.collection
46
- .where("targetId", "==", targetId)
47
- .orderBy("createdAt", "desc")
48
- .get();
49
- return snapshot.docs.map((doc) => doc.data());
50
- }
51
- async updateStatus(id, reportStatus, reviewedBy, resolution) {
52
- const updates = {
53
- reportStatus,
54
- updatedAt: firestore_1.Timestamp.now(),
55
- };
56
- if (reviewedBy) {
57
- updates.reviewedBy = reviewedBy;
58
- updates.reviewedAt = firestore_1.Timestamp.now();
59
- }
60
- if (resolution) {
61
- updates.resolution = resolution;
62
- }
63
- await this.db.collection(core_1.COLLECTIONS.Reports).doc(id).update(updates);
64
- }
65
- async getPaginated(limit = 20, cursor, direction = "forward", statusFilter, targetTypeFilter) {
66
- const isForward = direction === "forward";
67
- const sortDir = isForward ? "desc" : "asc";
68
- let query = this.collection
69
- .orderBy("createdAt", sortDir)
70
- .orderBy(firestore_1.FieldPath.documentId(), sortDir);
71
- if (statusFilter) {
72
- query = query.where("reportStatus", "==", statusFilter);
73
- }
74
- if (targetTypeFilter) {
75
- query = query.where("targetType", "==", targetTypeFilter);
76
- }
77
- if (cursor) {
78
- const [timestamp, id] = (0, cursor_1.cursorToFirestoreValues)(cursor);
79
- query = query.startAfter(timestamp, id);
80
- }
81
- const snapshot = await query.limit(limit + 1).get();
82
- const hasMore = snapshot.docs.length > limit;
83
- let docs = hasMore ? snapshot.docs.slice(0, -1) : snapshot.docs;
84
- if (!isForward) {
85
- docs = docs.reverse();
86
- }
87
- if (docs.length === 0) {
88
- return {
89
- data: [],
90
- startCursor: null,
91
- endCursor: null,
92
- hasNextPage: false,
93
- hasPreviousPage: false,
94
- };
95
- }
96
- const reports = docs.map((doc) => doc.data());
97
- const firstDoc = docs[0];
98
- const lastDoc = docs[docs.length - 1];
99
- const firstCreatedAt = firstDoc.get("createdAt");
100
- const lastCreatedAt = lastDoc.get("createdAt");
101
- return {
102
- data: reports,
103
- startCursor: (0, cursor_1.encodeCursor)(firstCreatedAt, firstDoc.id),
104
- endCursor: (0, cursor_1.encodeCursor)(lastCreatedAt, lastDoc.id),
105
- hasNextPage: isForward ? hasMore : !!cursor,
106
- hasPreviousPage: isForward ? !!cursor : hasMore,
107
- };
108
- }
109
- }
110
- exports.ReportRepository = ReportRepository;
111
- //# sourceMappingURL=report.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/repository/report.ts"],"names":[],"mappings":";;;AAAA,wDAA2E;AAC3E,wCAQuB;AACvB,4CAA+C;AAC/C,4CAAwE;AAExE,MAAa,gBAAgB;IAC3B,YAAoB,EAAa;QAAb,OAAE,GAAF,EAAE,CAAW;IAAG,CAAC;IAErC,IAAY,UAAU;QACpB,OAAO,IAAI,CAAC,EAAE;aACX,UAAU,CAAC,kBAAW,CAAC,OAAO,CAAC;aAC/B,aAAa,CAAC,2BAAe,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAGC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,qBAAS,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,SAAS,mCACV,MAAM,KACT,EAAE,EAAE,MAAM,CAAC,EAAE,EACb,MAAM,EAAE,QAAwB,EAChC,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,EACjE,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,GAClE,CAAC;QACF,MAAM,MAAM,CAAC,aAAa,CAAC,2BAAe,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAChD,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,KAAK,GAAG,EAAE;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU;aACnC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC;aAC7B,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;aAC5B,KAAK,CAAC,KAAK,CAAC;aACZ,GAAG,EAAE,CAAC;QACT,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,UAA4B,EAC5B,KAAK,GAAG,EAAE;QAEV,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU;aACnC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC;aACrC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;aAC5B,KAAK,CAAC,KAAK,CAAC;aACZ,GAAG,EAAE,CAAC;QACT,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU;aACnC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;aACjC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;aAC5B,GAAG,EAAE,CAAC;QACT,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,EAAU,EACV,YAAoC,EACpC,UAAmB,EACnB,UAAmB;QAEnB,MAAM,OAAO,GAGT;YACF,YAAY;YACZ,SAAS,EAAE,qBAAS,CAAC,GAAG,EAAE;SAC3B,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;YAChC,OAAO,CAAC,UAAU,GAAG,qBAAS,CAAC,GAAG,EAAE,CAAC;QACvC,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;QAClC,CAAC;QAED,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAK,GAAG,EAAE,EACV,MAAe,EACf,YAAiC,SAAS,EAC1C,YAA2B,EAC3B,gBAAmC;QAEnC,MAAM,SAAS,GAAG,SAAS,KAAK,SAAS,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAE3C,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU;aACxB,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;aAC7B,OAAO,CAAC,qBAAS,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;QAE5C,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACrB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,IAAA,gCAAuB,EAAC,MAAM,CAAC,CAAC;YACxD,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAC7C,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAEhE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,IAAI,EAAE,EAAE;gBACR,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,KAAK;gBAClB,eAAe,EAAE,KAAK;aACvB,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEtC,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAc,CAAC;QAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAc,CAAC;QAE5D,OAAO;YACL,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,IAAA,qBAAY,EAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtD,SAAS,EAAE,IAAA,qBAAY,EAAC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC;YAClD,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;YAC3C,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;SAChD,CAAC;IACJ,CAAC;CACF;AArJD,4CAqJC"}
@@ -1,39 +0,0 @@
1
- import { Firestore } from "firebase-admin/firestore";
2
- import { Database } from "firebase-admin/database";
3
- import { type Recipe, type RecipeMeta, type RecipeContent, type Locale } from "@cravery/core";
4
- import { RecipeRepository } from "./recipe";
5
- export declare class UserRecipeRepository {
6
- private db;
7
- private rtdb;
8
- constructor(db: Firestore, rtdb: Database);
9
- private userCollection;
10
- private savedCollection;
11
- private likesCollection;
12
- private ratingsCollection;
13
- private recipesCollection;
14
- private recipeStatsRef;
15
- toggleSave(userId: string, recipeId: string): Promise<{
16
- saved: boolean;
17
- }>;
18
- toggleLike(userId: string, recipeId: string): Promise<{
19
- liked: boolean;
20
- }>;
21
- rateRecipe(userId: string, recipeId: string, rating: number): Promise<{
22
- previousRating?: number;
23
- }>;
24
- cloneRecipe(userId: string, recipeId: string, locale: Locale, sourceRepository: RecipeRepository): Promise<Recipe>;
25
- getUserRecipe(userId: string, recipeId: string, locale: Locale): Promise<Recipe>;
26
- updateUserRecipe(userId: string, recipeId: string, locale: Locale, updates: {
27
- meta?: Partial<Omit<RecipeMeta, "id" | "createdAt" | "createdBy">>;
28
- content?: Partial<RecipeContent>;
29
- }): Promise<void>;
30
- isSaved(userId: string, recipeId: string): Promise<boolean>;
31
- isLiked(userId: string, recipeId: string): Promise<boolean>;
32
- getUserRating(userId: string, recipeId: string): Promise<number | null>;
33
- getRecipeInteractions(userId: string, recipeId: string): Promise<{
34
- saved: boolean;
35
- liked: boolean;
36
- rating: number | null;
37
- }>;
38
- }
39
- //# sourceMappingURL=user_recipe.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user_recipe.d.ts","sourceRoot":"","sources":["../../src/repository/user_recipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAe,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,MAAM,EAGZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,IAAI;gBADJ,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,QAAQ;IAGxB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,cAAc;IAIhB,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAsBxB,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAsBxB,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA8BjC,WAAW,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,MAAM,CAAC;IAqBZ,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IAyBZ,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QACP,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;KAClC,GACA,OAAO,CAAC,IAAI,CAAC;IA2BV,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK3D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK3D,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKnB,qBAAqB,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAStE"}
@@ -1,170 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UserRecipeRepository = void 0;
4
- const firestore_1 = require("firebase-admin/firestore");
5
- const database_1 = require("firebase-admin/database");
6
- const core_1 = require("@cravery/core");
7
- const converter_1 = require("../converter");
8
- const transform_1 = require("../transform");
9
- class UserRecipeRepository {
10
- constructor(db, rtdb) {
11
- this.db = db;
12
- this.rtdb = rtdb;
13
- }
14
- userCollection(userId) {
15
- return this.db.collection(core_1.COLLECTIONS.Users).doc(userId);
16
- }
17
- savedCollection(userId) {
18
- return this.userCollection(userId).collection(core_1.COLLECTIONS.Saved);
19
- }
20
- likesCollection(userId) {
21
- return this.userCollection(userId).collection(core_1.COLLECTIONS.Likes);
22
- }
23
- ratingsCollection(userId) {
24
- return this.userCollection(userId).collection(core_1.COLLECTIONS.Ratings);
25
- }
26
- recipesCollection(userId) {
27
- return this.userCollection(userId).collection(core_1.COLLECTIONS.Recipes);
28
- }
29
- recipeStatsRef(recipeId) {
30
- return this.rtdb.ref(`${core_1.RTDB_PATHS.RecipeStats}/${recipeId}`);
31
- }
32
- async toggleSave(userId, recipeId) {
33
- const saveRef = this.savedCollection(userId).doc(recipeId);
34
- const doc = await saveRef.get();
35
- if (doc.exists) {
36
- await saveRef.delete();
37
- await this.recipeStatsRef(recipeId)
38
- .child("saves")
39
- .set(database_1.ServerValue.increment(-1));
40
- return { saved: false };
41
- }
42
- await saveRef.set({
43
- recipeId,
44
- savedAt: firestore_1.Timestamp.now(),
45
- });
46
- await this.recipeStatsRef(recipeId)
47
- .child("saves")
48
- .set(database_1.ServerValue.increment(1));
49
- return { saved: true };
50
- }
51
- async toggleLike(userId, recipeId) {
52
- const likeRef = this.likesCollection(userId).doc(recipeId);
53
- const doc = await likeRef.get();
54
- if (doc.exists) {
55
- await likeRef.delete();
56
- await this.recipeStatsRef(recipeId)
57
- .child("likes")
58
- .set(database_1.ServerValue.increment(-1));
59
- return { liked: false };
60
- }
61
- await likeRef.set({
62
- recipeId,
63
- likedAt: firestore_1.Timestamp.now(),
64
- });
65
- await this.recipeStatsRef(recipeId)
66
- .child("likes")
67
- .set(database_1.ServerValue.increment(1));
68
- return { liked: true };
69
- }
70
- async rateRecipe(userId, recipeId, rating) {
71
- var _a;
72
- if (rating < 1 || rating > 5) {
73
- throw new Error("Rating must be between 1 and 5");
74
- }
75
- const ratingRef = this.ratingsCollection(userId).doc(recipeId);
76
- const doc = await ratingRef.get();
77
- const previousRating = doc.exists ? (_a = doc.data()) === null || _a === void 0 ? void 0 : _a.rating : undefined;
78
- await ratingRef.set({
79
- recipeId,
80
- rating,
81
- ratedAt: firestore_1.Timestamp.now(),
82
- });
83
- const statsRef = this.recipeStatsRef(recipeId);
84
- if (previousRating === undefined) {
85
- await statsRef.update({
86
- ratingCount: database_1.ServerValue.increment(1),
87
- ratingSum: database_1.ServerValue.increment(rating),
88
- });
89
- }
90
- else {
91
- await statsRef
92
- .child("ratingSum")
93
- .set(database_1.ServerValue.increment(rating - previousRating));
94
- }
95
- return { previousRating };
96
- }
97
- async cloneRecipe(userId, recipeId, locale, sourceRepository) {
98
- const recipeRef = this.recipesCollection(userId).doc(recipeId);
99
- const existingDoc = await recipeRef.get();
100
- if (existingDoc.exists) {
101
- throw new Error(`Recipe ${recipeId} already cloned for user ${userId}`);
102
- }
103
- const sourceRecipe = await sourceRepository.getById(recipeId, locale);
104
- const { meta, content } = (0, transform_1.splitRecipe)(sourceRecipe);
105
- await recipeRef.withConverter(converter_1.recipeMetaConverter).set(meta);
106
- await recipeRef
107
- .collection(core_1.COLLECTIONS.Content)
108
- .doc(locale)
109
- .withConverter(converter_1.recipeContentConverter)
110
- .set(content);
111
- return sourceRecipe;
112
- }
113
- async getUserRecipe(userId, recipeId, locale) {
114
- const recipeRef = this.recipesCollection(userId).doc(recipeId);
115
- const [metaDoc, contentDoc] = await Promise.all([
116
- recipeRef.withConverter(converter_1.recipeMetaConverter).get(),
117
- recipeRef
118
- .collection(core_1.COLLECTIONS.Content)
119
- .doc(locale)
120
- .withConverter(converter_1.recipeContentConverter)
121
- .get(),
122
- ]);
123
- if (!metaDoc.exists) {
124
- throw new Error(`Recipe ${recipeId} not found in user ${userId}'s collection`);
125
- }
126
- if (!contentDoc.exists) {
127
- throw new Error(`Recipe ${recipeId} has no content for locale ${locale}`);
128
- }
129
- return (0, transform_1.mergeRecipe)(metaDoc.data(), contentDoc.data());
130
- }
131
- async updateUserRecipe(userId, recipeId, locale, updates) {
132
- const recipeRef = this.recipesCollection(userId).doc(recipeId);
133
- const metaDoc = await recipeRef.get();
134
- if (!metaDoc.exists) {
135
- throw new Error(`Recipe ${recipeId} not found in user ${userId}'s collection`);
136
- }
137
- const batch = this.db.batch();
138
- if (updates.meta) {
139
- batch.update(recipeRef, Object.assign(Object.assign({}, updates.meta), { updatedAt: firestore_1.Timestamp.now() }));
140
- }
141
- if (updates.content) {
142
- const contentRef = recipeRef.collection(core_1.COLLECTIONS.Content).doc(locale);
143
- batch.set(contentRef, Object.assign(Object.assign({}, updates.content), { locale }), { merge: true });
144
- }
145
- await batch.commit();
146
- }
147
- async isSaved(userId, recipeId) {
148
- const doc = await this.savedCollection(userId).doc(recipeId).get();
149
- return doc.exists;
150
- }
151
- async isLiked(userId, recipeId) {
152
- const doc = await this.likesCollection(userId).doc(recipeId).get();
153
- return doc.exists;
154
- }
155
- async getUserRating(userId, recipeId) {
156
- var _a, _b;
157
- const doc = await this.ratingsCollection(userId).doc(recipeId).get();
158
- return doc.exists ? ((_b = (_a = doc.data()) === null || _a === void 0 ? void 0 : _a.rating) !== null && _b !== void 0 ? _b : null) : null;
159
- }
160
- async getRecipeInteractions(userId, recipeId) {
161
- const [saved, liked, rating] = await Promise.all([
162
- this.isSaved(userId, recipeId),
163
- this.isLiked(userId, recipeId),
164
- this.getUserRating(userId, recipeId),
165
- ]);
166
- return { saved, liked, rating };
167
- }
168
- }
169
- exports.UserRecipeRepository = UserRecipeRepository;
170
- //# sourceMappingURL=user_recipe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user_recipe.js","sourceRoot":"","sources":["../../src/repository/user_recipe.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export * from "./recipe";
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB"}
@@ -1,7 +0,0 @@
1
- import { Recipe, RecipeContent, RecipeMeta } from "@cravery/core";
2
- export declare function mergeRecipe(meta: RecipeMeta, content: RecipeContent): Recipe;
3
- export declare function splitRecipe(recipe: Recipe): {
4
- meta: Omit<RecipeMeta, "id">;
5
- content: RecipeContent;
6
- };
7
- //# sourceMappingURL=recipe.d.ts.map