From da957aadb59eaa7b6d8abe85ee5ee14bc65646ef Mon Sep 17 00:00:00 2001 From: Jose Carlos Date: Thu, 1 Apr 2021 15:17:44 -0300 Subject: [PATCH] create meets endpoint --- index.js | 3 +- src/controllers/index.js | 8 +- src/controllers/meetController.js | 27 +++++++ src/controllers/sessionController.js | 4 +- src/environment/FilterMapper.js | 31 ++++++++ src/environment/FirestoreDB/index.js | 8 +- src/model/meet.js | 20 +++++ src/model/session.js | 3 +- src/model/team.js | 8 ++ src/repositories/index.js | 5 ++ .../meetRepository/meetRepository.js | 28 +++++++ src/repositories/sessionRepository/index.js | 6 -- src/repositories/teamRepository/teamFilter.js | 12 +++ src/router/index.js | 5 ++ src/router/meetRouter/meetMapper.js | 71 ++++++++++++++++++ src/router/meetRouter/meetRouter.js | 53 ++++++++++++++ src/router/sessionRouter/index.js | 6 +- src/router/sessionRouter/mapper.js | 13 ---- src/router/sessionRouter/sessionMapper.js | 73 +++++++++++++++++++ 19 files changed, 356 insertions(+), 28 deletions(-) create mode 100644 src/controllers/meetController.js create mode 100644 src/environment/FilterMapper.js create mode 100644 src/model/meet.js create mode 100644 src/repositories/meetRepository/meetRepository.js create mode 100644 src/repositories/teamRepository/teamFilter.js create mode 100644 src/router/meetRouter/meetMapper.js create mode 100644 src/router/meetRouter/meetRouter.js delete mode 100644 src/router/sessionRouter/mapper.js create mode 100644 src/router/sessionRouter/sessionMapper.js diff --git a/index.js b/index.js index 73c5234..71868cd 100644 --- a/index.js +++ b/index.js @@ -24,10 +24,11 @@ const repositories = new RepositoriesProvider(db) const notesRepository = repositories.provideNotesRepository() const sessionsRepository = repositories.provideSessionsRepository() const teamsRepository = repositories.provideTeamsRepository() +const meetsRepository = repositories.provideMeetsRepository() const ControllersProvider = env.controllers const controllersProvider = new ControllersProvider(notesRepository, sessionsRepository, - teamsRepository) + teamsRepository, meetsRepository) const auth = require('./src/middlewares/auth') const RouterProvider = env.router diff --git a/src/controllers/index.js b/src/controllers/index.js index b9520f9..2861230 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -1,12 +1,14 @@ const NoteController = require('./noteController') const SessionController = require('./sessionController') const TeamController = require('./teamController') +const MeetController = require('./meetController') class ControllersProvider { - constructor (noteRepository, sessionRepository, teamRepository) { + constructor (noteRepository, sessionRepository, teamRepository, meetRepository) { this.noteRepository = noteRepository this.sessionRepository = sessionRepository this.teamRepository = teamRepository + this.meetRepository = meetRepository } getNotesController () { @@ -20,6 +22,10 @@ class ControllersProvider { getTeamsController () { return new TeamController(this.teamRepository) } + + getMeetsController () { + return new MeetController(this.meetRepository) + } } module.exports = ControllersProvider diff --git a/src/controllers/meetController.js b/src/controllers/meetController.js new file mode 100644 index 0000000..01a8a42 --- /dev/null +++ b/src/controllers/meetController.js @@ -0,0 +1,27 @@ +class MeetController { + constructor (meetRepository) { + this.meetRepository = meetRepository + } + + async getMeets () { + return this.meetRepository.getMeets() + } + + async getMeet (meet) { + return this.meetRepository.getMeet(meet) + } + + async createMeet (meet) { + return this.meetRepository.createMeet(meet) + } + + async editMeet (meet) { + return this.meetRepository.editMeet(meet) + } + + async deleteMeet (meet) { + return this.meetRepository.deleteMeet(meet.id) + } +} + +module.exports = MeetController diff --git a/src/controllers/sessionController.js b/src/controllers/sessionController.js index 2581f8e..f6e3ae0 100644 --- a/src/controllers/sessionController.js +++ b/src/controllers/sessionController.js @@ -5,8 +5,8 @@ class SessionController { this.sessionRepository = sessionRepository } - async getAllSessions (meeting) { - return this.sessionRepository.getAllSessions(meeting) + async getAllSessions (meetingId) { + return this.sessionRepository.getAllSessions(meetingId) } async getSession (session) { diff --git a/src/environment/FilterMapper.js b/src/environment/FilterMapper.js new file mode 100644 index 0000000..7239222 --- /dev/null +++ b/src/environment/FilterMapper.js @@ -0,0 +1,31 @@ +class FilterMapper { + toFirestore (key) { + if (key === 'EQUALS') { + return '==' + } + if (key === 'CONTAINS') { + return 'array-contains' + } + if (key === 'NEQUALS') { + return '!=' + } + if (key === 'GREATERTHAN') { + return '>' + } + if (key === 'SMALLERTHAN') { + return '<' + } + if (key === 'CONTAINSANY') { + return 'array-contains-any' + } + if (key === 'EQGREATERTHAN') { + return '>=' + } + if (key === 'EQSMALLERTHAN') { + return '<=' + } + return '' + } +} + +module.exports = FilterMapper diff --git a/src/environment/FirestoreDB/index.js b/src/environment/FirestoreDB/index.js index 4705ce8..220073e 100644 --- a/src/environment/FirestoreDB/index.js +++ b/src/environment/FirestoreDB/index.js @@ -1,4 +1,5 @@ const admin = require('firebase-admin') +const FilterMapper = require('../FilterMapper') const db = admin.firestore() const settings = { timestampsInSnapshots: true } db.settings(settings) @@ -22,12 +23,17 @@ class FirestoreDB { if (data) { console.log('filtering') + var filter = data.getFilter() for (var field in data) { if (data[field] !== undefined && data[field] !== null) { if (field === 'id') { query = query.doc(data[field]) } else { - query = query.where(field, '==', data[field]) + if (filter[field] !== undefined && filter[field] !== null) { + query = query.where(field, FilterMapper.toFirestore(filter[field]), data[field]) + } else { + query = query.where(field, '==', data[field]) + } } } } diff --git a/src/model/meet.js b/src/model/meet.js new file mode 100644 index 0000000..ad97ced --- /dev/null +++ b/src/model/meet.js @@ -0,0 +1,20 @@ +class Meet { + constructor (id, date, idTeam, members) { + this.id = id + this.date = date + this.idTeam = idTeam + this.members = members + } + + // returns javascript object representation of team model + getMeet () { + return { + id: this.id, + date: this.date, + idTeam: this.idTeam, + members: this.members + } + } +} + +module.exports = Meet diff --git a/src/model/session.js b/src/model/session.js index 2763e65..2aa0aeb 100644 --- a/src/model/session.js +++ b/src/model/session.js @@ -1,8 +1,9 @@ class Session { - constructor (id, topics, timestamp) { + constructor (id, topics, timestamp, meetId) { this.id = id this.topics = topics this.timestamp = timestamp + this.meetId = this.meetId } getSession () { diff --git a/src/model/team.js b/src/model/team.js index b04f8f6..484d654 100644 --- a/src/model/team.js +++ b/src/model/team.js @@ -15,6 +15,14 @@ class Team { members: this.members } } + + getFilter () { + return { + name: 'EQUALS', + admin: 'EQUALS', + members: 'CONTAINS' + } + } } module.exports = Team diff --git a/src/repositories/index.js b/src/repositories/index.js index 1ec1759..6a4c033 100644 --- a/src/repositories/index.js +++ b/src/repositories/index.js @@ -1,6 +1,7 @@ const NoteRepository = require('./noteRepository') const SessionRepository = require('./sessionRepository') const TeamRepository = require('./teamRepository/teamRepository') +const MeetRepository = require('./meetRepository/meetRepository') class RepositoriesProvider { constructor (db) { @@ -18,6 +19,10 @@ class RepositoriesProvider { provideTeamsRepository () { return new TeamRepository(this.db) } + + provideMeetsRepository () { + return new MeetRepository(this.db) + } } module.exports = RepositoriesProvider diff --git a/src/repositories/meetRepository/meetRepository.js b/src/repositories/meetRepository/meetRepository.js new file mode 100644 index 0000000..3b2e075 --- /dev/null +++ b/src/repositories/meetRepository/meetRepository.js @@ -0,0 +1,28 @@ +class MeetRepository { + constructor (db) { + this.db = db + this.table = 'meets' + } + + async getMeets () { + return this.db.executeGetDB(this.table) + } + + async getMeet (meet) { + return this.db.executeGetDB(this.table, meet) + } + + async createMeet (meet) { + return this.db.executeInsert(this.table, meet.getMeet()) + } + + async editMeet (meet) { + return this.db.executeUpdateDB(this.table, meet.id, meet.getMeet()) + } + + async deleteMeet (id) { + return this.db.executeDelete(this.table, id) + } +} + +module.exports = MeetRepository diff --git a/src/repositories/sessionRepository/index.js b/src/repositories/sessionRepository/index.js index ba81296..a6d87c1 100644 --- a/src/repositories/sessionRepository/index.js +++ b/src/repositories/sessionRepository/index.js @@ -8,12 +8,6 @@ class SessionsRepository { return this.db.executeGetDB(this.table, session) } - // todo : getAllSession of a meeting - // eslint-disable-next-line no-use-before-define - async getAllSessions (meeting) { - return this.db.executeGetDB(this.table) - } - async createSession (session) { return this.db.executeInsert(this.table, session) } diff --git a/src/repositories/teamRepository/teamFilter.js b/src/repositories/teamRepository/teamFilter.js new file mode 100644 index 0000000..53f0dd5 --- /dev/null +++ b/src/repositories/teamRepository/teamFilter.js @@ -0,0 +1,12 @@ +class TeamFilter { + getFilter () { + return { + id: '==', + name: '==', + admin: '==', + members: 'contains' + } + } +} + +module.exports = TeamFilter diff --git a/src/router/index.js b/src/router/index.js index 3dc5e49..cc784ad 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,9 +1,11 @@ const notesFromSessionURL = '/notes/' const sessionURL = '/sessions/' const teamURL = '/teams/' +const meetURL = '/meets/' const NotesRouter = require('./notesRouter') const SessionRouter = require('./sessionRouter') const TeamRouter = require('./teamRouter/teamRouter') +const MeetRouter = require('./meetRouter/meetRouter') class RouterProvider { constructor (app, controllers, auth) { @@ -24,6 +26,9 @@ class RouterProvider { var teamRouter = new TeamRouter(this.controllers.getTeamsController()) this.app.use(teamURL, teamRouter.getRoutes()) + + var meetRouter = new MeetRouter(this.controllers.getMeetsController()) + this.app.use(meetURL, meetRouter.getRoutes()) } } diff --git a/src/router/meetRouter/meetMapper.js b/src/router/meetRouter/meetMapper.js new file mode 100644 index 0000000..1ef5f72 --- /dev/null +++ b/src/router/meetRouter/meetMapper.js @@ -0,0 +1,71 @@ +const Joi = require('joi') +const GenericMapper = require('../genericMapper') +const Meet = require('../../model/meet') + +class MeetMapper { + constructor () { + this.genericMapper = new GenericMapper() + } + + mapGetMeets (req) { + return this.genericMapper.map(this.validateEmpty.bind(this), req.params) + } + + mapGetMeet (req) { + var map = this.genericMapper.map(this.validateId.bind(this), req.params) + var model = new Meet(map.id, null, null, null) + return model + } + + mapCreateMeet (req) { + var map = this.genericMapper.map(this.validateMeet.bind(this), req.body) + var model = new Meet(null, map.date, map.idTeam, map.members) + return model + } + + mapEditMeet (req) { + let newMeet = { ...req.params, ...req.body } + var map = this.genericMapper.map(this.validateMeetWithId.bind(this), newMeet) + var model = new Meet(null, map.date, map.idTeam, map.members) + return model + } + + mapDeleteMeet (req) { + var map = this.genericMapper.map(this.validateId.bind(this), req.params) + var model = new Meet(map.id, null, null, null) + return model + } + + validateEmpty (meet) { + return Joi.validate(meet, Joi.object().required()) + } + + validateId (meet) { + return Joi.validate(meet, Joi.object({ + id: Joi.string().required() + }).required()) + } + + validateMeetWithId (meet) { + var model = Joi.validate(meet, Joi.object({ + id: Joi.string().required(), + date: Joi.string().required(), + idTeam: Joi.string().required(), + members: Joi.array().items(Joi.string()).required() + })) + + return model + } + + validateMeet (meet) { + var model = Joi.validate(meet, Joi.object({ + date: Joi.string().required(), + idTeam: Joi.string().required(), + members: Joi.array().items(Joi.string()).required() + })) + + return model + } +} + +module.exports = MeetMapper diff --git a/src/router/meetRouter/meetRouter.js b/src/router/meetRouter/meetRouter.js new file mode 100644 index 0000000..ccc5d7f --- /dev/null +++ b/src/router/meetRouter/meetRouter.js @@ -0,0 +1,53 @@ +const express = require('express') +const MeetMapper = require('./meetMapper') +const Router = require('../router') + +class MeetRouter { + constructor (meetController) { + this.meetMapper = new MeetMapper() + this.app = express() + this.meetController = meetController + this.genericRouter = new Router(this.meetMapper) + } + + getRoutes () { + this.app.get('/', (req, res) => { + this.genericRouter.execute( + this.meetController.getMeets.bind(this.meetController), + this.meetMapper.mapGetMeets.bind(this.meetMapper), + req, res) + }) + + this.app.get('/:id', (req, res) => { + this.genericRouter.execute( + this.meetController.getMeet.bind(this.meetController), + this.meetMapper.mapGetMeet.bind(this.meetMapper), + req, res) + }) + + this.app.post('/', (req, res) => { + this.genericRouter.execute( + this.meetController.createMeet.bind(this.meetController), + this.meetMapper.mapCreateMeet.bind(this.meetMapper), + req, res) + }) + + this.app.put('/:id', (req, res) => { + this.genericRouter.execute( + this.meetController.editMeet.bind(this.meetController), + this.meetMapper.mapEditMeet.bind(this.meetMapper), + req, res) + }) + + this.app.delete('/:id', (req, res) => { + this.genericRouter.execute( + this.meetController.deleteMeet.bind(this.meetController), + this.meetMapper.mapDeleteMeet.bind(this.meetMapper), + req, res) + }) + + return this.app + } +} + +module.exports = MeetRouter diff --git a/src/router/sessionRouter/index.js b/src/router/sessionRouter/index.js index f571c5a..456cc52 100644 --- a/src/router/sessionRouter/index.js +++ b/src/router/sessionRouter/index.js @@ -1,5 +1,5 @@ const express = require('express') -const SessionMapper = require('./mapper') +const SessionMapper = require('./sessionMapper') const Router = require('../router') class SessionRouter { @@ -11,8 +11,8 @@ class SessionRouter { } getRoutes () { - this.app.get('/', (req, res) => { - this.genericRouter.executeOld(this.sessionController.getAllSessions + this.app.get('/:meetId', (req, res) => { + this.genericRouter.executeOld(this.sessionController.getSession .bind(this.sessionController), req, res) }) diff --git a/src/router/sessionRouter/mapper.js b/src/router/sessionRouter/mapper.js deleted file mode 100644 index 6cd5c7b..0000000 --- a/src/router/sessionRouter/mapper.js +++ /dev/null @@ -1,13 +0,0 @@ -const Session = require('../../model/session') - -class SessionMapper { - mapToDomain (req) { - return new Session( - req.params.id, - req.body.topics, - req.body.timestamp - ) - } -} - -module.exports = SessionMapper diff --git a/src/router/sessionRouter/sessionMapper.js b/src/router/sessionRouter/sessionMapper.js new file mode 100644 index 0000000..bb18ed1 --- /dev/null +++ b/src/router/sessionRouter/sessionMapper.js @@ -0,0 +1,73 @@ +const Joi = require('joi') +const GenericMapper = require('../genericMapper') +const Session = require('../../model/session') + +class SessionMapper { + constructor () { + this.genericMapper = new GenericMapper() + } + + mapGetSessions (req) { + return this.genericMapper.map(this.validateMeetId.bind(this), req.params) + } + + mapGetSession (req) { + var map = this.genericMapper.map(this.validateId.bind(this), req.params) + var model = new Session(map.id, null, null, null) + return model + } + + mapCreateSession (req) { + var map = this.genericMapper.map(this.validateSession.bind(this), req.body) + var model = new Session(null, map.topics, map.timestamp, map.meetId) + return model + } + + mapEditSession (req) { + let newSession = { ...req.params, ...req.body } + var map = this.genericMapper.map(this.validateSessionWithId.bind(this), newSession) + var model = new Session(map.id, map.topics, map.timestamp, map.meetId) + return model + } + + mapDeleteSession (req) { + var map = this.genericMapper.map(this.validateId.bind(this), req.params) + var model = new Session(map.id, null, null, null) + return model + } + + validateMeetId (session) { + return Joi.validate(session, Joi.object({ + meetId: Joi.string().required() + }).required()) + } + + validateId (session) { + return Joi.validate(session, Joi.object({ + id: Joi.string().required() + }).required()) + } + + validateSessionWithId (session) { + var model = Joi.validate(session, Joi.object({ + id: Joi.string().required(), + topics: Joi.string().required(), + timestamp: Joi.string().required(), + meetId: Joi.string().required() + })) + + return model + } + + validateSession (session) { + var model = Joi.validate(session, Joi.object({ + topics: Joi.string().required(), + timestamp: Joi.string().required(), + meetId: Joi.string().required() + })) + + return model + } +} + +module.exports = SessionMapper