Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/controllers/FacilityController.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { NextFunction, Request, Response } from 'express';
import type { AvailabilityDate } from '../services/DBService';
import type { FormattedDate } from '../services/DBService';
import { DateTime } from 'luxon';
import ApiError from '../exceptions/ApiError';
import { SpaceAvailabilityRepository } from '../repositories/SpaceAvailabilityRepository';
Expand All @@ -16,7 +16,7 @@ export class FacilityController {

const repository = new SpaceAvailabilityRepository(facilityId, spaceId);
const numSpaces = await repository.getSpaceAvailabilityNumSpaces(
date as AvailabilityDate
date as FormattedDate
);

return res.json({ numSpaces });
Expand All @@ -41,7 +41,7 @@ export class FacilityController {

const repository = new SpaceAvailabilityRepository(facilityId, spaceId);
await repository.createAvailabilityByDate(
date as AvailabilityDate,
date as FormattedDate,
Number(numSpaces)
);

Expand Down
10 changes: 5 additions & 5 deletions src/repositories/SpaceAvailabilityRepository.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import DBService, {
AvailabilityDate,
AvailabilityItemKey,
FormattedDate,
DefaultOrDateItemKey,
FacilityItemValues,
LevelDefaultTyping
} from '../services/DBService';
Expand All @@ -12,7 +12,7 @@ export class SpaceAvailabilityRepository {
private availableDB: AbstractSublevel<
AbstractLevel<LevelDefaultTyping, string, FacilityItemValues>,
LevelDefaultTyping,
AvailabilityItemKey,
DefaultOrDateItemKey,
Availability
>;

Expand All @@ -25,7 +25,7 @@ export class SpaceAvailabilityRepository {
}

public async getSpaceAvailabilityNumSpaces(
key: AvailabilityItemKey
key: DefaultOrDateItemKey
): Promise<number> {
try {
const availability: Availability = await this.availableDB.get(key);
Expand All @@ -48,7 +48,7 @@ export class SpaceAvailabilityRepository {
}

public async createAvailabilityByDate(
key: AvailabilityDate,
key: FormattedDate,
numSpaces = 1
): Promise<void> {
const count = await this.getSpaceAvailabilityNumSpaces(key);
Expand Down
86 changes: 77 additions & 9 deletions src/services/DBService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@ import {
DayOfWeekRateModifer,
LOSRateModifier,
NoticeRequiredRule,
OccupancyRateModifier
OccupancyRateModifier,
Rates
} from '../proto/lpms';
import { Stub } from '../proto/stub';
import { Person } from '../proto/person';

export type LevelDefaultTyping = string | Buffer | Uint8Array;
export type DBLevel = Level<string, string | string[]>;
Expand All @@ -23,17 +26,26 @@ export type StringAbstractDB = AbstractSublevel<
string,
string
>;
export type FacilityRules = NoticeRequiredRule | DayOfWeekLOSRule;
export type FacilityModifiers =
export type Rules = NoticeRequiredRule | DayOfWeekLOSRule;
export type RulesItemKey = 'notice_required' | 'length_of_stay';
export type ModifiersValues =
| DayOfWeekRateModifer
| OccupancyRateModifier
| LOSRateModifier;
export type ModifiersKey =
| 'day_of_week'
| 'occupancy'
| 'length_of_stay'
export type FacilityValues = FacilityMetadata | string[];
export type FacilitySpaceValues = ItemMetadata | SpaceMetadata;
export type FacilityItemType = 'spaces' | 'otherItems';
export type FacilityItemValues = ItemMetadata | FacilitySpaceValues;
export type AvailabilityDate = `${number}-${number}-${number}`;
export type AvailabilityItemKey = 'default' | AvailabilityDate;
export type FormattedDate = `${number}-${number}-${number}`;
export type DefaultOrDateItemKey = 'default' | FormattedDate;
export type FacilityStubKey = string | FormattedDate;
export type FacilityStubValues = string[] | Stub;
export type SpaceStubKey = FormattedDate | `${FormattedDate}-num_booked`;
export type SpaceStubValues = string[] | number;

export default class DBService {
protected db: DBLevel;
Expand Down Expand Up @@ -118,10 +130,66 @@ export default class DBService {
);
}

public getFacilityRulesDB(facilityId: string) {
return this.getFacilityDB(facilityId).sublevel<RulesItemKey, Rules>(
'rules',
{ valueEncoding: 'json' }
);
}

public getFacilityModifiersDB(facilityId: string) {
return this.getFacilityDB(facilityId).sublevel<ModifiersKey, ModifiersValues>(
'modifiers',
{ valueEncoding: 'json' }
);
}

public getFacilityStubsDB(facilityId: string) {
return this.getFacilityDB(facilityId).sublevel<FacilityStubKey, FacilityStubValues>(
'stubs',
{ valueEncoding: 'json' }
);
}

public getFacilityPiiDB(facilityId: string) {
return this.getFacilityDB(facilityId).sublevel<string, Person>(
'pii',
{ valueEncoding: 'json' }
);
}

public getSpaceAvailabilityDB(facilityId: string, itemId: string) {
return this.getFacilityItemDB(facilityId, 'spaces', itemId).sublevel<
AvailabilityItemKey,
Availability
>('availability', { valueEncoding: 'json' });
return this.getFacilityItemDB(facilityId, 'spaces', itemId).sublevel<DefaultOrDateItemKey, Availability>(
'availability',
{ valueEncoding: 'json' }
);
}

public getSpaceRatesDB(facilityId: string, spaceId: string) {
return this.getFacilityItemDB(facilityId, 'spaces', spaceId).sublevel<DefaultOrDateItemKey, Rates>(
'rates',
{ valueEncoding: 'json' }
);
}

public getSpaceRulesDB(facilityId: string, spaceId: string) {
return this.getFacilityItemDB(facilityId, 'spaces', spaceId).sublevel<RulesItemKey, Rules>(
'rules',
{ valueEncoding: 'json' }
);
}

public getSpaceModifiersDB(facilityId: string, spaceId: string) {
return this.getFacilityItemDB(facilityId, 'spaces', spaceId).sublevel<ModifiersKey, ModifiersValues>(
'modifiers',
{ valueEncoding: 'json' }
);
}

public getSpaceStubsDB(facilityId: string, spaceId: string) {
return this.getFacilityItemDB(facilityId, 'spaces', spaceId).sublevel<SpaceStubKey, SpaceStubValues>(
'stubs',
{ valueEncoding: 'json' }
);
}
}