x
This commit is contained in:
1 parent
5fac4524c8
commit
e1d793ce37
69 files changed
+1892
-610
No files matched your search
+8
@@ -94,6 +94,11 @@ export declare const categoriesRoute: Elysia<"/categories", {
|
||||
};
|
||||
400: {
|
||||
readonly message: "Invalid category ID";
|
||||
} | {
|
||||
readonly message: "No valid translations provided";
|
||||
};
|
||||
404: {
|
||||
readonly message: "Category not found";
|
||||
};
|
||||
422: {
|
||||
type: "validation";
|
||||
@@ -104,6 +109,9 @@ export declare const categoriesRoute: Elysia<"/categories", {
|
||||
property?: string;
|
||||
expected?: string;
|
||||
};
|
||||
500: {
|
||||
readonly message: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAkBnC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgNxB,CAAC"}
|
||||
{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAkBnC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4NxB,CAAC"}
|
||||
@@ -113,36 +113,48 @@ export const categoriesRoute = new Elysia({ prefix: "/categories" })
|
||||
const id = parseInt(params.id);
|
||||
if (isNaN(id))
|
||||
return status(400, { message: "Invalid category ID" });
|
||||
const payload = body;
|
||||
const results = [];
|
||||
for (const lang of LANGS) {
|
||||
const name = typeof payload.name === 'string'
|
||||
? (lang === 'th' ? payload.name : null)
|
||||
: payload.name?.[lang];
|
||||
if (!name)
|
||||
continue;
|
||||
const existing = await prisma.categoryTranslation.findUnique({
|
||||
where: { categoryId_langCode: { categoryId: id, langCode: lang } }
|
||||
try {
|
||||
const categoryExists = await prisma.category.findUnique({ where: { id } });
|
||||
if (!categoryExists)
|
||||
return status(404, { message: "Category not found" });
|
||||
const payload = body;
|
||||
const results = [];
|
||||
for (const lang of LANGS) {
|
||||
const name = typeof payload.name === 'string'
|
||||
? (lang === 'th' ? payload.name : null)
|
||||
: payload.name?.[lang];
|
||||
if (!name)
|
||||
continue;
|
||||
const existing = await prisma.categoryTranslation.findUnique({
|
||||
where: { categoryId_langCode: { categoryId: id, langCode: lang } }
|
||||
});
|
||||
if (existing) {
|
||||
const updated = await prisma.categoryTranslation.update({
|
||||
where: { id: existing.id },
|
||||
data: { name },
|
||||
});
|
||||
results.push(updated);
|
||||
}
|
||||
else {
|
||||
const created = await prisma.categoryTranslation.create({
|
||||
data: { categoryId: id, langCode: lang, name },
|
||||
});
|
||||
results.push(created);
|
||||
}
|
||||
}
|
||||
if (results.length === 0) {
|
||||
return status(400, { message: "No valid translations provided" });
|
||||
}
|
||||
const updated = await prisma.category.findUnique({
|
||||
where: { id },
|
||||
include: { translations: true, _count: { select: { products: true } } },
|
||||
});
|
||||
if (existing) {
|
||||
const updated = await prisma.categoryTranslation.update({
|
||||
where: { id: existing.id },
|
||||
data: { name },
|
||||
});
|
||||
results.push(updated);
|
||||
}
|
||||
else {
|
||||
const created = await prisma.categoryTranslation.create({
|
||||
data: { categoryId: id, langCode: lang, name },
|
||||
});
|
||||
results.push(created);
|
||||
}
|
||||
return { success: true, translations: results, category: updated };
|
||||
}
|
||||
catch (err) {
|
||||
console.error("Update category translations error:", err);
|
||||
return status(500, { message: err?.message || "Failed to update translations" });
|
||||
}
|
||||
const updated = await prisma.category.findUnique({
|
||||
where: { id },
|
||||
include: { translations: true, _count: { select: { products: true } } },
|
||||
});
|
||||
return { success: true, translations: results, category: updated };
|
||||
})
|
||||
.post("/", async ({ body, status }) => {
|
||||
try {
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"categories.js","sourceRoot":"","sources":["categories.ts"],"names":[],"mappings":"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 truncated
|
||||
{"version":3,"file":"categories.js","sourceRoot":"","sources":["categories.ts"],"names":[],"mappings":"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 truncated
|
||||
Vendored
+2
-2
@@ -54,8 +54,8 @@ export declare const couponsRoute: Elysia<"/coupons", {
|
||||
usageLimit?: number | null;
|
||||
expiresAt?: string | null;
|
||||
type: string;
|
||||
value: number;
|
||||
code: string;
|
||||
value: number;
|
||||
};
|
||||
params: {};
|
||||
query: unknown;
|
||||
@@ -74,8 +74,8 @@ export declare const couponsRoute: Elysia<"/coupons", {
|
||||
body: {
|
||||
type?: string;
|
||||
isActive?: boolean;
|
||||
value?: number;
|
||||
code?: string;
|
||||
value?: number;
|
||||
minPurchase?: number;
|
||||
maxDiscount?: number | null;
|
||||
usageLimit?: number | null;
|
||||
|
||||
Vendored
+21
@@ -62,6 +62,26 @@ export declare const pagesRoute: Elysia<"/pages", {
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
pages: {
|
||||
sections: {
|
||||
":sectionId": {
|
||||
get: {
|
||||
body: unknown;
|
||||
params: {
|
||||
sectionId: string;
|
||||
} & {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
[x: string]: any;
|
||||
[x: number]: any;
|
||||
[x: symbol]: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
pages: {
|
||||
newsletter: {
|
||||
@@ -156,4 +176,5 @@ export declare const pagesRoute: Elysia<"/pages", {
|
||||
standaloneSchema: {};
|
||||
response: {};
|
||||
}, any>;
|
||||
export declare function hydrateSectionPayload(section: any, lang: string): Promise<any>;
|
||||
//# sourceMappingURL=pages.d.ts.map
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAgKnC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6dnB,CAAC"}
|
||||
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AA0EnC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2cnB,CAAC;AAsKL,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,gBA+CrE"}
|
||||
+318
-463
File diff suppressed because it is too large.
Load diff
@@ -1 +1 @@
|
||||
{"version":3,"file":"pages.js","sourceRoot":"","sources":["pages.ts"],"names":[],"mappings":"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 truncated
|
||||
{"version":3,"file":"pages.js","sourceRoot":"","sources":["pages.ts"],"names":[],"mappings":"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 truncated
|
||||
+349
@@ -0,0 +1,349 @@
|
||||
import { Elysia } from "elysia";
|
||||
export declare const productAttributesRoute: Elysia<"", {
|
||||
decorator: {};
|
||||
store: {};
|
||||
derive: {};
|
||||
resolve: {};
|
||||
}, {
|
||||
typebox: {};
|
||||
error: {};
|
||||
}, {
|
||||
schema: {};
|
||||
standaloneSchema: {};
|
||||
macro: {};
|
||||
macroFn: {};
|
||||
parser: {};
|
||||
response: {};
|
||||
}, {
|
||||
"product-attributes": {
|
||||
definitions: {
|
||||
get: {
|
||||
body: unknown;
|
||||
params: {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
[x: string]: any;
|
||||
[x: number]: any;
|
||||
[x: symbol]: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
"product-attributes": {
|
||||
definitions: {
|
||||
":id": {
|
||||
get: {
|
||||
body: unknown;
|
||||
params: {
|
||||
id: string;
|
||||
} & {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
[x: string]: any;
|
||||
[x: number]: any;
|
||||
[x: symbol]: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
"product-attributes": {
|
||||
definitions: {
|
||||
post: {
|
||||
body: any;
|
||||
params: {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
200: {
|
||||
success: boolean;
|
||||
definition: any;
|
||||
};
|
||||
400: {
|
||||
readonly message: "Attribute definition code already exists";
|
||||
};
|
||||
500: {
|
||||
readonly message: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
"product-attributes": {
|
||||
definitions: {
|
||||
":id": {
|
||||
put: {
|
||||
body: any;
|
||||
params: {
|
||||
id: string;
|
||||
} & {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
200: {
|
||||
success: boolean;
|
||||
definition: any;
|
||||
};
|
||||
400: {
|
||||
readonly message: "Attribute definition code already exists";
|
||||
};
|
||||
404: {
|
||||
readonly message: "Attribute definition not found";
|
||||
};
|
||||
422: {
|
||||
type: "validation";
|
||||
on: string;
|
||||
summary?: string;
|
||||
message?: string;
|
||||
found?: unknown;
|
||||
property?: string;
|
||||
expected?: string;
|
||||
};
|
||||
500: {
|
||||
readonly message: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
"product-attributes": {
|
||||
definitions: {
|
||||
":id": {
|
||||
translations: {
|
||||
patch: {
|
||||
body: any;
|
||||
params: {
|
||||
id: string;
|
||||
} & {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
200: {
|
||||
success: boolean;
|
||||
definition: any;
|
||||
translations: any[];
|
||||
};
|
||||
400: {
|
||||
readonly message: "No valid translations provided";
|
||||
};
|
||||
404: {
|
||||
readonly message: "Attribute definition not found";
|
||||
};
|
||||
422: {
|
||||
type: "validation";
|
||||
on: string;
|
||||
summary?: string;
|
||||
message?: string;
|
||||
found?: unknown;
|
||||
property?: string;
|
||||
expected?: string;
|
||||
};
|
||||
500: {
|
||||
readonly message: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
products: {
|
||||
":id": {
|
||||
attributes: {
|
||||
get: {
|
||||
body: unknown;
|
||||
params: {
|
||||
id: string;
|
||||
} & {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
[x: string]: any;
|
||||
[x: number]: any;
|
||||
[x: symbol]: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
products: {
|
||||
":id": {
|
||||
attributes: {
|
||||
post: {
|
||||
body: any;
|
||||
params: {
|
||||
id: string;
|
||||
} & {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
200: {
|
||||
success: boolean;
|
||||
attribute: any;
|
||||
};
|
||||
400: {
|
||||
readonly message: "attributeDefinitionId is required";
|
||||
} | {
|
||||
readonly message: any;
|
||||
};
|
||||
404: {
|
||||
readonly message: any;
|
||||
};
|
||||
422: {
|
||||
type: "validation";
|
||||
on: string;
|
||||
summary?: string;
|
||||
message?: string;
|
||||
found?: unknown;
|
||||
property?: string;
|
||||
expected?: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
products: {
|
||||
":id": {
|
||||
attributes: {
|
||||
put: {
|
||||
body: any;
|
||||
params: {
|
||||
id: string;
|
||||
} & {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
200: {
|
||||
success: boolean;
|
||||
attributes: any;
|
||||
};
|
||||
400: {
|
||||
readonly message: "attributes array is required";
|
||||
} | {
|
||||
readonly message: any;
|
||||
};
|
||||
404: {
|
||||
readonly message: "Product not found";
|
||||
} | {
|
||||
readonly message: any;
|
||||
};
|
||||
422: {
|
||||
type: "validation";
|
||||
on: string;
|
||||
summary?: string;
|
||||
message?: string;
|
||||
found?: unknown;
|
||||
property?: string;
|
||||
expected?: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
products: {
|
||||
":id": {
|
||||
attributes: {
|
||||
":productAttributeId": {
|
||||
put: {
|
||||
body: any;
|
||||
params: {
|
||||
id: string;
|
||||
productAttributeId: string;
|
||||
} & {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
200: {
|
||||
success: boolean;
|
||||
attribute: any;
|
||||
};
|
||||
400: {
|
||||
readonly message: any;
|
||||
};
|
||||
404: {
|
||||
readonly message: "Product attribute not found";
|
||||
};
|
||||
422: {
|
||||
type: "validation";
|
||||
on: string;
|
||||
summary?: string;
|
||||
message?: string;
|
||||
found?: unknown;
|
||||
property?: string;
|
||||
expected?: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
products: {
|
||||
":id": {
|
||||
attributes: {
|
||||
":productAttributeId": {
|
||||
translations: {
|
||||
patch: {
|
||||
body: any;
|
||||
params: {
|
||||
id: string;
|
||||
productAttributeId: string;
|
||||
} & {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
200: {
|
||||
success: boolean;
|
||||
attribute: any;
|
||||
translations: any[];
|
||||
};
|
||||
400: {
|
||||
readonly message: any;
|
||||
};
|
||||
404: {
|
||||
readonly message: "Product attribute not found";
|
||||
};
|
||||
422: {
|
||||
type: "validation";
|
||||
on: string;
|
||||
summary?: string;
|
||||
message?: string;
|
||||
found?: unknown;
|
||||
property?: string;
|
||||
expected?: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}, {
|
||||
derive: {};
|
||||
resolve: {};
|
||||
schema: {};
|
||||
standaloneSchema: {};
|
||||
response: {};
|
||||
}, {
|
||||
derive: {};
|
||||
resolve: {};
|
||||
schema: {};
|
||||
standaloneSchema: {};
|
||||
response: {};
|
||||
}>;
|
||||
//# sourceMappingURL=product-attributes.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"product-attributes.d.ts","sourceRoot":"","sources":["product-attributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAiDnC,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqY/B,CAAC"}
|
||||
@@ -0,0 +1,417 @@
|
||||
import { Elysia, t } from "elysia";
|
||||
import prisma from "../lib/prisma";
|
||||
import { SUPPORTED_LANGS, localizeAttributeDefinition, localizeProductAttribute, normalizeAttributeType, validateAttributeValue, validateSelectOption, } from "../lib/productAttributes";
|
||||
function parseId(value, label) {
|
||||
const parsed = parseInt(value);
|
||||
if (Number.isNaN(parsed)) {
|
||||
throw new Error(`Invalid ${label}`);
|
||||
}
|
||||
return parsed;
|
||||
}
|
||||
function buildDefinitionPayload(payload) {
|
||||
return {
|
||||
code: payload.code,
|
||||
label: payload.label,
|
||||
description: payload.description ?? null,
|
||||
type: normalizeAttributeType(payload.type),
|
||||
unit: payload.unit ?? null,
|
||||
options: payload.options ?? null,
|
||||
isRequired: Boolean(payload.isRequired),
|
||||
isFilterable: Boolean(payload.isFilterable),
|
||||
sortOrder: typeof payload.sortOrder === 'number' ? payload.sortOrder : 0,
|
||||
categoryId: payload.categoryId ?? null,
|
||||
};
|
||||
}
|
||||
async function assertProductAndDefinitionMatch(productId, attributeDefinitionId) {
|
||||
const [product, definition] = await Promise.all([
|
||||
prisma.product.findUnique({ where: { id: productId } }),
|
||||
prisma.attributeDefinition.findUnique({ where: { id: attributeDefinitionId } }),
|
||||
]);
|
||||
if (!product)
|
||||
throw new Error("Product not found");
|
||||
if (!definition)
|
||||
throw new Error("Attribute definition not found");
|
||||
if (definition.categoryId && definition.categoryId !== product.categoryId) {
|
||||
throw new Error("Attribute definition category does not match product category");
|
||||
}
|
||||
return { product, definition };
|
||||
}
|
||||
export const productAttributesRoute = new Elysia()
|
||||
.get("/product-attributes/definitions", async ({ query }) => {
|
||||
const lang = query.lang || 'th';
|
||||
const categoryId = query.categoryId ? parseInt(query.categoryId) : undefined;
|
||||
const definitions = await prisma.attributeDefinition.findMany({
|
||||
where: categoryId ? { OR: [{ categoryId }, { categoryId: null }] } : undefined,
|
||||
include: {
|
||||
category: true,
|
||||
translations: true,
|
||||
},
|
||||
orderBy: [
|
||||
{ sortOrder: 'asc' },
|
||||
{ code: 'asc' },
|
||||
],
|
||||
});
|
||||
return definitions.map((definition) => localizeAttributeDefinition(definition, lang));
|
||||
})
|
||||
.get("/product-attributes/definitions/:id", async ({ params, query, status }) => {
|
||||
try {
|
||||
const id = parseId(params.id, "attribute definition ID");
|
||||
const lang = query.lang || 'th';
|
||||
const definition = await prisma.attributeDefinition.findUnique({
|
||||
where: { id },
|
||||
include: {
|
||||
category: true,
|
||||
translations: true,
|
||||
},
|
||||
});
|
||||
if (!definition)
|
||||
return status(404, { message: "Attribute definition not found" });
|
||||
return localizeAttributeDefinition(definition, lang);
|
||||
}
|
||||
catch (err) {
|
||||
return status(400, { message: err.message });
|
||||
}
|
||||
})
|
||||
.post("/product-attributes/definitions", async ({ body, status }) => {
|
||||
try {
|
||||
const payload = body;
|
||||
const definition = await prisma.attributeDefinition.create({
|
||||
data: {
|
||||
...buildDefinitionPayload(payload),
|
||||
translations: payload.translations && typeof payload.translations === 'object'
|
||||
? {
|
||||
create: Object.entries(payload.translations)
|
||||
.filter(([lang, value]) => SUPPORTED_LANGS.includes(lang) && value && typeof value === 'object' && value.label)
|
||||
.map(([lang, value]) => ({
|
||||
langCode: lang,
|
||||
label: value.label,
|
||||
description: value.description ?? null,
|
||||
})),
|
||||
}
|
||||
: undefined,
|
||||
},
|
||||
include: {
|
||||
category: true,
|
||||
translations: true,
|
||||
},
|
||||
});
|
||||
return { success: true, definition };
|
||||
}
|
||||
catch (err) {
|
||||
if (err.code === 'P2002')
|
||||
return status(400, { message: "Attribute definition code already exists" });
|
||||
return status(500, { message: err?.message || "Failed to create attribute definition" });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
})
|
||||
.put("/product-attributes/definitions/:id", async ({ params, body, status }) => {
|
||||
try {
|
||||
const id = parseId(params.id, "attribute definition ID");
|
||||
const payload = body;
|
||||
const definition = await prisma.attributeDefinition.update({
|
||||
where: { id },
|
||||
data: buildDefinitionPayload(payload),
|
||||
include: {
|
||||
category: true,
|
||||
translations: true,
|
||||
},
|
||||
});
|
||||
return { success: true, definition };
|
||||
}
|
||||
catch (err) {
|
||||
if (err.code === 'P2025')
|
||||
return status(404, { message: "Attribute definition not found" });
|
||||
if (err.code === 'P2002')
|
||||
return status(400, { message: "Attribute definition code already exists" });
|
||||
return status(500, { message: err?.message || "Failed to update attribute definition" });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
})
|
||||
.patch("/product-attributes/definitions/:id/translations", async ({ params, body, status }) => {
|
||||
try {
|
||||
const id = parseId(params.id, "attribute definition ID");
|
||||
const definition = await prisma.attributeDefinition.findUnique({ where: { id } });
|
||||
if (!definition)
|
||||
return status(404, { message: "Attribute definition not found" });
|
||||
const payload = body;
|
||||
const results = [];
|
||||
for (const lang of SUPPORTED_LANGS) {
|
||||
const item = payload.translations?.[lang]
|
||||
|| ((payload.label?.[lang] || payload.description?.[lang]) ? { label: payload.label?.[lang], description: payload.description?.[lang] } : null);
|
||||
if (!item?.label)
|
||||
continue;
|
||||
const existing = await prisma.attributeDefinitionTranslation.findUnique({
|
||||
where: { attributeDefinitionId_langCode: { attributeDefinitionId: id, langCode: lang } },
|
||||
});
|
||||
const data = {
|
||||
label: item.label,
|
||||
description: item.description ?? null,
|
||||
};
|
||||
if (existing) {
|
||||
results.push(await prisma.attributeDefinitionTranslation.update({
|
||||
where: { id: existing.id },
|
||||
data,
|
||||
}));
|
||||
}
|
||||
else {
|
||||
results.push(await prisma.attributeDefinitionTranslation.create({
|
||||
data: {
|
||||
attributeDefinitionId: id,
|
||||
langCode: lang,
|
||||
...data,
|
||||
},
|
||||
}));
|
||||
}
|
||||
}
|
||||
if (results.length === 0)
|
||||
return status(400, { message: "No valid translations provided" });
|
||||
const updated = await prisma.attributeDefinition.findUnique({
|
||||
where: { id },
|
||||
include: { category: true, translations: true },
|
||||
});
|
||||
return { success: true, definition: updated, translations: results };
|
||||
}
|
||||
catch (err) {
|
||||
return status(500, { message: err?.message || "Failed to update attribute definition translations" });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
})
|
||||
.get("/products/:id/attributes", async ({ params, query, status }) => {
|
||||
try {
|
||||
const productId = parseId(params.id, "product ID");
|
||||
const lang = query.lang || 'th';
|
||||
const product = await prisma.product.findUnique({ where: { id: productId } });
|
||||
if (!product)
|
||||
return status(404, { message: "Product not found" });
|
||||
const attributes = await prisma.productAttribute.findMany({
|
||||
where: { productId },
|
||||
include: {
|
||||
translations: true,
|
||||
attributeDefinition: {
|
||||
include: {
|
||||
category: true,
|
||||
translations: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
orderBy: [
|
||||
{ attributeDefinition: { sortOrder: 'asc' } },
|
||||
{ id: 'asc' },
|
||||
],
|
||||
});
|
||||
return attributes.map((attribute) => localizeProductAttribute(attribute, lang));
|
||||
}
|
||||
catch (err) {
|
||||
return status(400, { message: err.message });
|
||||
}
|
||||
})
|
||||
.post("/products/:id/attributes", async ({ params, body, status }) => {
|
||||
try {
|
||||
const productId = parseId(params.id, "product ID");
|
||||
const payload = body;
|
||||
const attributeDefinitionId = Number(payload.attributeDefinitionId);
|
||||
if (!attributeDefinitionId)
|
||||
return status(400, { message: "attributeDefinitionId is required" });
|
||||
const { definition } = await assertProductAndDefinitionMatch(productId, attributeDefinitionId);
|
||||
const type = normalizeAttributeType(definition.type);
|
||||
validateAttributeValue(type, payload);
|
||||
if (type === 'SELECT')
|
||||
validateSelectOption(definition.options, payload.valueText);
|
||||
const attribute = await prisma.productAttribute.upsert({
|
||||
where: { productId_attributeDefinitionId: { productId, attributeDefinitionId } },
|
||||
update: {
|
||||
valueText: payload.valueText ?? null,
|
||||
valueNumber: payload.valueNumber ?? null,
|
||||
valueBoolean: payload.valueBoolean ?? null,
|
||||
valueJson: payload.valueJson ?? null,
|
||||
},
|
||||
create: {
|
||||
productId,
|
||||
attributeDefinitionId,
|
||||
valueText: payload.valueText ?? null,
|
||||
valueNumber: payload.valueNumber ?? null,
|
||||
valueBoolean: payload.valueBoolean ?? null,
|
||||
valueJson: payload.valueJson ?? null,
|
||||
},
|
||||
include: {
|
||||
translations: true,
|
||||
attributeDefinition: { include: { category: true, translations: true } },
|
||||
},
|
||||
});
|
||||
return { success: true, attribute };
|
||||
}
|
||||
catch (err) {
|
||||
const code = err.message === "Product not found" || err.message === "Attribute definition not found" ? 404 : 400;
|
||||
return status(code, { message: err.message });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
})
|
||||
.put("/products/:id/attributes", async ({ params, body, status }) => {
|
||||
try {
|
||||
const productId = parseId(params.id, "product ID");
|
||||
const payload = body;
|
||||
if (!Array.isArray(payload.attributes))
|
||||
return status(400, { message: "attributes array is required" });
|
||||
const product = await prisma.product.findUnique({ where: { id: productId } });
|
||||
if (!product)
|
||||
return status(404, { message: "Product not found" });
|
||||
const existing = await prisma.productAttribute.findMany({
|
||||
where: { productId },
|
||||
select: { id: true, attributeDefinitionId: true },
|
||||
});
|
||||
const incomingDefinitionIds = payload.attributes.map((item) => Number(item.attributeDefinitionId)).filter(Boolean);
|
||||
const toDelete = existing.filter((item) => !incomingDefinitionIds.includes(item.attributeDefinitionId));
|
||||
if (toDelete.length > 0) {
|
||||
await prisma.productAttribute.deleteMany({
|
||||
where: { id: { in: toDelete.map((item) => item.id) } },
|
||||
});
|
||||
}
|
||||
const results = [];
|
||||
for (const item of payload.attributes) {
|
||||
const attributeDefinitionId = Number(item.attributeDefinitionId);
|
||||
const { definition } = await assertProductAndDefinitionMatch(productId, attributeDefinitionId);
|
||||
const type = normalizeAttributeType(definition.type);
|
||||
validateAttributeValue(type, item);
|
||||
if (type === 'SELECT')
|
||||
validateSelectOption(definition.options, item.valueText);
|
||||
const attribute = await prisma.productAttribute.upsert({
|
||||
where: { productId_attributeDefinitionId: { productId, attributeDefinitionId } },
|
||||
update: {
|
||||
valueText: item.valueText ?? null,
|
||||
valueNumber: item.valueNumber ?? null,
|
||||
valueBoolean: item.valueBoolean ?? null,
|
||||
valueJson: item.valueJson ?? null,
|
||||
},
|
||||
create: {
|
||||
productId,
|
||||
attributeDefinitionId,
|
||||
valueText: item.valueText ?? null,
|
||||
valueNumber: item.valueNumber ?? null,
|
||||
valueBoolean: item.valueBoolean ?? null,
|
||||
valueJson: item.valueJson ?? null,
|
||||
},
|
||||
include: {
|
||||
translations: true,
|
||||
attributeDefinition: { include: { category: true, translations: true } },
|
||||
},
|
||||
});
|
||||
if (type === 'TEXT' && item.translations && typeof item.translations === 'object') {
|
||||
for (const lang of SUPPORTED_LANGS) {
|
||||
const translatedValue = item.translations[lang];
|
||||
if (typeof translatedValue !== 'string' || !translatedValue.trim())
|
||||
continue;
|
||||
await prisma.productAttributeTranslation.upsert({
|
||||
where: { productAttributeId_langCode: { productAttributeId: attribute.id, langCode: lang } },
|
||||
update: { valueText: translatedValue },
|
||||
create: { productAttributeId: attribute.id, langCode: lang, valueText: translatedValue },
|
||||
});
|
||||
}
|
||||
}
|
||||
results.push(attribute);
|
||||
}
|
||||
const updated = await prisma.productAttribute.findMany({
|
||||
where: { productId },
|
||||
include: {
|
||||
translations: true,
|
||||
attributeDefinition: { include: { category: true, translations: true } },
|
||||
},
|
||||
orderBy: [
|
||||
{ attributeDefinition: { sortOrder: 'asc' } },
|
||||
{ id: 'asc' },
|
||||
],
|
||||
});
|
||||
return { success: true, attributes: updated };
|
||||
}
|
||||
catch (err) {
|
||||
const code = err.message === "Product not found" || err.message === "Attribute definition not found" ? 404 : 400;
|
||||
return status(code, { message: err.message });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
})
|
||||
.put("/products/:id/attributes/:productAttributeId", async ({ params, body, status }) => {
|
||||
try {
|
||||
const productId = parseId(params.id, "product ID");
|
||||
const productAttributeId = parseId(params.productAttributeId, "product attribute ID");
|
||||
const attribute = await prisma.productAttribute.findUnique({
|
||||
where: { id: productAttributeId },
|
||||
include: { attributeDefinition: true },
|
||||
});
|
||||
if (!attribute || attribute.productId !== productId) {
|
||||
return status(404, { message: "Product attribute not found" });
|
||||
}
|
||||
const type = normalizeAttributeType(attribute.attributeDefinition.type);
|
||||
const payload = body;
|
||||
validateAttributeValue(type, payload);
|
||||
if (type === 'SELECT')
|
||||
validateSelectOption(attribute.attributeDefinition.options, payload.valueText);
|
||||
const updated = await prisma.productAttribute.update({
|
||||
where: { id: productAttributeId },
|
||||
data: {
|
||||
valueText: payload.valueText ?? null,
|
||||
valueNumber: payload.valueNumber ?? null,
|
||||
valueBoolean: payload.valueBoolean ?? null,
|
||||
valueJson: payload.valueJson ?? null,
|
||||
},
|
||||
include: {
|
||||
translations: true,
|
||||
attributeDefinition: { include: { category: true, translations: true } },
|
||||
},
|
||||
});
|
||||
return { success: true, attribute: updated };
|
||||
}
|
||||
catch (err) {
|
||||
return status(400, { message: err.message });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
})
|
||||
.patch("/products/:id/attributes/:productAttributeId/translations", async ({ params, body, status }) => {
|
||||
try {
|
||||
const productId = parseId(params.id, "product ID");
|
||||
const productAttributeId = parseId(params.productAttributeId, "product attribute ID");
|
||||
const attribute = await prisma.productAttribute.findUnique({
|
||||
where: { id: productAttributeId },
|
||||
include: { attributeDefinition: true, translations: true },
|
||||
});
|
||||
if (!attribute || attribute.productId !== productId) {
|
||||
return status(404, { message: "Product attribute not found" });
|
||||
}
|
||||
const type = normalizeAttributeType(attribute.attributeDefinition.type);
|
||||
if (type !== 'TEXT') {
|
||||
return status(400, { message: "Only TEXT product attributes support translations in this phase" });
|
||||
}
|
||||
const payload = body;
|
||||
const results = [];
|
||||
for (const lang of SUPPORTED_LANGS) {
|
||||
const valueText = payload.translations?.[lang] ?? payload.valueText?.[lang];
|
||||
if (typeof valueText !== 'string' || !valueText.trim())
|
||||
continue;
|
||||
results.push(await prisma.productAttributeTranslation.upsert({
|
||||
where: { productAttributeId_langCode: { productAttributeId, langCode: lang } },
|
||||
update: { valueText },
|
||||
create: { productAttributeId, langCode: lang, valueText },
|
||||
}));
|
||||
}
|
||||
if (results.length === 0)
|
||||
return status(400, { message: "No valid translations provided" });
|
||||
const updated = await prisma.productAttribute.findUnique({
|
||||
where: { id: productAttributeId },
|
||||
include: {
|
||||
translations: true,
|
||||
attributeDefinition: { include: { category: true, translations: true } },
|
||||
},
|
||||
});
|
||||
return { success: true, attribute: updated, translations: results };
|
||||
}
|
||||
catch (err) {
|
||||
return status(400, { message: err.message });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
});
|
||||
//# sourceMappingURL=product-attributes.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"product-attributes.js","sourceRoot":"","sources":["product-attributes.ts"],"names":[],"mappings":"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 truncated
|
||||
+41
-5
@@ -1,6 +1,8 @@
|
||||
import { Elysia } from "elysia";
|
||||
export declare const productsRoute: Elysia<"/products", {
|
||||
decorator: {};
|
||||
decorator: {
|
||||
validateVariants: (options?: any[], variants?: any[]) => void;
|
||||
};
|
||||
store: {};
|
||||
derive: {};
|
||||
resolve: {};
|
||||
@@ -139,7 +141,7 @@ export declare const productsRoute: Elysia<"/products", {
|
||||
};
|
||||
500: {
|
||||
readonly success: false;
|
||||
readonly message: "Failed to update product";
|
||||
readonly message: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -182,7 +184,7 @@ export declare const productsRoute: Elysia<"/products", {
|
||||
};
|
||||
500: {
|
||||
readonly success: false;
|
||||
readonly message: "Failed to add product image";
|
||||
readonly message: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -203,7 +205,41 @@ export declare const productsRoute: Elysia<"/products", {
|
||||
};
|
||||
500: {
|
||||
readonly success: false;
|
||||
readonly message: "Failed to create product";
|
||||
readonly message: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
} & {
|
||||
products: {
|
||||
bulk: {
|
||||
post: {
|
||||
body: any[];
|
||||
params: {};
|
||||
query: unknown;
|
||||
headers: unknown;
|
||||
response: {
|
||||
200: {
|
||||
success: boolean;
|
||||
products: any;
|
||||
};
|
||||
400: {
|
||||
readonly success: false;
|
||||
readonly message: "Payload must be an array of products";
|
||||
};
|
||||
422: {
|
||||
type: "validation";
|
||||
on: string;
|
||||
summary?: string;
|
||||
message?: string;
|
||||
found?: unknown;
|
||||
property?: string;
|
||||
expected?: string;
|
||||
};
|
||||
500: {
|
||||
readonly success: false;
|
||||
readonly message: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -237,7 +273,7 @@ export declare const productsRoute: Elysia<"/products", {
|
||||
};
|
||||
500: {
|
||||
readonly success: false;
|
||||
readonly message: "Failed to patch product";
|
||||
readonly message: any;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAGnC,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2bvB,CAAC"}
|
||||
{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAInC,eAAO,MAAM,aAAa;;qCACgB,GAAG,EAAE,aAAiB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4tBlE,CAAC"}
|
||||
@@ -1,6 +1,41 @@
|
||||
import { Elysia, t } from "elysia";
|
||||
import prisma from "../lib/prisma";
|
||||
import { localizeProductAttribute } from "../lib/productAttributes";
|
||||
export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
.decorate("validateVariants", (options = [], variants = []) => {
|
||||
if (options.length > 3)
|
||||
throw new Error("Options array length cannot exceed 3.");
|
||||
const getPrimaryValues = (values) => {
|
||||
return values.map(val => {
|
||||
if (typeof val === 'string')
|
||||
return val;
|
||||
if (typeof val === 'object' && val !== null) {
|
||||
return val.th || Object.values(val)[0];
|
||||
}
|
||||
return String(val);
|
||||
});
|
||||
};
|
||||
for (const v of variants) {
|
||||
if (v.option1 && options[0]) {
|
||||
const validValues = getPrimaryValues(options[0].values);
|
||||
if (!validValues.includes(v.option1)) {
|
||||
throw new Error(`Variant option1 '${v.option1}' is not found in options[0].values [${validValues.join(', ')}]`);
|
||||
}
|
||||
}
|
||||
if (v.option2 && options[1]) {
|
||||
const validValues = getPrimaryValues(options[1].values);
|
||||
if (!validValues.includes(v.option2)) {
|
||||
throw new Error(`Variant option2 '${v.option2}' is not found in options[1].values [${validValues.join(', ')}]`);
|
||||
}
|
||||
}
|
||||
if (v.option3 && options[2]) {
|
||||
const validValues = getPrimaryValues(options[2].values);
|
||||
if (!validValues.includes(v.option3)) {
|
||||
throw new Error(`Variant option3 '${v.option3}' is not found in options[2].values [${validValues.join(', ')}]`);
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
.get("/brands", async () => {
|
||||
return await prisma.productBrand.findMany({
|
||||
orderBy: { name: "asc" },
|
||||
@@ -68,6 +103,21 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
category: { include: { translations: true } },
|
||||
brand: true,
|
||||
translations: true,
|
||||
attributes: {
|
||||
include: {
|
||||
translations: true,
|
||||
attributeDefinition: {
|
||||
include: {
|
||||
category: true,
|
||||
translations: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
orderBy: [
|
||||
{ attributeDefinition: { sortOrder: "asc" } },
|
||||
{ id: "asc" },
|
||||
],
|
||||
},
|
||||
variants: {
|
||||
include: {
|
||||
bomItems: { include: { rawMaterial: true } }
|
||||
@@ -82,27 +132,35 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
prisma.product.count({ where }),
|
||||
]);
|
||||
// Map translations
|
||||
const mappedProducts = products.map(p => {
|
||||
const mappedProducts = products.map((p) => {
|
||||
if (lang === 'all') {
|
||||
const nameObj = {};
|
||||
const descObj = {};
|
||||
const detailsObj = {};
|
||||
p.translations.forEach(t => {
|
||||
p.translations.forEach((t) => {
|
||||
nameObj[t.langCode] = t.name;
|
||||
descObj[t.langCode] = t.description;
|
||||
detailsObj[t.langCode] = t.details;
|
||||
});
|
||||
return { ...p, name: nameObj, description: descObj, details: detailsObj, category: { ...p.category, name: p.category.name } }; // Actually for 'all', keep as is, but wait, category name needs resolving if we want it? Let's just resolve it simply below.
|
||||
return {
|
||||
...p,
|
||||
name: nameObj,
|
||||
description: descObj,
|
||||
details: detailsObj,
|
||||
category: { ...p.category, name: p.category.name },
|
||||
attributes: p.attributes.map((attribute) => localizeProductAttribute(attribute, lang)),
|
||||
};
|
||||
}
|
||||
else {
|
||||
const trans = p.translations.find(t => t.langCode === lang) || p.translations.find(t => t.langCode === 'th') || p.translations[0];
|
||||
const trans = p.translations.find((t) => t.langCode === lang) || p.translations.find((t) => t.langCode === 'th') || p.translations[0];
|
||||
const catTrans = p.category.translations?.find((t) => t.langCode === lang) || p.category.translations?.find((t) => t.langCode === 'th') || p.category.translations?.[0];
|
||||
return {
|
||||
...p,
|
||||
name: trans?.name || p.name || '',
|
||||
description: trans?.description || p.description,
|
||||
details: trans?.details || p.details,
|
||||
category: { ...p.category, name: catTrans?.name || p.category.name }
|
||||
category: { ...p.category, name: catTrans?.name || p.category.name },
|
||||
attributes: p.attributes.map((attribute) => localizeProductAttribute(attribute, lang)),
|
||||
};
|
||||
}
|
||||
});
|
||||
@@ -132,6 +190,21 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
category: { include: { translations: true } },
|
||||
brand: true,
|
||||
translations: true,
|
||||
attributes: {
|
||||
include: {
|
||||
translations: true,
|
||||
attributeDefinition: {
|
||||
include: {
|
||||
category: true,
|
||||
translations: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
orderBy: [
|
||||
{ attributeDefinition: { sortOrder: "asc" } },
|
||||
{ id: "asc" },
|
||||
],
|
||||
},
|
||||
variants: {
|
||||
include: {
|
||||
bomItems: { include: { rawMaterial: true } }
|
||||
@@ -147,31 +220,47 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
const nameObj = {};
|
||||
const descObj = {};
|
||||
const detailsObj = {};
|
||||
product.translations.forEach(t => {
|
||||
product.translations.forEach((t) => {
|
||||
nameObj[t.langCode] = t.name;
|
||||
descObj[t.langCode] = t.description;
|
||||
detailsObj[t.langCode] = t.details;
|
||||
});
|
||||
return { ...product, name: nameObj, description: descObj, details: detailsObj };
|
||||
return {
|
||||
...product,
|
||||
name: nameObj,
|
||||
description: descObj,
|
||||
details: detailsObj,
|
||||
attributes: product.attributes.map((attribute) => localizeProductAttribute(attribute, lang)),
|
||||
};
|
||||
}
|
||||
else {
|
||||
const trans = product.translations.find(t => t.langCode === lang) || product.translations.find(t => t.langCode === 'th') || product.translations[0];
|
||||
const trans = product.translations.find((t) => t.langCode === lang) || product.translations.find((t) => t.langCode === 'th') || product.translations[0];
|
||||
const catTrans = product.category.translations?.find((t) => t.langCode === lang) || product.category.translations?.find((t) => t.langCode === 'th') || product.category.translations?.[0];
|
||||
return {
|
||||
...product,
|
||||
name: trans?.name || product.name || '',
|
||||
description: trans?.description || product.description,
|
||||
details: trans?.details || product.details,
|
||||
category: { ...product.category, name: catTrans?.name || product.category.name }
|
||||
category: { ...product.category, name: catTrans?.name || product.category.name },
|
||||
attributes: product.attributes.map((attribute) => localizeProductAttribute(attribute, lang)),
|
||||
};
|
||||
}
|
||||
})
|
||||
.put("/:id", async ({ params, body, status }) => {
|
||||
.put("/:id", async ({ params, body, status, validateVariants }) => {
|
||||
const id = parseInt(params.id);
|
||||
if (isNaN(id))
|
||||
return status(400, { message: "Invalid product ID" });
|
||||
const { categoryId, description, details, variants, images } = body;
|
||||
let options = body.options;
|
||||
try {
|
||||
if (variants && Array.isArray(variants)) {
|
||||
// If options is not passed but variants are, we might need to fetch existing options
|
||||
if (options === undefined) {
|
||||
const existingProduct = await prisma.product.findUnique({ where: { id } });
|
||||
options = existingProduct?.options || [];
|
||||
}
|
||||
validateVariants(options, variants);
|
||||
}
|
||||
const updatedProduct = await prisma.$transaction(async (tx) => {
|
||||
// 1. Update basic product info
|
||||
const updateData = {};
|
||||
@@ -184,45 +273,97 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
data: updateData,
|
||||
});
|
||||
// 2. Sync Variants
|
||||
await tx.productVariant.deleteMany({
|
||||
where: { productId: id },
|
||||
});
|
||||
if (variants && variants.length > 0) {
|
||||
for (const v of variants) {
|
||||
await tx.productVariant.create({
|
||||
data: {
|
||||
productId: id,
|
||||
sku: v.sku || null,
|
||||
barcode: v.barcode || null,
|
||||
stock: v.stock || 0,
|
||||
option1: v.option1 || "",
|
||||
option2: v.option2 || "",
|
||||
option3: v.option3 || "",
|
||||
price: v.price || 0,
|
||||
bomItems: v.bomItems && v.bomItems.length > 0 ? {
|
||||
create: v.bomItems.map((b) => ({
|
||||
rawMaterialId: b.rawMaterialId,
|
||||
quantity: b.quantity,
|
||||
}))
|
||||
} : undefined
|
||||
}
|
||||
if (variants && Array.isArray(variants)) {
|
||||
const existingVariants = await tx.productVariant.findMany({ where: { productId: id } });
|
||||
const incomingIds = variants.map((v) => v.id).filter(Boolean);
|
||||
// Delete variants not in incoming payload
|
||||
const variantsToDelete = existingVariants.filter(ev => !incomingIds.includes(ev.id));
|
||||
if (variantsToDelete.length > 0) {
|
||||
await tx.productVariant.deleteMany({
|
||||
where: { id: { in: variantsToDelete.map(ev => ev.id) } }
|
||||
});
|
||||
}
|
||||
for (const v of variants) {
|
||||
if (v.id) {
|
||||
// Check if it really belongs to this product
|
||||
const exists = existingVariants.find(ev => ev.id === v.id);
|
||||
if (exists) {
|
||||
await tx.productVariant.update({
|
||||
where: { id: v.id },
|
||||
data: {
|
||||
sku: v.sku || null,
|
||||
barcode: v.barcode || null,
|
||||
stock: v.stock || 0,
|
||||
option1: v.option1 || "",
|
||||
option2: v.option2 || "",
|
||||
option3: v.option3 || "",
|
||||
price: v.price || 0,
|
||||
bomItems: v.bomItems ? {
|
||||
deleteMany: {},
|
||||
create: v.bomItems.map((b) => ({
|
||||
rawMaterialId: b.rawMaterialId,
|
||||
quantity: b.quantity,
|
||||
}))
|
||||
} : undefined
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
await tx.productVariant.create({
|
||||
data: {
|
||||
productId: id,
|
||||
sku: v.sku || null,
|
||||
barcode: v.barcode || null,
|
||||
stock: v.stock || 0,
|
||||
option1: v.option1 || "",
|
||||
option2: v.option2 || "",
|
||||
option3: v.option3 || "",
|
||||
price: v.price || 0,
|
||||
bomItems: v.bomItems && v.bomItems.length > 0 ? {
|
||||
create: v.bomItems.map((b) => ({
|
||||
rawMaterialId: b.rawMaterialId,
|
||||
quantity: b.quantity,
|
||||
}))
|
||||
} : undefined
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
// 3. Sync Images
|
||||
await tx.productImage.deleteMany({
|
||||
where: { productId: id },
|
||||
});
|
||||
if (images && images.length > 0) {
|
||||
for (const [idx, img] of images.entries()) {
|
||||
await tx.productImage.create({
|
||||
data: {
|
||||
productId: id,
|
||||
url: img.url,
|
||||
order: img.order ?? (typeof img.order === 'number' ? img.order : idx),
|
||||
}
|
||||
if (images && Array.isArray(images)) {
|
||||
const existingImages = await tx.productImage.findMany({ where: { productId: id } });
|
||||
const incomingImgIds = images.map((img) => img.id).filter(Boolean);
|
||||
const imagesToDelete = existingImages.filter(ei => !incomingImgIds.includes(ei.id));
|
||||
if (imagesToDelete.length > 0) {
|
||||
await tx.productImage.deleteMany({
|
||||
where: { id: { in: imagesToDelete.map(ei => ei.id) } }
|
||||
});
|
||||
}
|
||||
for (const [idx, img] of images.entries()) {
|
||||
if (img.id) {
|
||||
const exists = existingImages.find(ei => ei.id === img.id);
|
||||
if (exists) {
|
||||
await tx.productImage.update({
|
||||
where: { id: img.id },
|
||||
data: {
|
||||
url: img.url,
|
||||
order: img.order ?? (typeof img.order === 'number' ? img.order : idx),
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
await tx.productImage.create({
|
||||
data: {
|
||||
productId: id,
|
||||
url: img.url,
|
||||
order: img.order ?? (typeof img.order === 'number' ? img.order : idx),
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
return prod;
|
||||
});
|
||||
@@ -230,7 +371,7 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
}
|
||||
catch (err) {
|
||||
console.error("Update product error:", err);
|
||||
return status(500, { success: false, message: "Failed to update product" });
|
||||
return status(500, { success: false, message: err?.message || "Failed to update product" });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
@@ -264,37 +405,70 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
}
|
||||
catch (err) {
|
||||
console.error("Add product image error:", err);
|
||||
return status(500, { success: false, message: "Failed to add product image" });
|
||||
return status(500, { success: false, message: err?.message || "Failed to add product image" });
|
||||
}
|
||||
}, {
|
||||
body: t.Object({
|
||||
url: t.String()
|
||||
})
|
||||
})
|
||||
.post("/", async ({ body, status }) => {
|
||||
.post("/", async ({ body, status, validateVariants }) => {
|
||||
const payload = body;
|
||||
try {
|
||||
if (payload.variants && Array.isArray(payload.variants)) {
|
||||
validateVariants(payload.options || [], payload.variants);
|
||||
}
|
||||
const product = await prisma.$transaction(async (tx) => {
|
||||
let categoryId = payload.categoryId;
|
||||
if (!categoryId && payload.categoryName) {
|
||||
let cat = await tx.category.findUnique({ where: { name: payload.categoryName } });
|
||||
if (!cat) {
|
||||
cat = await tx.category.create({ data: { name: payload.categoryName } });
|
||||
}
|
||||
categoryId = cat.id;
|
||||
}
|
||||
let brandId = payload.brandId;
|
||||
if (!brandId && payload.brandName) {
|
||||
let brand = await tx.productBrand.findUnique({ where: { name: payload.brandName } });
|
||||
if (!brand) {
|
||||
brand = await tx.productBrand.create({ data: { name: payload.brandName } });
|
||||
}
|
||||
brandId = brand.id;
|
||||
}
|
||||
const prod = await tx.product.create({
|
||||
data: {
|
||||
categoryId: payload.categoryId,
|
||||
brandId: payload.brandId,
|
||||
categoryId: categoryId,
|
||||
brandId: brandId,
|
||||
name: payload.name || "New Product",
|
||||
price: payload.price || 0,
|
||||
description: payload.description || "",
|
||||
details: payload.details || "",
|
||||
options: payload.options || [],
|
||||
}
|
||||
});
|
||||
await tx.productTranslation.create({
|
||||
data: {
|
||||
productId: prod.id,
|
||||
langCode: 'th',
|
||||
name: payload.name || "New Product",
|
||||
description: payload.description || "",
|
||||
details: payload.details || "",
|
||||
if (payload.translations && typeof payload.translations === 'object') {
|
||||
for (const [lang, trans] of Object.entries(payload.translations)) {
|
||||
await tx.productTranslation.create({
|
||||
data: {
|
||||
productId: prod.id,
|
||||
langCode: lang,
|
||||
name: trans.name || payload.name || "New Product",
|
||||
description: trans.description || payload.description || "",
|
||||
details: trans.details || payload.details || "",
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
await tx.productTranslation.create({
|
||||
data: {
|
||||
productId: prod.id,
|
||||
langCode: 'th',
|
||||
name: payload.name || "New Product",
|
||||
description: payload.description || "",
|
||||
details: payload.details || "",
|
||||
}
|
||||
});
|
||||
}
|
||||
if (payload.variants && payload.variants.length > 0) {
|
||||
for (const v of payload.variants) {
|
||||
await tx.productVariant.create({
|
||||
@@ -328,7 +502,7 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
}
|
||||
catch (err) {
|
||||
console.error("Create product error:", err);
|
||||
return status(500, { success: false, message: "Failed to create product" });
|
||||
return status(500, { success: false, message: err?.message || "Failed to create product" });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
@@ -336,6 +510,112 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
summary: "Create Product",
|
||||
tags: ["products"],
|
||||
},
|
||||
})
|
||||
.post("/bulk", async ({ body, status, validateVariants }) => {
|
||||
const payloadArray = body;
|
||||
if (!Array.isArray(payloadArray)) {
|
||||
return status(400, { success: false, message: "Payload must be an array of products" });
|
||||
}
|
||||
try {
|
||||
const createdProducts = await prisma.$transaction(async (tx) => {
|
||||
const results = [];
|
||||
for (const payload of payloadArray) {
|
||||
if (payload.variants && Array.isArray(payload.variants)) {
|
||||
validateVariants(payload.options || [], payload.variants);
|
||||
}
|
||||
let categoryId = payload.categoryId;
|
||||
if (!categoryId && payload.categoryName) {
|
||||
let cat = await tx.category.findUnique({ where: { name: payload.categoryName } });
|
||||
if (!cat) {
|
||||
cat = await tx.category.create({ data: { name: payload.categoryName } });
|
||||
}
|
||||
categoryId = cat.id;
|
||||
}
|
||||
let brandId = payload.brandId;
|
||||
if (!brandId && payload.brandName) {
|
||||
let brand = await tx.productBrand.findUnique({ where: { name: payload.brandName } });
|
||||
if (!brand) {
|
||||
brand = await tx.productBrand.create({ data: { name: payload.brandName } });
|
||||
}
|
||||
brandId = brand.id;
|
||||
}
|
||||
const prod = await tx.product.create({
|
||||
data: {
|
||||
categoryId: categoryId,
|
||||
brandId: brandId,
|
||||
name: payload.name || "New Product",
|
||||
description: payload.description || "",
|
||||
details: payload.details || "",
|
||||
options: payload.options || [],
|
||||
}
|
||||
});
|
||||
if (payload.translations && typeof payload.translations === 'object') {
|
||||
for (const [lang, trans] of Object.entries(payload.translations)) {
|
||||
await tx.productTranslation.create({
|
||||
data: {
|
||||
productId: prod.id,
|
||||
langCode: lang,
|
||||
name: trans.name || payload.name || "New Product",
|
||||
description: trans.description || payload.description || "",
|
||||
details: trans.details || payload.details || "",
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
await tx.productTranslation.create({
|
||||
data: {
|
||||
productId: prod.id,
|
||||
langCode: 'th',
|
||||
name: payload.name || "New Product",
|
||||
description: payload.description || "",
|
||||
details: payload.details || "",
|
||||
}
|
||||
});
|
||||
}
|
||||
if (payload.variants && payload.variants.length > 0) {
|
||||
for (const v of payload.variants) {
|
||||
await tx.productVariant.create({
|
||||
data: {
|
||||
productId: prod.id,
|
||||
sku: v.sku || null,
|
||||
barcode: v.barcode || null,
|
||||
stock: v.stock || 0,
|
||||
option1: v.option1 || "",
|
||||
option2: v.option2 || "",
|
||||
option3: v.option3 || "",
|
||||
price: v.price || 0,
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (payload.images && payload.images.length > 0) {
|
||||
for (const [idx, img] of payload.images.entries()) {
|
||||
await tx.productImage.create({
|
||||
data: {
|
||||
productId: prod.id,
|
||||
url: img.url,
|
||||
order: img.order ?? idx,
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
results.push(prod);
|
||||
}
|
||||
return results;
|
||||
});
|
||||
return { success: true, products: createdProducts };
|
||||
}
|
||||
catch (err) {
|
||||
console.error("Bulk create products error:", err);
|
||||
return status(500, { success: false, message: err?.message || "Failed to bulk create products" });
|
||||
}
|
||||
}, {
|
||||
body: t.Array(t.Any()),
|
||||
detail: {
|
||||
summary: "Bulk Create Products",
|
||||
tags: ["products"],
|
||||
},
|
||||
})
|
||||
.patch("/:id", async ({ params, body, status }) => {
|
||||
const id = parseInt(params.id);
|
||||
@@ -348,8 +628,6 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
prodData.categoryId = payload.categoryId;
|
||||
if (payload.brandId !== undefined)
|
||||
prodData.brandId = payload.brandId;
|
||||
if (payload.price !== undefined)
|
||||
prodData.price = payload.price;
|
||||
if (payload.options !== undefined)
|
||||
prodData.options = payload.options;
|
||||
const prod = await prisma.product.update({
|
||||
@@ -412,7 +690,7 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
}
|
||||
catch (err) {
|
||||
console.error("Patch product error:", err);
|
||||
return status(500, { success: false, message: "Failed to patch product" });
|
||||
return status(500, { success: false, message: err?.message || "Failed to patch product" });
|
||||
}
|
||||
}, {
|
||||
body: t.Any(),
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"products.js","sourceRoot":"","sources":["products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,MAAM,MAAM,eAAe,CAAC;AAEnC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;KAC7D,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IACzB,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC;QACxC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACxB,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KAChC,CAAC,CAAC;AACL,CAAC,CAAC;KACD,KAAK,CAAC,0BAA0B,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;IACpE,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAEnE,MAAM,OAAO,GAAG,IAAW,CAAC;IAC5B,MAAM,OAAO,GAAU,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7G,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,UAAU,CAAC;YAC/D,KAAK,EAAE,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;SAC7D,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC;gBAC1D,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE;gBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE;aACf,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC;gBAC1D,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;aAC5C,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;QACnD,KAAK,EAAE,EAAE,EAAE,EAAE;QACb,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KAChC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAClE,CAAC,CAAC;KACD,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;IAEhC,oBAAoB;IACpB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAEhC,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC;QACjC,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,IAAI;YACZ,EAAE,EAAE;gBACF,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAsB,EAAE,EAAE,EAAE,EAAE;gBACxF,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAsB,EAAE,EAAE,EAAE;gBACvE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAsB,EAAE,EAAE,EAAE;aAC3E;SACF,CAAC;KACM,CAAC;IAEX,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtB,KAAK;YACL,OAAO,EAAE;gBACP,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;gBAC7C,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE;oBACR,OAAO,EAAE;wBACP,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;qBAC7C;oBACD,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;iBAC1B;gBACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;aACtC;YACD,IAAI;YACJ,IAAI,EAAE,KAAK;SACZ,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;KAChC,CAAC,CAAC;IAEH,mBAAmB;IACnB,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACtC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,OAAO,GAAQ,EAAE,CAAC;YACxB,MAAM,OAAO,GAAQ,EAAE,CAAC;YACxB,MAAM,UAAU,GAAQ,EAAE,CAAC;YAC3B,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACxB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC7B,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;gBACpC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,6HAA6H;QAC9P,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClI,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;YAClL,OAAO;gBACL,GAAG,CAAC;gBACJ,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE;gBACjC,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC,WAAW;gBAChD,OAAO,EAAE,KAAK,EAAE,OALine truncated
|
||||
{"version":3,"file":"products.js","sourceRoot":"","sources":["products.ts"],"names":[],"mappings":"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 truncated
|
||||
@@ -465,7 +465,6 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
categoryId: categoryId,
|
||||
brandId: brandId,
|
||||
name: payload.name || "New Product",
|
||||
price: payload.price || 0,
|
||||
description: payload.description || "",
|
||||
details: payload.details || "",
|
||||
options: payload.options || [],
|
||||
@@ -582,7 +581,6 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
categoryId: categoryId,
|
||||
brandId: brandId,
|
||||
name: payload.name || "New Product",
|
||||
price: payload.price || 0,
|
||||
description: payload.description || "",
|
||||
details: payload.details || "",
|
||||
options: payload.options || [],
|
||||
@@ -671,7 +669,6 @@ export const productsRoute = new Elysia({ prefix: "/products" })
|
||||
const prodData: any = {};
|
||||
if (payload.categoryId !== undefined) prodData.categoryId = payload.categoryId;
|
||||
if (payload.brandId !== undefined) prodData.brandId = payload.brandId;
|
||||
if (payload.price !== undefined) prodData.price = payload.price;
|
||||
if (payload.options !== undefined) prodData.options = payload.options;
|
||||
|
||||
const prod = await prisma.product.update({
|
||||
|
||||
+2
-2
@@ -54,8 +54,8 @@ export declare const promotionsRoute: Elysia<"/promotions", {
|
||||
type: string;
|
||||
isActive: boolean;
|
||||
value: number;
|
||||
minPurchase: number;
|
||||
level: number;
|
||||
minPurchase: number;
|
||||
};
|
||||
params: {};
|
||||
query: unknown;
|
||||
@@ -78,8 +78,8 @@ export declare const promotionsRoute: Elysia<"/promotions", {
|
||||
type: string;
|
||||
isActive: boolean;
|
||||
value: number;
|
||||
minPurchase: number;
|
||||
level: number;
|
||||
minPurchase: number;
|
||||
};
|
||||
params: {
|
||||
id: string;
|
||||
|
||||
Reference in new issue
Block a user