11import type { NextFunction , Request , Response } from 'express' ;
2- import type { AvailabilityDate } from '../services/DBService' ;
2+ import type {
3+ FacilityIndexKey ,
4+ FormattedDate ,
5+ ModifiersKey ,
6+ ModifiersValues
7+ } from '../services/DBService' ;
38import { DateTime } from 'luxon' ;
49import ApiError from '../exceptions/ApiError' ;
510import { SpaceAvailabilityRepository } from '../repositories/SpaceAvailabilityRepository' ;
11+ import {
12+ FacilityModifierRepository ,
13+ ItemModifierRepository
14+ } from '../repositories/ModifierRepository' ;
615
716export class FacilityController {
817 // Returns availability of the space
@@ -15,8 +24,8 @@ export class FacilityController {
1524 const { facilityId, spaceId, date } = req . params ;
1625
1726 const repository = new SpaceAvailabilityRepository ( facilityId , spaceId ) ;
18- const numSpaces = await repository . getSpaceAvailabilityNumSpaces (
19- date as AvailabilityDate
27+ const numSpaces = await repository . getSpaceAvailability (
28+ date as FormattedDate
2029 ) ;
2130
2231 return res . json ( { numSpaces } ) ;
@@ -40,10 +49,9 @@ export class FacilityController {
4049 }
4150
4251 const repository = new SpaceAvailabilityRepository ( facilityId , spaceId ) ;
43- await repository . createAvailabilityByDate (
44- date as AvailabilityDate ,
45- Number ( numSpaces )
46- ) ;
52+ await repository . setAvailabilityByDate ( date as FormattedDate , {
53+ numSpaces : Number ( numSpaces )
54+ } ) ;
4755
4856 return res . json ( { success : true } ) ;
4957 } catch ( e ) {
@@ -62,13 +70,160 @@ export class FacilityController {
6270 const { numSpaces } = req . body ;
6371
6472 const repository = new SpaceAvailabilityRepository ( facilityId , spaceId ) ;
65- await repository . createDefaultAvailability ( Number ( numSpaces ) ) ;
73+ await repository . setAvailabilityDefault ( { numSpaces : Number ( numSpaces ) } ) ;
6674
6775 return res . json ( { success : true } ) ;
6876 } catch ( e ) {
6977 next ( e ) ;
7078 }
7179 } ;
80+
81+ // Returns modifier of facility
82+ getModifierOfFacility = async (
83+ req : Request ,
84+ res : Response ,
85+ next : NextFunction
86+ ) => {
87+ try {
88+ const { facilityId, modifierKey } = req . params ;
89+
90+ const repository = new FacilityModifierRepository ( facilityId ) ;
91+ const modifier = await repository . getModifier (
92+ modifierKey as ModifiersKey
93+ ) ;
94+
95+ res . json ( modifier ) ;
96+ } catch ( e ) {
97+ next ( e ) ;
98+ }
99+ } ;
100+
101+ // Returns modifier of the item: `spaces` or `otherItems`
102+ getModifierOfItem = async (
103+ req : Request ,
104+ res : Response ,
105+ next : NextFunction
106+ ) => {
107+ try {
108+ const { facilityId, itemKey, itemId, modifierKey } = req . params ;
109+
110+ const repository = new ItemModifierRepository (
111+ facilityId ,
112+ itemKey as FacilityIndexKey ,
113+ itemId
114+ ) ;
115+
116+ let modifier : ModifiersValues ;
117+
118+ try {
119+ modifier = await repository . getModifier ( modifierKey as ModifiersKey ) ;
120+ } catch ( e ) {
121+ if ( e . status !== 404 ) {
122+ throw e ;
123+ }
124+
125+ // If item does not contain such modifier then try to lookup the facility
126+ const facilityRepository = new FacilityModifierRepository ( facilityId ) ;
127+ modifier = await facilityRepository . getModifier (
128+ modifierKey as ModifiersKey
129+ ) ;
130+ }
131+
132+ res . json ( modifier ) ;
133+ } catch ( e ) {
134+ next ( e ) ;
135+ }
136+ } ;
137+
138+ // Creates a modifier for the facility
139+ createFacilityModifier = async (
140+ req : Request ,
141+ res : Response ,
142+ next : NextFunction
143+ ) => {
144+ try {
145+ const { facilityId, modifierKey } = req . params ;
146+ const modifier = req . body ;
147+
148+ const repository = new FacilityModifierRepository ( facilityId ) ;
149+ await repository . setModifier (
150+ modifierKey as ModifiersKey ,
151+ modifier as ModifiersValues
152+ ) ;
153+
154+ res . json ( { success : true } ) ;
155+ } catch ( e ) {
156+ next ( e ) ;
157+ }
158+ } ;
159+
160+ // Creates a modifier for the item: spaces or otherItems
161+ createItemModifier = async (
162+ req : Request ,
163+ res : Response ,
164+ next : NextFunction
165+ ) => {
166+ try {
167+ const { facilityId, itemKey, itemId, modifierKey } = req . params ;
168+ const modifier = req . body ;
169+
170+ const repository = new ItemModifierRepository (
171+ facilityId ,
172+ itemKey as FacilityIndexKey ,
173+ itemId
174+ ) ;
175+
176+ await repository . setModifier (
177+ modifierKey as ModifiersKey ,
178+ modifier as ModifiersValues
179+ ) ;
180+
181+ res . json ( { success : true } ) ;
182+ } catch ( e ) {
183+ next ( e ) ;
184+ }
185+ } ;
186+
187+ // Removes a modifier from the facility
188+ removeModifierOfFacility = async (
189+ req : Request ,
190+ res : Response ,
191+ next : NextFunction
192+ ) => {
193+ try {
194+ const { facilityId, modifierKey } = req . params ;
195+
196+ const repository = new FacilityModifierRepository ( facilityId ) ;
197+ await repository . delModifier ( modifierKey as ModifiersKey ) ;
198+
199+ res . json ( { success : true } ) ;
200+ } catch ( e ) {
201+ next ( e ) ;
202+ }
203+ } ;
204+
205+ // Removes modifier of the item: `spaces` or `otherItems`
206+ removeModifierOfItem = async (
207+ req : Request ,
208+ res : Response ,
209+ next : NextFunction
210+ ) => {
211+ try {
212+ const { facilityId, itemKey, itemId, modifierKey } = req . params ;
213+
214+ const repository = new ItemModifierRepository (
215+ facilityId ,
216+ itemKey as FacilityIndexKey ,
217+ itemId
218+ ) ;
219+
220+ await repository . delModifier ( modifierKey as ModifiersKey ) ;
221+
222+ res . json ( { success : true } ) ;
223+ } catch ( e ) {
224+ next ( e ) ;
225+ }
226+ } ;
72227}
73228
74229export default new FacilityController ( ) ;
0 commit comments