@cravery/firebase 0.0.1

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 (51) hide show
  1. package/dist/iam/converters.d.ts +4 -0
  2. package/dist/iam/converters.d.ts.map +1 -0
  3. package/dist/iam/converters.js +39 -0
  4. package/dist/iam/converters.js.map +1 -0
  5. package/dist/iam/index.d.ts +2 -0
  6. package/dist/iam/index.d.ts.map +1 -0
  7. package/dist/iam/index.js +18 -0
  8. package/dist/iam/index.js.map +1 -0
  9. package/dist/index.d.ts +4 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +20 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/recipe/converters.d.ts +5 -0
  14. package/dist/recipe/converters.d.ts.map +1 -0
  15. package/dist/recipe/converters.js +90 -0
  16. package/dist/recipe/converters.js.map +1 -0
  17. package/dist/recipe/index.d.ts +4 -0
  18. package/dist/recipe/index.d.ts.map +1 -0
  19. package/dist/recipe/index.js +20 -0
  20. package/dist/recipe/index.js.map +1 -0
  21. package/dist/recipe/repository.d.ts +21 -0
  22. package/dist/recipe/repository.d.ts.map +1 -0
  23. package/dist/recipe/repository.js +157 -0
  24. package/dist/recipe/repository.js.map +1 -0
  25. package/dist/recipe/utils.d.ts +7 -0
  26. package/dist/recipe/utils.d.ts.map +1 -0
  27. package/dist/recipe/utils.js +118 -0
  28. package/dist/recipe/utils.js.map +1 -0
  29. package/dist/utils/index.d.ts +3 -0
  30. package/dist/utils/index.d.ts.map +1 -0
  31. package/dist/utils/index.js +19 -0
  32. package/dist/utils/index.js.map +1 -0
  33. package/dist/utils/strip-undefined.d.ts +13 -0
  34. package/dist/utils/strip-undefined.d.ts.map +1 -0
  35. package/dist/utils/strip-undefined.js +33 -0
  36. package/dist/utils/strip-undefined.js.map +1 -0
  37. package/dist/utils/timestamp.d.ts +6 -0
  38. package/dist/utils/timestamp.d.ts.map +1 -0
  39. package/dist/utils/timestamp.js +19 -0
  40. package/dist/utils/timestamp.js.map +1 -0
  41. package/package.json +58 -0
  42. package/src/iam/converters.ts +38 -0
  43. package/src/iam/index.ts +1 -0
  44. package/src/index.ts +3 -0
  45. package/src/recipe/converters.ts +93 -0
  46. package/src/recipe/index.ts +3 -0
  47. package/src/recipe/repository.ts +220 -0
  48. package/src/recipe/utils.ts +143 -0
  49. package/src/utils/index.ts +2 -0
  50. package/src/utils/strip-undefined.ts +32 -0
  51. package/src/utils/timestamp.ts +21 -0
@@ -0,0 +1,4 @@
1
+ import { FirestoreDataConverter } from "firebase-admin/firestore";
2
+ import type { User } from "@cravery/core/types";
3
+ export declare const userConverter: FirestoreDataConverter<User>;
4
+ //# sourceMappingURL=converters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../src/iam/converters.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAGvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAGhD,eAAO,MAAM,aAAa,EAAE,sBAAsB,CAAC,IAAI,CA6BtD,CAAC"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.userConverter = void 0;
15
+ const utils_1 = require("../utils");
16
+ exports.userConverter = {
17
+ toFirestore(user) {
18
+ const { id, createdAt, updatedAt, deletedAt } = user, rest = __rest(user, ["id", "createdAt", "updatedAt", "deletedAt"]);
19
+ return Object.assign(Object.assign(Object.assign({}, rest), { createdAt: (0, utils_1.fromTimestamp)(createdAt), updatedAt: (0, utils_1.fromTimestamp)(updatedAt) }), (deletedAt && { deletedAt: (0, utils_1.fromTimestamp)(deletedAt) }));
20
+ },
21
+ fromFirestore(snapshot) {
22
+ var _a;
23
+ const data = snapshot.data();
24
+ return {
25
+ id: snapshot.id,
26
+ email: data.email,
27
+ name: data.name,
28
+ role: data.role,
29
+ status: data.status,
30
+ verified: (_a = data.verified) !== null && _a !== void 0 ? _a : false,
31
+ createdAt: (0, utils_1.toTimestamp)(data.createdAt),
32
+ updatedAt: (0, utils_1.toTimestamp)(data.updatedAt),
33
+ deletedAt: (0, utils_1.toOptionalTimestamp)(data.deletedAt),
34
+ imageUrl: data.imageUrl,
35
+ subscriptionId: data.subscriptionId,
36
+ };
37
+ },
38
+ };
39
+ //# sourceMappingURL=converters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.js","sourceRoot":"","sources":["../../src/iam/converters.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAMA,oCAA2E;AAE9D,QAAA,aAAa,GAAiC;IACzD,WAAW,CAAC,IAAU;QACpB,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,KAAc,IAAI,EAAb,IAAI,UAAK,IAAI,EAAvD,6CAAgD,CAAO,CAAC;QAE9D,qDACK,IAAI,KACP,SAAS,EAAE,IAAA,qBAAa,EAAC,SAAS,CAAC,EACnC,SAAS,EAAE,IAAA,qBAAa,EAAC,SAAS,CAAC,KAChC,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,IAAA,qBAAa,EAAC,SAAS,CAAC,EAAE,CAAC,EACzD;IACJ,CAAC;IAED,aAAa,CAAC,QAA+B;;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE7B,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,MAAA,IAAI,CAAC,QAAQ,mCAAI,KAAK;YAChC,SAAS,EAAE,IAAA,mBAAW,EAAC,IAAI,CAAC,SAAS,CAAC;YACtC,SAAS,EAAE,IAAA,mBAAW,EAAC,IAAI,CAAC,SAAS,CAAC;YACtC,SAAS,EAAE,IAAA,2BAAmB,EAAC,IAAI,CAAC,SAAS,CAAC;YAC9C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./converters";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/iam/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./converters"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/iam/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B"}
@@ -0,0 +1,4 @@
1
+ export * from "./iam";
2
+ export * from "./recipe";
3
+ export * from "./utils";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./iam"), exports);
18
+ __exportStar(require("./recipe"), exports);
19
+ __exportStar(require("./utils"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,2CAAyB;AACzB,0CAAwB"}
@@ -0,0 +1,5 @@
1
+ import { FirestoreDataConverter } from "firebase-admin/firestore";
2
+ import type { RecipeMeta, RecipeContent } from "@cravery/core/types";
3
+ export declare const recipeMetaConverter: FirestoreDataConverter<RecipeMeta>;
4
+ export declare const recipeContentConverter: FirestoreDataConverter<RecipeContent>;
5
+ //# sourceMappingURL=converters.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.recipeContentConverter = exports.recipeMetaConverter = void 0;
15
+ const utils_1 = require("../utils");
16
+ exports.recipeMetaConverter = {
17
+ toFirestore(recipeMeta) {
18
+ const { id, createdAt, updatedAt, deletedAt } = recipeMeta, rest = __rest(recipeMeta, ["id", "createdAt", "updatedAt", "deletedAt"]);
19
+ const convertTimestamp = (ts) => {
20
+ if (!ts)
21
+ return ts;
22
+ // Handle Firestore internal format with _seconds
23
+ if (typeof ts === 'object' && '_seconds' in ts) {
24
+ return ts;
25
+ }
26
+ // Handle Firestore Timestamp objects with seconds/nanoseconds
27
+ if (typeof ts === 'object' && 'seconds' in ts && 'nanoseconds' in ts) {
28
+ return (0, utils_1.fromTimestamp)(ts);
29
+ }
30
+ return ts;
31
+ };
32
+ // Strip undefined values before returning to Firestore
33
+ return (0, utils_1.stripUndefined)(Object.assign(Object.assign(Object.assign({}, rest), { createdAt: convertTimestamp(createdAt), updatedAt: convertTimestamp(updatedAt) }), (deletedAt && { deletedAt: convertTimestamp(deletedAt) })));
34
+ },
35
+ fromFirestore(snapshot) {
36
+ const data = snapshot.data();
37
+ return {
38
+ id: snapshot.id,
39
+ allergens: data.allergens,
40
+ confidence: data.confidence,
41
+ createdBy: data.createdBy,
42
+ cuisine: data.cuisine,
43
+ dietaryTags: data.dietaryTags,
44
+ difficulty: data.difficulty,
45
+ equipment: data.equipment,
46
+ imageUrl: data.imageUrl,
47
+ ingredientSections: data.ingredientSections,
48
+ instructions: data.instructions,
49
+ mealTypes: data.mealTypes,
50
+ nutrition: data.nutrition,
51
+ originalLocale: data.originalLocale,
52
+ servings: data.servings,
53
+ source: data.source,
54
+ sourceUrl: data.sourceUrl,
55
+ spiciness: data.spiciness,
56
+ status: data.status,
57
+ time: data.time,
58
+ createdAt: (0, utils_1.toTimestamp)(data.createdAt),
59
+ updatedAt: (0, utils_1.toTimestamp)(data.updatedAt),
60
+ deletedAt: (0, utils_1.toOptionalTimestamp)(data.deletedAt),
61
+ };
62
+ },
63
+ };
64
+ exports.recipeContentConverter = {
65
+ toFirestore(content) {
66
+ // Strip undefined values before returning to Firestore
67
+ return (0, utils_1.stripUndefined)({
68
+ description: content.description,
69
+ equipment: content.equipment,
70
+ ingredientSections: content.ingredientSections,
71
+ instructions: content.instructions,
72
+ locale: content.locale,
73
+ tips: content.tips,
74
+ title: content.title,
75
+ });
76
+ },
77
+ fromFirestore(snapshot) {
78
+ const data = snapshot.data();
79
+ return {
80
+ description: data.description,
81
+ equipment: data.equipment,
82
+ ingredientSections: data.ingredientSections,
83
+ instructions: data.instructions,
84
+ locale: data.locale,
85
+ tips: data.tips,
86
+ title: data.title,
87
+ };
88
+ },
89
+ };
90
+ //# sourceMappingURL=converters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.js","sourceRoot":"","sources":["../../src/recipe/converters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./converters";
2
+ export * from "./repository";
3
+ export * from "./utils";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./converters"), exports);
18
+ __exportStar(require("./repository"), exports);
19
+ __exportStar(require("./utils"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recipe/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,+CAA6B;AAC7B,0CAAwB"}
@@ -0,0 +1,21 @@
1
+ import { Firestore } from "firebase-admin/firestore";
2
+ import type { Recipe, RecipeMeta, RecipeContent, Locale, RecipeStatus } from "@cravery/core";
3
+ export declare class RecipeRepository {
4
+ private db;
5
+ constructor(db: Firestore);
6
+ private get metaCollection();
7
+ private contentCollection;
8
+ create(recipe: Omit<Recipe, "id">): Promise<Recipe>;
9
+ getById(recipeId: string, locale: Locale): Promise<Recipe>;
10
+ updateMeta(recipeId: string, updates: Partial<Omit<RecipeMeta, "id" | "createdAt" | "createdBy">>): Promise<void>;
11
+ updateContent(recipeId: string, locale: Locale, content: Partial<RecipeContent>): Promise<void>;
12
+ getAvailableLocales(recipeId: string): Promise<Locale[]>;
13
+ delete(recipeId: string): Promise<void>;
14
+ getByStatus(status: RecipeStatus, locale: Locale, limit?: number): Promise<Recipe[]>;
15
+ getByMultipleStatuses(statuses: RecipeStatus[], locale: Locale, page?: number, limit?: number): Promise<{
16
+ recipes: Recipe[];
17
+ total: number;
18
+ }>;
19
+ findBySourceUrl(sourceUrl: string): Promise<Recipe | null>;
20
+ }
21
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,157 @@
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 converters_1 = require("./converters");
6
+ const utils_1 = require("./utils");
7
+ const RECIPES_COLLECTION = "recipes";
8
+ const CONTENT_SUBCOLLECTION = "content";
9
+ class RecipeRepository {
10
+ constructor(db) {
11
+ this.db = db;
12
+ }
13
+ get metaCollection() {
14
+ return this.db
15
+ .collection(RECIPES_COLLECTION)
16
+ .withConverter(converters_1.recipeMetaConverter);
17
+ }
18
+ contentCollection(recipeId) {
19
+ return this.db
20
+ .collection(RECIPES_COLLECTION)
21
+ .doc(recipeId)
22
+ .collection(CONTENT_SUBCOLLECTION)
23
+ .withConverter(converters_1.recipeContentConverter);
24
+ }
25
+ async create(recipe) {
26
+ const { meta, content } = (0, utils_1.splitRecipe)(recipe);
27
+ const metaRef = await this.metaCollection.add(meta);
28
+ await this.contentCollection(metaRef.id).doc(content.locale).set(content);
29
+ return this.getById(metaRef.id, content.locale);
30
+ }
31
+ async getById(recipeId, locale) {
32
+ const [metaDoc, contentDoc] = await Promise.all([
33
+ this.metaCollection.doc(recipeId).get(),
34
+ this.contentCollection(recipeId).doc(locale).get(),
35
+ ]);
36
+ if (!metaDoc.exists) {
37
+ throw new Error(`Recipe ${recipeId} not found`);
38
+ }
39
+ const meta = metaDoc.data();
40
+ let content;
41
+ if (contentDoc.exists) {
42
+ content = contentDoc.data();
43
+ }
44
+ else {
45
+ const originalContentDoc = await this.contentCollection(recipeId)
46
+ .doc(meta.originalLocale)
47
+ .get();
48
+ if (!originalContentDoc.exists) {
49
+ throw new Error(`Recipe ${recipeId} has no content for locale ${locale} or ${meta.originalLocale}`);
50
+ }
51
+ content = originalContentDoc.data();
52
+ }
53
+ return (0, utils_1.mergeRecipe)(meta, content);
54
+ }
55
+ async updateMeta(recipeId, updates) {
56
+ await this.metaCollection.doc(recipeId).update(Object.assign(Object.assign({}, updates), { updatedAt: firestore_1.Timestamp.now() }));
57
+ }
58
+ async updateContent(recipeId, locale, content) {
59
+ await this.contentCollection(recipeId)
60
+ .doc(locale)
61
+ .set(Object.assign(Object.assign({}, content), { locale }), { merge: true });
62
+ }
63
+ async getAvailableLocales(recipeId) {
64
+ const snapshot = await this.contentCollection(recipeId).get();
65
+ return snapshot.docs.map((doc) => doc.id);
66
+ }
67
+ async delete(recipeId) {
68
+ await this.metaCollection.doc(recipeId).update({
69
+ status: "deleted",
70
+ deletedAt: firestore_1.Timestamp.now(),
71
+ });
72
+ }
73
+ async getByStatus(status, locale, limit = 10) {
74
+ // Query only by status - deletedAt field may not exist for newly created recipes
75
+ const metaSnapshot = await this.metaCollection
76
+ .where("status", "==", status)
77
+ .limit(limit)
78
+ .get();
79
+ // Filter out deleted recipes client-side (where deletedAt exists and is not null)
80
+ const nonDeletedDocs = metaSnapshot.docs.filter(doc => !doc.data().deletedAt);
81
+ const recipes = await Promise.all(nonDeletedDocs.map(async (metaDoc) => {
82
+ const meta = metaDoc.data();
83
+ const contentDoc = await this.contentCollection(metaDoc.id)
84
+ .doc(locale)
85
+ .get();
86
+ let content;
87
+ if (contentDoc.exists) {
88
+ content = contentDoc.data();
89
+ }
90
+ else {
91
+ const originalContentDoc = await this.contentCollection(metaDoc.id)
92
+ .doc(meta.originalLocale)
93
+ .get();
94
+ content = originalContentDoc.data();
95
+ }
96
+ return (0, utils_1.mergeRecipe)(meta, content);
97
+ }));
98
+ return recipes;
99
+ }
100
+ async getByMultipleStatuses(statuses, locale, page = 1, limit = 20) {
101
+ // Build base query - no deletedAt filter on query level
102
+ const baseQuery = this.metaCollection.where("status", "in", statuses);
103
+ // Get all documents for accurate count
104
+ const allDocsSnapshot = await baseQuery.get();
105
+ // Client-side filtering for deletedAt
106
+ const nonDeletedDocs = allDocsSnapshot.docs.filter(doc => !doc.data().deletedAt);
107
+ // Sort by createdAt desc
108
+ const sortedDocs = nonDeletedDocs.sort((a, b) => {
109
+ const aTime = a.data().createdAt;
110
+ const bTime = b.data().createdAt;
111
+ return bTime.seconds - aTime.seconds;
112
+ });
113
+ const total = sortedDocs.length;
114
+ const offset = (page - 1) * limit;
115
+ const paginatedDocs = sortedDocs.slice(offset, offset + limit);
116
+ const recipes = await Promise.all(paginatedDocs.map(async (metaDoc) => {
117
+ const meta = metaDoc.data();
118
+ const contentDoc = await this.contentCollection(metaDoc.id)
119
+ .doc(locale)
120
+ .get();
121
+ let content;
122
+ if (contentDoc.exists) {
123
+ content = contentDoc.data();
124
+ }
125
+ else {
126
+ const originalContentDoc = await this.contentCollection(metaDoc.id)
127
+ .doc(meta.originalLocale)
128
+ .get();
129
+ content = originalContentDoc.data();
130
+ }
131
+ return (0, utils_1.mergeRecipe)(meta, content);
132
+ }));
133
+ return { recipes, total };
134
+ }
135
+ async findBySourceUrl(sourceUrl) {
136
+ const metaSnapshot = await this.metaCollection
137
+ .where("sourceUrl", "==", sourceUrl)
138
+ .where("deletedAt", "==", null)
139
+ .limit(1)
140
+ .get();
141
+ if (metaSnapshot.empty) {
142
+ return null;
143
+ }
144
+ const metaDoc = metaSnapshot.docs[0];
145
+ const meta = metaDoc.data();
146
+ const contentDoc = await this.contentCollection(metaDoc.id)
147
+ .doc(meta.originalLocale)
148
+ .get();
149
+ if (!contentDoc.exists) {
150
+ throw new Error(`Recipe ${metaDoc.id} has no content`);
151
+ }
152
+ const content = contentDoc.data();
153
+ return (0, utils_1.mergeRecipe)(meta, content);
154
+ }
155
+ }
156
+ exports.RecipeRepository = RecipeRepository;
157
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/recipe/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
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=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/recipe/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAElE,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CA2D5E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;IAC3C,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,aAAa,CAAC;CACxB,CA4EA"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.mergeRecipe = mergeRecipe;
15
+ exports.splitRecipe = splitRecipe;
16
+ function mergeRecipe(meta, content) {
17
+ var _a;
18
+ const equipment = (_a = meta.equipment) === null || _a === void 0 ? void 0 : _a.map((equipMeta, index) => {
19
+ var _a;
20
+ const equipContent = (_a = content.equipment) === null || _a === void 0 ? void 0 : _a[index];
21
+ if (!equipContent) {
22
+ throw new Error(`Missing equipment content at index ${index}`);
23
+ }
24
+ return Object.assign(Object.assign({}, equipMeta), equipContent);
25
+ });
26
+ const ingredientSections = meta.ingredientSections.map((sectionMeta, sectionIndex) => {
27
+ var _a;
28
+ return ({
29
+ slug: sectionMeta.slug,
30
+ title: (_a = content.ingredientSections[sectionIndex]) === null || _a === void 0 ? void 0 : _a.title,
31
+ ingredients: sectionMeta.ingredients.map((ingredMeta, ingredIndex) => {
32
+ var _a;
33
+ return (Object.assign(Object.assign({}, ingredMeta), (((_a = content.ingredientSections[sectionIndex]) === null || _a === void 0 ? void 0 : _a.ingredients[ingredIndex]) || {})));
34
+ }),
35
+ });
36
+ });
37
+ const instructions = meta.instructions.map((instrMeta, index) => (Object.assign(Object.assign({}, instrMeta), (content.instructions[index] || {}))));
38
+ return {
39
+ id: meta.id,
40
+ allergens: meta.allergens,
41
+ confidence: meta.confidence,
42
+ createdAt: meta.createdAt,
43
+ createdBy: meta.createdBy,
44
+ cuisine: meta.cuisine,
45
+ deletedAt: meta.deletedAt,
46
+ dietaryTags: meta.dietaryTags,
47
+ difficulty: meta.difficulty,
48
+ imageUrl: meta.imageUrl,
49
+ mealTypes: meta.mealTypes,
50
+ nutrition: meta.nutrition,
51
+ originalLocale: meta.originalLocale,
52
+ servings: meta.servings,
53
+ source: meta.source,
54
+ sourceUrl: meta.sourceUrl,
55
+ spiciness: meta.spiciness,
56
+ status: meta.status,
57
+ time: meta.time,
58
+ updatedAt: meta.updatedAt,
59
+ equipment,
60
+ ingredientSections,
61
+ instructions,
62
+ description: content.description,
63
+ locale: content.locale,
64
+ tips: content.tips,
65
+ title: content.title,
66
+ };
67
+ }
68
+ function splitRecipe(recipe) {
69
+ const { id, description, equipment, ingredientSections, instructions, locale, tips, title } = recipe, metaFields = __rest(recipe, ["id", "description", "equipment", "ingredientSections", "instructions", "locale", "tips", "title"]);
70
+ const equipmentMeta = equipment === null || equipment === void 0 ? void 0 : equipment.map(({ required, slug }) => ({
71
+ required,
72
+ slug,
73
+ }));
74
+ const equipmentContent = equipment === null || equipment === void 0 ? void 0 : equipment.map(({ name, notes, slug }) => ({
75
+ name,
76
+ notes,
77
+ slug,
78
+ }));
79
+ const ingredientSectionsMeta = ingredientSections.map(({ ingredients, slug }) => ({
80
+ slug,
81
+ ingredients: ingredients.map(({ quantity, required, slug, unit }) => ({
82
+ quantity,
83
+ required,
84
+ slug,
85
+ unit,
86
+ })),
87
+ }));
88
+ const ingredientSectionsContent = ingredientSections.map(({ ingredients, slug, title }) => ({
89
+ slug,
90
+ title,
91
+ ingredients: ingredients.map(({ name, notes, slug }) => ({
92
+ name,
93
+ notes,
94
+ slug,
95
+ })),
96
+ }));
97
+ const instructionsMeta = instructions.map(({ duration, step, temperature }) => ({
98
+ duration,
99
+ step,
100
+ temperature,
101
+ }));
102
+ const instructionsContent = instructions.map(({ step, text }) => ({
103
+ step,
104
+ text,
105
+ }));
106
+ const content = {
107
+ description,
108
+ equipment: equipmentContent,
109
+ ingredientSections: ingredientSectionsContent,
110
+ instructions: instructionsContent,
111
+ locale,
112
+ tips,
113
+ title,
114
+ };
115
+ const meta = Object.assign(Object.assign({}, metaFields), { equipment: equipmentMeta, ingredientSections: ingredientSectionsMeta, instructions: instructionsMeta });
116
+ return { meta, content };
117
+ }
118
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/recipe/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./strip-undefined";
2
+ export * from "./timestamp";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./strip-undefined"), exports);
18
+ __exportStar(require("./timestamp"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,8CAA4B"}