From e45a2666da887d0b6e6f7fd267410e623f2e4584 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Wed, 15 Jan 2020 21:28:13 -0800 Subject: [PATCH] Got basic log api functioning --- package-lock.json | 5 ++ package.json | 1 + src/modules/logapi/controller.js | 130 +++++++++++++++++++++++++++++++ src/modules/logapi/router.js | 35 +++++++++ 4 files changed, 171 insertions(+) create mode 100644 src/modules/logapi/controller.js create mode 100644 src/modules/logapi/router.js diff --git a/package-lock.json b/package-lock.json index 4fb5696..c600b7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3836,6 +3836,11 @@ "type-check": "~0.3.2" } }, + "line-reader": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.4.0.tgz", + "integrity": "sha1-F+RIGNoKwzVnW6MAlU+U72cOZv0=" + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", diff --git a/package.json b/package.json index 2c5f5d7..c81a397 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "koa-passport": "^4.1.1", "koa-router": "^7.0.1", "koa-static": "^5.0.0", + "line-reader": "^0.4.0", "mongoose": "^5.5.12", "passport-local": "^1.0.0", "request": "^2.85.0", diff --git a/src/modules/logapi/controller.js b/src/modules/logapi/controller.js new file mode 100644 index 0000000..42b144e --- /dev/null +++ b/src/modules/logapi/controller.js @@ -0,0 +1,130 @@ +const lineReader = require('line-reader') +const fs = require('fs') + +let _this + +class LogsApi { + constructor () { + _this = this + } + + /** + * @api {post} /logapi Parse and return the log files. + * @apiPermission public + * @apiName LogApi + * @apiGroup Logs + * + * @apiExample Example usage: + * curl -H "Content-Type: application/json" -X POST -d '{ "password": "secretpasas" }' localhost:5000/logapi + * + * @apiParam {String} password Password (required) + * + * @apiSuccess {Array} users User object + * @apiSuccess {ObjectId} users._id User id + * @apiSuccess {String} user.type User type (admin or user) + * @apiSuccess {String} users.name User name + * @apiSuccess {String} users.username User username + * + * @apiSuccessExample {json} Success-Response: + * HTTP/1.1 200 OK + * { + * "user": { + * "_id": "56bd1da600a526986cf65c80" + * "name": "John Doe" + * "username": "johndoe" + * } + * } + * + * @apiError UnprocessableEntity Missing required parameters + * + * @apiErrorExample {json} Error-Response: + * HTTP/1.1 422 Unprocessable Entity + * { + * "status": 422, + * "error": "Unprocessable Entity" + * } + */ + async getLogs (ctx) { + try { + console.log('entering getLogs()') + + const password = ctx.request.body.password + _this.password = password + + if (password === 'test') { + const now = new Date() + const thisDate = now.getDate() + + let thisMonth = now.getMonth() + 1 + thisMonth = ('0' + thisMonth).slice(-2) + // console.log(`thisMonth: ${thisMonth}`) + + const filename = `koa-dev-2020-${thisMonth}-${thisDate}.log` + // console.log(`filename: ${filename}`) + const logDir = `${__dirname}/../../../logs/` + const fullPath = `${logDir}${filename}` + // console.log(`fullPath: ${fullPath}`) + + // const data = require(`${__dirname}/../../../logs/${filename}`) + // const data = await this.readFile(filename) + const data = await _this.readLines(fullPath) + // console.log(`data: ${JSON.stringify(data, null, 2)}`) + + ctx.body = { + success: true, + data + } + } else { + ctx.body = { + success: false + } + } + } catch (err) { + if (err) { + ctx.throw(500, err.message) + } else { + ctx.throw(500, 'Unhandled error') + console.log(`unhandled error: `, err) + } + } + } + + // Promise based read-file + readFile (path, opts = 'utf8') { + return new Promise((resolve, reject) => { + fs.readFile(path, opts, (err, data) => { + if (err) reject(err) + else resolve(data) + }) + }) + } + + // Returns an array with each element containing a line of the file. + readLines (filename) { + return new Promise((resolve, reject) => { + try { + const data = [] + let i = 0 + + lineReader.eachLine(filename, function (line, last) { + try { + data.push(JSON.parse(line)) + + // Uncomment to display the raw data in each line of the winston log file. + console.log(`line ${i}: ${line}`) + i++ + + if (last) return resolve(data) + } catch (err) { + console.log(`err: `, err) + } + }) + } catch (err) { + console.log(`Error in readLines()`) + return reject(err) + } + }) + } +} + +module.exports = LogsApi diff --git a/src/modules/logapi/router.js b/src/modules/logapi/router.js new file mode 100644 index 0000000..50fcebf --- /dev/null +++ b/src/modules/logapi/router.js @@ -0,0 +1,35 @@ +// const validator = require('../../middleware/validators') +const LogApi = require('./controller') +const logApi = new LogApi() + +module.exports.baseUrl = '/logapi' + +module.exports.routes = [ + { + method: 'POST', + route: '/', + handlers: [logApi.getLogs] + } + /* + { + method: 'GET', + route: '/', + handlers: [validator.ensureUser, user.getUsers] + }, + { + method: 'GET', + route: '/:id', + handlers: [validator.ensureUser, user.getUser] + }, + { + method: 'PUT', + route: '/:id', + handlers: [validator.ensureTargetUserOrAdmin, user.getUser, user.updateUser] + }, + { + method: 'DELETE', + route: '/:id', + handlers: [validator.ensureTargetUserOrAdmin, user.getUser, user.deleteUser] + } + */ +]