feat(auth): implement user authentication with JWT and NextAuth
- Added user registration and login functionality with JWT authentication. - Created auth controller, service, and module in the backend. - Implemented user model and user products management. - Integrated NextAuth for session management on the frontend. - Added middleware for protecting routes and handling public access. - Updated frontend API routes to include authorization headers. - Enhanced recipe and user product models to support ownership and visibility. - Created registration and login pages in the frontend. - Added necessary types for NextAuth session management.
This commit is contained in:
@@ -7,6 +7,19 @@ datasource db {
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
model User {
|
||||
id Int @id @default(autoincrement())
|
||||
username String @unique
|
||||
email String @unique
|
||||
passwordHash String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
userProducts UserProduct[]
|
||||
ownedRecipes Recipe[] @relation("RecipeOwner")
|
||||
sharedRecipes RecipeShare[]
|
||||
}
|
||||
|
||||
model Product {
|
||||
id Int @id @default(autoincrement())
|
||||
name String
|
||||
@@ -26,6 +39,28 @@ model Product {
|
||||
receiptAliases ReceiptAlias[]
|
||||
tags ProductTag[]
|
||||
nutrition Nutrition?
|
||||
ownerId Int?
|
||||
owner User? @relation(fields: [ownerId], references: [id], onDelete: SetNull)
|
||||
userProducts UserProduct[]
|
||||
}
|
||||
|
||||
model UserProduct {
|
||||
id Int @id @default(autoincrement())
|
||||
userId Int
|
||||
productId Int
|
||||
note String? @db.Text
|
||||
preferredBrand String?
|
||||
preferredStore String?
|
||||
isPrivate Boolean @default(false)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([userId, productId])
|
||||
@@index([userId])
|
||||
@@index([productId])
|
||||
}
|
||||
|
||||
model InventoryItem {
|
||||
@@ -73,11 +108,25 @@ model Recipe {
|
||||
instructions String? @db.Text
|
||||
imageUrl String?
|
||||
servings Int?
|
||||
isPublic Boolean @default(false)
|
||||
ownerId Int?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
ingredients RecipeIngredient[]
|
||||
owner User? @relation("RecipeOwner", fields: [ownerId], references: [id], onDelete: SetNull)
|
||||
ingredients RecipeIngredient[]
|
||||
mealPlanEntries MealPlanEntry[]
|
||||
shares RecipeShare[]
|
||||
}
|
||||
|
||||
model RecipeShare {
|
||||
recipeId Int
|
||||
userId Int
|
||||
recipe Recipe @relation(fields: [recipeId], references: [id], onDelete: Cascade)
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@id([recipeId, userId])
|
||||
@@index([userId])
|
||||
}
|
||||
|
||||
model RecipeIngredient {
|
||||
|
||||
Reference in New Issue
Block a user