skirda-backend/deno/routes.ts
2022-08-24 15:08:22 +03:00

110 lines
3.4 KiB
TypeScript

import { Router } from 'https://deno.land/x/oak/mod.ts';
import loadFile from './loadfile.ts';
const customers = JSON.parse(loadFile('../data/customers.json')),
states = JSON.parse(loadFile('../data/states.json')),
router = new Router();
router.get('/api/customers/page/:skip/:top', (ctx: any) => {
const topVal = +ctx.request.top,
skipVal = +ctx.params.skip,
skip = (isNaN(skipVal)) ? 0 : skipVal;
let top = (isNaN(topVal)) ? 10 : skip + (topVal);
if (top > customers.length) {
top = skip + (customers.length - skip);
}
console.log(`Skip: ${skip} Top: ${top}`);
const pagedCustomers = customers.slice(skip, top);
ctx.response.headers.set('X-InlineCount', customers.length);
ctx.response.body = pagedCustomers;
});
router.get('/api/customers', (ctx: any) => {
ctx.response.body = customers;
});
router.get('/api/customers/:id', (ctx: any) => {
const customerId = +ctx.params.id;
let selectedCustomer = null;
for (const customer of customers) {
if (customer.id === customerId) {
// found customer to create one to send
selectedCustomer = {};
selectedCustomer = customer;
break;
}
}
ctx.response.body = selectedCustomer;
});
router.post('/api/customers', async (ctx: any) => {
const postedCustomer = (await ctx.request.body()).value;
let maxId = Math.max.apply(Math,customers.map((cust: any) => cust.id));
postedCustomer.id = ++maxId;
postedCustomer.gender = (postedCustomer.id % 2 === 0) ? 'female' : 'male';
customers.push(postedCustomer);
ctx.response.body = postedCustomer;
});
router.put('/api/customers/:id', async (ctx: any) => {
const putCustomer = (await ctx.request.body()).value;
console.log(putCustomer);
const id = +ctx.params.id;
let status = false;
//Ensure state name is in sync with state abbreviation
const filteredStates = states.filter((state: any) => state.abbreviation === putCustomer.state.abbreviation);
if (filteredStates && filteredStates.length) {
putCustomer.state.name = filteredStates[0].name;
console.log('Updated putCustomer state to ' + putCustomer.state.name);
}
for (let i=0,len=customers.length;i<len;i++) {
if (customers[i].id === id) {
customers[i] = putCustomer;
status = true;
break;
}
}
ctx.response.body = { status: status };
});
router.delete('/api/customers/:id', (ctx: any) => {
const customerId = +ctx.params.id;
for (let i=0,len=customers.length;i<len;i++) {
if (customers[i].id === customerId) {
customers.splice(i,1);
break;
}
}
ctx.response.body = { status: true };
});
router.get('/api/orders/:id', (ctx: any) => {
const customerId = +ctx.params.id;
for (const cust of customers) {
if (cust.customerId === customerId) {
return ctx.response.body = cust;
}
}
ctx.response.body = [];
});
router.get('/api/states', (ctx: any) => {
ctx.response.body = states;
});
router.post('/api/auth/login', async (ctx: any) => {
const userLogin = (await ctx.request.body()).value;
//Add "real" auth here. Simulating it by returning a simple boolean.
ctx.response.body = true;
});
router.post('/api/auth/logout', (ctx: any) => {
ctx.response.body = true;
});
export default router;