Initial commit for homaroma

This commit is contained in:
Your Name committed 2026-06-03 08:39:12 +07:00
commit f2179cfe57
269 files changed
+22635

No files matched your search

+93
View File
@@ -0,0 +1,93 @@
import { Elysia } from "elysia";
import { cors } from "@elysiajs/cors";
import { swagger } from "@elysiajs/swagger";
import { jwt } from "@elysiajs/jwt";
import { staticPlugin } from "@elysiajs/static";
import { categoriesRoute } from "./routes/categories";
import { productsRoute } from "./routes/products";
import { authRoute } from "./routes/auth";
import { uploadRoute } from "./routes/upload";
import { heroRoute } from "./routes/hero";
import { ordersRoute } from "./routes/orders";
import { settingsRoute } from "./routes/settings";
import { articlesRoute } from "./routes/articles";
import { tiktokRoute } from "./routes/tiktok";
import { rawMaterialsRoute } from "./routes/raw-materials";
import { shopeeRoute } from "./routes/shopee";
import { tiktokOrderRoute } from "./routes/tiktokOrder";
import { lazadaOrderRoute } from "./routes/lazadaOrder";
import { customersRoute } from "./routes/customers";
import { couponsRoute } from "./routes/coupons";
const PORT = process.env.PORT ? parseInt(process.env.PORT) : 3000;
const CORS_ORIGIN = process.env.CORS_ORIGIN || "http://localhost:5173";
const JWT_SECRET = process.env.JWT_SECRET || "homaroma_secret_2026_scent";
const app = new Elysia()
.use(
cors({
origin: [
...CORS_ORIGIN.split(",").map((o) => o.trim()),
"https://admin.homaroma.shop",
"https://line.homaroma.shop", // LIFF
"https://homaroma.shop", // Main Website
"http://localhost:5174", // Admin
"http://localhost:4173",
"http://localhost:3001", // SSR Next.js
],
methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
credentials: true,
})
)
.use(
jwt({
name: "jwt",
secret: JWT_SECRET,
exp: "24h",
})
)
.use(
swagger({
documentation: {
info: {
title: "HomAroma API",
version: "1.0.0",
description: "API for HomAroma & Essential Oil Products",
},
tags: [
{ name: "categories", description: "Product categories" },
{ name: "products", description: "Products and variants" },
{ name: "auth", description: "Authentication for Admin" },
],
},
})
)
.use(staticPlugin({
assets: "public",
prefix: "", // use empty string for root
}))
.get("/", () => ({
name: "HomAroma API",
version: "1.0.0",
status: "running",
docs: `/swagger`,
}))
// Explicit route for uploads to guarantee it works even if staticPlugin fails
.get("/uploads/:filename", ({ params: { filename }, set }) => {
const file = Bun.file(`public/uploads/${filename}`);
if (file.size === 0) {
set.status = 404;
return "File not found";
}
return file;
})
.group("/api", (app) =>
app.use(authRoute).use(categoriesRoute).use(productsRoute).use(uploadRoute).use(heroRoute).use(ordersRoute).use(settingsRoute).use(articlesRoute).use(tiktokRoute).use(rawMaterialsRoute).use(shopeeRoute).use(tiktokOrderRoute).use(lazadaOrderRoute).use(customersRoute).use(couponsRoute)
)
.listen(PORT);
console.log(
`🌿 HomAroma API is running at http://${app.server?.hostname}:${app.server?.port}`
);
console.log(
`📖 Swagger docs: http://${app.server?.hostname}:${app.server?.port}/swagger`
);