import ApiBuilder from '../core/builders/ApiBuilder.js'; import UrlBuilder from '../core/builders/UrlBuilder.js'; import SchemaBuilder from '../core/builders/SchemaBuilder.js'; import SchemaFileLoader from '../core/utils/SchemaFileLoader.js'; import listingRequestTranslator from '../logic/listings/listingRequestTranslator.js'; import listingResponseTranslator from '../logic/listings/listingResponseTranslator.js'; export default function registerListingsApi(baseUrl, common, dbClient) { // GET /listings (feed) new ApiBuilder(common) .method('get') .url(new UrlBuilder(baseUrl)) .schema( new SchemaBuilder() .responseSchema( SchemaFileLoader.load('./models/listings/listings_response.json') ) .requestTranslator(listingRequestTranslator) .responseTranslator(listingResponseTranslator) .defaultError({ error: 'INTERNAL_ERROR' }) ) .sync() .build(dbClient); // GET /listings/:id new ApiBuilder(common) .method('get') .url(new UrlBuilder(baseUrl).withPathParams(SchemaFileLoader.load('./models/listings/listing_request_path_param.json'))) .schema( new SchemaBuilder() .responseSchema( SchemaFileLoader.load('./models/listings/listings_response.json') ) .requestTranslator(listingRequestTranslator) .responseTranslator(listingResponseTranslator) .defaultError({ error: 'NOT_FOUND' }) ) .sync() .build(dbClient); // POST /listings (create) new ApiBuilder(common) .method('post') .url(new UrlBuilder(baseUrl)) .schema( new SchemaBuilder() .requestSchema( SchemaFileLoader.load('./models/listings/listings_response.json') ) .responseSchema( SchemaFileLoader.load('./models/listings/listings_response.json') ) .requestTranslator(req => ({ type: 'transaction', handler: async (trx) => { const [listing] = await trx('listings') .insert(req.body) .returning('*'); return listing; } })) .responseTranslator(result => result) .defaultError({ error: 'CREATE_FAILED' }) ) .sync() .build(dbClient); };