"feat: add product API with Prisma integration and update dependencies"

This commit is contained in:
louiscklaw
2025-05-28 10:35:37 +08:00
parent efe70ceb69
commit 964ba3e5b0
6 changed files with 30 additions and 1070 deletions

4
.gitignore vendored
View File

@@ -1,4 +1,8 @@
04_poc 04_poc
**/*del
**/*bak
**/*copy*
# Created by https://www.toptal.com/developers/gitignore/api/node,python,nextjs # Created by https://www.toptal.com/developers/gitignore/api/node,python,nextjs
# Edit at https://www.toptal.com/developers/gitignore?templates=node,python,nextjs # Edit at https://www.toptal.com/developers/gitignore?templates=node,python,nextjs

View File

@@ -45,6 +45,7 @@
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"es-toolkit": "^1.33.0", "es-toolkit": "^1.33.0",
"jose": "^6.0.10", "jose": "^6.0.10",
"lodash": "^4.17.21",
"next": "^14.2.26", "next": "^14.2.26",
"pg": "^8.16.0", "pg": "^8.16.0",
"prisma": "^5.6.0", "prisma": "^5.6.0",
@@ -56,6 +57,7 @@
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.23.0", "@eslint/js": "^9.23.0",
"@types/lodash": "^4.17.17",
"@types/node": "^22.13.13", "@types/node": "^22.13.13",
"@types/react": "^18.3.20", "@types/react": "^18.3.20",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.5",

File diff suppressed because it is too large Load Diff

View File

@@ -1,25 +1,32 @@
// src/app/api/product/details/route.ts
import type { NextRequest } from 'next/server'; import type { NextRequest } from 'next/server';
import { logger } from 'src/utils/logger'; import { logger } from 'src/utils/logger';
import { STATUS, response, handleError } from 'src/utils/response'; import { STATUS, response, handleError } from 'src/utils/response';
import { _products } from 'src/_mock/_product'; import prisma from '../../../lib/prisma';
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
export const runtime = 'edge';
/** ************************************** /** **************************************
* Get product details * Get product details
*************************************** */ *************************************** */
export async function GET(req: NextRequest) { export async function GET(req: NextRequest) {
try { try {
const { searchParams } = req.nextUrl; const { searchParams } = req.nextUrl;
// RULES: productId must exist
const productId = searchParams.get('productId'); const productId = searchParams.get('productId');
if (!productId) {
return response({ message: 'Product ID is required!' }, STATUS.BAD_REQUEST);
}
const products = _products(); // NOTE: productId confirmed exist, run below
const product = await prisma.productItem.findFirst({
const product = products.find((productItem) => productItem.id === productId); include: { reviews: true },
where: { id: productId },
});
if (!product) { if (!product) {
return response({ message: 'Product not found!' }, STATUS.NOT_FOUND); return response({ message: 'Product not found!' }, STATUS.NOT_FOUND);

View File

@@ -1,3 +1,4 @@
// src/app/api/product/list/route.ts
import { logger } from 'src/utils/logger'; import { logger } from 'src/utils/logger';
import { STATUS, response, handleError } from 'src/utils/response'; import { STATUS, response, handleError } from 'src/utils/response';

View File

@@ -780,6 +780,11 @@
resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz"
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
"@types/lodash@^4.17.17":
version "4.17.17"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.17.tgz#fb85a04f47e9e4da888384feead0de05f7070355"
integrity sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==
"@types/node@^22.13.13": "@types/node@^22.13.13":
version "22.13.13" version "22.13.13"
resolved "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz" resolved "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz"
@@ -2428,6 +2433,11 @@ lodash.merge@^4.6.2:
resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
loose-envify@^1.1.0, loose-envify@^1.4.0: loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"