@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.
Files changed (174) hide show
  1. package/dist/converter/comment.d.ts +4 -0
  2. package/dist/converter/comment.d.ts.map +1 -0
  3. package/dist/converter/comment.js +36 -0
  4. package/dist/converter/comment.js.map +1 -0
  5. package/dist/converter/equipment.d.ts +5 -0
  6. package/dist/converter/equipment.d.ts.map +1 -0
  7. package/dist/converter/equipment.js +49 -0
  8. package/dist/converter/equipment.js.map +1 -0
  9. package/dist/converter/index.d.ts +10 -0
  10. package/dist/converter/index.d.ts.map +1 -0
  11. package/dist/converter/index.js +26 -0
  12. package/dist/converter/index.js.map +1 -0
  13. package/dist/converter/ingredient.d.ts +5 -0
  14. package/dist/converter/ingredient.d.ts.map +1 -0
  15. package/dist/converter/ingredient.js +49 -0
  16. package/dist/converter/ingredient.js.map +1 -0
  17. package/dist/converter/profile.d.ts +4 -0
  18. package/dist/converter/profile.d.ts.map +1 -0
  19. package/dist/converter/profile.js +40 -0
  20. package/dist/converter/profile.js.map +1 -0
  21. package/dist/converter/recipe.d.ts +5 -0
  22. package/dist/converter/recipe.d.ts.map +1 -0
  23. package/dist/converter/recipe.js +75 -0
  24. package/dist/converter/recipe.js.map +1 -0
  25. package/dist/converter/report.d.ts +4 -0
  26. package/dist/converter/report.d.ts.map +1 -0
  27. package/dist/converter/report.js +46 -0
  28. package/dist/converter/report.js.map +1 -0
  29. package/dist/converter/settings.d.ts +4 -0
  30. package/dist/converter/settings.d.ts.map +1 -0
  31. package/dist/converter/settings.js +44 -0
  32. package/dist/converter/settings.js.map +1 -0
  33. package/dist/converter/submission.d.ts +4 -0
  34. package/dist/converter/submission.d.ts.map +1 -0
  35. package/dist/converter/submission.js +41 -0
  36. package/dist/converter/submission.js.map +1 -0
  37. package/dist/converter/user.d.ts +4 -0
  38. package/dist/converter/user.d.ts.map +1 -0
  39. package/dist/converter/user.js +39 -0
  40. package/dist/converter/user.js.map +1 -0
  41. package/dist/equipment/equipment.repository.d.ts +6 -0
  42. package/dist/equipment/equipment.repository.d.ts.map +1 -0
  43. package/dist/equipment/equipment.repository.js +11 -0
  44. package/dist/equipment/equipment.repository.js.map +1 -0
  45. package/dist/equipment/index.d.ts +2 -0
  46. package/dist/equipment/index.d.ts.map +1 -0
  47. package/dist/equipment/index.js +18 -0
  48. package/dist/equipment/index.js.map +1 -0
  49. package/dist/iam/index.d.ts +2 -1
  50. package/dist/iam/index.d.ts.map +1 -1
  51. package/dist/iam/index.js +2 -1
  52. package/dist/iam/index.js.map +1 -1
  53. package/dist/iam/profile.converter.d.ts +4 -0
  54. package/dist/iam/profile.converter.d.ts.map +1 -0
  55. package/dist/iam/profile.converter.js +40 -0
  56. package/dist/iam/profile.converter.js.map +1 -0
  57. package/dist/iam/user.converter.d.ts +4 -0
  58. package/dist/iam/user.converter.d.ts.map +1 -0
  59. package/dist/iam/user.converter.js +39 -0
  60. package/dist/iam/user.converter.js.map +1 -0
  61. package/dist/index.d.ts +3 -3
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +3 -3
  64. package/dist/index.js.map +1 -1
  65. package/dist/ingredient/index.d.ts +2 -0
  66. package/dist/ingredient/index.d.ts.map +1 -0
  67. package/dist/ingredient/index.js +18 -0
  68. package/dist/ingredient/index.js.map +1 -0
  69. package/dist/ingredient/ingredient.repository.d.ts +6 -0
  70. package/dist/ingredient/ingredient.repository.d.ts.map +1 -0
  71. package/dist/ingredient/ingredient.repository.js +11 -0
  72. package/dist/ingredient/ingredient.repository.js.map +1 -0
  73. package/dist/lib/asset.repository.d.ts +13 -0
  74. package/dist/lib/asset.repository.d.ts.map +1 -0
  75. package/dist/lib/asset.repository.js +65 -0
  76. package/dist/lib/asset.repository.js.map +1 -0
  77. package/dist/lib/index.d.ts +2 -0
  78. package/dist/lib/index.d.ts.map +1 -0
  79. package/dist/lib/index.js +18 -0
  80. package/dist/lib/index.js.map +1 -0
  81. package/dist/recipe/index.d.ts +2 -2
  82. package/dist/recipe/index.d.ts.map +1 -1
  83. package/dist/recipe/index.js +2 -2
  84. package/dist/recipe/index.js.map +1 -1
  85. package/dist/recipe/recipe.converter.d.ts +5 -0
  86. package/dist/recipe/recipe.converter.d.ts.map +1 -0
  87. package/dist/recipe/recipe.converter.js +86 -0
  88. package/dist/recipe/recipe.converter.js.map +1 -0
  89. package/dist/recipe/recipe.repository.d.ts +22 -0
  90. package/dist/recipe/recipe.repository.d.ts.map +1 -0
  91. package/dist/recipe/recipe.repository.js +210 -0
  92. package/dist/recipe/recipe.repository.js.map +1 -0
  93. package/dist/recipe/user_recipe_repository.d.ts +1 -1
  94. package/dist/recipe/user_recipe_repository.d.ts.map +1 -1
  95. package/dist/recipe/user_recipe_repository.js +7 -7
  96. package/dist/recipe/user_recipe_repository.js.map +1 -1
  97. package/dist/repository/base.d.ts +32 -0
  98. package/dist/repository/base.d.ts.map +1 -0
  99. package/dist/repository/base.js +167 -0
  100. package/dist/repository/base.js.map +1 -0
  101. package/dist/repository/equipment.d.ts +14 -0
  102. package/dist/repository/equipment.d.ts.map +1 -0
  103. package/dist/repository/equipment.js +33 -0
  104. package/dist/repository/equipment.js.map +1 -0
  105. package/dist/repository/index.d.ts +6 -0
  106. package/dist/repository/index.d.ts.map +1 -0
  107. package/dist/repository/index.js +22 -0
  108. package/dist/repository/index.js.map +1 -0
  109. package/dist/repository/ingredient.d.ts +14 -0
  110. package/dist/repository/ingredient.d.ts.map +1 -0
  111. package/dist/repository/ingredient.js +33 -0
  112. package/dist/repository/ingredient.js.map +1 -0
  113. package/dist/repository/recipe.d.ts +17 -0
  114. package/dist/repository/recipe.d.ts.map +1 -0
  115. package/dist/repository/recipe.js +92 -0
  116. package/dist/repository/recipe.js.map +1 -0
  117. package/dist/repository/recipe_stats.d.ts +19 -0
  118. package/dist/repository/recipe_stats.d.ts.map +1 -0
  119. package/dist/repository/recipe_stats.js +121 -0
  120. package/dist/repository/recipe_stats.js.map +1 -0
  121. package/dist/repository/user_recipe.d.ts +39 -0
  122. package/dist/repository/user_recipe.d.ts.map +1 -0
  123. package/dist/repository/user_recipe.js +160 -0
  124. package/dist/repository/user_recipe.js.map +1 -0
  125. package/dist/transform/index.d.ts +2 -0
  126. package/dist/transform/index.d.ts.map +1 -0
  127. package/dist/transform/index.js +18 -0
  128. package/dist/transform/index.js.map +1 -0
  129. package/dist/transform/recipe.d.ts +7 -0
  130. package/dist/transform/recipe.d.ts.map +1 -0
  131. package/dist/transform/recipe.js +118 -0
  132. package/dist/transform/recipe.js.map +1 -0
  133. package/dist/utils/cursor.d.ts +10 -0
  134. package/dist/utils/cursor.d.ts.map +1 -0
  135. package/dist/utils/cursor.js +31 -0
  136. package/dist/utils/cursor.js.map +1 -0
  137. package/dist/utils/index.d.ts +1 -0
  138. package/dist/utils/index.d.ts.map +1 -1
  139. package/dist/utils/index.js +1 -0
  140. package/dist/utils/index.js.map +1 -1
  141. package/dist/utils/timestamp.d.ts +2 -0
  142. package/dist/utils/timestamp.d.ts.map +1 -1
  143. package/dist/utils/timestamp.js +19 -0
  144. package/dist/utils/timestamp.js.map +1 -1
  145. package/package.json +2 -2
  146. package/src/converter/comment.ts +41 -0
  147. package/src/converter/equipment.ts +58 -0
  148. package/src/converter/index.ts +9 -0
  149. package/src/converter/ingredient.ts +58 -0
  150. package/src/converter/profile.ts +44 -0
  151. package/src/{recipe/converters.ts → converter/recipe.ts} +6 -20
  152. package/src/converter/report.ts +52 -0
  153. package/src/converter/settings.ts +49 -0
  154. package/src/converter/submission.ts +47 -0
  155. package/src/{iam/converters.ts → converter/user.ts} +10 -5
  156. package/src/index.ts +3 -3
  157. package/src/repository/base.ts +274 -0
  158. package/src/repository/equipment.ts +62 -0
  159. package/src/repository/index.ts +5 -0
  160. package/src/repository/ingredient.ts +62 -0
  161. package/src/repository/recipe.ts +147 -0
  162. package/src/{recipe/stats_repository.ts → repository/recipe_stats.ts} +22 -81
  163. package/src/repository/user_recipe.ts +225 -0
  164. package/src/transform/index.ts +1 -0
  165. package/src/utils/cursor.ts +34 -0
  166. package/src/utils/index.ts +1 -0
  167. package/src/utils/timestamp.ts +20 -0
  168. package/src/asset/index.ts +0 -1
  169. package/src/asset/repository.ts +0 -142
  170. package/src/iam/index.ts +0 -1
  171. package/src/recipe/index.ts +0 -5
  172. package/src/recipe/repository.ts +0 -284
  173. package/src/recipe/user_recipe_repository.ts +0 -240
  174. /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":";;;;;;;;;;;;;AAEA,kCA2DC;AAED,kCA+EC;AA5ID,SAAgB,WAAW,CAAC,IAAgB,EAAE,OAAsB;;IAClE,MAAM,SAAS,GAAG,MAAA,IAAI,CAAC,SAAS,0CAAE,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;;QACzD,MAAM,YAAY,GAAG,MAAA,OAAO,CAAC,SAAS,0CAAG,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,uCACK,SAAS,GACT,YAAY,EACf;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CACpD,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE;;QAAC,OAAA,CAAC;YAC9B,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,KAAK,EAAE,MAAA,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,0CAAE,KAAK;YACtD,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE;;gBAAC,OAAA,iCACjE,UAAU,GACV,CAAC,CAAA,MAAA,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,0CAAE,WAAW,CACvD,WAAW,CACZ,KAAI,EAAE,CAAC,EACR,CAAA;aAAA,CAAC;SACJ,CAAC,CAAA;KAAA,CACH,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,iCAC5D,SAAS,GACT,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EACtC,CAAC,CAAC;IAEJ,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS;QACT,kBAAkB;QAClB,YAAY;QACZ,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAC,MAAc;IAIxC,MAAM,EACJ,EAAE,EACF,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,MAAM,EACN,IAAI,EACJ,KAAK,KAEH,MAAM,EADL,UAAU,UACX,MAAM,EAVJ,mGAUL,CAAS,CAAC;IAEX,MAAM,aAAa,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5D,QAAQ;QACR,IAAI;KACL,CAAC,CAAC,CAAC;IACJ,MAAM,gBAAgB,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,IAAI;QACJ,KAAK;QACL,IAAI;KACL,CAAC,CAAC,CAAC;IAEJ,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,GAAG,CACnD,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI;QACJ,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACpE,QAAQ;YACR,QAAQ;YACR,IAAI;YACJ,IAAI;SACL,CAAC,CAAC;KACJ,CAAC,CACH,CAAC;IACF,MAAM,yBAAyB,GAAG,kBAAkB,CAAC,GAAG,CACtD,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI;QACJ,KAAK;QACL,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACvD,IAAI;YACJ,KAAK;YACL,IAAI;SACL,CAAC,CAAC;KACJ,CAAC,CACH,CAAC;IAEF,MAAM,gBAAgB,GAAG,YAAY,CAAC,GAAG,CACvC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,QAAQ;QACR,IAAI;QACJ,WAAW;KACZ,CAAC,CACH,CAAC;IACF,MAAM,mBAAmB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI;QACJ,IAAI;KACL,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GAAkB;QAC7B,WAAW;QACX,SAAS,EAAE,gBAAgB;QAC3B,kBAAkB,EAAE,yBAAyB;QAC7C,YAAY,EAAE,mBAAmB;QACjC,MAAM;QACN,IAAI;QACJ,KAAK;KACN,CAAC;IAEF,MAAM,IAAI,mCACL,UAAU,KACb,SAAS,EAAE,aAAa,EACxB,kBAAkB,EAAE,sBAAsB,EAC1C,YAAY,EAAE,gBAAgB,GAC/B,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
@@ -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"}
@@ -1,3 +1,4 @@
1
+ export * from "./cursor";
1
2
  export * from "./strip-undefined";
2
3
  export * from "./timestamp";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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
@@ -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"}
@@ -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;AApBD,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"}
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.8",
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.33"
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,9 @@
1
+ export * from "./comment";
2
+ export * from "./equipment";
3
+ export * from "./ingredient";
4
+ export * from "./profile";
5
+ export * from "./recipe";
6
+ export * from "./report";
7
+ export * from "./settings";
8
+ export * from "./submission";
9
+ export * from "./user";
@@ -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/types";
6
+ import type { RecipeMeta, RecipeContent } from "@cravery/core";
7
7
  import {
8
8
  toTimestamp,
9
9
  toOptionalTimestamp,
10
- fromTimestamp,
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: convertTimestamp(createdAt),
35
- updatedAt: convertTimestamp(updatedAt),
36
- ...(deletedAt && { deletedAt: convertTimestamp(deletedAt) }),
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
+ };