@@ -8,12 +8,14 @@ import { logger, generateRouteMetadata } from 'onecore-utilities'
88import { z } from 'zod'
99
1010import {
11+ getBuildingByCode ,
1112 getBuildingById ,
1213 getBuildings ,
1314 searchBuildings ,
1415} from '../adapters/building-adapter'
1516import { buildingsQueryParamsSchema , BuildingSchema } from '../types/building'
1617import { parseRequest } from '../middleware/parse-request'
18+ import { transformBuildingData } from '../utils/buildings'
1719
1820/**
1921 * @swagger
@@ -73,30 +75,9 @@ export const routes = (router: KoaRouter) => {
7375 const buildings = await getBuildings ( propertyCode )
7476
7577 const responseContent = buildings . map ( ( building ) => {
76- const parsedBuilding = BuildingSchema . parse ( {
77- id : building . id ,
78- code : building . buildingCode ,
79- name : building . name || '' ,
80- buildingType : {
81- id : building . buildingType ?. id || '' ,
82- code : building . buildingType ?. code || '' ,
83- name : building . buildingType ?. name || '' ,
84- } ,
85- construction : {
86- constructionYear : building . constructionYear ,
87- renovationYear : building . renovationYear ,
88- valueYear : building . valueYear ,
89- } ,
90- features : {
91- heating : building . heating || '' ,
92- fireRating : building . fireRating || '' ,
93- } ,
94- insurance : {
95- class : building . insuranceClass ,
96- value : building . insuranceValue ,
97- } ,
98- deleted : Boolean ( building . deleteMark ) ,
99- } )
78+ const parsedBuilding = BuildingSchema . parse (
79+ transformBuildingData ( building )
80+ )
10081
10182 return parsedBuilding
10283 } )
@@ -202,6 +183,65 @@ export const routes = (router: KoaRouter) => {
202183 }
203184 )
204185
186+ /**
187+ * @swagger
188+ * /buildings/by-building-code/{buildingCode}:
189+ * get:
190+ * summary: Get detailed information about a specific building by building code
191+ * description: |
192+ * Retrieves comprehensive information about a building using its building code.
193+ * Returns details including construction year, renovation history, insurance information,
194+ * and associated property data.
195+ * tags:
196+ * - Buildings
197+ * parameters:
198+ * - in: path
199+ * name: buildingCode
200+ * required: true
201+ * schema:
202+ * type: string
203+ * description: The building code of the building
204+ * responses:
205+ * 200:
206+ * description: Successfully retrieved building information
207+ * content:
208+ * application/json:
209+ * schema:
210+ * type: object
211+ * properties:
212+ * content:
213+ * $ref: '#/components/schemas/Building'
214+ * 404:
215+ * description: Building not found
216+ * 500:
217+ * description: Internal server error
218+ */
219+ router . get ( '(.*)/buildings/by-building-code/:buildingCode' , async ( ctx ) => {
220+ const metadata = generateRouteMetadata ( ctx )
221+ const buildingCode = ctx . params . buildingCode
222+ logger . info ( `GET /buildings/by-building-code/${ buildingCode } ` , metadata )
223+
224+ try {
225+ const building = await getBuildingByCode ( buildingCode )
226+
227+ if ( ! building ) {
228+ ctx . status = 404
229+ return
230+ }
231+
232+ const transformedData = transformBuildingData ( building )
233+
234+ ctx . body = {
235+ content : BuildingSchema . parse ( transformedData ) ,
236+ ...metadata ,
237+ }
238+ } catch ( err ) {
239+ ctx . status = 500
240+ const errorMessage = err instanceof Error ? err . message : 'unknown error'
241+ ctx . body = { reason : errorMessage , ...metadata }
242+ }
243+ } )
244+
205245 /**
206246 * @swagger
207247 * /buildings/{id}:
@@ -249,33 +289,10 @@ export const routes = (router: KoaRouter) => {
249289 return
250290 }
251291
252- const parsedBuilding = BuildingSchema . parse ( {
253- id : building . id ,
254- code : building . buildingCode ,
255- name : building . name || '' ,
256- buildingType : {
257- id : building . buildingType ?. id || '' ,
258- code : building . buildingType ?. code || '' ,
259- name : building . buildingType ?. name || '' ,
260- } ,
261- construction : {
262- constructionYear : building . constructionYear ,
263- renovationYear : building . renovationYear ,
264- valueYear : building . valueYear ,
265- } ,
266- features : {
267- heating : building . heating ,
268- fireRating : building . fireRating ,
269- } ,
270- insurance : {
271- class : building . insuranceClass ,
272- value : building . insuranceValue ,
273- } ,
274- deleted : Boolean ( building . deleteMark ) ,
275- } )
292+ const transformedData = transformBuildingData ( building )
276293
277294 ctx . body = {
278- content : parsedBuilding ,
295+ content : BuildingSchema . parse ( transformedData ) ,
279296 ...metadata ,
280297 }
281298 } catch ( err ) {
0 commit comments