Skip to content
Snippets Groups Projects
api.ts 4.41 KiB
Newer Older
const util = require('util');
const { Router } = require('express');
Art Lowel's avatar
Art Lowel committed

// Our API for demos only
import { fakeDataBase } from './db';
import { fakeDemoRedisCache } from './cache';
Art Lowel's avatar
Art Lowel committed
import { COLLECTIONS } from "./collections";
import { ITEMS } from "./items";
Art Lowel's avatar
Art Lowel committed

// you would use cookies/token etc
const USER_ID = 'f9d98cf1-1b96-464e-8755-bcc2a5c09077'; // hardcoded as an example
Art Lowel's avatar
Art Lowel committed

// Our API for demos only
export function serverApi(req, res) {
  let key = USER_ID + '/data.json';
  let cache = fakeDemoRedisCache.get(key);
  if (cache !== undefined) {
    console.log('/data.json Cache Hit');
    return res.json(cache);
  }
  console.log('/data.json Cache Miss');

  fakeDataBase.get()
    .then(data => {
      fakeDemoRedisCache.set(key, data);
      return data;
    })
    .then(data => res.json(data));
}


Art Lowel's avatar
Art Lowel committed
let COLLECTION_COUNT = 2;
let ITEM_COUNT = 2;


function toJSONAPIResponse(req, data) {
  return {
    "data": data,
    "links": {
      "self": req.protocol + '://' + req.get('host') + req.originalUrl
    }
Art Lowel's avatar
Art Lowel committed
}
Art Lowel's avatar
Art Lowel committed

export function createMockApi() {
Art Lowel's avatar
Art Lowel committed

  let router = Router();
Art Lowel's avatar
Art Lowel committed

  router.route('/collections')
Art Lowel's avatar
Art Lowel committed
    .get(function(req, res) {
      console.log('GET');
      // 70ms latency
      setTimeout(function() {
Art Lowel's avatar
Art Lowel committed
        res.json(toJSONAPIResponse(req, COLLECTIONS));
Art Lowel's avatar
Art Lowel committed
      }, 0);

    // })
    // .post(function(req, res) {
    //   console.log('POST', util.inspect(req.body, { colors: true }));
    //   let collection = req.body;
    //   if (collection) {
    //     COLLECTIONS.push({
    //       value: collection.value,
    //       created_at: new Date(),
    //       completed: collection.completed,
Art Lowel's avatar
Art Lowel committed
    //       id: COLLECTION_COUNT++
    //     });
    //     return res.json(collection);
    //   }
    //
    //   return res.end();
Art Lowel's avatar
Art Lowel committed
    });

  router.param('collection_id', function(req, res, next, collection_id) {
Art Lowel's avatar
Art Lowel committed
    // ensure correct prop type
    let id = req.params.collection_id;
Art Lowel's avatar
Art Lowel committed
    try {
      req.collection_id = id;
      req.collection = COLLECTIONS.find((collection) => {
        return collection.id = id;
      });
Art Lowel's avatar
Art Lowel committed
      next();
    } catch (e) {
      next(new Error('failed to load collection'));
Art Lowel's avatar
Art Lowel committed
    }
  });

  router.route('/collections/:collection_id')
Art Lowel's avatar
Art Lowel committed
    .get(function(req, res) {
      console.log('GET', util.inspect(req.collection, { colors: true }));
Art Lowel's avatar
Art Lowel committed
      res.json(toJSONAPIResponse(req, req.collection));
    // })
    // .put(function(req, res) {
    //   console.log('PUT', util.inspect(req.body, { colors: true }));
    //
    //   let index = COLLECTIONS.indexOf(req.collection);
    //   let collection = COLLECTIONS[index] = req.body;
    //
    //   res.json(collection);
    // })
    // .delete(function(req, res) {
    //   console.log('DELETE', req.collection_id);
    //
    //   let index = COLLECTIONS.indexOf(req.collection);
    //   COLLECTIONS.splice(index, 1);
    //
    //   res.json(req.collection);
Art Lowel's avatar
Art Lowel committed
    });

Art Lowel's avatar
Art Lowel committed

  router.route('/items')
    .get(function(req, res) {
      console.log('GET');
      // 70ms latency
      setTimeout(function() {
        res.json(toJSONAPIResponse(req, ITEMS));
      }, 0);

    // })
    // .post(function(req, res) {
    //   console.log('POST', util.inspect(req.body, { colors: true }));
    //   let item = req.body;
    //   if (item) {
    //     ITEMS.push({
    //       value: item.value,
    //       created_at: new Date(),
    //       completed: item.completed,
    //       id: ITEM_COUNT++
    //     });
    //     return res.json(item);
    //   }
    //
    //   return res.end();
    });

  router.param('item_id', function(req, res, next, item_id) {
    // ensure correct prop type
    let id = req.params.item_id;
    try {
      req.item_id = id;
      req.item = ITEMS.find((item) => {
        return item.id = id;
      });
      next();
    } catch (e) {
      next(new Error('failed to load item'));
    }
  });

  router.route('/items/:item_id')
    .get(function(req, res) {
      console.log('GET', util.inspect(req.item, { colors: true }));

      res.json(toJSONAPIResponse(req, req.item));
    // })
    // .put(function(req, res) {
    //   console.log('PUT', util.inspect(req.body, { colors: true }));
    //
    //   let index = ITEMS.indexOf(req.item);
    //   let item = ITEMS[index] = req.body;
    //
    //   res.json(item);
    // })
    // .delete(function(req, res) {
    //   console.log('DELETE', req.item_id);
    //
    //   let index = ITEMS.indexOf(req.item);
    //   ITEMS.splice(index, 1);
    //
    //   res.json(req.item);
    });

Art Lowel's avatar
Art Lowel committed
  return router;