api-v1/routes/listings.route.js

71 lines
2.2 KiB
JavaScript

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