diff --git a/index.js b/index.js index 51af6bb..9e2a309 100644 --- a/index.js +++ b/index.js @@ -23,9 +23,11 @@ const db = dbFactory.getDB(config.db) const repositories = new RepositoriesProvider(db) const notesRepository = repositories.provideNotesRepository() const sessionsRepository = repositories.provideSessionsRepository() +const teamsRepository = repositories.provideTeamsRepository() const ControllersProvider = env.controllers -const controllersProvider = new ControllersProvider(notesRepository, sessionsRepository) +const controllersProvider = new ControllersProvider(notesRepository, sessionsRepository, + teamsRepository) const auth = require('./src/middlewares/auth') const RouterProvider = env.router diff --git a/src/controllers/index.js b/src/controllers/index.js index a846c89..b9520f9 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -1,19 +1,25 @@ const NoteController = require('./noteController') const SessionController = require('./sessionController') +const TeamController = require('./teamController') class ControllersProvider { - constructor (noteRepository, sessionRepository) { + constructor (noteRepository, sessionRepository, teamRepository) { this.noteRepository = noteRepository this.sessionRepository = sessionRepository + this.teamRepository = teamRepository } - provideNotesController () { + getNotesController () { return new NoteController(this.noteRepository) } getSessionsController () { return new SessionController(this.sessionRepository) } + + getTeamsController () { + return new TeamController(this.teamRepository) + } } module.exports = ControllersProvider diff --git a/src/controllers/teamController.js b/src/controllers/teamController.js new file mode 100644 index 0000000..c7c2810 --- /dev/null +++ b/src/controllers/teamController.js @@ -0,0 +1,53 @@ +const Joi = require('joi') + +class TeamController { + constructor (teamRepository) { + this.teamRepository = teamRepository + } + + async getTeams (team) { + this.validateTeam(team) + return this.teamRepository.getTeam(team) + } + + async getTeam (team) { + this.validateTeamId(team) + return this.teamRepository.getTeam(team.getIdObject()) + } + + async createTeam (team) { + this.validateTeam(team) + return this.teamRepository.createTeam(team.getTeam()) + } + + async editTeam (team) { + this.validateFullTeam(team) + return this.teamRepository.editTeam(team.id, team.getTeam()) + } + + async deleteTeam (team) { + this.validateTeamId(team) + return this.teamRepository.deleteTeam(team.id) + } + + validateTeamId (team) { + Joi.validate(team, Joi.object({ + id: Joi.string().required() + })) + } + + validateFullTeam (team) { + Joi.validate(team, Joi.object({ + id: Joi.string().required(), + topics: Joi.array().items(Joi.string()).required(), + timestamp: Joi.date().timestamp().required() + })) + } + + validateTeam (team) { + Joi.validate(team, Joi.object({ + topics: Joi.array().items(Joi.string()).required() + })) + } +} +module.exports = TeamController diff --git a/src/environment/FirestoreDB/index.js b/src/environment/FirestoreDB/index.js index 74f8b27..4705ce8 100644 --- a/src/environment/FirestoreDB/index.js +++ b/src/environment/FirestoreDB/index.js @@ -17,7 +17,7 @@ class FirestoreDB { } async executeGetDB (table, data) { - console.log('Going to GET on ', table) + console.log('Going to GET', data, 'on ', table) var query = db.collection(table) if (data) { diff --git a/src/model/team.js b/src/model/team.js new file mode 100644 index 0000000..43c7164 --- /dev/null +++ b/src/model/team.js @@ -0,0 +1,24 @@ +class Team { + constructor (id, name, admin, members) { + this.id = id + this.name = name + this.admin = admin + this.members = members + } + + getTeam () { + return { + name: this.name, + admin: this.admin, + members: this.members + } + } + + getIdObject () { + return { + id: this.id + } + } +} + +module.exports = Team diff --git a/src/repositories/index.js b/src/repositories/index.js index 4c5190c..3a3fd8d 100644 --- a/src/repositories/index.js +++ b/src/repositories/index.js @@ -1,5 +1,6 @@ const NoteRepository = require('./noteRepository') const SessionRepository = require('./sessionRepository') +const TeamRepository = require('./teamRepository') class RepositoriesProvider { constructor (db) { @@ -13,6 +14,10 @@ class RepositoriesProvider { provideSessionsRepository () { return new SessionRepository(this.db) } + + provideTeamsRepository () { + return new TeamRepository(this.db) + } } module.exports = RepositoriesProvider diff --git a/src/repositories/teamRepository/index.js b/src/repositories/teamRepository/index.js new file mode 100644 index 0000000..5404667 --- /dev/null +++ b/src/repositories/teamRepository/index.js @@ -0,0 +1,24 @@ +class TeamRepository { + constructor (db) { + this.db = db + this.table = 'teams' + } + + async getTeam (team) { + return this.db.executeGetDB(this.table, team) + } + + async createTeam (team) { + return this.db.executeInsert(this.table, team) + } + + async deleteTeam (id) { + return this.db.executeDelete(this.table, id) + } + + async editTeam (id, team) { + return this.db.executeUpdateDB(this.table, id, team) + } +} + +module.exports = TeamRepository diff --git a/src/router/index.js b/src/router/index.js index df4c91d..0349c8a 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,7 +1,9 @@ const notesFromSessionURL = '/notes/' const sessionURL = '/sessions/' +const teamURL = '/teams/' const NotesRouter = require('./notesRouter') const SessionRouter = require('./sessionRouter') +const TeamRouter = require('./teamRouter') class RouterProvider { constructor (app, controllers, auth) { @@ -14,11 +16,14 @@ class RouterProvider { // Use middleware verifytoken function in before every route this.app.use(this.auth.verifyToken) - var notesRouter = new NotesRouter(this.controllers.provideNotesController()) + var notesRouter = new NotesRouter(this.controllers.getNotesController()) this.app.use(notesFromSessionURL, notesRouter.getRoutes()) var sessionRouter = new SessionRouter(this.controllers.getSessionsController()) this.app.use(sessionURL, sessionRouter.getRoutes()) + + var teamRouter = new TeamRouter(this.controllers.getTeamsController()) + this.app.use(teamURL, teamRouter.getRoutes()) } } diff --git a/src/router/router.js b/src/router/router.js index 1743018..f4853ad 100644 --- a/src/router/router.js +++ b/src/router/router.js @@ -16,6 +16,7 @@ class Router { res.send(response) } } catch (error) { + console.log(error) res.status(400) res.send({ 'error': error }) } diff --git a/src/router/teamRouter/index.js b/src/router/teamRouter/index.js new file mode 100644 index 0000000..c7abc08 --- /dev/null +++ b/src/router/teamRouter/index.js @@ -0,0 +1,43 @@ +const express = require('express') +const TeamMapper = require('./mapper') +const Router = require('../router') + +class TeamRouter { + constructor (teamController) { + this.teamMapper = new TeamMapper() + this.app = express() + this.teamController = teamController + this.genericRouter = new Router(this.teamMapper) + } + + getRoutes () { + this.app.get('/', (req, res) => { + this.genericRouter.execute(this.teamController.getTeams + .bind(this.teamController), req, res) + }) + + this.app.get('/:id', (req, res) => { + this.genericRouter.execute(this.teamController.getTeam + .bind(this.teamController), req, res) + }) + + this.app.post('/', (req, res) => { + this.genericRouter.execute(this.teamController.createTeam + .bind(this.teamController), req, res) + }) + + this.app.put('/:id', (req, res) => { + this.genericRouter.execute(this.teamController.editTeam + .bind(this.teamController), req, res) + }) + + this.app.delete('/:id', (req, res) => { + this.genericRouter.execute(this.teamController.deleteTeam + .bind(this.teamController), req, res) + }) + + return this.app + } +} + +module.exports = TeamRouter diff --git a/src/router/teamRouter/mapper.js b/src/router/teamRouter/mapper.js new file mode 100644 index 0000000..8223758 --- /dev/null +++ b/src/router/teamRouter/mapper.js @@ -0,0 +1,22 @@ +const Team = require('../../model/team') + +class TeamMapper { + mapToDomain (req) { + if (req.query.name !== undefined) { + return new Team( + null, + req.query.name, + null + ) + } + + return new Team( + req.params.id, + req.body.name, + req.body.admin, + req.body.members + ) + } +} + +module.exports = TeamMapper