mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-16 13:19:39 +02:00
Applied formatting to 1487+ files using pnpm format:write - TypeScript/JavaScript files - Svelte components - Astro pages - JSON configs - Markdown docs 13 files still need manual review (Astro JSX comments)
66 lines
2 KiB
TypeScript
66 lines
2 KiB
TypeScript
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<FoodItem[]>().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;
|