@cravery/firebase 0.0.8 → 0.0.9
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.
- package/dist/converter/comment.d.ts +4 -0
- package/dist/converter/comment.d.ts.map +1 -0
- package/dist/converter/comment.js +36 -0
- package/dist/converter/comment.js.map +1 -0
- package/dist/converter/equipment.d.ts +5 -0
- package/dist/converter/equipment.d.ts.map +1 -0
- package/dist/converter/equipment.js +49 -0
- package/dist/converter/equipment.js.map +1 -0
- package/dist/converter/index.d.ts +10 -0
- package/dist/converter/index.d.ts.map +1 -0
- package/dist/converter/index.js +26 -0
- package/dist/converter/index.js.map +1 -0
- package/dist/converter/ingredient.d.ts +5 -0
- package/dist/converter/ingredient.d.ts.map +1 -0
- package/dist/converter/ingredient.js +49 -0
- package/dist/converter/ingredient.js.map +1 -0
- package/dist/converter/profile.d.ts +4 -0
- package/dist/converter/profile.d.ts.map +1 -0
- package/dist/converter/profile.js +40 -0
- package/dist/converter/profile.js.map +1 -0
- package/dist/converter/recipe.d.ts +5 -0
- package/dist/converter/recipe.d.ts.map +1 -0
- package/dist/converter/recipe.js +75 -0
- package/dist/converter/recipe.js.map +1 -0
- package/dist/converter/report.d.ts +4 -0
- package/dist/converter/report.d.ts.map +1 -0
- package/dist/converter/report.js +46 -0
- package/dist/converter/report.js.map +1 -0
- package/dist/converter/settings.d.ts +4 -0
- package/dist/converter/settings.d.ts.map +1 -0
- package/dist/converter/settings.js +44 -0
- package/dist/converter/settings.js.map +1 -0
- package/dist/converter/submission.d.ts +4 -0
- package/dist/converter/submission.d.ts.map +1 -0
- package/dist/converter/submission.js +41 -0
- package/dist/converter/submission.js.map +1 -0
- package/dist/converter/user.d.ts +4 -0
- package/dist/converter/user.d.ts.map +1 -0
- package/dist/converter/user.js +39 -0
- package/dist/converter/user.js.map +1 -0
- package/dist/equipment/equipment.repository.d.ts +6 -0
- package/dist/equipment/equipment.repository.d.ts.map +1 -0
- package/dist/equipment/equipment.repository.js +11 -0
- package/dist/equipment/equipment.repository.js.map +1 -0
- package/dist/equipment/index.d.ts +2 -0
- package/dist/equipment/index.d.ts.map +1 -0
- package/dist/equipment/index.js +18 -0
- package/dist/equipment/index.js.map +1 -0
- package/dist/iam/index.d.ts +2 -1
- package/dist/iam/index.d.ts.map +1 -1
- package/dist/iam/index.js +2 -1
- package/dist/iam/index.js.map +1 -1
- package/dist/iam/profile.converter.d.ts +4 -0
- package/dist/iam/profile.converter.d.ts.map +1 -0
- package/dist/iam/profile.converter.js +40 -0
- package/dist/iam/profile.converter.js.map +1 -0
- package/dist/iam/user.converter.d.ts +4 -0
- package/dist/iam/user.converter.d.ts.map +1 -0
- package/dist/iam/user.converter.js +39 -0
- package/dist/iam/user.converter.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/ingredient/index.d.ts +2 -0
- package/dist/ingredient/index.d.ts.map +1 -0
- package/dist/ingredient/index.js +18 -0
- package/dist/ingredient/index.js.map +1 -0
- package/dist/ingredient/ingredient.repository.d.ts +6 -0
- package/dist/ingredient/ingredient.repository.d.ts.map +1 -0
- package/dist/ingredient/ingredient.repository.js +11 -0
- package/dist/ingredient/ingredient.repository.js.map +1 -0
- package/dist/lib/asset.repository.d.ts +13 -0
- package/dist/lib/asset.repository.d.ts.map +1 -0
- package/dist/lib/asset.repository.js +65 -0
- package/dist/lib/asset.repository.js.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +18 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/recipe/index.d.ts +2 -2
- package/dist/recipe/index.d.ts.map +1 -1
- package/dist/recipe/index.js +2 -2
- package/dist/recipe/index.js.map +1 -1
- package/dist/recipe/recipe.converter.d.ts +5 -0
- package/dist/recipe/recipe.converter.d.ts.map +1 -0
- package/dist/recipe/recipe.converter.js +86 -0
- package/dist/recipe/recipe.converter.js.map +1 -0
- package/dist/recipe/recipe.repository.d.ts +22 -0
- package/dist/recipe/recipe.repository.d.ts.map +1 -0
- package/dist/recipe/recipe.repository.js +210 -0
- package/dist/recipe/recipe.repository.js.map +1 -0
- package/dist/recipe/user_recipe_repository.d.ts +1 -1
- package/dist/recipe/user_recipe_repository.d.ts.map +1 -1
- package/dist/recipe/user_recipe_repository.js +7 -7
- package/dist/recipe/user_recipe_repository.js.map +1 -1
- package/dist/repository/base.d.ts +32 -0
- package/dist/repository/base.d.ts.map +1 -0
- package/dist/repository/base.js +167 -0
- package/dist/repository/base.js.map +1 -0
- package/dist/repository/equipment.d.ts +14 -0
- package/dist/repository/equipment.d.ts.map +1 -0
- package/dist/repository/equipment.js +33 -0
- package/dist/repository/equipment.js.map +1 -0
- package/dist/repository/index.d.ts +6 -0
- package/dist/repository/index.d.ts.map +1 -0
- package/dist/repository/index.js +22 -0
- package/dist/repository/index.js.map +1 -0
- package/dist/repository/ingredient.d.ts +14 -0
- package/dist/repository/ingredient.d.ts.map +1 -0
- package/dist/repository/ingredient.js +33 -0
- package/dist/repository/ingredient.js.map +1 -0
- package/dist/repository/recipe.d.ts +17 -0
- package/dist/repository/recipe.d.ts.map +1 -0
- package/dist/repository/recipe.js +92 -0
- package/dist/repository/recipe.js.map +1 -0
- package/dist/repository/recipe_stats.d.ts +19 -0
- package/dist/repository/recipe_stats.d.ts.map +1 -0
- package/dist/repository/recipe_stats.js +121 -0
- package/dist/repository/recipe_stats.js.map +1 -0
- package/dist/repository/user_recipe.d.ts +39 -0
- package/dist/repository/user_recipe.d.ts.map +1 -0
- package/dist/repository/user_recipe.js +160 -0
- package/dist/repository/user_recipe.js.map +1 -0
- package/dist/transform/index.d.ts +2 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/index.js +18 -0
- package/dist/transform/index.js.map +1 -0
- package/dist/transform/recipe.d.ts +7 -0
- package/dist/transform/recipe.d.ts.map +1 -0
- package/dist/transform/recipe.js +118 -0
- package/dist/transform/recipe.js.map +1 -0
- package/dist/utils/cursor.d.ts +10 -0
- package/dist/utils/cursor.d.ts.map +1 -0
- package/dist/utils/cursor.js +31 -0
- package/dist/utils/cursor.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/timestamp.d.ts +2 -0
- package/dist/utils/timestamp.d.ts.map +1 -1
- package/dist/utils/timestamp.js +19 -0
- package/dist/utils/timestamp.js.map +1 -1
- package/package.json +2 -2
- package/src/converter/comment.ts +41 -0
- package/src/converter/equipment.ts +58 -0
- package/src/converter/index.ts +9 -0
- package/src/converter/ingredient.ts +58 -0
- package/src/converter/profile.ts +44 -0
- package/src/{recipe/converters.ts → converter/recipe.ts} +6 -20
- package/src/converter/report.ts +52 -0
- package/src/converter/settings.ts +49 -0
- package/src/converter/submission.ts +47 -0
- package/src/{iam/converters.ts → converter/user.ts} +10 -5
- package/src/index.ts +3 -3
- package/src/repository/base.ts +274 -0
- package/src/repository/equipment.ts +62 -0
- package/src/repository/index.ts +5 -0
- package/src/repository/ingredient.ts +62 -0
- package/src/repository/recipe.ts +147 -0
- package/src/{recipe/stats_repository.ts → repository/recipe_stats.ts} +22 -81
- package/src/repository/user_recipe.ts +225 -0
- package/src/transform/index.ts +1 -0
- package/src/utils/cursor.ts +34 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/timestamp.ts +20 -0
- package/src/asset/index.ts +0 -1
- package/src/asset/repository.ts +0 -142
- package/src/iam/index.ts +0 -1
- package/src/recipe/index.ts +0 -5
- package/src/recipe/repository.ts +0 -284
- package/src/recipe/user_recipe_repository.ts +0 -240
- /package/src/{recipe/utils.ts → transform/recipe.ts} +0 -0
|
@@ -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=recipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../src/transform/recipe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Timestamp } from "firebase-admin/firestore";
|
|
2
|
+
interface CursorData {
|
|
3
|
+
sortValue: number;
|
|
4
|
+
id: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function encodeCursor(sortValue: Timestamp, id: string): string;
|
|
7
|
+
export declare function decodeCursor(cursor: string): CursorData;
|
|
8
|
+
export declare function cursorToFirestoreValues(cursor: string): [Timestamp, string];
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/utils/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAavD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAG3E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.encodeCursor = encodeCursor;
|
|
4
|
+
exports.decodeCursor = decodeCursor;
|
|
5
|
+
exports.cursorToFirestoreValues = cursorToFirestoreValues;
|
|
6
|
+
const firestore_1 = require("firebase-admin/firestore");
|
|
7
|
+
function encodeCursor(sortValue, id) {
|
|
8
|
+
const data = {
|
|
9
|
+
sortValue: sortValue.toMillis(),
|
|
10
|
+
id,
|
|
11
|
+
};
|
|
12
|
+
return Buffer.from(JSON.stringify(data)).toString("base64url");
|
|
13
|
+
}
|
|
14
|
+
function decodeCursor(cursor) {
|
|
15
|
+
try {
|
|
16
|
+
const json = Buffer.from(cursor, "base64url").toString("utf-8");
|
|
17
|
+
const data = JSON.parse(json);
|
|
18
|
+
if (typeof data.sortValue !== "number" || typeof data.id !== "string") {
|
|
19
|
+
throw new Error("Invalid cursor structure");
|
|
20
|
+
}
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
23
|
+
catch (_a) {
|
|
24
|
+
throw new Error("Invalid cursor");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function cursorToFirestoreValues(cursor) {
|
|
28
|
+
const { sortValue, id } = decodeCursor(cursor);
|
|
29
|
+
return [firestore_1.Timestamp.fromMillis(sortValue), id];
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/utils/cursor.ts"],"names":[],"mappings":";;AAOA,oCAMC;AAED,oCAaC;AAED,0DAGC;AAjCD,wDAAqD;AAOrD,SAAgB,YAAY,CAAC,SAAoB,EAAE,EAAU;IAC3D,MAAM,IAAI,GAAe;QACvB,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;QAC/B,EAAE;KACH,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACjE,CAAC;AAED,SAAgB,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;QAE5C,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAgB,uBAAuB,CAAC,MAAc;IACpD,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO,CAAC,qBAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./cursor"), exports);
|
|
17
18
|
__exportStar(require("./strip-undefined"), exports);
|
|
18
19
|
__exportStar(require("./timestamp"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,8CAA4B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,oDAAkC;AAClC,8CAA4B"}
|
|
@@ -3,4 +3,6 @@ import type { Timestamp } from "@cravery/core";
|
|
|
3
3
|
export declare function toTimestamp(timestamp: FirestoreTimestamp): Timestamp;
|
|
4
4
|
export declare function fromTimestamp(timestamp: Timestamp): FirestoreTimestamp;
|
|
5
5
|
export declare function toOptionalTimestamp(timestamp?: FirestoreTimestamp): Timestamp | undefined;
|
|
6
|
+
export declare function toFirestoreTimestamp(ts: Timestamp | FirestoreTimestamp | null | undefined): FirestoreTimestamp | null | undefined;
|
|
7
|
+
export declare function toOptionalFirestoreTimestamp(ts: Timestamp | FirestoreTimestamp | undefined): FirestoreTimestamp | undefined;
|
|
6
8
|
//# sourceMappingURL=timestamp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timestamp.d.ts","sourceRoot":"","sources":["../../src/utils/timestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,wBAAgB,WAAW,CAAC,SAAS,EAAE,kBAAkB,GAAG,SAAS,CAKpE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB,CAItE;AAED,wBAAgB,mBAAmB,CACjC,SAAS,CAAC,EAAE,kBAAkB,GAC7B,SAAS,GAAG,SAAS,CAEvB"}
|
|
1
|
+
{"version":3,"file":"timestamp.d.ts","sourceRoot":"","sources":["../../src/utils/timestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,wBAAgB,WAAW,CAAC,SAAS,EAAE,kBAAkB,GAAG,SAAS,CAKpE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB,CAItE;AAED,wBAAgB,mBAAmB,CACjC,SAAS,CAAC,EAAE,kBAAkB,GAC7B,SAAS,GAAG,SAAS,CAEvB;AAMD,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,SAAS,GAAG,kBAAkB,GAAG,IAAI,GAAG,SAAS,GACpD,kBAAkB,GAAG,IAAI,GAAG,SAAS,CAIvC;AAED,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,SAAS,GAAG,kBAAkB,GAAG,SAAS,GAC7C,kBAAkB,GAAG,SAAS,CAIhC"}
|
package/dist/utils/timestamp.js
CHANGED
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.toTimestamp = toTimestamp;
|
|
4
4
|
exports.fromTimestamp = fromTimestamp;
|
|
5
5
|
exports.toOptionalTimestamp = toOptionalTimestamp;
|
|
6
|
+
exports.toFirestoreTimestamp = toFirestoreTimestamp;
|
|
7
|
+
exports.toOptionalFirestoreTimestamp = toOptionalFirestoreTimestamp;
|
|
6
8
|
const firestore_1 = require("firebase-admin/firestore");
|
|
7
9
|
function toTimestamp(timestamp) {
|
|
8
10
|
return {
|
|
@@ -16,4 +18,21 @@ function fromTimestamp(timestamp) {
|
|
|
16
18
|
function toOptionalTimestamp(timestamp) {
|
|
17
19
|
return timestamp ? toTimestamp(timestamp) : undefined;
|
|
18
20
|
}
|
|
21
|
+
function isFirestoreTimestamp(ts) {
|
|
22
|
+
return typeof ts === "object" && ts !== null && "_seconds" in ts;
|
|
23
|
+
}
|
|
24
|
+
function toFirestoreTimestamp(ts) {
|
|
25
|
+
if (!ts)
|
|
26
|
+
return ts;
|
|
27
|
+
if (isFirestoreTimestamp(ts))
|
|
28
|
+
return ts;
|
|
29
|
+
return fromTimestamp(ts);
|
|
30
|
+
}
|
|
31
|
+
function toOptionalFirestoreTimestamp(ts) {
|
|
32
|
+
if (!ts)
|
|
33
|
+
return undefined;
|
|
34
|
+
if (isFirestoreTimestamp(ts))
|
|
35
|
+
return ts;
|
|
36
|
+
return fromTimestamp(ts);
|
|
37
|
+
}
|
|
19
38
|
//# sourceMappingURL=timestamp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../src/utils/timestamp.ts"],"names":[],"mappings":";;AAGA,kCAKC;AAED,sCAIC;AAED,kDAIC;
|
|
1
|
+
{"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../src/utils/timestamp.ts"],"names":[],"mappings":";;AAGA,kCAKC;AAED,sCAIC;AAED,kDAIC;AAMD,oDAMC;AAED,oEAMC;AAxCD,wDAA2E;AAG3E,SAAgB,WAAW,CAAC,SAA6B;IACvD,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,WAAW,EAAE,SAAS,CAAC,WAAW;KACnC,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,SAAoB;IAChD,OAAO,qBAAkB,CAAC,UAAU,CAClC,SAAS,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,WAAW,GAAG,OAAO,CAC3D,CAAC;AACJ,CAAC;AAED,SAAgB,mBAAmB,CACjC,SAA8B;IAE9B,OAAO,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,SAAS,oBAAoB,CAAC,EAAW;IACvC,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,UAAU,IAAI,EAAE,CAAC;AACnE,CAAC;AAED,SAAgB,oBAAoB,CAClC,EAAqD;IAErD,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,IAAI,oBAAoB,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,SAAgB,4BAA4B,CAC1C,EAA8C;IAE9C,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,IAAI,oBAAoB,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cravery/firebase",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Shared Firebase Admin SDK utilities for Cravery",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -54,6 +54,6 @@
|
|
|
54
54
|
"src/**/*"
|
|
55
55
|
],
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@cravery/core": "^0.0.
|
|
57
|
+
"@cravery/core": "^0.0.47"
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FirestoreDataConverter,
|
|
3
|
+
QueryDocumentSnapshot,
|
|
4
|
+
DocumentData,
|
|
5
|
+
} from "firebase-admin/firestore";
|
|
6
|
+
import type { RecipeComment } from "@cravery/core";
|
|
7
|
+
import {
|
|
8
|
+
toTimestamp,
|
|
9
|
+
toOptionalTimestamp,
|
|
10
|
+
toFirestoreTimestamp,
|
|
11
|
+
toOptionalFirestoreTimestamp,
|
|
12
|
+
} from "../utils";
|
|
13
|
+
|
|
14
|
+
export const commentConverter: FirestoreDataConverter<RecipeComment> = {
|
|
15
|
+
toFirestore(comment: RecipeComment): DocumentData {
|
|
16
|
+
const { id, createdAt, updatedAt, deletedAt, ...rest } = comment;
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
...rest,
|
|
20
|
+
createdAt: toFirestoreTimestamp(createdAt),
|
|
21
|
+
updatedAt: toFirestoreTimestamp(updatedAt),
|
|
22
|
+
deletedAt: toOptionalFirestoreTimestamp(deletedAt),
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
fromFirestore(snapshot: QueryDocumentSnapshot): RecipeComment {
|
|
27
|
+
const data = snapshot.data();
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
id: snapshot.id,
|
|
31
|
+
content: data.content,
|
|
32
|
+
parentId: data.parentId,
|
|
33
|
+
recipeId: data.recipeId,
|
|
34
|
+
status: data.status,
|
|
35
|
+
userId: data.userId,
|
|
36
|
+
createdAt: toTimestamp(data.createdAt),
|
|
37
|
+
updatedAt: toTimestamp(data.updatedAt),
|
|
38
|
+
deletedAt: toOptionalTimestamp(data.deletedAt),
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FirestoreDataConverter,
|
|
3
|
+
QueryDocumentSnapshot,
|
|
4
|
+
DocumentData,
|
|
5
|
+
} from "firebase-admin/firestore";
|
|
6
|
+
import type { EquipmentEntityMeta, EquipmentEntityContent } from "@cravery/core";
|
|
7
|
+
import {
|
|
8
|
+
toTimestamp,
|
|
9
|
+
toOptionalTimestamp,
|
|
10
|
+
toFirestoreTimestamp,
|
|
11
|
+
toOptionalFirestoreTimestamp,
|
|
12
|
+
stripUndefined,
|
|
13
|
+
} from "../utils";
|
|
14
|
+
|
|
15
|
+
export const equipmentMetaConverter: FirestoreDataConverter<EquipmentEntityMeta> = {
|
|
16
|
+
toFirestore(equipmentMeta: EquipmentEntityMeta): DocumentData {
|
|
17
|
+
const { id, createdAt, updatedAt, deletedAt, ...rest } = equipmentMeta;
|
|
18
|
+
|
|
19
|
+
return stripUndefined({
|
|
20
|
+
...rest,
|
|
21
|
+
createdAt: toFirestoreTimestamp(createdAt),
|
|
22
|
+
updatedAt: toFirestoreTimestamp(updatedAt),
|
|
23
|
+
deletedAt: toOptionalFirestoreTimestamp(deletedAt),
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
fromFirestore(snapshot: QueryDocumentSnapshot): EquipmentEntityMeta {
|
|
28
|
+
const data = snapshot.data();
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
id: snapshot.id,
|
|
32
|
+
category: data.category,
|
|
33
|
+
slug: data.slug,
|
|
34
|
+
status: data.status,
|
|
35
|
+
createdAt: toTimestamp(data.createdAt),
|
|
36
|
+
updatedAt: toTimestamp(data.updatedAt),
|
|
37
|
+
deletedAt: toOptionalTimestamp(data.deletedAt),
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const equipmentContentConverter: FirestoreDataConverter<EquipmentEntityContent> = {
|
|
43
|
+
toFirestore(content: EquipmentEntityContent): DocumentData {
|
|
44
|
+
return stripUndefined({
|
|
45
|
+
name: content.name,
|
|
46
|
+
slug: content.slug,
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
fromFirestore(snapshot: QueryDocumentSnapshot): EquipmentEntityContent {
|
|
51
|
+
const data = snapshot.data();
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
name: data.name,
|
|
55
|
+
slug: data.slug,
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FirestoreDataConverter,
|
|
3
|
+
QueryDocumentSnapshot,
|
|
4
|
+
DocumentData,
|
|
5
|
+
} from "firebase-admin/firestore";
|
|
6
|
+
import type { IngredientEntityMeta, IngredientEntityContent } from "@cravery/core";
|
|
7
|
+
import {
|
|
8
|
+
toTimestamp,
|
|
9
|
+
toOptionalTimestamp,
|
|
10
|
+
toFirestoreTimestamp,
|
|
11
|
+
toOptionalFirestoreTimestamp,
|
|
12
|
+
stripUndefined,
|
|
13
|
+
} from "../utils";
|
|
14
|
+
|
|
15
|
+
export const ingredientMetaConverter: FirestoreDataConverter<IngredientEntityMeta> = {
|
|
16
|
+
toFirestore(ingredientMeta: IngredientEntityMeta): DocumentData {
|
|
17
|
+
const { id, createdAt, updatedAt, deletedAt, ...rest } = ingredientMeta;
|
|
18
|
+
|
|
19
|
+
return stripUndefined({
|
|
20
|
+
...rest,
|
|
21
|
+
createdAt: toFirestoreTimestamp(createdAt),
|
|
22
|
+
updatedAt: toFirestoreTimestamp(updatedAt),
|
|
23
|
+
deletedAt: toOptionalFirestoreTimestamp(deletedAt),
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
fromFirestore(snapshot: QueryDocumentSnapshot): IngredientEntityMeta {
|
|
28
|
+
const data = snapshot.data();
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
id: snapshot.id,
|
|
32
|
+
category: data.category,
|
|
33
|
+
slug: data.slug,
|
|
34
|
+
status: data.status,
|
|
35
|
+
createdAt: toTimestamp(data.createdAt),
|
|
36
|
+
updatedAt: toTimestamp(data.updatedAt),
|
|
37
|
+
deletedAt: toOptionalTimestamp(data.deletedAt),
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const ingredientContentConverter: FirestoreDataConverter<IngredientEntityContent> = {
|
|
43
|
+
toFirestore(content: IngredientEntityContent): DocumentData {
|
|
44
|
+
return stripUndefined({
|
|
45
|
+
name: content.name,
|
|
46
|
+
slug: content.slug,
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
fromFirestore(snapshot: QueryDocumentSnapshot): IngredientEntityContent {
|
|
51
|
+
const data = snapshot.data();
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
name: data.name,
|
|
55
|
+
slug: data.slug,
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FirestoreDataConverter,
|
|
3
|
+
QueryDocumentSnapshot,
|
|
4
|
+
DocumentData,
|
|
5
|
+
} from "firebase-admin/firestore";
|
|
6
|
+
import type { Profile } from "@cravery/core";
|
|
7
|
+
import {
|
|
8
|
+
toTimestamp,
|
|
9
|
+
toOptionalTimestamp,
|
|
10
|
+
toFirestoreTimestamp,
|
|
11
|
+
toOptionalFirestoreTimestamp,
|
|
12
|
+
} from "../utils";
|
|
13
|
+
|
|
14
|
+
export const profileConverter: FirestoreDataConverter<Profile> = {
|
|
15
|
+
toFirestore(profile: Profile): DocumentData {
|
|
16
|
+
const { id, createdAt, updatedAt, deletedAt, ...rest } = profile;
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
...rest,
|
|
20
|
+
createdAt: toFirestoreTimestamp(createdAt),
|
|
21
|
+
updatedAt: toFirestoreTimestamp(updatedAt),
|
|
22
|
+
deletedAt: toOptionalFirestoreTimestamp(deletedAt),
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
fromFirestore(snapshot: QueryDocumentSnapshot): Profile {
|
|
27
|
+
const data = snapshot.data();
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
id: snapshot.id,
|
|
31
|
+
bio: data.bio,
|
|
32
|
+
createdAt: toTimestamp(data.createdAt),
|
|
33
|
+
deletedAt: toOptionalTimestamp(data.deletedAt),
|
|
34
|
+
email: data.email,
|
|
35
|
+
heroUrl: data.heroUrl,
|
|
36
|
+
imageUrl: data.imageUrl,
|
|
37
|
+
name: data.name,
|
|
38
|
+
public: data.public ?? false,
|
|
39
|
+
status: data.status,
|
|
40
|
+
updatedAt: toTimestamp(data.updatedAt),
|
|
41
|
+
verified: data.verified ?? false,
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
};
|
|
@@ -3,11 +3,12 @@ import {
|
|
|
3
3
|
QueryDocumentSnapshot,
|
|
4
4
|
DocumentData,
|
|
5
5
|
} from "firebase-admin/firestore";
|
|
6
|
-
import type { RecipeMeta, RecipeContent } from "@cravery/core
|
|
6
|
+
import type { RecipeMeta, RecipeContent } from "@cravery/core";
|
|
7
7
|
import {
|
|
8
8
|
toTimestamp,
|
|
9
9
|
toOptionalTimestamp,
|
|
10
|
-
|
|
10
|
+
toFirestoreTimestamp,
|
|
11
|
+
toOptionalFirestoreTimestamp,
|
|
11
12
|
stripUndefined,
|
|
12
13
|
} from "../utils";
|
|
13
14
|
|
|
@@ -15,25 +16,11 @@ export const recipeMetaConverter: FirestoreDataConverter<RecipeMeta> = {
|
|
|
15
16
|
toFirestore(recipeMeta: RecipeMeta): DocumentData {
|
|
16
17
|
const { id, createdAt, updatedAt, deletedAt, ...rest } = recipeMeta;
|
|
17
18
|
|
|
18
|
-
const convertTimestamp = (ts: any) => {
|
|
19
|
-
if (!ts) return ts;
|
|
20
|
-
// Handle Firestore internal format with _seconds
|
|
21
|
-
if (typeof ts === "object" && "_seconds" in ts) {
|
|
22
|
-
return ts;
|
|
23
|
-
}
|
|
24
|
-
// Handle Firestore Timestamp objects with seconds/nanoseconds
|
|
25
|
-
if (typeof ts === "object" && "seconds" in ts && "nanoseconds" in ts) {
|
|
26
|
-
return fromTimestamp(ts);
|
|
27
|
-
}
|
|
28
|
-
return ts;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
// Strip undefined values before returning to Firestore
|
|
32
19
|
return stripUndefined({
|
|
33
20
|
...rest,
|
|
34
|
-
createdAt:
|
|
35
|
-
updatedAt:
|
|
36
|
-
|
|
21
|
+
createdAt: toFirestoreTimestamp(createdAt),
|
|
22
|
+
updatedAt: toFirestoreTimestamp(updatedAt),
|
|
23
|
+
deletedAt: toOptionalFirestoreTimestamp(deletedAt),
|
|
37
24
|
});
|
|
38
25
|
},
|
|
39
26
|
|
|
@@ -70,7 +57,6 @@ export const recipeMetaConverter: FirestoreDataConverter<RecipeMeta> = {
|
|
|
70
57
|
|
|
71
58
|
export const recipeContentConverter: FirestoreDataConverter<RecipeContent> = {
|
|
72
59
|
toFirestore(content: RecipeContent): DocumentData {
|
|
73
|
-
// Strip undefined values before returning to Firestore
|
|
74
60
|
return stripUndefined({
|
|
75
61
|
description: content.description,
|
|
76
62
|
equipment: content.equipment,
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FirestoreDataConverter,
|
|
3
|
+
QueryDocumentSnapshot,
|
|
4
|
+
DocumentData,
|
|
5
|
+
} from "firebase-admin/firestore";
|
|
6
|
+
import type { Report } from "@cravery/core";
|
|
7
|
+
import {
|
|
8
|
+
toTimestamp,
|
|
9
|
+
toOptionalTimestamp,
|
|
10
|
+
toFirestoreTimestamp,
|
|
11
|
+
toOptionalFirestoreTimestamp,
|
|
12
|
+
} from "../utils";
|
|
13
|
+
|
|
14
|
+
export const reportConverter: FirestoreDataConverter<Report> = {
|
|
15
|
+
toFirestore(report: Report): DocumentData {
|
|
16
|
+
const { id, createdAt, updatedAt, deletedAt, reviewedAt, ...rest } = report;
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
...rest,
|
|
20
|
+
createdAt: toFirestoreTimestamp(createdAt),
|
|
21
|
+
updatedAt: toFirestoreTimestamp(updatedAt),
|
|
22
|
+
deletedAt: toOptionalFirestoreTimestamp(deletedAt),
|
|
23
|
+
reviewedAt: toOptionalFirestoreTimestamp(reviewedAt),
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
fromFirestore(snapshot: QueryDocumentSnapshot): Report {
|
|
28
|
+
const data = snapshot.data();
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
id: snapshot.id,
|
|
32
|
+
categories: data.categories,
|
|
33
|
+
description: data.description,
|
|
34
|
+
evidence: data.evidence,
|
|
35
|
+
notes: data.notes,
|
|
36
|
+
priority: data.priority,
|
|
37
|
+
reason: data.reason,
|
|
38
|
+
reportedBy: data.reportedBy,
|
|
39
|
+
reportStatus: data.reportStatus,
|
|
40
|
+
resolution: data.resolution,
|
|
41
|
+
reviewedAt: toOptionalTimestamp(data.reviewedAt),
|
|
42
|
+
reviewedBy: data.reviewedBy,
|
|
43
|
+
status: data.status,
|
|
44
|
+
targetId: data.targetId,
|
|
45
|
+
targetType: data.targetType,
|
|
46
|
+
userId: data.userId,
|
|
47
|
+
createdAt: toTimestamp(data.createdAt),
|
|
48
|
+
updatedAt: toTimestamp(data.updatedAt),
|
|
49
|
+
deletedAt: toOptionalTimestamp(data.deletedAt),
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FirestoreDataConverter,
|
|
3
|
+
QueryDocumentSnapshot,
|
|
4
|
+
DocumentData,
|
|
5
|
+
} from "firebase-admin/firestore";
|
|
6
|
+
import type { Settings } from "@cravery/core";
|
|
7
|
+
import {
|
|
8
|
+
toTimestamp,
|
|
9
|
+
toOptionalTimestamp,
|
|
10
|
+
toFirestoreTimestamp,
|
|
11
|
+
toOptionalFirestoreTimestamp,
|
|
12
|
+
} from "../utils";
|
|
13
|
+
|
|
14
|
+
export const settingsConverter: FirestoreDataConverter<Settings> = {
|
|
15
|
+
toFirestore(settings: Settings): DocumentData {
|
|
16
|
+
const { id, createdAt, updatedAt, deletedAt, ...rest } = settings;
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
...rest,
|
|
20
|
+
createdAt: toFirestoreTimestamp(createdAt),
|
|
21
|
+
updatedAt: toFirestoreTimestamp(updatedAt),
|
|
22
|
+
deletedAt: toOptionalFirestoreTimestamp(deletedAt),
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
fromFirestore(snapshot: QueryDocumentSnapshot): Settings {
|
|
27
|
+
const data = snapshot.data();
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
id: snapshot.id,
|
|
31
|
+
allergens: data.allergens,
|
|
32
|
+
cuisines: data.cuisines,
|
|
33
|
+
defaultServings: data.defaultServings,
|
|
34
|
+
dietaryTags: data.dietaryTags,
|
|
35
|
+
excludedIngredients: data.excludedIngredients,
|
|
36
|
+
locale: data.locale,
|
|
37
|
+
measurementSystem: data.measurementSystem,
|
|
38
|
+
notifications: data.notifications,
|
|
39
|
+
skillLevel: data.skillLevel,
|
|
40
|
+
spiciness: data.spiciness,
|
|
41
|
+
status: data.status,
|
|
42
|
+
temperatureUnit: data.temperatureUnit,
|
|
43
|
+
theme: data.theme,
|
|
44
|
+
createdAt: toTimestamp(data.createdAt),
|
|
45
|
+
updatedAt: toTimestamp(data.updatedAt),
|
|
46
|
+
deletedAt: toOptionalTimestamp(data.deletedAt),
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
};
|