feat: add public inventory catalog boundary

This commit is contained in:
2026-09-08 19:34:38 -04:00
parent f42d3e4fd5
commit 206bb18da6
12 changed files with 300 additions and 3 deletions
@@ -15,6 +15,7 @@ import {
users,
} from '../../src/infrastructure/database/schema.js';
import { createInventoryImageRepository } from '../../src/modules/inventory/repositories/inventory-image-repository.js';
import { createInventoryItemRepository } from '../../src/modules/inventory/repositories/inventory-item-repository.js';
import { createListingRepository } from '../../src/modules/listings/repositories/listing-repository.js';
const connectionString = process.env.TEST_DATABASE_URL;
@@ -29,6 +30,7 @@ if (!new URL(connectionString).pathname.endsWith('_test')) {
const database = createDatabase(connectionString);
const listingRepository = createListingRepository(database.db);
const inventoryItemRepository = createInventoryItemRepository(database.db);
const inventoryImageRepository = createInventoryImageRepository(database.db);
async function createInventoryFixture() {
@@ -168,6 +170,29 @@ test('searches public listings with pagination and hides sold items by default',
assert.equal(included.items[0].status, 'CLOSED');
});
test('searches public inventory with product and listing fields', async () => {
const { category, condition, inventoryItem, product } = await createInventoryFixture();
await listingRepository.create({
inventoryItemId: inventoryItem.id,
productName: product.name,
categoryId: category.id,
conditionId: condition.id,
askingPriceMinor: 2499,
status: 'AVAILABLE',
});
const visible = await inventoryItemRepository.searchPublic({ page: 1, limit: 10 });
assert.equal(visible.total, 1);
assert.equal(visible.items[0].productSlug, product.slug);
assert.equal(visible.items[0].askingPriceMinor, 2499);
assert.equal((await inventoryItemRepository.findPublicById(inventoryItem.id)).id, inventoryItem.id);
await database.db.update(inventoryItems).set({ status: 'SOLD' }).where(sql`id = ${inventoryItem.id}`);
assert.equal(await inventoryItemRepository.findPublicById(inventoryItem.id), null);
});
test('persists image metadata only for the owning seller and counts item images', async () => {
const { seller, inventoryItem } = await createInventoryFixture();
const image = await inventoryImageRepository.createForSeller({