feat: manufacturers route — list, get, create

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-18 16:16:27 +02:00
parent 8c1b19f07d
commit ec27df1d0f
3 changed files with 52 additions and 0 deletions

View File

@@ -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);

View 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 };

View File

@@ -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(),