feat: manufacturers route — list, get, create
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -18,6 +18,7 @@ import { communityPriceRoutes } from "./routes/community-prices.ts";
|
||||
import { discoveryRoutes } from "./routes/discovery.ts";
|
||||
import { exchangeRateRoutes } from "./routes/exchange-rates.ts";
|
||||
import { globalItemRoutes } from "./routes/global-items.ts";
|
||||
import { manufacturerRoutes } from "./routes/manufacturers.ts";
|
||||
import { imageRoutes } from "./routes/images.ts";
|
||||
import { itemRoutes } from "./routes/items.ts";
|
||||
import { marketPriceRoutes } from "./routes/market-prices.ts";
|
||||
@@ -290,6 +291,7 @@ app.route("/api/users", profileRoutes);
|
||||
app.route("/api/setups", setupRoutes);
|
||||
app.route("/api/discovery", discoveryRoutes);
|
||||
app.route("/api/global-items", globalItemRoutes);
|
||||
app.route("/api/manufacturers", manufacturerRoutes);
|
||||
app.route("/api/onboarding", onboardingRoutes);
|
||||
app.route("/api/tags", tagRoutes);
|
||||
app.route("/api/exchange-rates", exchangeRateRoutes);
|
||||
|
||||
38
src/server/routes/manufacturers.ts
Normal file
38
src/server/routes/manufacturers.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { zValidator } from "@hono/zod-validator";
|
||||
import { Hono } from "hono";
|
||||
import { createManufacturerSchema } from "../../shared/schemas.ts";
|
||||
import {
|
||||
createManufacturer,
|
||||
getManufacturerBySlug,
|
||||
listManufacturers,
|
||||
} from "../services/manufacturer.service.ts";
|
||||
|
||||
type Env = { Variables: { db?: any } };
|
||||
|
||||
const app = new Hono<Env>();
|
||||
|
||||
app.get("/", async (c) => {
|
||||
const db = c.get("db");
|
||||
return c.json(await listManufacturers(db));
|
||||
});
|
||||
|
||||
app.get("/:slug", async (c) => {
|
||||
const db = c.get("db");
|
||||
const slug = c.req.param("slug");
|
||||
const manufacturer = await getManufacturerBySlug(db, slug);
|
||||
if (!manufacturer) return c.json({ error: "Manufacturer not found" }, 404);
|
||||
return c.json(manufacturer);
|
||||
});
|
||||
|
||||
app.post("/", zValidator("json", createManufacturerSchema), async (c) => {
|
||||
const db = c.get("db");
|
||||
const data = c.req.valid("json");
|
||||
try {
|
||||
const manufacturer = await createManufacturer(db, data);
|
||||
return c.json(manufacturer, 201);
|
||||
} catch {
|
||||
return c.json({ error: "Manufacturer with this name or slug already exists" }, 409);
|
||||
}
|
||||
});
|
||||
|
||||
export { app as manufacturerRoutes };
|
||||
@@ -146,6 +146,18 @@ export const bulkUpsertGlobalItemsSchema = z.object({
|
||||
items: z.array(upsertGlobalItemSchema).min(1).max(100),
|
||||
});
|
||||
|
||||
export const createManufacturerSchema = z.object({
|
||||
name: z.string().min(1).max(200),
|
||||
slug: z
|
||||
.string()
|
||||
.min(1)
|
||||
.max(100)
|
||||
.regex(/^[a-z0-9-]+$/, "Slug must be lowercase alphanumeric with hyphens"),
|
||||
website: z.string().url(),
|
||||
tier: z.number().int().min(1).max(3).optional(),
|
||||
country: z.string().length(2).optional(),
|
||||
});
|
||||
|
||||
// Profile schemas
|
||||
export const updateProfileSchema = z.object({
|
||||
displayName: z.string().max(100).optional(),
|
||||
|
||||
Reference in New Issue
Block a user