const express = require('express');
const { PermissionMiddlewareCreator, RecordCreator, RecordUpdater } = require('forest-express');
const { RecordSerializer } = require('forest-express');
const router = express.Router();
const COLLECTION_NAME = 'customers';
const permissionMiddlewareCreator = new PermissionMiddlewareCreator(COLLECTION_NAME);
const recordSerializer = new RecordSerializer({ name: COLLECTION_NAME });
const azureTableStorageService = require("../services/azure-table-storage-service");
// Get a list of Customers
router.get(`/${COLLECTION_NAME}`, permissionMiddlewareCreator.list(), async (request, response, next) => {
const pageSize = parseInt(request.query.page.size) || 15;
const pageNumber = parseInt(request.query.page.number);
azureTableStorageService.listEntitiesAsync(COLLECTION_NAME, {pageSize, pageNumber})
.then( async ({records, count}) => {
const recordsSerialized = await recordSerializer.serialize(records);
response.send({ ...recordsSerialized, meta: { count }});
router.get(`/${COLLECTION_NAME}/:recordId`, permissionMiddlewareCreator.details(), async (request, response, next) => {
const parts = request.params.recordId.split('|');
azureTableStorageService.getEntityAsync(COLLECTION_NAME, parts[0], parts[1])
.then( (record) => recordSerializer.serialize(record))
.then( (recordSerialized) => response.send(recordSerialized))
router.post(`/${COLLECTION_NAME}`, permissionMiddlewareCreator.create(), async (request, response, next) => {
const recordCreator = new RecordCreator({name: COLLECTION_NAME}, request.user, request.query);
recordCreator.deserialize(request.body)
.then( (recordToCreate) => {
return azureTableStorageService.createEntityAsync(COLLECTION_NAME, recordToCreate);
.then((record) => recordSerializer.serialize(record))
.then((recordSerialized) => response.send(recordSerialized))
router.put(`/${COLLECTION_NAME}/:recordId`, permissionMiddlewareCreator.update(), async (request, response, next) => {
const parts = request.params.recordId.split('|');
const recordUpdater = new RecordUpdater({name: COLLECTION_NAME}, request.user, request.query);
recordUpdater.deserialize(request.body)
.then( (recordToUpdate) => {
recordToUpdate.partitionKey = parts[0];
recordToUpdate.rowKey = parts[1];
return azureTableStorageService.udpateEntityAsync(COLLECTION_NAME, recordToUpdate);
.then( (record) => recordSerializer.serialize(record) )
.then( (recordSerialized) => response.send(recordSerialized) )
// Delete a list of Customers
router.delete(`/${COLLECTION_NAME}`, permissionMiddlewareCreator.delete(), async (request, response, next) => {
for (const key of request.body.data.attributes.ids) {
const parts = key.split('|');
await azureTableStorageService.deleteEntityAsync(COLLECTION_NAME, parts[0], parts[1]);
response.status(204).send()