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
45 changes: 23 additions & 22 deletions src/repositories/FacilityRepository.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import DBService, {
FacilityItemType,
FacilityKey,
FacilityIndexKey,
FacilityValues,
FacilitySpaceValues
} from '../services/DBService';
Expand All @@ -17,7 +18,7 @@ export class FacilityRepository {

// --- facility index management

public async getFacilityIds(): Promise<string[]> {
public async getAllFacilityIds(): Promise<string[]> {
try {
return await this.db.get<string, string[]>('facilities', {
valueEncoding: 'json'
Expand All @@ -31,7 +32,7 @@ export class FacilityRepository {
}

public async addFacilityToIndex(facilityId: string) {
const facilityIds = await this.getFacilityIds();
const facilityIds = await this.getAllFacilityIds();

if (facilityIds.length > 0) {
const ids = new Set<string>(facilityIds);
Expand All @@ -43,7 +44,7 @@ export class FacilityRepository {
}

public async delFacilityFromIndex(facilityId: string) {
const facilityIds = await this.getFacilityIds();
const facilityIds = await this.getAllFacilityIds();

if (facilityIds.length > 0) {
const ids = new Set<string>(facilityIds);
Expand All @@ -57,15 +58,15 @@ export class FacilityRepository {

public async setFacilityKey(
facilityId: string,
key: string,
key: FacilityKey | FacilityIndexKey,
value: FacilityValues
): Promise<void> {
await this.dbService.getFacilityDB(facilityId).put(key, value);
}

public async getFacilityKey(
facilityId: string,
key: string
key: FacilityKey | FacilityIndexKey
): Promise<FacilityValues> {
try {
return await this.dbService.getFacilityDB(facilityId).get(key);
Expand All @@ -79,14 +80,14 @@ export class FacilityRepository {

// --- items (space and otherItems) index management

public async getItemIds(
public async getAllItemIds(
facilityId: string,
itemType: FacilityItemType
idx: FacilityIndexKey
): Promise<string[]> {
try {
return await this.dbService
.getFacilityDB(facilityId)
.get<string, string[]>(itemType, {
.get<string, string[]>(idx, {
valueEncoding: 'json'
});
} catch (e) {
Expand All @@ -97,34 +98,34 @@ export class FacilityRepository {
return [];
}

public async addItemToIndex(
public async addToIndex(
facilityId: string,
itemType: FacilityItemType,
idx: FacilityIndexKey,
itemId: string
): Promise<void> {
const itemIds = await this.getItemIds(facilityId, itemType);
const itemIds = await this.getAllItemIds(facilityId, idx);
const db = this.dbService.getFacilityDB(facilityId);

if (itemIds.length > 0) {
const ids = new Set<string>(itemIds);
ids.add(itemId);
await db.put(itemType, Array.from(ids));
await db.put(idx, Array.from(ids));
} else {
await db.put(itemType, [itemId]);
await db.put(idx, [itemId]);
}
}

public async delItemFromIndex(
public async delFromIndex(
facilityId: string,
itemType: FacilityItemType,
idx: FacilityIndexKey,
itemId: string
): Promise<void> {
const itemIds = await this.getItemIds(facilityId, itemType);
const itemIds = await this.getAllItemIds(facilityId, idx);

if (itemIds.length > 0) {
const ids = new Set<string>(itemIds);
if (ids.delete(itemId)) {
await this.db.put(itemType, Array.from(ids));
await this.db.put(idx, Array.from(ids));
}
}
}
Expand All @@ -133,25 +134,25 @@ export class FacilityRepository {

public async setItemKey(
facilityId: string,
itemType: FacilityItemType,
idx: FacilityIndexKey,
itemId: string,
key: string,
value: Item | FacilitySpaceValues
): Promise<void> {
await this.dbService
.getFacilityItemDB(facilityId, itemType, itemId)
.getFacilityItemDB(facilityId, idx, itemId)
.put(key, value);
}

public async getItemKey(
facilityId: string,
itemType: FacilityItemType,
idx: FacilityIndexKey,
itemId: string,
key: string
): Promise<Item | FacilitySpaceValues> {
try {
return await this.dbService
.getFacilityItemDB(facilityId, itemType, itemId)
.getFacilityItemDB(facilityId, idx, itemId)
.get(key);
} catch (e) {
if (e.status === 404) {
Expand Down
89 changes: 89 additions & 0 deletions src/repositories/SpaceStubRepository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import DBService, {
FormattedDate,
FacilityItemValues,
LevelDefaultTyping,
DBLevel,
FacilityValues,
SpaceStubKey,
SpaceStubValues
} from '../services/DBService';
import { AbstractSublevel } from 'abstract-level';

export class SpaceStubRepository {
private dbService: DBService;
private db: AbstractSublevel<
AbstractSublevel<
AbstractSublevel<DBLevel, LevelDefaultTyping, string, FacilityValues>,
LevelDefaultTyping,
string,
FacilityItemValues
>,
LevelDefaultTyping,
SpaceStubKey,
SpaceStubValues
>;

constructor(facilityId: string, spaceId: string) {
this.dbService = DBService.getInstance();
this.db = this.dbService.getSpaceStubsDB(facilityId, spaceId);
}

// --- daily index management

public async getIndex(idx: FormattedDate): Promise<string[]> {
try {
return await this.db.get<FormattedDate, string[]>(idx, {
valueEncoding: 'json'
});
} catch (e) {
if (e.status !== 404) {
throw e;
}
}
return [];
}

public async addToIndex(idx: FormattedDate, stubId: string): Promise<void> {
const stubIds = await this.getIndex(idx);

if (stubIds.length > 0) {
const ids = new Set<string>(stubIds);
ids.add(stubId);
await this.db.put(idx, Array.from(ids));
} else {
await this.db.put(idx, [stubId]);
}
}

public async delFromIndex(idx: FormattedDate, itemId: string): Promise<void> {
const stubIds = await this.getIndex(idx);

if (stubIds.length > 0) {
const ids = new Set<string>(stubIds);
if (ids.delete(itemId)) {
await this.db.put(idx, Array.from(ids));
}
}
}

// --- num_booked getter / setter

public async getNumBookedByDate(key: SpaceStubKey): Promise<number> {
try {
return (await this.db.get(key)) as number;
} catch (e) {
if (e.status !== 404) {
throw e;
}
}

return 0;
}

public async setNumBookedByDate(
key: SpaceStubKey,
value: number
): Promise<void> {
await this.db.put(key, value);
}
}
80 changes: 80 additions & 0 deletions src/repositories/StubRepository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import DBService, {
FormattedDate,
LevelDefaultTyping,
DBLevel,
FacilityStubValues,
FacilityValues,
FacilityStubKey
} from '../services/DBService';
import { AbstractSublevel } from 'abstract-level';
import { StubStorage } from '../proto/lpms';

export class StubRepository {
private dbService: DBService;
private db: AbstractSublevel<
AbstractSublevel<DBLevel, LevelDefaultTyping, string, FacilityValues>,
LevelDefaultTyping,
string,
FacilityStubValues
>;

constructor(facilityId: string) {
this.dbService = DBService.getInstance();
this.db = this.dbService.getFacilityStubsDB(facilityId);
}

// --- availability getters / setters

public async getStub(key: FacilityStubKey): Promise<FacilityStubValues> {
try {
return await this.db.get(key);
} catch (e) {
if (e.status === 404) {
throw new Error(`Unable to get "${key}" of stub level"`);
}
throw e;
}
}

public async setStub(key: FacilityStubKey, stub: StubStorage): Promise<void> {
await this.db.put(key, stub);
}

// --- daily index management

public async getIndex(idx: FormattedDate): Promise<string[]> {
try {
return await this.db.get<FormattedDate, string[]>(idx, {
valueEncoding: 'json'
});
} catch (e) {
if (e.status !== 404) {
throw e;
}
}
return [];
}

public async addToIndex(idx: FormattedDate, stubId: string): Promise<void> {
const stubIds = await this.getIndex(idx);

if (stubIds.length > 0) {
const ids = new Set<string>(stubIds);
ids.add(stubId);
await this.db.put(idx, Array.from(ids));
} else {
await this.db.put(idx, [stubId]);
}
}

public async delFromIndex(idx: FormattedDate, itemId: string): Promise<void> {
const stubIds = await this.getIndex(idx);

if (stubIds.length > 0) {
const ids = new Set<string>(stubIds);
if (ids.delete(itemId)) {
await this.db.put(idx, Array.from(ids));
}
}
}
}
10 changes: 6 additions & 4 deletions src/services/DBService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ import {
LOSRateModifier,
NoticeRequiredRule,
OccupancyRateModifier,
Rates
Rates,
StubStorage
} from '../proto/lpms';
import { Stub } from '../proto/stub';
import { Person } from '../proto/person';
Expand All @@ -33,14 +34,15 @@ export type ModifiersValues =
| OccupancyRateModifier
| LOSRateModifier;
export type ModifiersKey = 'day_of_week' | 'occupancy' | 'length_of_stay';
export type FacilityKey = 'metadata';
export type FacilityIndexKey = 'stubs' | 'spaces' | 'otherItems';
export type FacilityValues = FacilityMetadata | string[];
export type FacilitySpaceValues = ItemMetadata | SpaceMetadata;
export type FacilityItemType = 'spaces' | 'otherItems';
export type FacilityItemValues = ItemMetadata | FacilitySpaceValues;
export type FormattedDate = `${number}-${number}-${number}`;
export type DefaultOrDateItemKey = 'default' | FormattedDate;
export type FacilityStubKey = string | FormattedDate;
export type FacilityStubValues = string[] | Stub;
export type FacilityStubValues = string[] | StubStorage;
export type SpaceStubKey = FormattedDate | `${FormattedDate}-num_booked`;
export type SpaceStubValues = string[] | number;

Expand Down Expand Up @@ -117,7 +119,7 @@ export default class DBService {

public getFacilityItemDB(
facilityId: string,
itemType: FacilityItemType,
itemType: FacilityIndexKey,
itemId: string
) {
const key = `${itemType}_${itemId}`;
Expand Down
11 changes: 6 additions & 5 deletions src/services/FacilityService.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Item } from '../proto/facility';
import {
FacilityItemType,
FacilityIndexKey,
FacilityValues,
FacilitySpaceValues
FacilitySpaceValues,
FacilityKey
} from './DBService';
import facilityRepository, {
FacilityRepository
Expand All @@ -17,7 +18,7 @@ export class FacilityService {

public async setFacilityDbKeys(
facilityId: string,
entries: [string, FacilityValues][]
entries: [FacilityIndexKey | FacilityKey, FacilityValues][]
): Promise<void> {
await this.repository.addFacilityToIndex(facilityId);

Expand All @@ -30,11 +31,11 @@ export class FacilityService {

public async setItemDbKeys(
facilityId: string,
itemType: FacilityItemType,
itemType: FacilityIndexKey,
itemId: string,
entries: [string, Item | FacilitySpaceValues][]
): Promise<void> {
await this.repository.addItemToIndex(facilityId, itemType, itemId);
await this.repository.addToIndex(facilityId, itemType, itemId);

await Promise.all(
entries.map(([key, value]) =>
Expand Down