@cravery/core 0.0.10 → 0.0.12
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/README.md +80 -0
- package/dist/config/ai.d.ts.map +1 -1
- package/dist/config/ai.js +5 -0
- package/dist/config/ai.js.map +1 -1
- package/dist/config/collections.d.ts +1 -1
- package/dist/config/collections.js +2 -2
- package/dist/config/common.d.ts +1 -1
- package/dist/config/common.d.ts.map +1 -1
- package/dist/config/common.js +2 -2
- package/dist/config/common.js.map +1 -1
- package/dist/config/limits.d.ts +3 -3
- package/dist/config/limits.d.ts.map +1 -1
- package/dist/config/limits.js +20 -14
- package/dist/config/limits.js.map +1 -1
- package/dist/config/subscription.d.ts +1 -1
- package/dist/config/subscription.d.ts.map +1 -1
- package/dist/config/subscription.js +2 -2
- package/dist/config/subscription.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/cost.d.ts.map +1 -1
- package/dist/lib/ai/cost.js +3 -2
- package/dist/lib/ai/cost.js.map +1 -1
- package/dist/lib/ai/embedding.js +2 -2
- package/dist/lib/ai/embedding.js.map +1 -1
- package/dist/lib/ai/errors.d.ts +1 -1
- package/dist/lib/ai/flow.d.ts +8 -8
- package/dist/lib/ai/flow.d.ts.map +1 -1
- package/dist/lib/ai/flow.js.map +1 -1
- package/dist/lib/iam.d.ts +3 -0
- package/dist/lib/iam.d.ts.map +1 -1
- package/dist/lib/iam.js +17 -2
- package/dist/lib/iam.js.map +1 -1
- package/dist/lib/index.d.ts +0 -2
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +0 -2
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/repository/equipment.repository.js +1 -1
- package/dist/lib/repository/ingredient.repository.js +1 -1
- package/dist/lib/repository/profile.repository.js +1 -1
- package/dist/lib/repository/recipe-queue.repository.js +1 -1
- package/dist/lib/repository/recipe.repository.js +1 -1
- package/dist/lib/repository/report.repository.js +1 -1
- package/dist/lib/repository/settings.repository.js +1 -1
- package/dist/lib/repository/user.repository.js +1 -1
- package/dist/lib/storage.js +5 -5
- package/dist/lib/storage.js.map +1 -1
- package/dist/lib/usage/usage.service.d.ts +1 -2
- package/dist/lib/usage/usage.service.d.ts.map +1 -1
- package/dist/lib/usage/usage.service.js +4 -4
- package/dist/lib/usage/usage.service.js.map +1 -1
- package/dist/types/ai/config.d.ts +2 -1
- package/dist/types/ai/config.d.ts.map +1 -1
- package/dist/types/ai/index.d.ts +0 -2
- package/dist/types/ai/index.d.ts.map +1 -1
- package/dist/types/ai/index.js +0 -2
- package/dist/types/ai/index.js.map +1 -1
- package/dist/types/ai/recipe.d.ts +50 -50
- package/dist/types/ai/recipe.d.ts.map +1 -1
- package/dist/types/ai/recipe.js +11 -15
- package/dist/types/ai/recipe.js.map +1 -1
- package/dist/types/ai/translation.d.ts +14 -14
- package/dist/types/ai/translation.d.ts.map +1 -1
- package/dist/types/ai/translation.js +4 -6
- package/dist/types/ai/translation.js.map +1 -1
- package/dist/types/api.d.ts +14 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +3 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/core/api.d.ts +14 -0
- package/dist/types/core/api.d.ts.map +1 -0
- package/dist/types/core/api.js +3 -0
- package/dist/types/core/api.js.map +1 -0
- package/dist/types/core/asset.d.ts +19 -0
- package/dist/types/core/asset.d.ts.map +1 -0
- package/dist/types/core/asset.js +12 -0
- package/dist/types/core/asset.js.map +1 -0
- package/dist/types/core/enums/image_type.d.ts +5 -0
- package/dist/types/core/enums/image_type.d.ts.map +1 -0
- package/dist/types/core/enums/image_type.js +7 -0
- package/dist/types/core/enums/image_type.js.map +1 -0
- package/dist/types/core/enums/index.d.ts +6 -0
- package/dist/types/core/enums/index.d.ts.map +1 -0
- package/dist/types/core/enums/index.js +22 -0
- package/dist/types/core/enums/index.js.map +1 -0
- package/dist/types/core/enums/locale.d.ts +5 -0
- package/dist/types/core/enums/locale.d.ts.map +1 -0
- package/dist/types/core/enums/locale.js +7 -0
- package/dist/types/core/enums/locale.js.map +1 -0
- package/dist/types/core/enums/measurement_system.d.ts +5 -0
- package/dist/types/core/enums/measurement_system.d.ts.map +1 -0
- package/dist/types/core/enums/measurement_system.js +7 -0
- package/dist/types/core/enums/measurement_system.js.map +1 -0
- package/dist/types/core/enums/theme.d.ts +5 -0
- package/dist/types/core/enums/theme.d.ts.map +1 -0
- package/dist/types/core/enums/theme.js +7 -0
- package/dist/types/core/enums/theme.js.map +1 -0
- package/dist/types/core/enums/url_type.d.ts +5 -0
- package/dist/types/core/enums/url_type.d.ts.map +1 -0
- package/dist/types/core/enums/url_type.js +15 -0
- package/dist/types/core/enums/url_type.js.map +1 -0
- package/dist/types/core/errors.d.ts +37 -0
- package/dist/types/core/errors.d.ts.map +1 -0
- package/dist/types/core/errors.js +89 -0
- package/dist/types/core/errors.js.map +1 -0
- package/dist/types/core/index.d.ts +6 -0
- package/dist/types/core/index.d.ts.map +1 -0
- package/dist/types/core/index.js +22 -0
- package/dist/types/core/index.js.map +1 -0
- package/dist/types/core/settings.d.ts +88 -0
- package/dist/types/core/settings.d.ts.map +1 -0
- package/dist/types/core/settings.js +28 -0
- package/dist/types/core/settings.js.map +1 -0
- package/dist/types/enums/index.d.ts +2 -0
- package/dist/types/enums/index.d.ts.map +1 -1
- package/dist/types/enums/index.js +2 -0
- package/dist/types/enums/index.js.map +1 -1
- package/dist/types/enums/recipe_source.d.ts +2 -2
- package/dist/types/enums/recipe_source.d.ts.map +1 -1
- package/dist/types/enums/recipe_source.js +1 -1
- package/dist/types/enums/recipe_source.js.map +1 -1
- package/dist/types/enums/recipe_status.d.ts +2 -2
- package/dist/types/enums/recipe_status.d.ts.map +1 -1
- package/dist/types/enums/recipe_status.js +0 -1
- package/dist/types/enums/recipe_status.js.map +1 -1
- package/dist/types/enums/subscription_role.d.ts +5 -0
- package/dist/types/enums/subscription_role.d.ts.map +1 -0
- package/dist/types/enums/subscription_role.js +13 -0
- package/dist/types/enums/subscription_role.js.map +1 -0
- package/dist/types/enums/subscription_status.d.ts +5 -0
- package/dist/types/enums/subscription_status.d.ts.map +1 -0
- package/dist/types/enums/subscription_status.js +14 -0
- package/dist/types/enums/subscription_status.js.map +1 -0
- package/dist/types/iam/enums/index.d.ts +7 -0
- package/dist/types/iam/enums/index.d.ts.map +1 -0
- package/dist/types/iam/enums/index.js +23 -0
- package/dist/types/iam/enums/index.js.map +1 -0
- package/dist/types/iam/enums/profile_status.d.ts +5 -0
- package/dist/types/iam/enums/profile_status.d.ts.map +1 -0
- package/dist/types/iam/enums/profile_status.js +12 -0
- package/dist/types/iam/enums/profile_status.js.map +1 -0
- package/dist/types/iam/enums/subscription_role.d.ts +5 -0
- package/dist/types/iam/enums/subscription_role.d.ts.map +1 -0
- package/dist/types/iam/enums/subscription_role.js +7 -0
- package/dist/types/iam/enums/subscription_role.js.map +1 -0
- package/dist/types/iam/enums/subscription_status.d.ts +5 -0
- package/dist/types/iam/enums/subscription_status.d.ts.map +1 -0
- package/dist/types/iam/enums/subscription_status.js +12 -0
- package/dist/types/iam/enums/subscription_status.js.map +1 -0
- package/dist/types/iam/enums/subscription_tier.d.ts +4 -0
- package/dist/types/iam/enums/subscription_tier.d.ts.map +1 -0
- package/dist/types/iam/enums/subscription_tier.js +6 -0
- package/dist/types/iam/enums/subscription_tier.js.map +1 -0
- package/dist/types/iam/enums/user_role.d.ts +5 -0
- package/dist/types/iam/enums/user_role.d.ts.map +1 -0
- package/dist/types/iam/enums/user_role.js +13 -0
- package/dist/types/iam/enums/user_role.js.map +1 -0
- package/dist/types/iam/enums/user_status.d.ts +5 -0
- package/dist/types/iam/enums/user_status.d.ts.map +1 -0
- package/dist/types/iam/enums/user_status.js +12 -0
- package/dist/types/iam/enums/user_status.js.map +1 -0
- package/dist/types/iam/index.d.ts +1 -0
- package/dist/types/iam/index.d.ts.map +1 -1
- package/dist/types/iam/index.js +1 -0
- package/dist/types/iam/index.js.map +1 -1
- package/dist/types/iam/profile.d.ts +9 -26
- package/dist/types/iam/profile.d.ts.map +1 -1
- package/dist/types/iam/profile.js +1 -2
- package/dist/types/iam/profile.js.map +1 -1
- package/dist/types/iam/settings.d.ts +96 -0
- package/dist/types/iam/settings.d.ts.map +1 -0
- package/dist/types/iam/settings.js +31 -0
- package/dist/types/iam/settings.js.map +1 -0
- package/dist/types/iam/subscription.d.ts +7 -7
- package/dist/types/iam/subscription.d.ts.map +1 -1
- package/dist/types/iam/subscription.js +5 -5
- package/dist/types/iam/subscription.js.map +1 -1
- package/dist/types/iam/user.d.ts +1 -15
- package/dist/types/iam/user.d.ts.map +1 -1
- package/dist/types/iam/user.js +2 -2
- package/dist/types/iam/user.js.map +1 -1
- package/dist/types/index.d.ts +1 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -4
- package/dist/types/index.js.map +1 -1
- package/dist/types/moderation/enums/index.d.ts +5 -0
- package/dist/types/moderation/enums/index.d.ts.map +1 -0
- package/dist/types/moderation/enums/index.js +21 -0
- package/dist/types/moderation/enums/index.js.map +1 -0
- package/dist/types/moderation/enums/moderation_status.d.ts +5 -0
- package/dist/types/moderation/enums/moderation_status.d.ts.map +1 -0
- package/dist/types/moderation/enums/moderation_status.js +11 -0
- package/dist/types/moderation/enums/moderation_status.js.map +1 -0
- package/dist/types/moderation/enums/priority.d.ts +5 -0
- package/dist/types/moderation/enums/priority.d.ts.map +1 -0
- package/dist/types/moderation/enums/priority.js +7 -0
- package/dist/types/moderation/enums/priority.js.map +1 -0
- package/dist/types/moderation/enums/severity.d.ts +5 -0
- package/dist/types/moderation/enums/severity.d.ts.map +1 -0
- package/dist/types/moderation/enums/severity.js +7 -0
- package/dist/types/moderation/enums/severity.js.map +1 -0
- package/dist/types/moderation/enums/suggestion_category.d.ts +5 -0
- package/dist/types/moderation/enums/suggestion_category.d.ts.map +1 -0
- package/dist/types/moderation/enums/suggestion_category.js +13 -0
- package/dist/types/moderation/enums/suggestion_category.js.map +1 -0
- package/dist/types/moderation/index.d.ts +3 -0
- package/dist/types/moderation/index.d.ts.map +1 -0
- package/dist/types/moderation/index.js +19 -0
- package/dist/types/moderation/index.js.map +1 -0
- package/dist/types/moderation/moderation.d.ts +139 -0
- package/dist/types/moderation/moderation.d.ts.map +1 -0
- package/dist/types/moderation/moderation.js +40 -0
- package/dist/types/moderation/moderation.js.map +1 -0
- package/dist/types/moderation.d.ts +36 -28
- package/dist/types/moderation.d.ts.map +1 -1
- package/dist/types/recipe/enums/allergen.d.ts +5 -0
- package/dist/types/recipe/enums/allergen.d.ts.map +1 -0
- package/dist/types/recipe/enums/allergen.js +21 -0
- package/dist/types/recipe/enums/allergen.js.map +1 -0
- package/dist/types/recipe/enums/cuisine.d.ts +5 -0
- package/dist/types/recipe/enums/cuisine.d.ts.map +1 -0
- package/dist/types/recipe/enums/cuisine.js +41 -0
- package/dist/types/recipe/enums/cuisine.js.map +1 -0
- package/dist/types/recipe/enums/dietary_tag.d.ts +5 -0
- package/dist/types/recipe/enums/dietary_tag.d.ts.map +1 -0
- package/dist/types/recipe/enums/dietary_tag.js +23 -0
- package/dist/types/recipe/enums/dietary_tag.js.map +1 -0
- package/dist/types/recipe/enums/difficulty.d.ts +5 -0
- package/dist/types/recipe/enums/difficulty.d.ts.map +1 -0
- package/dist/types/recipe/enums/difficulty.js +12 -0
- package/dist/types/recipe/enums/difficulty.js.map +1 -0
- package/dist/types/recipe/enums/index.d.ts +11 -0
- package/dist/types/recipe/enums/index.d.ts.map +1 -0
- package/dist/types/recipe/enums/index.js +27 -0
- package/dist/types/recipe/enums/index.js.map +1 -0
- package/dist/types/recipe/enums/meal_type.d.ts +5 -0
- package/dist/types/recipe/enums/meal_type.d.ts.map +1 -0
- package/dist/types/recipe/enums/meal_type.js +16 -0
- package/dist/types/recipe/enums/meal_type.js.map +1 -0
- package/dist/types/recipe/enums/recipe_source.d.ts +5 -0
- package/dist/types/recipe/enums/recipe_source.d.ts.map +1 -0
- package/dist/types/recipe/enums/recipe_source.js +7 -0
- package/dist/types/recipe/enums/recipe_source.js.map +1 -0
- package/dist/types/recipe/enums/recipe_status.d.ts +5 -0
- package/dist/types/recipe/enums/recipe_status.d.ts.map +1 -0
- package/dist/types/recipe/enums/recipe_status.js +14 -0
- package/dist/types/recipe/enums/recipe_status.js.map +1 -0
- package/dist/types/recipe/enums/spiciness.d.ts +5 -0
- package/dist/types/recipe/enums/spiciness.d.ts.map +1 -0
- package/dist/types/recipe/enums/spiciness.js +7 -0
- package/dist/types/recipe/enums/spiciness.js.map +1 -0
- package/dist/types/recipe/enums/temperature_unit.d.ts +5 -0
- package/dist/types/recipe/enums/temperature_unit.d.ts.map +1 -0
- package/dist/types/recipe/enums/temperature_unit.js +7 -0
- package/dist/types/recipe/enums/temperature_unit.js.map +1 -0
- package/dist/types/recipe/enums/unit.d.ts +5 -0
- package/dist/types/recipe/enums/unit.d.ts.map +1 -0
- package/dist/types/recipe/enums/unit.js +53 -0
- package/dist/types/recipe/enums/unit.js.map +1 -0
- package/dist/types/recipe/equipment.js +2 -2
- package/dist/types/recipe/equipment.js.map +1 -1
- package/dist/types/recipe/filters.d.ts +31 -0
- package/dist/types/recipe/filters.d.ts.map +1 -0
- package/dist/types/recipe/filters.js +16 -0
- package/dist/types/recipe/filters.js.map +1 -0
- package/dist/types/recipe/index.d.ts +2 -0
- package/dist/types/recipe/index.d.ts.map +1 -1
- package/dist/types/recipe/index.js +2 -0
- package/dist/types/recipe/index.js.map +1 -1
- package/dist/types/recipe/ingredient.d.ts +18 -18
- package/dist/types/recipe/ingredient.js +6 -6
- package/dist/types/recipe/ingredient.js.map +1 -1
- package/dist/types/recipe/recipe.d.ts +35 -65
- package/dist/types/recipe/recipe.d.ts.map +1 -1
- package/dist/types/recipe/recipe.js +6 -5
- package/dist/types/recipe/recipe.js.map +1 -1
- package/dist/types/recipe/temperature.js +2 -2
- package/dist/types/recipe/temperature.js.map +1 -1
- package/dist/types/report/enums/index.d.ts +5 -0
- package/dist/types/report/enums/index.d.ts.map +1 -0
- package/dist/types/report/enums/index.js +21 -0
- package/dist/types/report/enums/index.js.map +1 -0
- package/dist/types/report/enums/report_priority.d.ts +5 -0
- package/dist/types/report/enums/report_priority.d.ts.map +1 -0
- package/dist/types/report/enums/report_priority.js +12 -0
- package/dist/types/report/enums/report_priority.js.map +1 -0
- package/dist/types/report/enums/report_status.d.ts +5 -0
- package/dist/types/report/enums/report_status.d.ts.map +1 -0
- package/dist/types/report/enums/report_status.js +12 -0
- package/dist/types/report/enums/report_status.js.map +1 -0
- package/dist/types/report/enums/report_target_type.d.ts +5 -0
- package/dist/types/report/enums/report_target_type.d.ts.map +1 -0
- package/dist/types/report/enums/report_target_type.js +12 -0
- package/dist/types/report/enums/report_target_type.js.map +1 -0
- package/dist/types/report/enums/report_type.d.ts +5 -0
- package/dist/types/report/enums/report_type.d.ts.map +1 -0
- package/dist/types/report/enums/report_type.js +14 -0
- package/dist/types/report/enums/report_type.js.map +1 -0
- package/dist/types/report/index.d.ts +3 -0
- package/dist/types/report/index.d.ts.map +1 -0
- package/dist/types/report/index.js +19 -0
- package/dist/types/report/index.js.map +1 -0
- package/dist/types/report/report.d.ts +95 -0
- package/dist/types/report/report.d.ts.map +1 -0
- package/dist/types/report/report.js +32 -0
- package/dist/types/report/report.js.map +1 -0
- package/dist/types/report.d.ts +46 -38
- package/dist/types/report.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/config/ai.ts +5 -0
- package/src/config/collections.ts +1 -1
- package/src/config/common.ts +1 -1
- package/src/config/limits.ts +21 -15
- package/src/config/subscription.ts +1 -1
- package/src/index.ts +0 -1
- package/src/lib/ai/cost.ts +3 -2
- package/src/lib/ai/embedding.ts +1 -1
- package/src/lib/ai/flow.ts +1 -0
- package/src/lib/iam.ts +18 -3
- package/src/lib/index.ts +0 -2
- package/src/lib/storage.ts +1 -1
- package/src/lib/usage/usage.service.ts +7 -4
- package/src/types/ai/config.ts +2 -1
- package/src/types/ai/index.ts +0 -2
- package/src/types/ai/recipe.ts +6 -5
- package/src/types/ai/translation.ts +5 -3
- package/src/types/core/api.ts +15 -0
- package/src/types/core/asset.ts +11 -0
- package/src/types/core/enums/index.ts +5 -0
- package/src/types/core/enums/measurement_system.ts +5 -0
- package/src/types/core/enums/theme.ts +5 -0
- package/src/{lib/errors/index.ts → types/core/errors.ts} +19 -27
- package/src/types/core/index.ts +5 -0
- package/src/types/{settings.ts → core/settings.ts} +8 -17
- package/src/types/iam/enums/index.ts +6 -0
- package/src/types/iam/enums/subscription_role.ts +5 -0
- package/src/types/iam/enums/subscription_status.ts +10 -0
- package/src/types/iam/enums/user_role.ts +11 -0
- package/src/types/iam/index.ts +1 -0
- package/src/types/iam/profile.ts +2 -17
- package/src/types/iam/subscription.ts +10 -6
- package/src/types/iam/user.ts +3 -25
- package/src/types/index.ts +1 -4
- package/src/types/moderation/enums/index.ts +4 -0
- package/src/types/moderation/index.ts +2 -0
- package/src/types/{moderation.ts → moderation/moderation.ts} +6 -32
- package/src/types/recipe/enums/index.ts +10 -0
- package/src/types/{enums → recipe/enums}/recipe_source.ts +1 -1
- package/src/types/{enums → recipe/enums}/recipe_status.ts +0 -1
- package/src/types/recipe/equipment.ts +3 -3
- package/src/types/{ai → recipe}/filters.ts +2 -2
- package/src/types/recipe/index.ts +2 -0
- package/src/types/recipe/ingredient.ts +7 -7
- package/src/types/recipe/recipe.ts +4 -40
- package/src/types/recipe/temperature.ts +2 -2
- package/src/types/report/enums/index.ts +4 -0
- package/src/types/report/enums/report_priority.ts +10 -0
- package/src/types/report/enums/report_status.ts +10 -0
- package/src/types/report/enums/report_target_type.ts +10 -0
- package/src/types/report/enums/report_type.ts +12 -0
- package/src/types/report/index.ts +2 -0
- package/src/types/report/report.ts +38 -0
- package/src/lib/repository/equipment.repository.ts +0 -93
- package/src/lib/repository/errors.ts +0 -37
- package/src/lib/repository/factory.ts +0 -29
- package/src/lib/repository/firestore.repository.ts +0 -633
- package/src/lib/repository/index.ts +0 -12
- package/src/lib/repository/ingredient.repository.ts +0 -93
- package/src/lib/repository/profile.repository.ts +0 -51
- package/src/lib/repository/recipe-queue.repository.ts +0 -49
- package/src/lib/repository/recipe.repository.ts +0 -51
- package/src/lib/repository/report.repository.ts +0 -85
- package/src/lib/repository/rtdb.repository.ts +0 -67
- package/src/lib/repository/settings.repository.ts +0 -57
- package/src/lib/repository/user.repository.ts +0 -44
- package/src/types/ai/flow.ts +0 -82
- package/src/types/asset.ts +0 -19
- package/src/types/enums/index.ts +0 -21
- package/src/types/enums/role.ts +0 -11
- package/src/types/report.ts +0 -90
- package/src/types/repository.ts +0 -140
- package/src/types/response.ts +0 -30
- /package/src/types/{enums → core/enums}/image_type.ts +0 -0
- /package/src/types/{enums → core/enums}/locale.ts +0 -0
- /package/src/types/{enums → core/enums}/url_type.ts +0 -0
- /package/src/types/{enums → iam/enums}/profile_status.ts +0 -0
- /package/src/types/{enums → iam/enums}/subscription_tier.ts +0 -0
- /package/src/types/{enums → iam/enums}/user_status.ts +0 -0
- /package/src/types/{enums → moderation/enums}/moderation_status.ts +0 -0
- /package/src/types/{enums → moderation/enums}/priority.ts +0 -0
- /package/src/types/{enums → moderation/enums}/severity.ts +0 -0
- /package/src/types/{enums → moderation/enums}/suggestion_category.ts +0 -0
- /package/src/types/{enums → recipe/enums}/allergen.ts +0 -0
- /package/src/types/{enums → recipe/enums}/cuisine.ts +0 -0
- /package/src/types/{enums → recipe/enums}/dietary_tag.ts +0 -0
- /package/src/types/{enums → recipe/enums}/difficulty.ts +0 -0
- /package/src/types/{enums → recipe/enums}/meal_type.ts +0 -0
- /package/src/types/{enums → recipe/enums}/spiciness.ts +0 -0
- /package/src/types/{enums → recipe/enums}/temperature_unit.ts +0 -0
- /package/src/types/{enums → recipe/enums}/unit.ts +0 -0
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Firestore,
|
|
3
|
-
Timestamp,
|
|
4
|
-
QueryDocumentSnapshot,
|
|
5
|
-
DocumentData,
|
|
6
|
-
} from "firebase-admin/firestore";
|
|
7
|
-
import { FirestoreRepository } from "./firestore.repository";
|
|
8
|
-
import type { Asset, AssetLocale } from "../../types/asset";
|
|
9
|
-
import { AssetSchema } from "../../types/asset";
|
|
10
|
-
import { Collections } from "../../config/collections";
|
|
11
|
-
import { RepositoryError, RepositoryErrorCode } from "./errors";
|
|
12
|
-
import type { Locale } from "../../types/enums";
|
|
13
|
-
|
|
14
|
-
export class IngredientRepository extends FirestoreRepository<Asset> {
|
|
15
|
-
constructor(firestore: Firestore) {
|
|
16
|
-
super(firestore, Collections.Ingredients, {
|
|
17
|
-
enableTimestamps: true,
|
|
18
|
-
enableSoftDelete: false,
|
|
19
|
-
validateOnWrite: true,
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
protected validate(data: Partial<Asset>): void {
|
|
24
|
-
const result = AssetSchema.partial().safeParse(data);
|
|
25
|
-
if (!result.success) {
|
|
26
|
-
throw new RepositoryError(
|
|
27
|
-
RepositoryErrorCode.VALIDATION_ERROR,
|
|
28
|
-
"Ingredient validation failed",
|
|
29
|
-
{ errors: result.error.issues },
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async findBySlug(slug: string): Promise<Asset | null> {
|
|
35
|
-
return this.findById(slug);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async slugExists(slug: string): Promise<boolean> {
|
|
39
|
-
return this.exists(slug);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async getLocale(slug: string, locale: Locale): Promise<AssetLocale | null> {
|
|
43
|
-
const docRef = this.collection.doc(slug).collection("locales").doc(locale);
|
|
44
|
-
const doc = await docRef.get();
|
|
45
|
-
if (!doc.exists) return null;
|
|
46
|
-
return { locale, ...doc.data() } as AssetLocale;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async setLocale(
|
|
50
|
-
slug: string,
|
|
51
|
-
locale: Locale,
|
|
52
|
-
data: Omit<AssetLocale, "locale">,
|
|
53
|
-
): Promise<void> {
|
|
54
|
-
const docRef = this.collection.doc(slug).collection("locales").doc(locale);
|
|
55
|
-
await docRef.set({ locale, ...data });
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async getAllLocales(slug: string): Promise<AssetLocale[]> {
|
|
59
|
-
const snapshot = await this.collection
|
|
60
|
-
.doc(slug)
|
|
61
|
-
.collection("locales")
|
|
62
|
-
.get();
|
|
63
|
-
return snapshot.docs.map(
|
|
64
|
-
(doc: QueryDocumentSnapshot<DocumentData>) =>
|
|
65
|
-
({ locale: doc.id, ...doc.data() }) as AssetLocale,
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async createWithLocale(
|
|
70
|
-
slug: string,
|
|
71
|
-
imageUrl: string | undefined,
|
|
72
|
-
locale: Locale,
|
|
73
|
-
localeData: Omit<AssetLocale, "locale">,
|
|
74
|
-
): Promise<Asset> {
|
|
75
|
-
const now = Timestamp.now();
|
|
76
|
-
const batch = this.firestore.batch();
|
|
77
|
-
|
|
78
|
-
const docRef = this.collection.doc(slug);
|
|
79
|
-
const assetData: Asset = {
|
|
80
|
-
id: slug,
|
|
81
|
-
imageUrl,
|
|
82
|
-
createdAt: now,
|
|
83
|
-
updatedAt: now,
|
|
84
|
-
};
|
|
85
|
-
batch.set(docRef, assetData);
|
|
86
|
-
|
|
87
|
-
const localeRef = docRef.collection("locales").doc(locale);
|
|
88
|
-
batch.set(localeRef, { locale, ...localeData });
|
|
89
|
-
|
|
90
|
-
await batch.commit();
|
|
91
|
-
return assetData;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { Firestore } from "firebase-admin/firestore";
|
|
2
|
-
import { FirestoreRepository } from "./firestore.repository";
|
|
3
|
-
import type { Profile } from "../../types/iam/profile";
|
|
4
|
-
import { ProfileSchema } from "../../types/iam/profile";
|
|
5
|
-
import { Collections } from "../../config/collections";
|
|
6
|
-
import { RepositoryError, RepositoryErrorCode } from "./errors";
|
|
7
|
-
|
|
8
|
-
export class ProfileRepository extends FirestoreRepository<Profile> {
|
|
9
|
-
constructor(firestore: Firestore) {
|
|
10
|
-
super(firestore, Collections.Profiles, {
|
|
11
|
-
enableTimestamps: true,
|
|
12
|
-
enableSoftDelete: true,
|
|
13
|
-
validateOnWrite: true,
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
protected validate(data: Partial<Profile>): void {
|
|
18
|
-
const result = ProfileSchema.partial().safeParse(data);
|
|
19
|
-
if (!result.success) {
|
|
20
|
-
throw new RepositoryError(
|
|
21
|
-
RepositoryErrorCode.VALIDATION_ERROR,
|
|
22
|
-
"Profile validation failed",
|
|
23
|
-
{ errors: result.error.issues },
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async findByHandle(handle: string): Promise<Profile | null> {
|
|
29
|
-
const results = await this.findWhere(
|
|
30
|
-
[{ field: "handle", op: "==", value: handle }],
|
|
31
|
-
{ limit: 1 },
|
|
32
|
-
);
|
|
33
|
-
return results[0] ?? null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async findByUserId(userId: string): Promise<Profile | null> {
|
|
37
|
-
return this.findById(userId);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
async createWithUserId(
|
|
41
|
-
userId: string,
|
|
42
|
-
data: Omit<Profile, "id">,
|
|
43
|
-
): Promise<Profile> {
|
|
44
|
-
return this.create(data, userId);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
async handleExists(handle: string): Promise<boolean> {
|
|
48
|
-
const profile = await this.findByHandle(handle);
|
|
49
|
-
return profile !== null;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Firestore } from "firebase-admin/firestore";
|
|
2
|
-
import { FirestoreRepository } from "./firestore.repository";
|
|
3
|
-
import type { RecipeMeta } from "../../types/recipe";
|
|
4
|
-
import { RecipeMetaSchema } from "../../types/recipe";
|
|
5
|
-
import { Collections } from "../../config/collections";
|
|
6
|
-
import { RepositoryError, RepositoryErrorCode } from "./errors";
|
|
7
|
-
|
|
8
|
-
export class RecipeQueueRepository extends FirestoreRepository<RecipeMeta> {
|
|
9
|
-
constructor(firestore: Firestore) {
|
|
10
|
-
super(firestore, Collections.RecipeQueue, {
|
|
11
|
-
enableTimestamps: true,
|
|
12
|
-
enableSoftDelete: false,
|
|
13
|
-
validateOnWrite: true,
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
protected validate(data: Partial<RecipeMeta>): void {
|
|
18
|
-
const result = RecipeMetaSchema.partial().safeParse(data);
|
|
19
|
-
if (!result.success) {
|
|
20
|
-
throw new RepositoryError(
|
|
21
|
-
RepositoryErrorCode.VALIDATION_ERROR,
|
|
22
|
-
"Recipe queue validation failed",
|
|
23
|
-
{ errors: result.error.issues },
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async findBySourceUrl(sourceUrl: string): Promise<RecipeMeta | null> {
|
|
29
|
-
const results = await this.findWhere(
|
|
30
|
-
[{ field: "sourceUrl", op: "==", value: sourceUrl }],
|
|
31
|
-
{ limit: 1 },
|
|
32
|
-
);
|
|
33
|
-
return results[0] ?? null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async findBySourceUrlAndUser(
|
|
37
|
-
sourceUrl: string,
|
|
38
|
-
userId: string,
|
|
39
|
-
): Promise<RecipeMeta | null> {
|
|
40
|
-
const results = await this.findWhere(
|
|
41
|
-
[
|
|
42
|
-
{ field: "sourceUrl", op: "==", value: sourceUrl },
|
|
43
|
-
{ field: "createdBy", op: "==", value: userId },
|
|
44
|
-
],
|
|
45
|
-
{ limit: 1 },
|
|
46
|
-
);
|
|
47
|
-
return results[0] ?? null;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { Firestore } from "firebase-admin/firestore";
|
|
2
|
-
import { FirestoreRepository } from "./firestore.repository";
|
|
3
|
-
import type { RecipeMeta } from "../../types/recipe";
|
|
4
|
-
import { RecipeMetaSchema } from "../../types/recipe";
|
|
5
|
-
import { Collections } from "../../config/collections";
|
|
6
|
-
import { RepositoryError, RepositoryErrorCode } from "./errors";
|
|
7
|
-
|
|
8
|
-
export class RecipeRepository extends FirestoreRepository<RecipeMeta> {
|
|
9
|
-
constructor(firestore: Firestore) {
|
|
10
|
-
super(firestore, Collections.Recipes, {
|
|
11
|
-
enableTimestamps: true,
|
|
12
|
-
enableSoftDelete: true,
|
|
13
|
-
validateOnWrite: true,
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
protected validate(data: Partial<RecipeMeta>): void {
|
|
18
|
-
const result = RecipeMetaSchema.partial().safeParse(data);
|
|
19
|
-
if (!result.success) {
|
|
20
|
-
throw new RepositoryError(
|
|
21
|
-
RepositoryErrorCode.VALIDATION_ERROR,
|
|
22
|
-
"Recipe validation failed",
|
|
23
|
-
{ errors: result.error.issues },
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async findBySourceUrl(sourceUrl: string): Promise<RecipeMeta | null> {
|
|
29
|
-
const results = await this.findWhere(
|
|
30
|
-
[{ field: "sourceUrl", op: "==", value: sourceUrl }],
|
|
31
|
-
{ limit: 1 },
|
|
32
|
-
);
|
|
33
|
-
return results[0] ?? null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async hardDelete(id: string): Promise<void> {
|
|
37
|
-
const docRef = this.collection.doc(id);
|
|
38
|
-
const contentRef = docRef.collection("content");
|
|
39
|
-
|
|
40
|
-
const batch = this.firestore.batch();
|
|
41
|
-
|
|
42
|
-
const contentDocs = await contentRef.listDocuments();
|
|
43
|
-
for (const doc of contentDocs) {
|
|
44
|
-
batch.delete(doc);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
batch.delete(docRef);
|
|
48
|
-
|
|
49
|
-
await batch.commit();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { Firestore } from "firebase-admin/firestore";
|
|
2
|
-
import { FirestoreRepository } from "./firestore.repository";
|
|
3
|
-
import type { Report, ReportStatus, ReportType } from "../../types/report";
|
|
4
|
-
import { ReportSchema } from "../../types/report";
|
|
5
|
-
import { Collections } from "../../config/collections";
|
|
6
|
-
import { RepositoryError, RepositoryErrorCode } from "./errors";
|
|
7
|
-
import type { WhereClause, QueryOptions } from "../../types/repository";
|
|
8
|
-
|
|
9
|
-
export class ReportRepository extends FirestoreRepository<Report> {
|
|
10
|
-
constructor(firestore: Firestore) {
|
|
11
|
-
super(firestore, Collections.Reports, {
|
|
12
|
-
enableTimestamps: true,
|
|
13
|
-
enableSoftDelete: false,
|
|
14
|
-
validateOnWrite: true,
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
protected validate(data: Partial<Report>): void {
|
|
19
|
-
const result = ReportSchema.partial().safeParse(data);
|
|
20
|
-
if (!result.success) {
|
|
21
|
-
throw new RepositoryError(
|
|
22
|
-
RepositoryErrorCode.VALIDATION_ERROR,
|
|
23
|
-
"Report validation failed",
|
|
24
|
-
{ errors: result.error.issues },
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async findByStatus(
|
|
30
|
-
status: ReportStatus,
|
|
31
|
-
options?: QueryOptions,
|
|
32
|
-
): Promise<Report[]> {
|
|
33
|
-
return this.findWhere([{ field: "status", op: "==", value: status }], {
|
|
34
|
-
orderBy: { field: "createdAt", direction: "desc" },
|
|
35
|
-
...options,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async findByType(
|
|
40
|
-
type: ReportType,
|
|
41
|
-
options?: QueryOptions,
|
|
42
|
-
): Promise<Report[]> {
|
|
43
|
-
return this.findWhere([{ field: "type", op: "==", value: type }], {
|
|
44
|
-
orderBy: { field: "createdAt", direction: "desc" },
|
|
45
|
-
...options,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async findByUserId(
|
|
50
|
-
userId: string,
|
|
51
|
-
options?: QueryOptions,
|
|
52
|
-
): Promise<Report[]> {
|
|
53
|
-
return this.findWhere([{ field: "userId", op: "==", value: userId }], {
|
|
54
|
-
orderBy: { field: "createdAt", direction: "desc" },
|
|
55
|
-
...options,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async findByTargetId(
|
|
60
|
-
targetId: string,
|
|
61
|
-
options?: QueryOptions,
|
|
62
|
-
): Promise<Report[]> {
|
|
63
|
-
return this.findWhere([{ field: "targetId", op: "==", value: targetId }], {
|
|
64
|
-
orderBy: { field: "createdAt", direction: "desc" },
|
|
65
|
-
...options,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async findPending(options?: QueryOptions): Promise<Report[]> {
|
|
70
|
-
return this.findByStatus("pending", options);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
async countByUserInPeriod(
|
|
74
|
-
userId: string,
|
|
75
|
-
startDate: Date,
|
|
76
|
-
endDate: Date,
|
|
77
|
-
): Promise<number> {
|
|
78
|
-
const clauses: WhereClause[] = [
|
|
79
|
-
{ field: "userId", op: "==", value: userId },
|
|
80
|
-
{ field: "createdAt", op: ">=", value: startDate },
|
|
81
|
-
{ field: "createdAt", op: "<=", value: endDate },
|
|
82
|
-
];
|
|
83
|
-
return this.count(clauses);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { Database, Reference } from "firebase-admin/database";
|
|
2
|
-
import type { IRTDBRepository } from "../../types/repository";
|
|
3
|
-
|
|
4
|
-
export abstract class RTDBRepository<
|
|
5
|
-
T extends { id: string },
|
|
6
|
-
> implements IRTDBRepository<T> {
|
|
7
|
-
protected readonly ref: Reference;
|
|
8
|
-
|
|
9
|
-
constructor(
|
|
10
|
-
protected readonly database: Database,
|
|
11
|
-
protected readonly path: string,
|
|
12
|
-
) {
|
|
13
|
-
this.ref = database.ref(path);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
protected toDocument(entity: Partial<T>): Record<string, unknown> {
|
|
17
|
-
return { ...entity };
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
protected fromDocument(id: string, data: Record<string, unknown>): T {
|
|
21
|
-
return { id, ...data } as T;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async get(id: string): Promise<T | null> {
|
|
25
|
-
const snapshot = await this.ref.child(id).get();
|
|
26
|
-
if (!snapshot.exists()) return null;
|
|
27
|
-
return this.fromDocument(id, snapshot.val());
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async getAll(): Promise<T[]> {
|
|
31
|
-
const snapshot = await this.ref.get();
|
|
32
|
-
if (!snapshot.exists()) return [];
|
|
33
|
-
|
|
34
|
-
const results: T[] = [];
|
|
35
|
-
snapshot.forEach((child) => {
|
|
36
|
-
results.push(this.fromDocument(child.key!, child.val()));
|
|
37
|
-
});
|
|
38
|
-
return results;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async set(id: string, data: T): Promise<void> {
|
|
42
|
-
const docData = this.toDocument(data);
|
|
43
|
-
await this.ref.child(id).set(docData);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
async update(id: string, data: Partial<T>): Promise<void> {
|
|
47
|
-
const docData = this.toDocument(data);
|
|
48
|
-
await this.ref.child(id).update(docData);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async remove(id: string): Promise<void> {
|
|
52
|
-
await this.ref.child(id).remove();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async increment(id: string, field: string, delta: number = 1): Promise<void> {
|
|
56
|
-
const fieldRef = this.ref.child(id).child(field);
|
|
57
|
-
await fieldRef.transaction((current) => (current || 0) + delta);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async decrement(id: string, field: string, delta: number = 1): Promise<void> {
|
|
61
|
-
await this.increment(id, field, -delta);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async multiUpdate(updates: Record<string, unknown>): Promise<void> {
|
|
65
|
-
await this.ref.update(updates);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { Firestore } from "firebase-admin/firestore";
|
|
2
|
-
import { FirestoreRepository } from "./firestore.repository";
|
|
3
|
-
import type { Settings, SettingsInput } from "../../types/settings";
|
|
4
|
-
import { SettingsSchema } from "../../types/settings";
|
|
5
|
-
import { Collections } from "../../config/collections";
|
|
6
|
-
import { RepositoryError, RepositoryErrorCode } from "./errors";
|
|
7
|
-
|
|
8
|
-
export class SettingsRepository extends FirestoreRepository<Settings> {
|
|
9
|
-
constructor(firestore: Firestore) {
|
|
10
|
-
super(firestore, Collections.Settings, {
|
|
11
|
-
enableTimestamps: true,
|
|
12
|
-
enableSoftDelete: false,
|
|
13
|
-
validateOnWrite: true,
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
protected validate(data: Partial<Settings>): void {
|
|
18
|
-
const result = SettingsSchema.partial().safeParse(data);
|
|
19
|
-
if (!result.success) {
|
|
20
|
-
throw new RepositoryError(
|
|
21
|
-
RepositoryErrorCode.VALIDATION_ERROR,
|
|
22
|
-
"Settings validation failed",
|
|
23
|
-
{ errors: result.error.issues },
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async findByUserId(userId: string): Promise<Settings | null> {
|
|
29
|
-
return this.findById(userId);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
async createForUser(
|
|
33
|
-
userId: string,
|
|
34
|
-
data: Omit<Settings, "id">,
|
|
35
|
-
): Promise<Settings> {
|
|
36
|
-
return this.create(data, userId);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
static createDefaultSettings(): SettingsInput {
|
|
40
|
-
return {
|
|
41
|
-
allergens: [],
|
|
42
|
-
dietaryTags: [],
|
|
43
|
-
cuisines: [],
|
|
44
|
-
excludedIngredients: [],
|
|
45
|
-
locale: "en",
|
|
46
|
-
temperatureUnit: "celsius",
|
|
47
|
-
measurementSystem: "metric",
|
|
48
|
-
theme: "system",
|
|
49
|
-
notifications: {
|
|
50
|
-
email: true,
|
|
51
|
-
push: true,
|
|
52
|
-
marketing: false,
|
|
53
|
-
weeklyDigest: true,
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { Firestore } from "firebase-admin/firestore";
|
|
2
|
-
import { FirestoreRepository } from "./firestore.repository";
|
|
3
|
-
import type { User } from "../../types/iam/user";
|
|
4
|
-
import { UserSchema } from "../../types/iam/user";
|
|
5
|
-
import { Collections } from "../../config/collections";
|
|
6
|
-
import { RepositoryError, RepositoryErrorCode } from "./errors";
|
|
7
|
-
|
|
8
|
-
export class UserRepository extends FirestoreRepository<User> {
|
|
9
|
-
constructor(firestore: Firestore) {
|
|
10
|
-
super(firestore, Collections.Users, {
|
|
11
|
-
enableTimestamps: true,
|
|
12
|
-
enableSoftDelete: true,
|
|
13
|
-
validateOnWrite: true,
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
protected validate(data: Partial<User>): void {
|
|
18
|
-
const result = UserSchema.partial().safeParse(data);
|
|
19
|
-
if (!result.success) {
|
|
20
|
-
throw new RepositoryError(
|
|
21
|
-
RepositoryErrorCode.VALIDATION_ERROR,
|
|
22
|
-
"User validation failed",
|
|
23
|
-
{ errors: result.error.issues },
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async findByEmail(email: string): Promise<User | null> {
|
|
29
|
-
const results = await this.findWhere(
|
|
30
|
-
[{ field: "email", op: "==", value: email }],
|
|
31
|
-
{ limit: 1 },
|
|
32
|
-
);
|
|
33
|
-
return results[0] ?? null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async createWithId(uid: string, data: Omit<User, "id">): Promise<User> {
|
|
37
|
-
return this.create(data, uid);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
async emailExists(email: string): Promise<boolean> {
|
|
41
|
-
const user = await this.findByEmail(email);
|
|
42
|
-
return user !== null;
|
|
43
|
-
}
|
|
44
|
-
}
|
package/src/types/ai/flow.ts
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { z } from "genkit";
|
|
2
|
-
import {
|
|
3
|
-
LocaleSchema,
|
|
4
|
-
SeveritySchema,
|
|
5
|
-
SuggestionCategorySchema,
|
|
6
|
-
} from "../enums";
|
|
7
|
-
import { EquipmentContentSchema } from "../recipe/equipment";
|
|
8
|
-
import { IngredientSectionContentSchema } from "../recipe/ingredient";
|
|
9
|
-
import { InstructionContentSchema } from "../recipe/instruction";
|
|
10
|
-
|
|
11
|
-
// Moderation flow schemas
|
|
12
|
-
export const ModerationFlowSuggestionSchema = z.object({
|
|
13
|
-
category: SuggestionCategorySchema,
|
|
14
|
-
field: z.string(),
|
|
15
|
-
severity: SeveritySchema,
|
|
16
|
-
suggestion: z.string(),
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
export const ModerationFlowInputSchema = z.object({
|
|
20
|
-
locale: LocaleSchema,
|
|
21
|
-
title: z.string(),
|
|
22
|
-
description: z.string(),
|
|
23
|
-
ingredients: z.array(z.string()),
|
|
24
|
-
instructions: z.array(z.string()),
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
export const ModerationFlowOutputSchema = z.object({
|
|
28
|
-
qualityScore: z.number().min(0).max(1),
|
|
29
|
-
suggestions: z.array(ModerationFlowSuggestionSchema),
|
|
30
|
-
autoApproved: z.boolean(),
|
|
31
|
-
autoRejected: z.boolean(),
|
|
32
|
-
rejectionReason: z.string().optional(),
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
export type ModerationFlowInput = z.infer<typeof ModerationFlowInputSchema>;
|
|
36
|
-
export type ModerationFlowOutput = z.infer<typeof ModerationFlowOutputSchema>;
|
|
37
|
-
|
|
38
|
-
// Translation flow schemas
|
|
39
|
-
export const TranslationFlowInputSchema = z.object({
|
|
40
|
-
sourceLocale: LocaleSchema,
|
|
41
|
-
targetLocale: LocaleSchema,
|
|
42
|
-
title: z.string(),
|
|
43
|
-
description: z.string(),
|
|
44
|
-
ingredientSections: z.array(IngredientSectionContentSchema),
|
|
45
|
-
instructions: z.array(InstructionContentSchema),
|
|
46
|
-
equipment: z.array(EquipmentContentSchema).optional(),
|
|
47
|
-
tips: z.array(z.string()).optional(),
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
export const TranslationFlowOutputSchema = z.object({
|
|
51
|
-
title: z.string(),
|
|
52
|
-
description: z.string(),
|
|
53
|
-
ingredientSections: z.array(IngredientSectionContentSchema),
|
|
54
|
-
instructions: z.array(InstructionContentSchema),
|
|
55
|
-
equipment: z.array(EquipmentContentSchema).optional(),
|
|
56
|
-
tips: z.array(z.string()).optional(),
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
export type TranslationFlowInput = z.infer<typeof TranslationFlowInputSchema>;
|
|
60
|
-
export type TranslationFlowOutput = z.infer<typeof TranslationFlowOutputSchema>;
|
|
61
|
-
|
|
62
|
-
// Image safety flow schemas
|
|
63
|
-
const IMAGE_SAFETY_CATEGORY_VALUES = [
|
|
64
|
-
"appropriate",
|
|
65
|
-
"violence",
|
|
66
|
-
"adult",
|
|
67
|
-
"hate",
|
|
68
|
-
"dangerous",
|
|
69
|
-
] as const;
|
|
70
|
-
|
|
71
|
-
export const ImageSafetyFlowInputSchema = z.object({
|
|
72
|
-
imageUrl: z.string(),
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
export const ImageSafetyFlowOutputSchema = z.object({
|
|
76
|
-
safe: z.boolean(),
|
|
77
|
-
reason: z.string().optional(),
|
|
78
|
-
categories: z.array(z.enum(IMAGE_SAFETY_CATEGORY_VALUES)),
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
export type ImageSafetyFlowInput = z.infer<typeof ImageSafetyFlowInputSchema>;
|
|
82
|
-
export type ImageSafetyFlowOutput = z.infer<typeof ImageSafetyFlowOutputSchema>;
|
package/src/types/asset.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { z } from "genkit";
|
|
2
|
-
import type { Timestamp } from "firebase-admin/firestore";
|
|
3
|
-
import { SlugRegex } from "../config";
|
|
4
|
-
import { LocaleSchema } from "./enums";
|
|
5
|
-
|
|
6
|
-
export const AssetSchema = z.object({
|
|
7
|
-
createdAt: z.custom<Timestamp>(),
|
|
8
|
-
id: z.string().regex(SlugRegex),
|
|
9
|
-
imageUrl: z.string().optional(),
|
|
10
|
-
updatedAt: z.custom<Timestamp>(),
|
|
11
|
-
});
|
|
12
|
-
export type Asset = z.infer<typeof AssetSchema>;
|
|
13
|
-
|
|
14
|
-
export const AssetLocaleSchema = z.object({
|
|
15
|
-
description: z.string().max(500).optional(),
|
|
16
|
-
locale: LocaleSchema,
|
|
17
|
-
name: z.string().min(1).max(100),
|
|
18
|
-
});
|
|
19
|
-
export type AssetLocale = z.infer<typeof AssetLocaleSchema>;
|
package/src/types/enums/index.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export * from "./allergen";
|
|
2
|
-
export * from "./cuisine";
|
|
3
|
-
export * from "./dietary_tag";
|
|
4
|
-
export * from "./difficulty";
|
|
5
|
-
export * from "./image_type";
|
|
6
|
-
export * from "./locale";
|
|
7
|
-
export * from "./meal_type";
|
|
8
|
-
export * from "./moderation_status";
|
|
9
|
-
export * from "./priority";
|
|
10
|
-
export * from "./profile_status";
|
|
11
|
-
export * from "./recipe_source";
|
|
12
|
-
export * from "./recipe_status";
|
|
13
|
-
export * from "./role";
|
|
14
|
-
export * from "./severity";
|
|
15
|
-
export * from "./spiciness";
|
|
16
|
-
export * from "./subscription_tier";
|
|
17
|
-
export * from "./suggestion_category";
|
|
18
|
-
export * from "./temperature_unit";
|
|
19
|
-
export * from "./unit";
|
|
20
|
-
export * from "./url_type";
|
|
21
|
-
export * from "./user_status";
|
package/src/types/enums/role.ts
DELETED