Files
Epicure/packages/db/src/migrations/meta/0001_snapshot.json
T
Arnaud add9365250 feat(db): Drizzle ORM schema and migrations
Schema domains: users/auth, recipes, social, meal-planning, tiers/usage, webhooks.
Includes Better Auth tables, audit_logs, site_settings, push_subscriptions,
user_model_prefs, user_nutrition_goals. Migrations 0000–0008 applied.
2026-07-01 08:08:44 +02:00

2371 lines
58 KiB
JSON

{
"id": "005b57a5-7689-46fe-a247-37139039d4cf",
"prevId": "4cff9354-4f13-4960-af10-08fe2cd7a1f5",
"version": "7",
"dialect": "postgresql",
"tables": {
"public.accounts": {
"name": "accounts",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"account_id": {
"name": "account_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"provider_id": {
"name": "provider_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"access_token": {
"name": "access_token",
"type": "text",
"primaryKey": false,
"notNull": false
},
"refresh_token": {
"name": "refresh_token",
"type": "text",
"primaryKey": false,
"notNull": false
},
"id_token": {
"name": "id_token",
"type": "text",
"primaryKey": false,
"notNull": false
},
"access_token_expires_at": {
"name": "access_token_expires_at",
"type": "timestamp",
"primaryKey": false,
"notNull": false
},
"refresh_token_expires_at": {
"name": "refresh_token_expires_at",
"type": "timestamp",
"primaryKey": false,
"notNull": false
},
"scope": {
"name": "scope",
"type": "text",
"primaryKey": false,
"notNull": false
},
"password": {
"name": "password",
"type": "text",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"accounts_user_id_users_id_fk": {
"name": "accounts_user_id_users_id_fk",
"tableFrom": "accounts",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.api_keys": {
"name": "api_keys",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"key_hash": {
"name": "key_hash",
"type": "text",
"primaryKey": false,
"notNull": true
},
"last_used_at": {
"name": "last_used_at",
"type": "timestamp",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"api_keys_user_id_users_id_fk": {
"name": "api_keys_user_id_users_id_fk",
"tableFrom": "api_keys",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"api_keys_key_hash_unique": {
"name": "api_keys_key_hash_unique",
"nullsNotDistinct": false,
"columns": [
"key_hash"
]
}
},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.sessions": {
"name": "sessions",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"expires_at": {
"name": "expires_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true
},
"token": {
"name": "token",
"type": "text",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"ip_address": {
"name": "ip_address",
"type": "text",
"primaryKey": false,
"notNull": false
},
"user_agent": {
"name": "user_agent",
"type": "text",
"primaryKey": false,
"notNull": false
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
}
},
"indexes": {},
"foreignKeys": {
"sessions_user_id_users_id_fk": {
"name": "sessions_user_id_users_id_fk",
"tableFrom": "sessions",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"sessions_token_unique": {
"name": "sessions_token_unique",
"nullsNotDistinct": false,
"columns": [
"token"
]
}
},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.user_follows": {
"name": "user_follows",
"schema": "",
"columns": {
"follower_id": {
"name": "follower_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"following_id": {
"name": "following_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"user_follows_follower_id_users_id_fk": {
"name": "user_follows_follower_id_users_id_fk",
"tableFrom": "user_follows",
"tableTo": "users",
"columnsFrom": [
"follower_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"user_follows_following_id_users_id_fk": {
"name": "user_follows_following_id_users_id_fk",
"tableFrom": "user_follows",
"tableTo": "users",
"columnsFrom": [
"following_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.users": {
"name": "users",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": true
},
"email_verified": {
"name": "email_verified",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"avatar_url": {
"name": "avatar_url",
"type": "text",
"primaryKey": false,
"notNull": false
},
"bio": {
"name": "bio",
"type": "text",
"primaryKey": false,
"notNull": false
},
"username": {
"name": "username",
"type": "text",
"primaryKey": false,
"notNull": false
},
"role": {
"name": "role",
"type": "user_role",
"typeSchema": "public",
"primaryKey": false,
"notNull": true,
"default": "'user'"
},
"tier": {
"name": "tier",
"type": "tier",
"typeSchema": "public",
"primaryKey": false,
"notNull": true,
"default": "'free'"
},
"unit_pref": {
"name": "unit_pref",
"type": "unit_pref",
"typeSchema": "public",
"primaryKey": false,
"notNull": true,
"default": "'metric'"
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"users_email_unique": {
"name": "users_email_unique",
"nullsNotDistinct": false,
"columns": [
"email"
]
},
"users_username_unique": {
"name": "users_username_unique",
"nullsNotDistinct": false,
"columns": [
"username"
]
}
},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.verifications": {
"name": "verifications",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"identifier": {
"name": "identifier",
"type": "text",
"primaryKey": false,
"notNull": true
},
"value": {
"name": "value",
"type": "text",
"primaryKey": false,
"notNull": true
},
"expires_at": {
"name": "expires_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.ingredients": {
"name": "ingredients",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"aliases": {
"name": "aliases",
"type": "text[]",
"primaryKey": false,
"notNull": true,
"default": "'{}'"
},
"category": {
"name": "category",
"type": "text",
"primaryKey": false,
"notNull": false
},
"known_allergens": {
"name": "known_allergens",
"type": "text[]",
"primaryKey": false,
"notNull": true,
"default": "'{}'"
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"ingredients_name_unique": {
"name": "ingredients_name_unique",
"nullsNotDistinct": false,
"columns": [
"name"
]
}
},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.recipe_ingredients": {
"name": "recipe_ingredients",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"ingredient_id": {
"name": "ingredient_id",
"type": "text",
"primaryKey": false,
"notNull": false
},
"raw_name": {
"name": "raw_name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"quantity": {
"name": "quantity",
"type": "numeric(10, 4)",
"primaryKey": false,
"notNull": false
},
"unit": {
"name": "unit",
"type": "text",
"primaryKey": false,
"notNull": false
},
"note": {
"name": "note",
"type": "text",
"primaryKey": false,
"notNull": false
},
"order": {
"name": "order",
"type": "integer",
"primaryKey": false,
"notNull": true,
"default": 0
}
},
"indexes": {},
"foreignKeys": {
"recipe_ingredients_recipe_id_recipes_id_fk": {
"name": "recipe_ingredients_recipe_id_recipes_id_fk",
"tableFrom": "recipe_ingredients",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"recipe_ingredients_ingredient_id_ingredients_id_fk": {
"name": "recipe_ingredients_ingredient_id_ingredients_id_fk",
"tableFrom": "recipe_ingredients",
"tableTo": "ingredients",
"columnsFrom": [
"ingredient_id"
],
"columnsTo": [
"id"
],
"onDelete": "set null",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.recipe_notes": {
"name": "recipe_notes",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"content": {
"name": "content",
"type": "text",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"recipe_notes_recipe_id_recipes_id_fk": {
"name": "recipe_notes_recipe_id_recipes_id_fk",
"tableFrom": "recipe_notes",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"recipe_notes_user_id_users_id_fk": {
"name": "recipe_notes_user_id_users_id_fk",
"tableFrom": "recipe_notes",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.recipe_photos": {
"name": "recipe_photos",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"storage_key": {
"name": "storage_key",
"type": "text",
"primaryKey": false,
"notNull": true
},
"order": {
"name": "order",
"type": "integer",
"primaryKey": false,
"notNull": true,
"default": 0
},
"is_cover": {
"name": "is_cover",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"recipe_photos_recipe_id_recipes_id_fk": {
"name": "recipe_photos_recipe_id_recipes_id_fk",
"tableFrom": "recipe_photos",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.recipe_steps": {
"name": "recipe_steps",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"order": {
"name": "order",
"type": "integer",
"primaryKey": false,
"notNull": true
},
"instruction": {
"name": "instruction",
"type": "text",
"primaryKey": false,
"notNull": true
},
"timer_seconds": {
"name": "timer_seconds",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"photo_url": {
"name": "photo_url",
"type": "text",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {
"recipe_steps_recipe_id_recipes_id_fk": {
"name": "recipe_steps_recipe_id_recipes_id_fk",
"tableFrom": "recipe_steps",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.recipe_variations": {
"name": "recipe_variations",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"parent_recipe_id": {
"name": "parent_recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"child_recipe_id": {
"name": "child_recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"description": {
"name": "description",
"type": "text",
"primaryKey": false,
"notNull": false
},
"ai_generated": {
"name": "ai_generated",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"recipe_variations_parent_recipe_id_recipes_id_fk": {
"name": "recipe_variations_parent_recipe_id_recipes_id_fk",
"tableFrom": "recipe_variations",
"tableTo": "recipes",
"columnsFrom": [
"parent_recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"recipe_variations_child_recipe_id_recipes_id_fk": {
"name": "recipe_variations_child_recipe_id_recipes_id_fk",
"tableFrom": "recipe_variations",
"tableTo": "recipes",
"columnsFrom": [
"child_recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.recipes": {
"name": "recipes",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"author_id": {
"name": "author_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"title": {
"name": "title",
"type": "text",
"primaryKey": false,
"notNull": true
},
"description": {
"name": "description",
"type": "text",
"primaryKey": false,
"notNull": false
},
"base_servings": {
"name": "base_servings",
"type": "integer",
"primaryKey": false,
"notNull": true,
"default": 4
},
"visibility": {
"name": "visibility",
"type": "visibility",
"typeSchema": "public",
"primaryKey": false,
"notNull": true,
"default": "'private'"
},
"source_url": {
"name": "source_url",
"type": "text",
"primaryKey": false,
"notNull": false
},
"ai_generated": {
"name": "ai_generated",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": false
},
"ai_model": {
"name": "ai_model",
"type": "text",
"primaryKey": false,
"notNull": false
},
"ai_prompt": {
"name": "ai_prompt",
"type": "text",
"primaryKey": false,
"notNull": false
},
"dietary_tags": {
"name": "dietary_tags",
"type": "jsonb",
"primaryKey": false,
"notNull": false,
"default": "'{}'::jsonb"
},
"dietary_verified": {
"name": "dietary_verified",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": false
},
"difficulty": {
"name": "difficulty",
"type": "difficulty",
"typeSchema": "public",
"primaryKey": false,
"notNull": false
},
"prep_mins": {
"name": "prep_mins",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"cook_mins": {
"name": "cook_mins",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {
"recipes_author_idx": {
"name": "recipes_author_idx",
"columns": [
{
"expression": "author_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"recipes_visibility_idx": {
"name": "recipes_visibility_idx",
"columns": [
{
"expression": "visibility",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"recipes_author_id_users_id_fk": {
"name": "recipes_author_id_users_id_fk",
"tableFrom": "recipes",
"tableTo": "users",
"columnsFrom": [
"author_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.user_allergens": {
"name": "user_allergens",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"allergen_tag": {
"name": "allergen_tag",
"type": "text",
"primaryKey": false,
"notNull": true
}
},
"indexes": {},
"foreignKeys": {
"user_allergens_user_id_users_id_fk": {
"name": "user_allergens_user_id_users_id_fk",
"tableFrom": "user_allergens",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.collection_recipes": {
"name": "collection_recipes",
"schema": "",
"columns": {
"collection_id": {
"name": "collection_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"added_at": {
"name": "added_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"collection_recipes_collection_id_collections_id_fk": {
"name": "collection_recipes_collection_id_collections_id_fk",
"tableFrom": "collection_recipes",
"tableTo": "collections",
"columnsFrom": [
"collection_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"collection_recipes_recipe_id_recipes_id_fk": {
"name": "collection_recipes_recipe_id_recipes_id_fk",
"tableFrom": "collection_recipes",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.collections": {
"name": "collections",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"description": {
"name": "description",
"type": "text",
"primaryKey": false,
"notNull": false
},
"is_public": {
"name": "is_public",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"collections_user_id_users_id_fk": {
"name": "collections_user_id_users_id_fk",
"tableFrom": "collections",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.comments": {
"name": "comments",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"parent_id": {
"name": "parent_id",
"type": "text",
"primaryKey": false,
"notNull": false
},
"content": {
"name": "content",
"type": "text",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {
"comments_recipe_idx": {
"name": "comments_recipe_idx",
"columns": [
{
"expression": "recipe_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"comments_recipe_id_recipes_id_fk": {
"name": "comments_recipe_id_recipes_id_fk",
"tableFrom": "comments",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"comments_user_id_users_id_fk": {
"name": "comments_user_id_users_id_fk",
"tableFrom": "comments",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.cooking_history": {
"name": "cooking_history",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"cooked_at": {
"name": "cooked_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"servings": {
"name": "servings",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"notes": {
"name": "notes",
"type": "text",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {
"cooking_history_user_id_users_id_fk": {
"name": "cooking_history_user_id_users_id_fk",
"tableFrom": "cooking_history",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"cooking_history_recipe_id_recipes_id_fk": {
"name": "cooking_history_recipe_id_recipes_id_fk",
"tableFrom": "cooking_history",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.favorites": {
"name": "favorites",
"schema": "",
"columns": {
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"favorites_user_id_users_id_fk": {
"name": "favorites_user_id_users_id_fk",
"tableFrom": "favorites",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"favorites_recipe_id_recipes_id_fk": {
"name": "favorites_recipe_id_recipes_id_fk",
"tableFrom": "favorites",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.feed_items": {
"name": "feed_items",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"type": {
"name": "type",
"type": "feed_item_type",
"typeSchema": "public",
"primaryKey": false,
"notNull": true
},
"actor_id": {
"name": "actor_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"subject_id": {
"name": "subject_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {
"feed_items_user_idx": {
"name": "feed_items_user_idx",
"columns": [
{
"expression": "user_id",
"isExpression": false,
"asc": true,
"nulls": "last"
},
{
"expression": "created_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"feed_items_user_id_users_id_fk": {
"name": "feed_items_user_id_users_id_fk",
"tableFrom": "feed_items",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"feed_items_actor_id_users_id_fk": {
"name": "feed_items_actor_id_users_id_fk",
"tableFrom": "feed_items",
"tableTo": "users",
"columnsFrom": [
"actor_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.ratings": {
"name": "ratings",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"score": {
"name": "score",
"type": "integer",
"primaryKey": false,
"notNull": true
},
"review_text": {
"name": "review_text",
"type": "text",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"updated_at": {
"name": "updated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"ratings_recipe_id_recipes_id_fk": {
"name": "ratings_recipe_id_recipes_id_fk",
"tableFrom": "ratings",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"ratings_user_id_users_id_fk": {
"name": "ratings_user_id_users_id_fk",
"tableFrom": "ratings",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.meal_plan_entries": {
"name": "meal_plan_entries",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"meal_plan_id": {
"name": "meal_plan_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"day": {
"name": "day",
"type": "weekday",
"typeSchema": "public",
"primaryKey": false,
"notNull": true
},
"meal_type": {
"name": "meal_type",
"type": "meal_type",
"typeSchema": "public",
"primaryKey": false,
"notNull": true
},
"recipe_id": {
"name": "recipe_id",
"type": "text",
"primaryKey": false,
"notNull": false
},
"servings": {
"name": "servings",
"type": "integer",
"primaryKey": false,
"notNull": true,
"default": 2
},
"note": {
"name": "note",
"type": "text",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {
"meal_plan_entries_meal_plan_id_meal_plans_id_fk": {
"name": "meal_plan_entries_meal_plan_id_meal_plans_id_fk",
"tableFrom": "meal_plan_entries",
"tableTo": "meal_plans",
"columnsFrom": [
"meal_plan_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"meal_plan_entries_recipe_id_recipes_id_fk": {
"name": "meal_plan_entries_recipe_id_recipes_id_fk",
"tableFrom": "meal_plan_entries",
"tableTo": "recipes",
"columnsFrom": [
"recipe_id"
],
"columnsTo": [
"id"
],
"onDelete": "set null",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.meal_plans": {
"name": "meal_plans",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"week_start": {
"name": "week_start",
"type": "date",
"primaryKey": false,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"meal_plans_user_id_users_id_fk": {
"name": "meal_plans_user_id_users_id_fk",
"tableFrom": "meal_plans",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.pantry_items": {
"name": "pantry_items",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"ingredient_id": {
"name": "ingredient_id",
"type": "text",
"primaryKey": false,
"notNull": false
},
"raw_name": {
"name": "raw_name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"quantity": {
"name": "quantity",
"type": "numeric(10, 4)",
"primaryKey": false,
"notNull": false
},
"unit": {
"name": "unit",
"type": "text",
"primaryKey": false,
"notNull": false
},
"expires_at": {
"name": "expires_at",
"type": "timestamp",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"pantry_items_user_id_users_id_fk": {
"name": "pantry_items_user_id_users_id_fk",
"tableFrom": "pantry_items",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"pantry_items_ingredient_id_ingredients_id_fk": {
"name": "pantry_items_ingredient_id_ingredients_id_fk",
"tableFrom": "pantry_items",
"tableTo": "ingredients",
"columnsFrom": [
"ingredient_id"
],
"columnsTo": [
"id"
],
"onDelete": "set null",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.shopping_list_items": {
"name": "shopping_list_items",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"list_id": {
"name": "list_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"ingredient_id": {
"name": "ingredient_id",
"type": "text",
"primaryKey": false,
"notNull": false
},
"raw_name": {
"name": "raw_name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"quantity": {
"name": "quantity",
"type": "numeric(10, 4)",
"primaryKey": false,
"notNull": false
},
"unit": {
"name": "unit",
"type": "text",
"primaryKey": false,
"notNull": false
},
"aisle": {
"name": "aisle",
"type": "text",
"primaryKey": false,
"notNull": false
},
"checked": {
"name": "checked",
"type": "boolean",
"primaryKey": false,
"notNull": true,
"default": false
}
},
"indexes": {},
"foreignKeys": {
"shopping_list_items_list_id_shopping_lists_id_fk": {
"name": "shopping_list_items_list_id_shopping_lists_id_fk",
"tableFrom": "shopping_list_items",
"tableTo": "shopping_lists",
"columnsFrom": [
"list_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"shopping_list_items_ingredient_id_ingredients_id_fk": {
"name": "shopping_list_items_ingredient_id_ingredients_id_fk",
"tableFrom": "shopping_list_items",
"tableTo": "ingredients",
"columnsFrom": [
"ingredient_id"
],
"columnsTo": [
"id"
],
"onDelete": "set null",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.shopping_lists": {
"name": "shopping_lists",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"generated_at": {
"name": "generated_at",
"type": "timestamp",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {
"shopping_lists_user_id_users_id_fk": {
"name": "shopping_lists_user_id_users_id_fk",
"tableFrom": "shopping_lists",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.audit_logs": {
"name": "audit_logs",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": false
},
"action": {
"name": "action",
"type": "text",
"primaryKey": false,
"notNull": true
},
"target_type": {
"name": "target_type",
"type": "text",
"primaryKey": false,
"notNull": false
},
"target_id": {
"name": "target_id",
"type": "text",
"primaryKey": false,
"notNull": false
},
"metadata": {
"name": "metadata",
"type": "text",
"primaryKey": false,
"notNull": false
},
"created_at": {
"name": "created_at",
"type": "timestamp",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {
"audit_logs_created_idx": {
"name": "audit_logs_created_idx",
"columns": [
{
"expression": "created_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"audit_logs_user_id_users_id_fk": {
"name": "audit_logs_user_id_users_id_fk",
"tableFrom": "audit_logs",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "set null",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.tier_definitions": {
"name": "tier_definitions",
"schema": "",
"columns": {
"tier": {
"name": "tier",
"type": "tier",
"typeSchema": "public",
"primaryKey": true,
"notNull": true
},
"max_recipes": {
"name": "max_recipes",
"type": "integer",
"primaryKey": false,
"notNull": true
},
"ai_calls_per_month": {
"name": "ai_calls_per_month",
"type": "integer",
"primaryKey": false,
"notNull": true
},
"storage_mb": {
"name": "storage_mb",
"type": "integer",
"primaryKey": false,
"notNull": true
},
"max_public_recipes": {
"name": "max_public_recipes",
"type": "integer",
"primaryKey": false,
"notNull": true
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.user_usage": {
"name": "user_usage",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"month": {
"name": "month",
"type": "text",
"primaryKey": false,
"notNull": true
},
"ai_calls_used": {
"name": "ai_calls_used",
"type": "integer",
"primaryKey": false,
"notNull": true,
"default": 0
},
"recipe_count": {
"name": "recipe_count",
"type": "integer",
"primaryKey": false,
"notNull": true,
"default": 0
},
"storage_used_mb": {
"name": "storage_used_mb",
"type": "integer",
"primaryKey": false,
"notNull": true,
"default": 0
}
},
"indexes": {
"user_usage_user_month_idx": {
"name": "user_usage_user_month_idx",
"columns": [
{
"expression": "user_id",
"isExpression": false,
"asc": true,
"nulls": "last"
},
{
"expression": "month",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"user_usage_user_id_users_id_fk": {
"name": "user_usage_user_id_users_id_fk",
"tableFrom": "user_usage",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"user_usage_user_month_uniq": {
"name": "user_usage_user_month_uniq",
"nullsNotDistinct": false,
"columns": [
"user_id",
"month"
]
}
},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
}
},
"enums": {
"public.tier": {
"name": "tier",
"schema": "public",
"values": [
"free",
"pro"
]
},
"public.unit_pref": {
"name": "unit_pref",
"schema": "public",
"values": [
"metric",
"imperial"
]
},
"public.user_role": {
"name": "user_role",
"schema": "public",
"values": [
"user",
"moderator",
"admin"
]
},
"public.difficulty": {
"name": "difficulty",
"schema": "public",
"values": [
"easy",
"medium",
"hard"
]
},
"public.visibility": {
"name": "visibility",
"schema": "public",
"values": [
"private",
"unlisted",
"public"
]
},
"public.feed_item_type": {
"name": "feed_item_type",
"schema": "public",
"values": [
"new_recipe",
"new_follow",
"recipe_rated"
]
},
"public.meal_type": {
"name": "meal_type",
"schema": "public",
"values": [
"breakfast",
"lunch",
"dinner",
"snack"
]
},
"public.weekday": {
"name": "weekday",
"schema": "public",
"values": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
]
}
},
"schemas": {},
"sequences": {},
"roles": {},
"policies": {},
"views": {},
"_meta": {
"columns": {},
"schemas": {},
"tables": {}
}
}