@cravery/firebase 0.0.1 → 0.0.3

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 (36) hide show
  1. package/dist/recipe/converters.d.ts.map +1 -1
  2. package/dist/recipe/converters.js +2 -2
  3. package/dist/recipe/converters.js.map +1 -1
  4. package/dist/recipe/index.d.ts +2 -0
  5. package/dist/recipe/index.d.ts.map +1 -1
  6. package/dist/recipe/index.js +2 -0
  7. package/dist/recipe/index.js.map +1 -1
  8. package/dist/recipe/repository.d.ts +5 -0
  9. package/dist/recipe/repository.d.ts.map +1 -1
  10. package/dist/recipe/repository.js +46 -3
  11. package/dist/recipe/repository.js.map +1 -1
  12. package/dist/recipe/stats_repository.d.ts +18 -0
  13. package/dist/recipe/stats_repository.d.ts.map +1 -0
  14. package/dist/recipe/stats_repository.js +195 -0
  15. package/dist/recipe/stats_repository.js.map +1 -0
  16. package/dist/recipe/user_recipe_repository.d.ts +26 -0
  17. package/dist/recipe/user_recipe_repository.d.ts.map +1 -0
  18. package/dist/recipe/user_recipe_repository.js +180 -0
  19. package/dist/recipe/user_recipe_repository.js.map +1 -0
  20. package/dist/utils/strip-undefined.js +2 -2
  21. package/dist/utils/strip-undefined.js.map +1 -1
  22. package/dist/utils/timestamp.d.ts +1 -1
  23. package/dist/utils/timestamp.d.ts.map +1 -1
  24. package/package.json +60 -58
  25. package/src/iam/converters.ts +38 -38
  26. package/src/iam/index.ts +1 -1
  27. package/src/index.ts +3 -3
  28. package/src/recipe/converters.ts +98 -93
  29. package/src/recipe/index.ts +5 -3
  30. package/src/recipe/repository.ts +284 -220
  31. package/src/recipe/stats_repository.ts +251 -0
  32. package/src/recipe/user_recipe_repository.ts +240 -0
  33. package/src/recipe/utils.ts +143 -143
  34. package/src/utils/index.ts +2 -2
  35. package/src/utils/strip-undefined.ts +32 -32
  36. package/src/utils/timestamp.ts +21 -21
@@ -1 +1 @@
1
- {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../src/recipe/converters.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAGvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGrE,eAAO,MAAM,mBAAmB,EAAE,sBAAsB,CAAC,UAAU,CAuDlE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,sBAAsB,CAAC,aAAa,CA2BxE,CAAC"}
1
+ {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../src/recipe/converters.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAGvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQrE,eAAO,MAAM,mBAAmB,EAAE,sBAAsB,CAAC,UAAU,CAuDlE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,sBAAsB,CAAC,aAAa,CA2BxE,CAAC"}
@@ -20,11 +20,11 @@ exports.recipeMetaConverter = {
20
20
  if (!ts)
21
21
  return ts;
22
22
  // Handle Firestore internal format with _seconds
23
- if (typeof ts === 'object' && '_seconds' in ts) {
23
+ if (typeof ts === "object" && "_seconds" in ts) {
24
24
  return ts;
25
25
  }
26
26
  // Handle Firestore Timestamp objects with seconds/nanoseconds
27
- if (typeof ts === 'object' && 'seconds' in ts && 'nanoseconds' in ts) {
27
+ if (typeof ts === "object" && "seconds" in ts && "nanoseconds" in ts) {
28
28
  return (0, utils_1.fromTimestamp)(ts);
29
29
  }
30
30
  return ts;
@@ -1 +1 @@
1
- {"version":3,"file":"converters.js","sourceRoot":"","sources":["../../src/recipe/converters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"converters.js","sourceRoot":"","sources":["../../src/recipe/converters.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  export * from "./converters";
2
2
  export * from "./repository";
3
+ export * from "./stats_repository";
4
+ export * from "./user_recipe_repository";
3
5
  export * from "./utils";
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recipe/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recipe/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,SAAS,CAAC"}
@@ -16,5 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./converters"), exports);
18
18
  __exportStar(require("./repository"), exports);
19
+ __exportStar(require("./stats_repository"), exports);
20
+ __exportStar(require("./user_recipe_repository"), exports);
19
21
  __exportStar(require("./utils"), exports);
20
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recipe/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,+CAA6B;AAC7B,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recipe/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,+CAA6B;AAC7B,qDAAmC;AACnC,2DAAyC;AACzC,0CAAwB"}
@@ -17,5 +17,10 @@ export declare class RecipeRepository {
17
17
  total: number;
18
18
  }>;
19
19
  findBySourceUrl(sourceUrl: string): Promise<Recipe | null>;
20
+ getMeta(recipeId: string): Promise<RecipeMeta>;
21
+ getContent(recipeId: string, locale: Locale): Promise<RecipeContent>;
22
+ createContent(recipeId: string, content: RecipeContent): Promise<void>;
23
+ getAllContent(recipeId: string): Promise<RecipeContent[]>;
24
+ hasLocale(recipeId: string, locale: Locale): Promise<boolean>;
20
25
  }
21
26
  //# sourceMappingURL=repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/recipe/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,aAAa,EACb,MAAM,EACN,YAAY,EACb,MAAM,eAAe,CAAC;AAOvB,qBAAa,gBAAgB;IACf,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,SAAS;IAEjC,OAAO,KAAK,cAAc,GAIzB;IAED,OAAO,CAAC,iBAAiB;IAQnB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOnD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B1D,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,GACnE,OAAO,CAAC,IAAI,CAAC;IAOV,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAYV,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKxD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,WAAW,CACf,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,KAAK,SAAK,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IAkCd,qBAAqB,CACzB,QAAQ,EAAE,YAAY,EAAE,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,SAAI,EACR,KAAK,SAAK,GACT,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA6C1C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAyBjE"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/recipe/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,aAAa,EACb,MAAM,EACN,YAAY,EACb,MAAM,eAAe,CAAC;AAOvB,qBAAa,gBAAgB;IACf,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,SAAS;IAEjC,OAAO,KAAK,cAAc,GAIzB;IAED,OAAO,CAAC,iBAAiB;IAQnB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOnD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B1D,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,GACnE,OAAO,CAAC,IAAI,CAAC;IAOV,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAYV,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKxD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,WAAW,CACf,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,KAAK,SAAK,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IAoCd,qBAAqB,CACzB,QAAQ,EAAE,YAAY,EAAE,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,SAAI,EACR,KAAK,SAAK,GACT,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA+C1C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyB1D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAU9C,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUpE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAezD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAIpE"}
@@ -77,7 +77,7 @@ class RecipeRepository {
77
77
  .limit(limit)
78
78
  .get();
79
79
  // Filter out deleted recipes client-side (where deletedAt exists and is not null)
80
- const nonDeletedDocs = metaSnapshot.docs.filter(doc => !doc.data().deletedAt);
80
+ const nonDeletedDocs = metaSnapshot.docs.filter((doc) => !doc.data().deletedAt);
81
81
  const recipes = await Promise.all(nonDeletedDocs.map(async (metaDoc) => {
82
82
  const meta = metaDoc.data();
83
83
  const contentDoc = await this.contentCollection(metaDoc.id)
@@ -103,7 +103,7 @@ class RecipeRepository {
103
103
  // Get all documents for accurate count
104
104
  const allDocsSnapshot = await baseQuery.get();
105
105
  // Client-side filtering for deletedAt
106
- const nonDeletedDocs = allDocsSnapshot.docs.filter(doc => !doc.data().deletedAt);
106
+ const nonDeletedDocs = allDocsSnapshot.docs.filter((doc) => !doc.data().deletedAt);
107
107
  // Sort by createdAt desc
108
108
  const sortedDocs = nonDeletedDocs.sort((a, b) => {
109
109
  const aTime = a.data().createdAt;
@@ -135,7 +135,6 @@ class RecipeRepository {
135
135
  async findBySourceUrl(sourceUrl) {
136
136
  const metaSnapshot = await this.metaCollection
137
137
  .where("sourceUrl", "==", sourceUrl)
138
- .where("deletedAt", "==", null)
139
138
  .limit(1)
140
139
  .get();
141
140
  if (metaSnapshot.empty) {
@@ -152,6 +151,50 @@ class RecipeRepository {
152
151
  const content = contentDoc.data();
153
152
  return (0, utils_1.mergeRecipe)(meta, content);
154
153
  }
154
+ async getMeta(recipeId) {
155
+ const metaDoc = await this.metaCollection.doc(recipeId).get();
156
+ if (!metaDoc.exists) {
157
+ throw new Error(`Recipe ${recipeId} not found`);
158
+ }
159
+ return metaDoc.data();
160
+ }
161
+ async getContent(recipeId, locale) {
162
+ const contentDoc = await this.contentCollection(recipeId).doc(locale).get();
163
+ if (!contentDoc.exists) {
164
+ throw new Error(`Recipe ${recipeId} has no content for locale ${locale}`);
165
+ }
166
+ return contentDoc.data();
167
+ }
168
+ async createContent(recipeId, content) {
169
+ // Verify recipe exists
170
+ const metaDoc = await this.metaCollection.doc(recipeId).get();
171
+ if (!metaDoc.exists) {
172
+ throw new Error(`Recipe ${recipeId} not found`);
173
+ }
174
+ // Check if locale already exists
175
+ const existingContent = await this.contentCollection(recipeId)
176
+ .doc(content.locale)
177
+ .get();
178
+ if (existingContent.exists) {
179
+ throw new Error(`Content for recipe ${recipeId} in locale ${content.locale} already exists. Use updateContent() instead.`);
180
+ }
181
+ await this.contentCollection(recipeId).doc(content.locale).set(content);
182
+ }
183
+ async getAllContent(recipeId) {
184
+ const metaDoc = await this.metaCollection.doc(recipeId).get();
185
+ if (!metaDoc.exists) {
186
+ throw new Error(`Recipe ${recipeId} not found`);
187
+ }
188
+ const snapshot = await this.contentCollection(recipeId).get();
189
+ if (snapshot.empty) {
190
+ throw new Error(`Recipe ${recipeId} has no content`);
191
+ }
192
+ return snapshot.docs.map((doc) => doc.data());
193
+ }
194
+ async hasLocale(recipeId, locale) {
195
+ const contentDoc = await this.contentCollection(recipeId).doc(locale).get();
196
+ return contentDoc.exists;
197
+ }
155
198
  }
156
199
  exports.RecipeRepository = RecipeRepository;
157
200
  //# sourceMappingURL=repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/recipe/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/recipe/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
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 getRef;
7
+ get(recipeId: string): Promise<RecipeStats>;
8
+ initialize(recipeId: string): Promise<RecipeStats>;
9
+ incrementViews(recipeId: string): Promise<RecipeStats>;
10
+ incrementLikes(recipeId: string): Promise<RecipeStats>;
11
+ decrementLikes(recipeId: string): Promise<RecipeStats>;
12
+ incrementSaves(recipeId: string): Promise<RecipeStats>;
13
+ decrementSaves(recipeId: string): Promise<RecipeStats>;
14
+ addRating(recipeId: string, rating: number, previousRating?: number): Promise<RecipeStats>;
15
+ incrementComments(recipeId: string): Promise<RecipeStats>;
16
+ decrementComments(recipeId: string): Promise<RecipeStats>;
17
+ }
18
+ //# sourceMappingURL=stats_repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats_repository.d.ts","sourceRoot":"","sources":["../../src/recipe/stats_repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjD,qBAAa,qBAAqB;IACpB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEhC,OAAO,CAAC,MAAM;IAIR,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmB3C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAqBlD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBtD,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC;IAsCjB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBzD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAsBhE"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecipeStatsRepository = void 0;
4
+ const STATS_PATH = "stats/recipes";
5
+ class RecipeStatsRepository {
6
+ constructor(db) {
7
+ this.db = db;
8
+ }
9
+ getRef(recipeId) {
10
+ return this.db.ref(`${STATS_PATH}/${recipeId}`);
11
+ }
12
+ async get(recipeId) {
13
+ const snapshot = await this.getRef(recipeId).get();
14
+ if (!snapshot.exists()) {
15
+ // Return default stats (no error)
16
+ return {
17
+ comments: 0,
18
+ likes: 0,
19
+ rating: 0,
20
+ ratingCount: 0,
21
+ saves: 0,
22
+ updatedAt: Date.now(),
23
+ views: 0,
24
+ };
25
+ }
26
+ return snapshot.val();
27
+ }
28
+ async initialize(recipeId) {
29
+ const initialStats = {
30
+ comments: 0,
31
+ likes: 0,
32
+ rating: 0,
33
+ ratingCount: 0,
34
+ saves: 0,
35
+ updatedAt: Date.now(),
36
+ views: 0,
37
+ };
38
+ const ref = this.getRef(recipeId);
39
+ const snapshot = await ref.get();
40
+ if (!snapshot.exists()) {
41
+ await ref.set(initialStats);
42
+ }
43
+ return initialStats;
44
+ }
45
+ async incrementViews(recipeId) {
46
+ await this.getRef(recipeId).transaction((current) => {
47
+ if (!current) {
48
+ return {
49
+ comments: 0,
50
+ likes: 0,
51
+ rating: 0,
52
+ ratingCount: 0,
53
+ saves: 0,
54
+ updatedAt: Date.now(),
55
+ views: 1,
56
+ };
57
+ }
58
+ return Object.assign(Object.assign({}, current), { views: current.views + 1, updatedAt: Date.now() });
59
+ });
60
+ return this.get(recipeId);
61
+ }
62
+ async incrementLikes(recipeId) {
63
+ await this.getRef(recipeId).transaction((current) => {
64
+ if (!current) {
65
+ return {
66
+ comments: 0,
67
+ likes: 1,
68
+ rating: 0,
69
+ ratingCount: 0,
70
+ saves: 0,
71
+ updatedAt: Date.now(),
72
+ views: 0,
73
+ };
74
+ }
75
+ return Object.assign(Object.assign({}, current), { likes: Math.max(0, current.likes + 1), updatedAt: Date.now() });
76
+ });
77
+ return this.get(recipeId);
78
+ }
79
+ async decrementLikes(recipeId) {
80
+ await this.getRef(recipeId).transaction((current) => {
81
+ if (!current) {
82
+ return {
83
+ comments: 0,
84
+ likes: 0,
85
+ rating: 0,
86
+ ratingCount: 0,
87
+ saves: 0,
88
+ updatedAt: Date.now(),
89
+ views: 0,
90
+ };
91
+ }
92
+ return Object.assign(Object.assign({}, current), { likes: Math.max(0, current.likes - 1), updatedAt: Date.now() });
93
+ });
94
+ return this.get(recipeId);
95
+ }
96
+ async incrementSaves(recipeId) {
97
+ await this.getRef(recipeId).transaction((current) => {
98
+ if (!current) {
99
+ return {
100
+ comments: 0,
101
+ likes: 0,
102
+ rating: 0,
103
+ ratingCount: 0,
104
+ saves: 1,
105
+ updatedAt: Date.now(),
106
+ views: 0,
107
+ };
108
+ }
109
+ return Object.assign(Object.assign({}, current), { saves: Math.max(0, current.saves + 1), updatedAt: Date.now() });
110
+ });
111
+ return this.get(recipeId);
112
+ }
113
+ async decrementSaves(recipeId) {
114
+ await this.getRef(recipeId).transaction((current) => {
115
+ if (!current) {
116
+ return {
117
+ comments: 0,
118
+ likes: 0,
119
+ rating: 0,
120
+ ratingCount: 0,
121
+ saves: 0,
122
+ updatedAt: Date.now(),
123
+ views: 0,
124
+ };
125
+ }
126
+ return Object.assign(Object.assign({}, current), { saves: Math.max(0, current.saves - 1), updatedAt: Date.now() });
127
+ });
128
+ return this.get(recipeId);
129
+ }
130
+ async addRating(recipeId, rating, previousRating) {
131
+ await this.getRef(recipeId).transaction((current) => {
132
+ if (!current) {
133
+ return {
134
+ comments: 0,
135
+ likes: 0,
136
+ rating,
137
+ ratingCount: 1,
138
+ saves: 0,
139
+ updatedAt: Date.now(),
140
+ views: 0,
141
+ };
142
+ }
143
+ let newCount = current.ratingCount;
144
+ let newRating;
145
+ if (previousRating !== undefined) {
146
+ // Updating existing rating
147
+ const totalRating = current.rating * current.ratingCount;
148
+ newRating = (totalRating - previousRating + rating) / newCount;
149
+ }
150
+ else {
151
+ // New rating
152
+ newCount = current.ratingCount + 1;
153
+ newRating = (current.rating * current.ratingCount + rating) / newCount;
154
+ }
155
+ return Object.assign(Object.assign({}, current), { rating: newRating, ratingCount: newCount, updatedAt: Date.now() });
156
+ });
157
+ return this.get(recipeId);
158
+ }
159
+ async incrementComments(recipeId) {
160
+ await this.getRef(recipeId).transaction((current) => {
161
+ if (!current) {
162
+ return {
163
+ comments: 1,
164
+ likes: 0,
165
+ rating: 0,
166
+ ratingCount: 0,
167
+ saves: 0,
168
+ updatedAt: Date.now(),
169
+ views: 0,
170
+ };
171
+ }
172
+ return Object.assign(Object.assign({}, current), { comments: Math.max(0, current.comments + 1), updatedAt: Date.now() });
173
+ });
174
+ return this.get(recipeId);
175
+ }
176
+ async decrementComments(recipeId) {
177
+ await this.getRef(recipeId).transaction((current) => {
178
+ if (!current) {
179
+ return {
180
+ comments: 0,
181
+ likes: 0,
182
+ rating: 0,
183
+ ratingCount: 0,
184
+ saves: 0,
185
+ updatedAt: Date.now(),
186
+ views: 0,
187
+ };
188
+ }
189
+ return Object.assign(Object.assign({}, current), { comments: Math.max(0, current.comments - 1), updatedAt: Date.now() });
190
+ });
191
+ return this.get(recipeId);
192
+ }
193
+ }
194
+ exports.RecipeStatsRepository = RecipeStatsRepository;
195
+ //# sourceMappingURL=stats_repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats_repository.js","sourceRoot":"","sources":["../../src/recipe/stats_repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Firestore } from "firebase-admin/firestore";
2
+ import type { Recipe, RecipeMeta, RecipeContent, Locale } from "@cravery/core";
3
+ import { RecipeRepository } from "./repository";
4
+ export declare class UserRecipeRepository {
5
+ private db;
6
+ constructor(db: Firestore);
7
+ toggleSave(userId: string, recipeId: string): Promise<{
8
+ saved: boolean;
9
+ }>;
10
+ toggleLike(userId: string, recipeId: string): Promise<{
11
+ liked: boolean;
12
+ }>;
13
+ rateRecipe(userId: string, recipeId: string, rating: number): Promise<{
14
+ previousRating?: number;
15
+ }>;
16
+ cloneRecipe(userId: string, recipeId: string, locale: Locale, sourceRepository: RecipeRepository): Promise<Recipe>;
17
+ getUserRecipe(userId: string, recipeId: string, locale: Locale): Promise<Recipe>;
18
+ updateUserRecipe(userId: string, recipeId: string, locale: Locale, updates: {
19
+ meta?: Partial<Omit<RecipeMeta, "id" | "createdAt" | "createdBy">>;
20
+ content?: Partial<RecipeContent>;
21
+ }): Promise<void>;
22
+ isSaved(userId: string, recipeId: string): Promise<boolean>;
23
+ isLiked(userId: string, recipeId: string): Promise<boolean>;
24
+ getUserRating(userId: string, recipeId: string): Promise<number | null>;
25
+ }
26
+ //# sourceMappingURL=user_recipe_repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user_recipe_repository.d.ts","sourceRoot":"","sources":["../../src/recipe/user_recipe_repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,qBAAa,oBAAoB;IACnB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,SAAS;IAE3B,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAqBxB,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAqBxB,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAuBjC,WAAW,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,MAAM,CAAC;IAwCZ,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IAmCZ,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;IA+BV,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3D,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAS1B"}
@@ -0,0 +1,180 @@
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 converters_1 = require("./converters");
6
+ const utils_1 = require("./utils");
7
+ class UserRecipeRepository {
8
+ constructor(db) {
9
+ this.db = db;
10
+ }
11
+ async toggleSave(userId, recipeId) {
12
+ const saveRef = this.db
13
+ .collection("users")
14
+ .doc(userId)
15
+ .collection("saved")
16
+ .doc(recipeId);
17
+ const doc = await saveRef.get();
18
+ if (doc.exists) {
19
+ await saveRef.delete();
20
+ return { saved: false };
21
+ }
22
+ else {
23
+ await saveRef.set({
24
+ recipeId,
25
+ savedAt: firestore_1.Timestamp.now(),
26
+ });
27
+ return { saved: true };
28
+ }
29
+ }
30
+ async toggleLike(userId, recipeId) {
31
+ const likeRef = this.db
32
+ .collection("users")
33
+ .doc(userId)
34
+ .collection("likes")
35
+ .doc(recipeId);
36
+ const doc = await likeRef.get();
37
+ if (doc.exists) {
38
+ await likeRef.delete();
39
+ return { liked: false };
40
+ }
41
+ else {
42
+ await likeRef.set({
43
+ recipeId,
44
+ likedAt: firestore_1.Timestamp.now(),
45
+ });
46
+ return { liked: true };
47
+ }
48
+ }
49
+ async rateRecipe(userId, recipeId, rating) {
50
+ var _a;
51
+ if (rating < 1 || rating > 5) {
52
+ throw new Error("Rating must be between 1 and 5");
53
+ }
54
+ const ratingRef = this.db
55
+ .collection("users")
56
+ .doc(userId)
57
+ .collection("ratings")
58
+ .doc(recipeId);
59
+ const doc = await ratingRef.get();
60
+ const previousRating = doc.exists ? (_a = doc.data()) === null || _a === void 0 ? void 0 : _a.rating : undefined;
61
+ await ratingRef.set({
62
+ recipeId,
63
+ rating,
64
+ ratedAt: firestore_1.Timestamp.now(),
65
+ });
66
+ return { previousRating };
67
+ }
68
+ async cloneRecipe(userId, recipeId, locale, sourceRepository) {
69
+ // Check if already cloned
70
+ const existingDoc = await this.db
71
+ .collection("users")
72
+ .doc(userId)
73
+ .collection("recipes")
74
+ .doc(recipeId)
75
+ .get();
76
+ if (existingDoc.exists) {
77
+ throw new Error(`Recipe ${recipeId} already cloned for user ${userId}`);
78
+ }
79
+ // Fetch source recipe
80
+ const sourceRecipe = await sourceRepository.getById(recipeId, locale);
81
+ const { meta, content } = (0, utils_1.splitRecipe)(sourceRecipe);
82
+ // Store in user's collection (same structure as main recipes)
83
+ const userMetaRef = this.db
84
+ .collection("users")
85
+ .doc(userId)
86
+ .collection("recipes")
87
+ .doc(recipeId)
88
+ .withConverter(converters_1.recipeMetaConverter);
89
+ await userMetaRef.set(meta);
90
+ await this.db
91
+ .collection("users")
92
+ .doc(userId)
93
+ .collection("recipes")
94
+ .doc(recipeId)
95
+ .collection("content")
96
+ .doc(locale)
97
+ .withConverter(converters_1.recipeContentConverter)
98
+ .set(content);
99
+ return sourceRecipe;
100
+ }
101
+ async getUserRecipe(userId, recipeId, locale) {
102
+ const metaDoc = await this.db
103
+ .collection("users")
104
+ .doc(userId)
105
+ .collection("recipes")
106
+ .doc(recipeId)
107
+ .withConverter(converters_1.recipeMetaConverter)
108
+ .get();
109
+ if (!metaDoc.exists) {
110
+ throw new Error(`Recipe ${recipeId} not found in user ${userId}'s collection`);
111
+ }
112
+ const contentDoc = await this.db
113
+ .collection("users")
114
+ .doc(userId)
115
+ .collection("recipes")
116
+ .doc(recipeId)
117
+ .collection("content")
118
+ .doc(locale)
119
+ .withConverter(converters_1.recipeContentConverter)
120
+ .get();
121
+ if (!contentDoc.exists) {
122
+ throw new Error(`Recipe ${recipeId} has no content for locale ${locale}`);
123
+ }
124
+ const meta = metaDoc.data();
125
+ const content = contentDoc.data();
126
+ return (0, utils_1.mergeRecipe)(meta, content);
127
+ }
128
+ async updateUserRecipe(userId, recipeId, locale, updates) {
129
+ const baseRef = this.db
130
+ .collection("users")
131
+ .doc(userId)
132
+ .collection("recipes")
133
+ .doc(recipeId);
134
+ // Verify exists
135
+ const metaDoc = await baseRef.get();
136
+ if (!metaDoc.exists) {
137
+ throw new Error(`Recipe ${recipeId} not found in user ${userId}'s collection`);
138
+ }
139
+ if (updates.meta) {
140
+ await baseRef.withConverter(converters_1.recipeMetaConverter).update(Object.assign(Object.assign({}, updates.meta), { updatedAt: firestore_1.Timestamp.now() }));
141
+ }
142
+ if (updates.content) {
143
+ await baseRef
144
+ .collection("content")
145
+ .doc(locale)
146
+ .withConverter(converters_1.recipeContentConverter)
147
+ .set(Object.assign(Object.assign({}, updates.content), { locale }), { merge: true });
148
+ }
149
+ }
150
+ async isSaved(userId, recipeId) {
151
+ const doc = await this.db
152
+ .collection("users")
153
+ .doc(userId)
154
+ .collection("saved")
155
+ .doc(recipeId)
156
+ .get();
157
+ return doc.exists;
158
+ }
159
+ async isLiked(userId, recipeId) {
160
+ const doc = await this.db
161
+ .collection("users")
162
+ .doc(userId)
163
+ .collection("likes")
164
+ .doc(recipeId)
165
+ .get();
166
+ return doc.exists;
167
+ }
168
+ async getUserRating(userId, recipeId) {
169
+ var _a, _b;
170
+ const doc = await this.db
171
+ .collection("users")
172
+ .doc(userId)
173
+ .collection("ratings")
174
+ .doc(recipeId)
175
+ .get();
176
+ return doc.exists ? ((_b = (_a = doc.data()) === null || _a === void 0 ? void 0 : _a.rating) !== null && _b !== void 0 ? _b : null) : null;
177
+ }
178
+ }
179
+ exports.UserRecipeRepository = UserRecipeRepository;
180
+ //# sourceMappingURL=user_recipe_repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user_recipe_repository.js","sourceRoot":"","sources":["../../src/recipe/user_recipe_repository.ts"],"names":[],"mappings":"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"}