From 03a9c793d8cb7aef6544287be780e73d644dcc93 Mon Sep 17 00:00:00 2001 From: ruihildt Date: Thu, 1 Aug 2019 16:25:44 +0200 Subject: [PATCH] Add sessions endpoints with queries --- .gitignore | 2 +- README.md | 21 ++++----- api/server.js | 2 + ...eateUsersSessionsAndDailyAveragesTables.js | 16 ++++--- data/seeds/01-addUsers.js.bak | 19 ++++++++ data/seeds/02-addSessions.js | 25 ++++++++++ data/sleep-tracker.db3 | Bin 0 -> 36864 bytes services/auth/authRouter.js | 4 +- services/sessions/sessionsModel.js | 39 ++++++++++++++++ services/sessions/sessionsRouter.js | 43 ++++++++++++++++++ services/users/usersModel.js | 24 +++++----- services/users/usersRouter.js | 8 ++-- 12 files changed, 167 insertions(+), 36 deletions(-) create mode 100644 data/seeds/01-addUsers.js.bak create mode 100644 data/seeds/02-addSessions.js create mode 100644 data/sleep-tracker.db3 create mode 100644 services/sessions/sessionsModel.js create mode 100644 services/sessions/sessionsRouter.js diff --git a/.gitignore b/.gitignore index 9cc338a..c4f68bb 100644 --- a/.gitignore +++ b/.gitignore @@ -64,5 +64,5 @@ typings/ .vscode # Databases -data/sleep-tracker.db3 +# data/sleep-tracker.db3 data/test.db3 \ No newline at end of file diff --git a/README.md b/README.md index 4040d00..3f57f01 100644 --- a/README.md +++ b/README.md @@ -48,17 +48,16 @@ Sleep Tracker is intended for anyone interested in improving their sleep and hea ## API Endpoints -- `POST /api/auth/register` - add a new user -- `POST /api/auth/login` - login with user/password +- [x] `POST /api/auth/register` - add a new user +- [x] `POST /api/auth/login` - login with user/password -- `GET /api/users/:id` - fetch a user -- `PUT /api/users/:id` - update a user -- `DELETE /api/users/:id` - delete a user +- [x] `GET /api/users/:id` - fetch a user +- [x] `PUT /api/users/:id` - update a user +- [x] `DELETE /api/users/:id` - delete a user -- `GET /api/users/:id/sessions` - fetch list of all sessions by user id -- `POST /api/users/:id/sessions` - add a session by user id -- `GET /api/users/:id/sessions/:id` - fetch a single session by id -- `PUT /api/users/:id/sessions/:id` - update a session by id -- `DELETE /api/users/:id/sessions/:id` - delete a session by id +- [x] `GET /api/users/:id/sessions` - fetch list of all sessions by user id +- [x] `POST /api/users/sessions` - add a session +- [x] `PUT /api/users/sessions/:id` - update a session by id +- [x] `DELETE /api/users/sessions/:id` - delete a session by id -- `GET /api/dailyaverages/:id` - fetch a list of last 30 daily averages by user id \ No newline at end of file +- [ ] `GET /api/dailyaverages/:id` - fetch a list of last 30 daily averages by user id \ No newline at end of file diff --git a/api/server.js b/api/server.js index 0c10738..f8c1440 100644 --- a/api/server.js +++ b/api/server.js @@ -4,6 +4,7 @@ const cors = require('cors'); const authRouter = require('../services/auth/authRouter'); const usersRouter = require('../services/users/usersRouter'); +const sessionsRouter = require('../services/sessions/sessionsRouter'); const server = express(); @@ -13,5 +14,6 @@ server.use(cors()); server.use('/api/auth', authRouter); server.use('/api/users', usersRouter); +server.use('/api/users', sessionsRouter); module.exports = server; diff --git a/data/migrations/01-createUsersSessionsAndDailyAveragesTables.js b/data/migrations/01-createUsersSessionsAndDailyAveragesTables.js index b3acc8d..edaa281 100644 --- a/data/migrations/01-createUsersSessionsAndDailyAveragesTables.js +++ b/data/migrations/01-createUsersSessionsAndDailyAveragesTables.js @@ -34,10 +34,13 @@ exports.up = function(knex) { tbl .datetime('wake_time'); tbl - .integer('bed_tiredness') + .integer('wake_mood') .unsigned(); tbl - .integer('wake_mood') + .integer('day_mood') + .unsigned(); + tbl + .integer('bed_tiredness') .unsigned(); }) @@ -45,16 +48,17 @@ exports.up = function(knex) { tbl .increments(); tbl - .integer('session_user') + .integer('session_id') .unsigned() .notNullable() - .references('sessions.user_id') + .references('sessions.id') .onUpdate('CASCADE') .onDelete('CASCADE'); tbl - .datetime('session_date') + .integer('user_id') + .unsigned() .notNullable() - .references('sessions.wake_time') + .references('users.id') .onUpdate('CASCADE') .onDelete('CASCADE'); tbl diff --git a/data/seeds/01-addUsers.js.bak b/data/seeds/01-addUsers.js.bak new file mode 100644 index 0000000..96ad24f --- /dev/null +++ b/data/seeds/01-addUsers.js.bak @@ -0,0 +1,19 @@ +exports.seed = function(knex) { + return knex('users').truncate() + .then(function () { + return knex('users').insert([ + // { + // id: 1, + // email: 'gabe@ls.com', + // username: 'gabe', + // password: '1234' + // }, + // { + // id: 2, + // email: 'gabe2@ls.com', + // username: 'gabe2', + // password: '1234' + // } + ]); + }); +}; diff --git a/data/seeds/02-addSessions.js b/data/seeds/02-addSessions.js new file mode 100644 index 0000000..7ef59bb --- /dev/null +++ b/data/seeds/02-addSessions.js @@ -0,0 +1,25 @@ +exports.seed = function(knex) { + return knex('sessions').truncate() + .then(function () { + return knex('sessions').insert([ + { + "id": 1, + "user_id": 1, + "bed_time": "", + "wake_time": "", + "wake_mood": 3, + "day_mood": 3, + "bed_tiredness": 3 + }, + { + "id": 2, + "user_id": 1, + "bed_time": "", + "wake_time": "", + "wake_mood": 4, + "day_mood": 4, + "bed_tiredness": 4 + } + ]); + }); +}; diff --git a/data/sleep-tracker.db3 b/data/sleep-tracker.db3 new file mode 100644 index 0000000000000000000000000000000000000000..f9333f4836eb52ef982014c69346d19d5ce122fa GIT binary patch literal 36864 zcmeI&O-~y~7zgkjug%&4v#3?Hy&#Pmq}U=QK;xoRJz$KhqyiKNh?-u!gFQBj_XT$C zBpgj!_0!~Dsp_qlUV5o|=?6%URn<$RTspJM8n0s_6*!>izw*oM%zEaT-^^Ox@ov{P ztS+Z5&v#gteyYqUgea?&DvF|uXHGohO%sW9yd&PpQ2M;2t}NW6c~P3p{h{dP>A$DH z%Kwm`oBDBbUu0l|00bZa0SG_<0uZKqRgZP(`uU3a=X0Eed>B$>h^4#9{QHU{A1eT$CUNDp5-=t?r^tz zhnfKo0?Tvj<31>gdja>)D+_GS59`gI&$^<9LA&BpEDF8uc%F!-WqV9CC4RATtL@4t z3d7A7sn1*7=Wc@sgLncn>`Re)E^Ts~i(kBz@^+=XUX?k$!zMe+8L2uBIa#mF{Xdl! zPc}8pn4KlxIpL6;ItB52HaQS+_JzhEj`*#S6O?vEhOby0Wls;!2K2jX# zM)s$3L1Z@B@#%P+;b|DokJ`HOHk>hjfP4zKrI z>!`=WOzjkQck5wow@M#wtyjN}=3y{;yea2GI7LP9g)kv&Gm9*v8B3xqZKy5oh?8o# zp^0}iG<@(#D`AmY?60OZ!!XE6bjF6EhcB7r#0c{)G%KQp=riUw_L*N;E|rSILoX{1 zdwcE?hb#!5d%idW$JSBof2?XosYLqiaE5nW{-W+!?dWt4>bBSDjLSu;u)lJc z2Xkr=`8&Uitf*Cf_9a$)l$tQ+=gHIPBs{XkwQoJ(VzS7ui{!4F2yCRVAg%6*PZs-M z5KUHja(7&}N4k?r)M<{CUT9q39yD=w?y+uTf1o8Y1_Lp2dKcxjInjSn!~+`yAOHaf zKmY;|fB*y_009U<00P%o;B%5uI=Rf^(kEgeRxIo7%Eig;XeBl%yUq3C_1_)2A{;Cn z1jOF-e!d~E|I_+UivE}WyZ)<4V1obzAOHafKmY;|fB*y_009U<;5rFRrPWyy-zk*I zs;ZF-Zx8t(rOxL@ZY?l~S{ls@Z^?-M|9_+CZ?03<5DNq#009U<00Izz00bZa0SG_< z0#_uU5>?4Y*Z(gS{pA(aifSML0SG_<0uX=z1Rwwb2tWV=5V)K`jZ7%FZuT>6w#QfP zV4>kTGC8-*=9U)cKJzNe%XimG_g5bH2P;oEN(=59wUBNpmlG@Z#?PU5D^jmA4NQ{K>z{}fB*y_009U<00Izz00bcLz6eaKw{k=42hsKa zYej$kzH|`%fB*y_009U<00Izz00bZa0SG`K7SPn2;WB`{|39U_QuKfISNfm&Z*e)^ zApijgKmY;|fB*y_009U<00I!W#sVMZ@_CXYDOJQc6{jatSw*G^NvG43B;HX~RbKxq gGuOC32n_-dfB*y_009U<00Izz00bZaflCYg2VroU1^@s6 literal 0 HcmV?d00001 diff --git a/services/auth/authRouter.js b/services/auth/authRouter.js index 7f024e5..56ce819 100644 --- a/services/auth/authRouter.js +++ b/services/auth/authRouter.js @@ -9,7 +9,7 @@ router.post('/register', (req, res) => { const hash = bcrypt.hashSync(user.password, 10); user.password = hash; - Users.add(user) + Users.addUser(user) .then(saved => { res.status(201).json(saved); }) @@ -21,7 +21,7 @@ router.post('/register', (req, res) => { router.post('/login', (req, res) => { let { username, password } = req.body; - Users.findBy({ username }) + Users.findUserBy({ username }) .first() .then(user => { if (user && bcrypt.compareSync(password, user.password)) { diff --git a/services/sessions/sessionsModel.js b/services/sessions/sessionsModel.js new file mode 100644 index 0000000..b32322a --- /dev/null +++ b/services/sessions/sessionsModel.js @@ -0,0 +1,39 @@ +const db = require('../../data/dbConfig'); + +module.exports = { + addSession, + findUserSessions, + updateSession, + removeSession +}; + +async function addSession(session) { + const [id] = await db('sessions') + .insert(session); + return findSessionById(id); +} + +function findUserSessions(user_id) { + return db + .from("sessions") + .where({ user_id }); +} + +function findSessionById(id) { + return db('sessions') + .where({ id }) + .first(); +} + +async function updateSession(id, changes) { + await db('sessions') + .where({ id }) + .update(changes, '*'); + return findSessionById(id); +} + +async function removeSession(id) { + await db('sessions') + .where({ id }) + .del(); +} \ No newline at end of file diff --git a/services/sessions/sessionsRouter.js b/services/sessions/sessionsRouter.js new file mode 100644 index 0000000..73e9687 --- /dev/null +++ b/services/sessions/sessionsRouter.js @@ -0,0 +1,43 @@ +const router = require('express').Router(); + +const { authenticate } = require('../auth/authenticate'); +const Sessions = require('../sessions/sessionsModel'); + +router.post('/sessions', authenticate, (req, res) => { + Sessions.addSession(req.body) + .then(response => { + res.status(200).json(response); + }) + .catch(err => res.send(err)); +}); + +router.get('/:id/sessions', authenticate, (req, res) => { + Sessions.findUserSessions(req.params.id) + .then(users => { + res.status(200).json(users); + }) + .catch(err => res.send(err)); +}); + +router.put('/sessions/:id', authenticate, async (req, res) => { + Sessions.updateSession(req.params.id, req.body) + .then(session => { + if (session) { + res.status(200).json(session); + } else { + res.status(404).json({ message: 'The session could not be found' }); + } + }) + .catch(err => { + res.status(500).json(err); + }); +}); + +router.delete("/sessions/:id", authenticate, async (req, res) => { + Sessions.removeSession(req.params.id) + .then(() => res.status(200).json({ message: 'The session has been successfully deleted' })) + .catch(err => res.json(err)); +}); + + +module.exports = router; diff --git a/services/users/usersModel.js b/services/users/usersModel.js index 704bf9e..5e128ae 100644 --- a/services/users/usersModel.js +++ b/services/users/usersModel.js @@ -1,39 +1,39 @@ const db = require('../../data/dbConfig'); module.exports = { - add, - findBy, - findById, - update, - remove + addUser, + findUserBy, + findUserById, + updateUser, + removeUser }; -function findBy(filter) { +function findUserBy(filter) { return db('users') .where(filter); } -async function add(user) { +async function addUser(user) { const [id] = await db('users') .insert(user); - return findById(id); + return findUserById(id); } -function findById(id) { +function findUserById(id) { return db('users') .where({ id }) .first() .select('id', 'email', 'username'); } -async function update(id, changes) { +async function updateUser(id, changes) { await db('users') .where({ id }) .update(changes, '*'); - return findById(id); + return findUserById(id); } -function remove(id) { +function removeUser(id) { return db('users') .where({ id }) .del(); diff --git a/services/users/usersRouter.js b/services/users/usersRouter.js index 487387b..a1163ec 100644 --- a/services/users/usersRouter.js +++ b/services/users/usersRouter.js @@ -4,7 +4,7 @@ const { authenticate } = require('../auth/authenticate'); const Users = require('../users/usersModel'); router.get('/:id', authenticate, (req, res) => { - Users.findById(req.params.id) + Users.findUserById(req.params.id) .then(users => { res.status(200).json(users); }) @@ -12,8 +12,8 @@ router.get('/:id', authenticate, (req, res) => { }); router.put('/:id', authenticate, async (req, res) => { - Users.update(req.params.id, req.body) - .then( user => { + Users.updateUser(req.params.id, req.body) + .then(user => { if (user) { res.status(200).json(user); } else { @@ -24,7 +24,7 @@ router.put('/:id', authenticate, async (req, res) => { }); router.delete("/:id", (req, res) => { - Users.remove(req.params.id) + Users.removeUser(req.params.id) .then(data => res.status(200).json(data)) .catch(err => res.json(err)); });