Skip to content

Commit

Permalink
Merge pull request #39 from windingtree/feat/leveldb
Browse files Browse the repository at this point in the history
Feat/leveldb
  • Loading branch information
mfw78 authored Jun 7, 2022
2 parents 98be7c6 + ca3f032 commit 1c500d0
Show file tree
Hide file tree
Showing 25 changed files with 1,487 additions and 311 deletions.
27 changes: 20 additions & 7 deletions docs/STORAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,11 @@ Notes: This meets the requirement (2)
Parent level: `facilityId` (dynamic)
Level: `spaceId` (dynamic)

Key: `metadata_generic`
Key: `metadata`
Value: `videre.stays.lpms.facility.Item`
Description: Contains generic data for each item (name, photos etc)

Key: `metadata`
Key: `metadata_impl`
Value: `videre.stays.lpms.facility.Space`
Description: Contains specific metadata for Spaces (views, sleeping arrangements etc).

Expand Down Expand Up @@ -185,12 +185,25 @@ Notes: This meets the requirement (4)
#### otherItems

Parent level: `facilityId` (dynamic)
Level: `otherItems`
Level: `otherItemdId` (dynamic)

Key: `itemId` (dynamic)
Key: `metadata` (dynamic)
Value: `videre.stays.lpms.facility.Item`
Description: Contains generic data for the item (name, photos, etc)

##### rates

Parent level: `facilityId.otherItemdId` (dynamic)
Level: `rates`

Key: `default`
Value: `videre.stays.lpms.Rates`
Description: Contains the `Rates` message protobuf describing the rate for this item.

Key: `YYYY-MM-DD` (dynamic)
Value: `videre.stays.lpms.Rates`
Description: Contains the `Rates` message protobuf for a per-day override of rates.

# CRUD

## Stubs (booking)
Expand Down Expand Up @@ -251,8 +264,8 @@ let items: ServiceItemData[];
const spaces = db.get('facilityId.spaces'); // insert correct leveldb query here
for (const space of object) {
// get generic metadata
const generic = db.get(`${facilityId}.${space}.metadata_generic`) as Item;
const specific = db.get(`${facilityId}.${space}.metadata`) as Space;
const generic = db.get(`${facilityId}.${space}.metadata`) as Item;
const specific = db.get(`${facilityId}.${space}.metadata_impl`) as Space;
generic.payload = Space.toBinary(specific);

items.push({
Expand All @@ -264,7 +277,7 @@ for (const space of object) {
// process all other items
const otherItems = db.get('facilityId.otherItems') as Item[];
for (const item of otherItems) {
const otherItem = db.get(`${facilityId}.otherItems.${item}`) as Item;
const otherItem = db.get(`${facilityId}.${item}.metadata`) as Item;
items.push({
item: utils.arrayify(utils.formatBytes32String(item)),
payload: Item.toBinary(otherItem)
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
},
"dependencies": {
"@protobuf-ts/plugin": "^2.6.0",
"@windingtree/stays-models": "^2.0.0",
"@windingtree/stays-models": "^2.0.1",
"@windingtree/videre-sdk": "^0.5.0",
"axios": "^0.27.2",
"bcrypt": "^5.0.1",
Expand Down Expand Up @@ -88,7 +88,7 @@
"@types/luxon": "^2.3.2",
"@typescript-eslint/eslint-plugin": "^5.27.0",
"@typescript-eslint/parser": "^5.27.0",
"@windingtree/videre-contracts": "^0.2.0-alpha.1",
"@windingtree/videre-contracts": "^1.0.2",
"chai": "^4.3.6",
"conventional-changelog-cli": "^2.2.2",
"eslint": "^8.16.0",
Expand Down
171 changes: 163 additions & 8 deletions src/controllers/FacilityController.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
import type { NextFunction, Request, Response } from 'express';
import type { AvailabilityDate } from '../services/DBService';
import type {
FacilityIndexKey,
FormattedDate,
ModifiersKey,
ModifiersValues
} from '../services/DBService';
import { DateTime } from 'luxon';
import ApiError from '../exceptions/ApiError';
import { SpaceAvailabilityRepository } from '../repositories/SpaceAvailabilityRepository';
import {
FacilityModifierRepository,
ItemModifierRepository
} from '../repositories/ModifierRepository';

export class FacilityController {
// Returns availability of the space
Expand All @@ -15,8 +24,8 @@ export class FacilityController {
const { facilityId, spaceId, date } = req.params;

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

return res.json({ numSpaces });
Expand All @@ -40,10 +49,9 @@ export class FacilityController {
}

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

return res.json({ success: true });
} catch (e) {
Expand All @@ -62,13 +70,160 @@ export class FacilityController {
const { numSpaces } = req.body;

const repository = new SpaceAvailabilityRepository(facilityId, spaceId);
await repository.createDefaultAvailability(Number(numSpaces));
await repository.setAvailabilityDefault({ numSpaces: Number(numSpaces) });

return res.json({ success: true });
} catch (e) {
next(e);
}
};

// Returns modifier of facility
getModifierOfFacility = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const { facilityId, modifierKey } = req.params;

const repository = new FacilityModifierRepository(facilityId);
const modifier = await repository.getModifier(
modifierKey as ModifiersKey
);

res.json(modifier);
} catch (e) {
next(e);
}
};

// Returns modifier of the item: `spaces` or `otherItems`
getModifierOfItem = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const { facilityId, itemKey, itemId, modifierKey } = req.params;

const repository = new ItemModifierRepository(
facilityId,
itemKey as FacilityIndexKey,
itemId
);

let modifier: ModifiersValues;

try {
modifier = await repository.getModifier(modifierKey as ModifiersKey);
} catch (e) {
if (e.status !== 404) {
throw e;
}

// If item does not contain such modifier then try to lookup the facility
const facilityRepository = new FacilityModifierRepository(facilityId);
modifier = await facilityRepository.getModifier(
modifierKey as ModifiersKey
);
}

res.json(modifier);
} catch (e) {
next(e);
}
};

// Creates a modifier for the facility
createFacilityModifier = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const { facilityId, modifierKey } = req.params;
const modifier = req.body;

const repository = new FacilityModifierRepository(facilityId);
await repository.setModifier(
modifierKey as ModifiersKey,
modifier as ModifiersValues
);

res.json({ success: true });
} catch (e) {
next(e);
}
};

// Creates a modifier for the item: spaces or otherItems
createItemModifier = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const { facilityId, itemKey, itemId, modifierKey } = req.params;
const modifier = req.body;

const repository = new ItemModifierRepository(
facilityId,
itemKey as FacilityIndexKey,
itemId
);

await repository.setModifier(
modifierKey as ModifiersKey,
modifier as ModifiersValues
);

res.json({ success: true });
} catch (e) {
next(e);
}
};

// Removes a modifier from the facility
removeModifierOfFacility = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const { facilityId, modifierKey } = req.params;

const repository = new FacilityModifierRepository(facilityId);
await repository.delModifier(modifierKey as ModifiersKey);

res.json({ success: true });
} catch (e) {
next(e);
}
};

// Removes modifier of the item: `spaces` or `otherItems`
removeModifierOfItem = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const { facilityId, itemKey, itemId, modifierKey } = req.params;

const repository = new ItemModifierRepository(
facilityId,
itemKey as FacilityIndexKey,
itemId
);

await repository.delModifier(modifierKey as ModifiersKey);

res.json({ success: true });
} catch (e) {
next(e);
}
};
}

export default new FacilityController();
13 changes: 8 additions & 5 deletions src/controllers/StorageController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { web3StorageKey, typedDataDomain } from '../config';
import { walletAccountsIndexes } from '../types';
import { Facility, Item, ItemType, Space } from '../proto/facility';
import facilityService from '../services/FacilityService';
import { FacilitySpaceLevelValues } from 'src/services/DBService';
import { FacilitySpaceValues } from 'src/services/DBService';
const { readFile } = promises;

export class StorageController {
Expand Down Expand Up @@ -75,7 +75,7 @@ export class StorageController {
]);

// Extract spaces from metadata
const spaces: Record<string, [string, FacilitySpaceLevelValues][]> = {};
const spaces: Record<string, [string, FacilitySpaceValues][]> = {};
const otherItems: Record<string, [string, Item][]> = {};

for (const item of serviceProviderData.items) {
Expand All @@ -84,11 +84,14 @@ export class StorageController {

if (type === ItemType.SPACE) {
spaces[itemId] = [
['metadata_generic', generic as Item],
['metadata', (payload ? Space.fromBinary(payload) : {}) as Space]
['metadata', generic as Item],
[
'metadata_impl',
(payload ? Space.fromBinary(payload) : {}) as Space
]
];
} else {
otherItems[itemId] = [['metadata_generic', generic as Item]];
otherItems[itemId] = [['metadata', generic as Item]];
}
}

Expand Down
6 changes: 5 additions & 1 deletion src/exceptions/ApiError.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,15 @@ export default class ApiError extends Error {
return new ApiError(401, 'User is not authorized');
}

static BadRequest(message, errors: ValidationError[] = []) {
static BadRequest(message: string, errors: ValidationError[] = []) {
return new ApiError(400, message, errors);
}

static AccessDenied() {
return new ApiError(403, 'Access denied');
}

static NotFound(message: string) {
return new ApiError(404, message || 'Not Found');
}
}
5 changes: 3 additions & 2 deletions src/middlewares/AuthMiddleware.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import ApiError from '../exceptions/ApiError';
import tokenService from '../services/TokenService';
import userService from '../services/UserService';
import userRepository from '../repositories/UserRepository';
import { UserDTO } from '../types';

export default async (req, res, next) => {
Expand All @@ -21,13 +22,13 @@ export default async (req, res, next) => {
return next(ApiError.UnauthorizedError());
}

const userExists = await userService.getUserIdByLogin(userData.login);
const userExists = await userRepository.getUserIdByLogin(userData.login);

if (!userExists) {
return next(ApiError.UnauthorizedError());
}

const user = await userService.getUserById(userData.id);
const user = await userRepository.getUserById(userData.id);
req.user = userService.getUserDTO(user);
next();
} catch (e) {
Expand Down
Loading

0 comments on commit 1c500d0

Please sign in to comment.