feat: surface seller contact methods on public detail pages
Quality / test (push) Canceled after 0s

This commit is contained in:
2026-09-10 07:16:41 -04:00
parent 54a8d87293
commit e630a89e8d
11 changed files with 84 additions and 3 deletions
@@ -17,6 +17,8 @@ import {
marketValueOverrides,
marketValuations,
products,
sellers,
sellerSettings,
} from "../../../infrastructure/database/schema.js";
export function createListingRepository(db) {
@@ -220,7 +222,12 @@ export function createListingRepository(db) {
async findPublicById(listingId) {
const [result] = await db
.select({ listing: listings, condition: conditions })
.select({
listing: listings,
condition: conditions,
sellerDisplayName: sellers.displayName,
sellerSettings: sellerSettings.settings,
})
.from(listings)
.innerJoin(
inventoryItems,
@@ -228,6 +235,8 @@ export function createListingRepository(db) {
)
.innerJoin(products, eq(products.id, inventoryItems.productId))
.innerJoin(conditions, eq(conditions.id, inventoryItems.conditionId))
.innerJoin(sellers, eq(sellers.id, products.sellerId))
.leftJoin(sellerSettings, eq(sellerSettings.sellerId, sellers.id))
.where(
and(
eq(listings.id, listingId),
@@ -263,6 +272,9 @@ export function createListingRepository(db) {
marketValueMinor: override?.valueMinor ?? valuation?.valueMinor ?? null,
marketValueCurrency: override?.currency ?? valuation?.currency ?? null,
marketValueUpdatedAt: override?.createdAt ?? valuation?.calculatedAt ?? null,
sellerDisplayName: result.sellerDisplayName,
sellerContactEmail: result.sellerSettings?.general?.publicContactEmail ?? null,
sellerContactPhone: result.sellerSettings?.general?.publicContactPhone ?? null,
};
},
@@ -4,6 +4,8 @@ import {
inventoryItems,
listings,
products,
sellers,
sellerSettings,
} from '../../../infrastructure/database/schema.js';
export function createProductRepository(db) {
@@ -24,10 +26,16 @@ export function createProductRepository(db) {
async findPublicBySlug(slug) {
const [result] = await db
.select({ product: products })
.select({
product: products,
sellerDisplayName: sellers.displayName,
sellerSettings: sellerSettings.settings,
})
.from(products)
.innerJoin(inventoryItems, eq(inventoryItems.productId, products.id))
.innerJoin(listings, eq(listings.inventoryItemId, inventoryItems.id))
.innerJoin(sellers, eq(sellers.id, products.sellerId))
.leftJoin(sellerSettings, eq(sellerSettings.sellerId, sellers.id))
.where(and(
eq(products.slug, slug),
eq(inventoryItems.status, 'ACTIVE'),
@@ -35,7 +43,13 @@ export function createProductRepository(db) {
))
.limit(1);
return result?.product ?? null;
if (!result) return null;
return {
...result.product,
sellerDisplayName: result.sellerDisplayName,
sellerContactEmail: result.sellerSettings?.general?.publicContactEmail ?? null,
sellerContactPhone: result.sellerSettings?.general?.publicContactPhone ?? null,
};
},
async findBySellerIdAndSlug(sellerId, slug) {
@@ -36,6 +36,9 @@ function createTestApp() {
conditionId: 'condition-1',
askingPriceMinor: 2499,
status: 'PENDING',
sellerDisplayName: 'Pika Collectibles',
sellerContactEmail: 'hello@pika.example',
sellerContactPhone: null,
};
},
},
@@ -72,6 +75,8 @@ test('returns a public listing detail or a not-found response', async (testConte
assert.equal(detailResponse.statusCode, 200);
assert.equal('inventoryItemId' in detailResponse.json().data, false);
assert.equal(detailResponse.json().data.sellerDisplayName, 'Pika Collectibles');
assert.equal(detailResponse.json().data.sellerContactEmail, 'hello@pika.example');
assert.equal(missingResponse.statusCode, 404);
assert.equal(missingResponse.json().error.code, 'LISTING_NOT_FOUND');
});
@@ -21,6 +21,9 @@ function createTestApp() {
name: 'Pikachu Plush',
slug,
description: 'A friendly plush.',
sellerDisplayName: 'Pika Collectibles',
sellerContactEmail: 'hello@pika.example',
sellerContactPhone: null,
createdAt: new Date('2026-09-07T00:00:00.000Z'),
updatedAt: new Date('2026-09-07T00:00:00.000Z'),
};
@@ -51,6 +54,9 @@ test('returns a public product without private seller identity', async (testCont
eventName: null,
releaseYear: null,
tags: [],
sellerDisplayName: 'Pika Collectibles',
sellerContactEmail: 'hello@pika.example',
sellerContactPhone: null,
createdAt: '2026-09-07T00:00:00.000Z',
updatedAt: '2026-09-07T00:00:00.000Z',
});