Skip to content
This repository has been archived by the owner on Feb 6, 2019. It is now read-only.

Add REST API code from the chill-dashboard #1

Merged
merged 16 commits into from
Jun 23, 2017
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Refactor code
  • Loading branch information
kabirbaidhya committed Jun 19, 2017
commit 305262ad842a88b672c2144ebcf3673bf79409fb
48 changes: 48 additions & 0 deletions src/controllers/home.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import swaggerSpec from '../utils/swagger';

/**
* GET /api/swagger.json
*/
export function getSwaggerSpec(req, res) {
res.json(swaggerSpec);
}


/**
* @swagger
* definitions:
* App:
* title: App
* type: object
* properties:
* app:
* type: string
* apiVersion:
* type: string
*/

/**
* @swagger
* /:
* get:
* summary: Get API version
* description: App version
* produces:
* - application/json
* tags:
* - Base
* responses:
* 200:
* description: Application and API version
* schema:
* title: Users
* type: object
* $ref: '#/definitions/App'
*/

export function getAppInfo(req, res) {
res.json({
app: req.app.locals.title,
apiVersion: req.app.locals.version
});
}
26 changes: 8 additions & 18 deletions src/controllers/status.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,15 @@
import { Router } from 'express';
import * as statusService from '../services/status';

const router = Router();

/**
* GET /api/status
* Get the latest status of all the services.
*
* @param {Object} req
* @param {Object} res
* @param {Object} next
*/
router.get('/', (req, res, next) => {
export function getStatus(req, res, next) {
statusService.fetchLatestStatuses()
.then(data => res.json({ data }))
.catch(err => next(err));
});


/**
* GET /api/status/:id
*/
router.get('/:id', (req, res, next) => {
statusService.getStatus(req.params.id)
.then(data => res.json({ data }))
.then(data => res.json(data))
.catch(err => next(err));
});
}

export default router;
13 changes: 0 additions & 13 deletions src/db.js

This file was deleted.

6 changes: 0 additions & 6 deletions src/env.js

This file was deleted.

17 changes: 7 additions & 10 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import helmet from 'helmet';
import morgan from 'morgan';
import express from 'express';

import './db';
import './env';
import pkg from '../package';
import routes from './routes';
import logger from './utils/logger';
import bodyParser from 'body-parser';
Expand All @@ -14,14 +13,12 @@ import * as errorHandler from './middlewares/errorHandler';

const app = express();

const APP_PORT = (process.env.NODE_ENV === 'test' ? process.env.TEST_APP_PORT : process.env.APP_PORT) || '3000';
const APP_HOST = process.env.APP_HOST || '0.0.0.0';
const PORT = process.env.PORT || '3000';

app.set('port', APP_PORT);
app.set('host', APP_HOST);
app.set('port', PORT);

app.locals.title = process.env.APP_NAME;
app.locals.version = process.env.APP_VERSION;
app.locals.title = pkg.name;
app.locals.version = pkg.version;

app.use(cors());
app.use(helmet());
Expand All @@ -36,8 +33,8 @@ app.use('/api', routes);
app.use(errorHandler.genericErrorHandler);
app.use(errorHandler.notFoundError);

app.listen(app.get('port'), app.get('host'), () => {
logger().info('info', `Server started at http://${app.get('host')}:${app.get('port')}`);
app.listen(app.get('port'), () => {
logger().info(`Server listening is on port ${app.get('port')}`);
});

export default app;
20 changes: 0 additions & 20 deletions src/models/Status.js

This file was deleted.

22 changes: 22 additions & 0 deletions src/models/StatusLog.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { getClient } from '../utils/db';

const db = getClient();

class StatusLog extends db.Model {

get tableName() {
return 'status_logs';
}

get hasTimestamps() {
return true;
}

static fetchLatestStatuses() {
return this
.query(qb => qb.groupBy('name').orderBy('created_at', 'DSC'))
.fetchAll();
}
}

export default StatusLog;
58 changes: 6 additions & 52 deletions src/routes.js
Original file line number Diff line number Diff line change
@@ -1,57 +1,11 @@
import { Router } from 'express';
import swaggerSpec from './utils/swagger';
import statusController from './controllers/status';
import * as homeController from './controllers/home';
import * as statusController from './controllers/status';

/**
* Contains all API routes for the application.
*/
let router = Router();
const router = Router();

/**
* GET /api/swagger.json
*/
router.get('/swagger.json', (req, res) => {
res.json(swaggerSpec);
});

/**
* @swagger
* definitions:
* App:
* title: App
* type: object
* properties:
* app:
* type: string
* apiVersion:
* type: string
*/

/**
* @swagger
* /:
* get:
* summary: Get API version
* description: App version
* produces:
* - application/json
* tags:
* - Base
* responses:
* 200:
* description: Application and API version
* schema:
* title: Users
* type: object
* $ref: '#/definitions/App'
*/
router.get('/', (req, res) => {
res.json({
app: req.app.locals.title,
apiVersion: req.app.locals.version
});
});

router.use('/status', statusController);
router.get('/swagger.json', homeController.getSwaggerSpec);
router.get('/', homeController.getAppInfo);
router.get('/status', statusController.getStatus);

export default router;
13 changes: 6 additions & 7 deletions src/services/status.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import Boom from 'boom';
import Status from '../models/Status';
import StatusLog from '../models/StatusLog';

/**
* Get all status.
* Get all status logs.
*
* @return {Promise}
*/
export function getAllStatus() {
return Status.fetchAll();
return StatusLog.fetchAll();
}

/**
Expand All @@ -17,19 +17,18 @@ export function getAllStatus() {
* @return {Promise}
*/
export function fetchLatestStatuses() {
return Status.fetchLatestStatuses();
return StatusLog.fetchLatestStatuses();
}

/**
* Get a service status.
* Get a service status logs.
*
* @param {string|Number} id
* @return {Promise}
*/
export async function getStatus(id) {
try {

let status = await new Status({ id }).fetch();
let status = await new StatusLog({ id }).fetch();

if (!status) {
throw new Boom.notFound('Service not found');
Expand Down
24 changes: 24 additions & 0 deletions src/utils/db.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import knex from 'knex';
import bookshelf from 'bookshelf';
import * as config from '../config/config';

/**
* Create a new database client.
* Return the same client if it is already created.
*
* @returns {Object}
*/
let db;

export function getClient() {
if (db) {
return db;
}

const dbConfig = config.get().db;

db = bookshelf(knex(dbConfig));
db.plugin(['bookshelf-camelcase']);

return db;
}