import { pgTable, uuid, text, integer, real, timestamp, index, jsonb } from 'drizzle-orm/pg-core'; /** * Meals table - stores all meal entries with nutrition data */ export const meals = pgTable( 'meals', { id: uuid('id').primaryKey().defaultRandom(), userId: text('user_id').notNull(), foodName: text('food_name').notNull(), imageUrl: text('image_url'), storagePath: text('storage_path'), // R2 path for deletion calories: real('calories').default(0), protein: real('protein').default(0), carbohydrates: real('carbohydrates').default(0), fat: real('fat').default(0), fiber: real('fiber').default(0), sugar: real('sugar').default(0), sodium: real('sodium').default(0), servingSize: text('serving_size'), mealType: text('meal_type'), // breakfast | lunch | dinner | snack analysisStatus: text('analysis_status').default('pending'), // pending | completed | failed | manual healthScore: integer('health_score'), // 1-10 healthCategory: text('health_category'), // very_healthy | healthy | moderate | unhealthy notes: text('notes'), userRating: integer('user_rating'), // 1-5 foodItems: jsonb('food_items').$type().default([]), createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(), }, (table) => [ index('meals_user_id_idx').on(table.userId), index('meals_created_at_idx').on(table.createdAt), index('meals_user_created_idx').on(table.userId, table.createdAt), ] ); /** * Food item type for meal ingredients */ export interface FoodItem { id: string; name: string; category: | 'protein' | 'vegetable' | 'grain' | 'fruit' | 'dairy' | 'fat' | 'processed' | 'beverage'; portionSize: string; calories?: number; protein?: number; carbs?: number; fat?: number; fiber?: number; sugar?: number; confidence?: number; } // Type exports export type Meal = typeof meals.$inferSelect; export type NewMeal = typeof meals.$inferInsert;