diff --git a/API/config/database.js b/API/config/database.js new file mode 100644 index 0000000..acd7230 --- /dev/null +++ b/API/config/database.js @@ -0,0 +1,10 @@ +module.exports = { + hrPool: { + user: "system", + password: "shukhu", + connectString: "localhost:1521/xe", + poolMin: 10, + poolMax: 10, + poolIncrement: 0 + } +}; \ No newline at end of file diff --git a/API/config/web-server.js b/API/config/web-server.js new file mode 100644 index 0000000..98827b8 --- /dev/null +++ b/API/config/web-server.js @@ -0,0 +1,3 @@ +module.exports = { +port : process.env.HTTP_PORT || 3000 +}; \ No newline at end of file diff --git a/API/controllers/add.js b/API/controllers/add.js new file mode 100644 index 0000000..41f3365 --- /dev/null +++ b/API/controllers/add.js @@ -0,0 +1,27 @@ +const users = require('../db_apis/add.js'); +function getUserFromRec(req) { + const user = { + name: req.body.name, + email: req.body.email, + password: req.body.password, + contact: req.body.contact, + city: req.body.city, + address: req.body.address + }; + + return user; +} + +async function post(req, res, next) { + try { + + let user = getUserFromRec(req); + user = await users.create(user); + + res.status(201).json(user); + } catch (err) { + next(err); + } +} + +module.exports.post = post; \ No newline at end of file diff --git a/API/controllers/change.js b/API/controllers/change.js new file mode 100644 index 0000000..e9ac078 --- /dev/null +++ b/API/controllers/change.js @@ -0,0 +1,28 @@ +const change = require('../db_apis/change.js'); + +async function put(req, res, next) { + try { + const context = {}; + + context.id = parseInt(req.params.id, 10); + + + + if (req.params.id) { + const rows = await change.put(context.id,req.body.password); + if (rows===1) { + + res.status(200).end(); + + } else { + res.status(404).end(); + } + } else { + res.status(400).end(); + } + } catch (err) { + next(err); + } +} + +module.exports.put = put; \ No newline at end of file diff --git a/API/controllers/del.js b/API/controllers/del.js new file mode 100644 index 0000000..beca97b --- /dev/null +++ b/API/controllers/del.js @@ -0,0 +1,16 @@ +const users = require('../db_apis/del.js'); + +async function del(req, res, next) { + try { + const id = parseInt(req.params.id, 10); + const success = await users.delete(id); + if (success) { + res.status(204).end(); + } else { + res.status(404).end(); + } + } catch (err) { + next(err); + } +} +module.exports.delete = del; \ No newline at end of file diff --git a/API/controllers/search.js b/API/controllers/search.js new file mode 100644 index 0000000..1b22f08 --- /dev/null +++ b/API/controllers/search.js @@ -0,0 +1,26 @@ +const users = require('../db_apis/search.js'); + +async function get(req, res, next) { + try { + const context = {}; + + context.tag = req.params.tag; + + const rows = await users.find(context); + + if (req.params.tag) { + if (rows.length > 0) { + res.status(200).json(rows); + + } else { + res.status(404).end(); + } + } else { + res.status(404).end(); + } + } catch (err) { + next(err); + } +} + +module.exports.get = get \ No newline at end of file diff --git a/API/controllers/users.js b/API/controllers/users.js new file mode 100644 index 0000000..517f76b --- /dev/null +++ b/API/controllers/users.js @@ -0,0 +1,26 @@ +const users = require('../db_apis/users.js'); + +async function get(req, res, next) { + try { + const context = {}; + + context.id = parseInt(req.params.id, 10); + + const rows = await users.find(context); + + if (req.params.id) { + if (rows.length === 1) { + res.status(200).json(rows[0]); + + } else { + res.status(404).end(); + } + } else { + res.status(200).json(rows); + } + } catch (err) { + next(err); + } +} + +module.exports.get = get \ No newline at end of file diff --git a/API/db_apis/add.js b/API/db_apis/add.js new file mode 100644 index 0000000..4a82a3c --- /dev/null +++ b/API/db_apis/add.js @@ -0,0 +1,38 @@ +const database = require('../services/database.js'); +const oracledb = require('oracledb'); +const createSql = + `insert into users ( + id, + name, + email, + password, + contact, + city, + address + ) values ( + :user_id, + :name, + :email, + :password, + :contact, + :city, + :address + )`; + +async function create(id) { + const user = Object.assign({}, id); + var query = "SELECT id FROM users order by id desc"; + var res = await database.simpleExecute(query); + + user.user_id=1; + if(res.rows.length>0) + user.user_id += res.rows[0].ID; + const result = await database.simpleExecute(createSql, user); + + + return user.user_id; + + +} + +module.exports.create = create; \ No newline at end of file diff --git a/API/db_apis/change.js b/API/db_apis/change.js new file mode 100644 index 0000000..872545d --- /dev/null +++ b/API/db_apis/change.js @@ -0,0 +1,25 @@ + +const database = require('../services/database.js'); + +let baseQuery = + `update users set password = :pass + where id = :user_id`; + + +async function put(id,password) { + const binds = { + + }; + binds.user_id=id; + +let query = `select * from users + where id = :user_id`; +var result = await database.simpleExecute(query, binds); +if(result.rows.length === 1) +{ + binds.pass=password; + const result1 = await database.simpleExecute(baseQuery, binds); + return 1;} +else + return 0;} +module.exports.put = put; diff --git a/API/db_apis/del.js b/API/db_apis/del.js new file mode 100644 index 0000000..d96728e --- /dev/null +++ b/API/db_apis/del.js @@ -0,0 +1,24 @@ + +const database = require('../services/database.js'); + +let baseQuery = + `delete from users + where id = :user_id`; + + +async function del(id) { + const binds = { + + }; + binds.user_id=id; +let query = `select * from users + where id = :user_id`; +const result = await database.simpleExecute(query, binds); +if(result.rows.length === 1) +{ + const result1 = await database.simpleExecute(baseQuery, binds); + return 1; +} +else + return 0;} +module.exports.delete = del; \ No newline at end of file diff --git a/API/db_apis/search.js b/API/db_apis/search.js new file mode 100644 index 0000000..386f202 --- /dev/null +++ b/API/db_apis/search.js @@ -0,0 +1,26 @@ + +const database = require('../services/database.js'); + + + +async function find(context) { + + const binds = {}; + + let user_tag ="'"+context.tag+"'"; + binds.user_id=context.tag; + + const baseQuery = + `select * + from users`; + let query = baseQuery; + query += '\nwhere name = '+ user_tag + ' or city = '+ user_tag + ' or email = '+ user_tag + 'or address = '+ user_tag + ' or contact = '+ user_tag; + + + + const result = await database.simpleExecute(query); + + return result.rows; +} + +module.exports.find = find; \ No newline at end of file diff --git a/API/db_apis/users.js b/API/db_apis/users.js new file mode 100644 index 0000000..4c32a2b --- /dev/null +++ b/API/db_apis/users.js @@ -0,0 +1,23 @@ + +const database = require('../services/database.js'); + +const baseQuery = + `select * + from users`; + +async function find(context) { + let query = baseQuery; + const binds = {}; + if (context.id) { + binds.user_id = context.id; + + query += `\nwhere id = :user_id`; + } + + + const result = await database.simpleExecute(query,binds); + + return result.rows; +} + +module.exports.find = find; \ No newline at end of file diff --git a/API/index.js b/API/index.js new file mode 100644 index 0000000..036f54f --- /dev/null +++ b/API/index.js @@ -0,0 +1,83 @@ +const webServer = require('./services/web-server.js'); +const database = require('./services/database.js'); +const dbConfig = require('./config/database.js'); +const defaultThreadPoolSize = 4; + +// Increase thread pool size by poolMax +process.env.UV_THREADPOOL_SIZE = dbConfig.hrPool.poolMax + defaultThreadPoolSize; + +async function startup() { + console.log('Starting application'); + + try { + console.log('Initializing web server module'); + + await webServer.initialize(); + } catch (err) { + console.error(err); + + process.exit(1); // Non-zero failure code + } +try { + console.log('Initializing database module'); + + database.initialize(); + } catch (err) { + console.error(err); + + process.exit(1); // Non-zero failure code + } +} + +startup(); +async function shutdown(e) { + let err = e; + + console.log('Shutting down'); + + try { + console.log('Closing web server module'); + + await webServer.close(); + } catch (e) { + console.log('Encountered error', e); + + err = err || e; + } + try { + console.log('Closing database module'); + + await database.close(); + } catch (err) { + console.log('Encountered error', e); + + err = err || e; + } + + console.log('Exiting process'); + + if (err) { + process.exit(1); // Non-zero failure code + } else { + process.exit(0); + } +} + +process.on('SIGTERM', () => { + console.log('Received SIGTERM'); + + shutdown(); +}); + +process.on('SIGINT', () => { + console.log('Received SIGINT'); + + shutdown(); +}); + +process.on('uncaughtException', err => { + console.log('Uncaught exception'); + console.error(err); + + shutdown(err); +}); \ No newline at end of file diff --git a/API/package-lock.json b/API/package-lock.json new file mode 100644 index 0000000..6feb052 --- /dev/null +++ b/API/package-lock.json @@ -0,0 +1,420 @@ +{ + "name": "app", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "oracledb": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oracledb/-/oracledb-3.1.1.tgz", + "integrity": "sha512-NqXMg+5QDdpjA93uQPskVKC4oyXMhBh5Q2THzmEmiZm5ywa5zCUX11ZItZbE4HTXRUXU5M0OX6tO0w3HvyYaEw==" + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } +} diff --git a/API/package.json b/API/package.json new file mode 100644 index 0000000..02277cc --- /dev/null +++ b/API/package.json @@ -0,0 +1,19 @@ +{ + "name": "app", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "body-parser": "^1.18.3", + "connect": "^3.6.6", + "express": "^4.16.4", + "morgan": "^1.9.1", + "oracledb": "^3.1.1" + } +} diff --git a/API/services/database.js b/API/services/database.js new file mode 100644 index 0000000..2853bd0 --- /dev/null +++ b/API/services/database.js @@ -0,0 +1,41 @@ +const oracledb = require('oracledb'); +const dbConfig = require('../config/database.js'); + +async function initialize() { + const pool = await oracledb.createPool(dbConfig.hrPool); +} + +module.exports.initialize = initialize; +async function close() { + await oracledb.getPool().close(); +} + +module.exports.close = close; +function simpleExecute(statement, binds = [], opts = {}) { + return new Promise(async (resolve, reject) => { + let conn; + + opts.outFormat = oracledb.OBJECT; + opts.autoCommit = true; + + try { + conn = await oracledb.getConnection(); + + const result = await conn.execute(statement, binds, opts); + + resolve(result); + } catch (err) { + reject(err); + } finally { + if (conn) { // conn assignment worked, need to close + try { + await conn.close(); + } catch (err) { + console.log(err); + } + } + } + }); +} + +module.exports.simpleExecute = simpleExecute; \ No newline at end of file diff --git a/API/services/router.js b/API/services/router.js new file mode 100644 index 0000000..197bced --- /dev/null +++ b/API/services/router.js @@ -0,0 +1,21 @@ +const express = require('express'); +const router = new express.Router(); +const users = require('../controllers/users.js'); +const search= require('../controllers/search.js'); +const add= require('../controllers/add.js'); +const del= require('../controllers/del.js'); +const change= require('../controllers/change.js'); +router.route('/users/getById/:id?') + .get(users.get); +router.route('/users/deleteById/:id?') + .delete(del.delete); +router.route('/users/getAll') + .get(users.get); + router.route('/users/search/:tag?') + .get(search.get); +router.route('/users/add') + .post(add.post); + router.route('/users/change/:id?/password') + .put(change.put); + +module.exports = router; \ No newline at end of file diff --git a/API/services/web-server.js b/API/services/web-server.js new file mode 100644 index 0000000..7f7bf08 --- /dev/null +++ b/API/services/web-server.js @@ -0,0 +1,54 @@ +const http = require('http'); +const express = require('express'); +const morgan = require('morgan'); +const database = require('./database.js'); +const webServerConfig = require('../config/web-server.js'); +const router = require('./router.js'); + + + +let httpServer; + +function initialize() { + return new Promise((resolve, reject) => { + const app = express(); + httpServer = http.createServer(app); + app.use(morgan('combined')); +app.use(express.json()); + +app.use('/api', router); + app.get('/', async (req, res) => { + const result = await database.simpleExecute('select user, systimestamp from dual'); + const user = result.rows[0].USER; + const date = result.rows[0].SYSTIMESTAMP; + + res.end(`DB user: ${user}\nDate: ${date}`); + }); + + httpServer.listen(webServerConfig.port) + .on('listening', () => { + console.log(`Web server listening on localhost:${webServerConfig.port}`); + + resolve(); + }) + .on('error', err => { + reject(err); + }); + }); +} + +module.exports.initialize = initialize; +function close() { + return new Promise((resolve, reject) => { + httpServer.close((err) => { + if (err) { + reject(err); + return; + } + + resolve(); + }); + }); +} + +module.exports.close = close; \ No newline at end of file diff --git a/Database/users.sql b/Database/users.sql new file mode 100644 index 0000000..a3fb934 --- /dev/null +++ b/Database/users.sql @@ -0,0 +1,63 @@ +-------------------------------------------------------- +-- File created - Monday-February-04-2019 +-------------------------------------------------------- +-------------------------------------------------------- +-- DDL for Table USERS +-------------------------------------------------------- + + CREATE TABLE "SYSTEM"."USERS" + ( "ID" NUMBER(*,0), + "NAME" VARCHAR2(255 BYTE), + "EMAIL" VARCHAR2(255 BYTE), + "PASSWORD" VARCHAR2(255 BYTE), + "CONTACT" VARCHAR2(255 BYTE), + "CITY" VARCHAR2(255 BYTE), + "ADDRESS" VARCHAR2(255 BYTE) + ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING + STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 + PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) + TABLESPACE "SYSTEM" ; +REM INSERTING into SYSTEM.USERS +SET DEFINE OFF; +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (3,'punam','shukhu4@gmail.com','password','8420591712','kolkata','kestopur'); +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (4,'prabhat','sinha@gmail.com','prabh','9999433762','kolkata','kestopur'); +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (5,'priyonkar','pinku@gmail.com','bulbasur','0332591640','kolkata','rabindrapallyr'); +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (6,'hello','worldhello@gmail.com','world','6977543210','india','talbagan'); +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (7,'suraj','jhawar@gmail.com','sun','6977512340','kolkata','howrah'); +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (8,'sumit','sum@gmail.com','summit','6977152340','delhi','metro station'); +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (9,'shubham','khush@gmail.com','bharti','6797152340','jaipur','somewhere'); +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (1,'shubham','dan@fakemail.com','McGhan','1233211234','IT_PROG','2014-12-14T00:00:00.000Z'); +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (2,'shubham','shukhu10@gmail.com','shu','9748669897','kolkata','kestopur'); +Insert into SYSTEM.USERS (ID,NAME,EMAIL,PASSWORD,CONTACT,CITY,ADDRESS) values (10,'pranay','prenav@gmail.com','pandu','9797152340','agra','taj mahal'); +-------------------------------------------------------- +-- DDL for Index SYS_C004047 +-------------------------------------------------------- + + CREATE UNIQUE INDEX "SYSTEM"."SYS_C004047" ON "SYSTEM"."USERS" ("ID") + PCTFREE 10 INITRANS 2 MAXTRANS 255 + STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 + PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) + TABLESPACE "SYSTEM" ; +-------------------------------------------------------- +-- Constraints for Table USERS +-------------------------------------------------------- + + ALTER TABLE "SYSTEM"."USERS" MODIFY ("ID" NOT NULL ENABLE); + + ALTER TABLE "SYSTEM"."USERS" MODIFY ("NAME" NOT NULL ENABLE); + + ALTER TABLE "SYSTEM"."USERS" MODIFY ("EMAIL" NOT NULL ENABLE); + + ALTER TABLE "SYSTEM"."USERS" MODIFY ("PASSWORD" NOT NULL ENABLE); + + ALTER TABLE "SYSTEM"."USERS" MODIFY ("CONTACT" NOT NULL ENABLE); + + ALTER TABLE "SYSTEM"."USERS" MODIFY ("CITY" NOT NULL ENABLE); + + ALTER TABLE "SYSTEM"."USERS" MODIFY ("ADDRESS" NOT NULL ENABLE); + + ALTER TABLE "SYSTEM"."USERS" ADD PRIMARY KEY ("ID") + USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 + STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 + PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) + TABLESPACE "SYSTEM" ENABLE; diff --git a/PERSONAL INFORMATION.txt b/PERSONAL INFORMATION.txt new file mode 100644 index 0000000..9b0c2e1 --- /dev/null +++ b/PERSONAL INFORMATION.txt @@ -0,0 +1,4 @@ +NAME : SHUBHAM KUMAR +EMAIL ID : shukhu10@gmail.com +CONTACT : +91 9748669897 +CITY : KOLKATA \ No newline at end of file diff --git a/README.md b/README.md index e63c078..0255ad6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,68 @@ -# back-end-task -Build REST APIs server using Node.js and Express.js on any database of your choice. +The api works for all the required functions i.e. + +/getAll - To get all the entries in your database(with pagination support if you can). +/getById - To get just one entry by ID. +/search - To get all the entries in your database with at least one attribute containing the string that is passed in the arguments. +/add - To add a new entry in the database. +/deleteById - To delete an entry by ID. + +This api works on oracle database and also have some additional function like changing password of the user etc. + +Requirements -- >require('http') + >require('express') + >require('morgan') + >require('oracledb') + + +How to use the functions : + +>getAll - USE - To get all the informations of all the users. + URL - http://localhost:3000/api/users/getAll + REQUEST - get + RESPOND - JSON data + +>getById - USE - To get all the information of a user having the required user id. + URL - http://localhost:3000/api/users/getById/:id? + REQUEST - get + RESPOND - JSON data + +>search - USE - To serach a string throughout the database(except the password column for security purpose). + URL - http://localhost:3000/api/users/search/:tag? + REQUEST - get + RESPOND - JSON data + +>add - USE - To add new user tothe database. + URL - http://localhost:3000/api/users/add + REQUEST - post + CONTEXT TYPE - application/JSON + DATA FORMAT - { + "name":"", + "password": "", + "email": "", + "city": "", + "address": "
", + "contact": "" + } + RESPOND - User id if data added. + +>deleteById - USE - To delete a user from the database. + + URL - http://localhost:3000/api/users/deleteById/:id? + REQUEST - delete + RESPOND - status = 204 if user id found and deleted + status = 404 if user id not found. + +>password - USE - To change the password of given user. + URL - http://localhost:3000/api/users/change/:id?/password + REQUEST - put + CONTEXT TYPE - application/JSON + DATA FORMAT - { + "password": "" + } + RESPOND - status = 200 if user id found and password changed + status = 404 if user id not found. + status = 400 if user id not entered. + +CREATED BY -> SHUBHAM KUMAR + EMAIL ID : shukhu10@gmail.com + CONTACT : +91 9748669897 diff --git a/ScreenShots/add.png b/ScreenShots/add.png new file mode 100644 index 0000000..2a67809 Binary files /dev/null and b/ScreenShots/add.png differ diff --git a/ScreenShots/change.png b/ScreenShots/change.png new file mode 100644 index 0000000..1365c10 Binary files /dev/null and b/ScreenShots/change.png differ diff --git a/ScreenShots/deleteById.png b/ScreenShots/deleteById.png new file mode 100644 index 0000000..55d9cc0 Binary files /dev/null and b/ScreenShots/deleteById.png differ diff --git a/ScreenShots/getAll.png b/ScreenShots/getAll.png new file mode 100644 index 0000000..3160abd Binary files /dev/null and b/ScreenShots/getAll.png differ diff --git a/ScreenShots/getById.png b/ScreenShots/getById.png new file mode 100644 index 0000000..b6a17cb Binary files /dev/null and b/ScreenShots/getById.png differ diff --git a/ScreenShots/search.png b/ScreenShots/search.png new file mode 100644 index 0000000..b176c3f Binary files /dev/null and b/ScreenShots/search.png differ