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:
@@ -0,0 +1,55 @@
|
||||
-- CreateTable: User
|
||||
CREATE TABLE `User` (
|
||||
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
||||
`username` VARCHAR(191) NOT NULL,
|
||||
`email` VARCHAR(191) NOT NULL,
|
||||
`passwordHash` VARCHAR(191) NOT NULL,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE INDEX `User_username_key` (`username`),
|
||||
UNIQUE INDEX `User_email_key` (`email`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable: UserProduct
|
||||
CREATE TABLE `UserProduct` (
|
||||
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
||||
`userId` INTEGER NOT NULL,
|
||||
`productId` INTEGER NOT NULL,
|
||||
`note` TEXT NULL,
|
||||
`preferredBrand` VARCHAR(191) NULL,
|
||||
`preferredStore` VARCHAR(191) NULL,
|
||||
`isPrivate` BOOLEAN NOT NULL DEFAULT false,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE INDEX `UserProduct_userId_productId_key` (`userId`, `productId`),
|
||||
INDEX `UserProduct_userId_idx` (`userId`),
|
||||
INDEX `UserProduct_productId_idx` (`productId`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable: RecipeShare
|
||||
CREATE TABLE `RecipeShare` (
|
||||
`recipeId` INTEGER NOT NULL,
|
||||
`userId` INTEGER NOT NULL,
|
||||
PRIMARY KEY (`recipeId`, `userId`),
|
||||
INDEX `RecipeShare_userId_idx` (`userId`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- AlterTable: Product add ownerId
|
||||
ALTER TABLE `Product` ADD COLUMN `ownerId` INTEGER NULL;
|
||||
|
||||
-- AlterTable: Recipe add ownerId and isPublic
|
||||
ALTER TABLE `Recipe` ADD COLUMN `ownerId` INTEGER NULL,
|
||||
ADD COLUMN `isPublic` BOOLEAN NOT NULL DEFAULT false;
|
||||
|
||||
-- Make all existing recipes (without owner) public
|
||||
UPDATE `Recipe` SET `isPublic` = true WHERE `ownerId` IS NULL;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `UserProduct` ADD CONSTRAINT `UserProduct_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
ALTER TABLE `UserProduct` ADD CONSTRAINT `UserProduct_productId_fkey` FOREIGN KEY (`productId`) REFERENCES `Product`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
ALTER TABLE `RecipeShare` ADD CONSTRAINT `RecipeShare_recipeId_fkey` FOREIGN KEY (`recipeId`) REFERENCES `Recipe`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
ALTER TABLE `RecipeShare` ADD CONSTRAINT `RecipeShare_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
ALTER TABLE `Product` ADD CONSTRAINT `Product_ownerId_fkey` FOREIGN KEY (`ownerId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
ALTER TABLE `Recipe` ADD CONSTRAINT `Recipe_ownerId_fkey` FOREIGN KEY (`ownerId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
Reference in New Issue
Block a user