diff --git a/src/server/services/csv.service.ts b/src/server/services/csv.service.ts index d378253..845a3f2 100644 --- a/src/server/services/csv.service.ts +++ b/src/server/services/csv.service.ts @@ -1,6 +1,6 @@ import { eq, sql } from "drizzle-orm"; import type { db as prodDb } from "../../db/index.ts"; -import { categories, globalItems, items } from "../../db/schema.ts"; +import { categories, globalItems, items, manufacturers } from "../../db/schema.ts"; import { getOrCreateUncategorized } from "./category.service.ts"; type Db = typeof prodDb; @@ -90,7 +90,7 @@ export async function exportItemsCsv(db: Db, userId: number): Promise { .select({ name: sql`COALESCE( CASE WHEN ${items.globalItemId} IS NOT NULL - THEN ${globalItems.brand} || ' ' || ${globalItems.model} + THEN ${manufacturers.name} || ' ' || ${globalItems.model} ELSE ${items.name} END, ${items.name} @@ -111,6 +111,7 @@ export async function exportItemsCsv(db: Db, userId: number): Promise { .from(items) .innerJoin(categories, eq(items.categoryId, categories.id)) .leftJoin(globalItems, eq(items.globalItemId, globalItems.id)) + .leftJoin(manufacturers, eq(globalItems.manufacturerId, manufacturers.id)) .where(eq(items.userId, userId)); const header = diff --git a/src/server/services/discovery.service.ts b/src/server/services/discovery.service.ts index 93f9c00..35d9a14 100644 --- a/src/server/services/discovery.service.ts +++ b/src/server/services/discovery.service.ts @@ -4,6 +4,7 @@ import { globalItems, globalItemTags, items, + manufacturers, setupItems, setups, tags, @@ -86,14 +87,15 @@ export async function getRecentGlobalItems( db: Db = prodDb, limit = 8, cursor?: string, -): Promise> { +): Promise> { const conditions = cursor ? [lt(globalItems.createdAt, new Date(cursor))] : []; const rows = await db - .select() + .select({ ...globalItems, brand: manufacturers.name }) .from(globalItems) + .innerJoin(manufacturers, eq(globalItems.manufacturerId, manufacturers.id)) .where(conditions.length ? and(...conditions) : undefined) .orderBy(desc(globalItems.createdAt)) .limit(limit + 1); @@ -160,7 +162,7 @@ export async function getPopularItemsByTags( const rows = await db .select({ id: globalItems.id, - brand: globalItems.brand, + brand: manufacturers.name, model: globalItems.model, category: globalItems.category, weightGrams: globalItems.weightGrams, @@ -170,6 +172,7 @@ export async function getPopularItemsByTags( ownerCount: sql`CAST(COUNT(DISTINCT ${items.id}) AS INT)`, }) .from(globalItems) + .innerJoin(manufacturers, eq(globalItems.manufacturerId, manufacturers.id)) .innerJoin(globalItemTags, eq(globalItemTags.globalItemId, globalItems.id)) .innerJoin(tags, eq(tags.id, globalItemTags.tagId)) .leftJoin(items, eq(items.globalItemId, globalItems.id)) diff --git a/src/server/services/profile.service.ts b/src/server/services/profile.service.ts index ab10d1e..2b43c4e 100644 --- a/src/server/services/profile.service.ts +++ b/src/server/services/profile.service.ts @@ -4,6 +4,7 @@ import { categories, globalItems, items, + manufacturers, setupItems, setups, users, @@ -97,7 +98,7 @@ export async function getPublicSetupWithItems(db: Db, setupId: number) { id: items.id, name: sql`COALESCE( CASE WHEN ${items.globalItemId} IS NOT NULL - THEN ${globalItems.brand} || ' ' || ${globalItems.model} + THEN ${manufacturers.name} || ' ' || ${globalItems.model} ELSE ${items.name} END, ${items.name} @@ -129,6 +130,7 @@ export async function getPublicSetupWithItems(db: Db, setupId: number) { .innerJoin(items, eq(setupItems.itemId, items.id)) .innerJoin(categories, eq(items.categoryId, categories.id)) .leftJoin(globalItems, eq(items.globalItemId, globalItems.id)) + .leftJoin(manufacturers, eq(globalItems.manufacturerId, manufacturers.id)) .where(eq(setupItems.setupId, setupId)); return { ...setup, items: itemList }; diff --git a/src/server/services/setup.service.ts b/src/server/services/setup.service.ts index f5210ae..005eb1c 100644 --- a/src/server/services/setup.service.ts +++ b/src/server/services/setup.service.ts @@ -4,6 +4,7 @@ import { categories, globalItems, items, + manufacturers, setupItems, setups, } from "../../db/schema.ts"; @@ -79,7 +80,7 @@ export async function getSetupWithItems( id: items.id, name: sql`COALESCE( CASE WHEN ${items.globalItemId} IS NOT NULL - THEN ${globalItems.brand} || ' ' || ${globalItems.model} + THEN ${manufacturers.name} || ' ' || ${globalItems.model} ELSE ${items.name} END, ${items.name} @@ -113,6 +114,7 @@ export async function getSetupWithItems( .innerJoin(items, eq(setupItems.itemId, items.id)) .innerJoin(categories, eq(items.categoryId, categories.id)) .leftJoin(globalItems, eq(items.globalItemId, globalItems.id)) + .leftJoin(manufacturers, eq(globalItems.manufacturerId, manufacturers.id)) .where(eq(setupItems.setupId, setupId)); return { ...setup, items: itemList }; @@ -131,7 +133,7 @@ export async function getSetupWithItemsById(db: Db, setupId: number) { id: items.id, name: sql`COALESCE( CASE WHEN ${items.globalItemId} IS NOT NULL - THEN ${globalItems.brand} || ' ' || ${globalItems.model} + THEN ${manufacturers.name} || ' ' || ${globalItems.model} ELSE ${items.name} END, ${items.name} @@ -165,6 +167,7 @@ export async function getSetupWithItemsById(db: Db, setupId: number) { .innerJoin(items, eq(setupItems.itemId, items.id)) .innerJoin(categories, eq(items.categoryId, categories.id)) .leftJoin(globalItems, eq(items.globalItemId, globalItems.id)) + .leftJoin(manufacturers, eq(globalItems.manufacturerId, manufacturers.id)) .where(eq(setupItems.setupId, setupId)); return { ...setup, items: itemList }; @@ -185,14 +188,14 @@ export async function getSetupItemById( id: items.id, name: sql`COALESCE( CASE WHEN ${items.globalItemId} IS NOT NULL - THEN ${globalItems.brand} || ' ' || ${globalItems.model} + THEN ${manufacturers.name} || ' ' || ${globalItems.model} ELSE ${items.name} END, ${items.name} )`.as("name"), brand: sql< string | null - >`CASE WHEN ${items.globalItemId} IS NOT NULL THEN ${globalItems.brand} ELSE ${items.brand} END`.as( + >`CASE WHEN ${items.globalItemId} IS NOT NULL THEN ${manufacturers.name} ELSE ${items.brand} END`.as( "brand", ), weightGrams: sql`COALESCE( @@ -221,6 +224,7 @@ export async function getSetupItemById( .innerJoin(items, eq(setupItems.itemId, items.id)) .innerJoin(categories, eq(items.categoryId, categories.id)) .leftJoin(globalItems, eq(items.globalItemId, globalItems.id)) + .leftJoin(manufacturers, eq(globalItems.manufacturerId, manufacturers.id)) .where(and(eq(setupItems.setupId, setupId), eq(items.id, itemId))); return row ?? null; diff --git a/src/server/services/thread.service.ts b/src/server/services/thread.service.ts index 13f517c..c431d4e 100644 --- a/src/server/services/thread.service.ts +++ b/src/server/services/thread.service.ts @@ -4,6 +4,7 @@ import { categories, globalItems, items, + manufacturers, threadCandidates, threads, } from "../../db/schema.ts"; @@ -82,7 +83,7 @@ export async function getThreadWithCandidates( threadId: threadCandidates.threadId, name: sql`COALESCE( CASE WHEN ${threadCandidates.globalItemId} IS NOT NULL - THEN ${globalItems.brand} || ' ' || ${globalItems.model} + THEN ${manufacturers.name} || ' ' || ${globalItems.model} ELSE ${threadCandidates.name} END, ${threadCandidates.name} @@ -118,6 +119,7 @@ export async function getThreadWithCandidates( .from(threadCandidates) .innerJoin(categories, eq(threadCandidates.categoryId, categories.id)) .leftJoin(globalItems, eq(threadCandidates.globalItemId, globalItems.id)) + .leftJoin(manufacturers, eq(globalItems.manufacturerId, manufacturers.id)) .where(eq(threadCandidates.threadId, threadId)) .orderBy(asc(threadCandidates.sortOrder)); @@ -367,10 +369,11 @@ export async function resolveThread( if (candidate.globalItemId) { // Reference item — link to global, personal fields only const [gi] = await tx - .select() + .select({ name: manufacturers.name, model: globalItems.model }) .from(globalItems) + .innerJoin(manufacturers, eq(globalItems.manufacturerId, manufacturers.id)) .where(eq(globalItems.id, candidate.globalItemId)); - const fallbackName = gi ? `${gi.brand} ${gi.model}` : candidate.name; + const fallbackName = gi ? `${gi.name} ${gi.model}` : candidate.name; insertValues = { name: fallbackName, globalItemId: candidate.globalItemId,