Skip to content

Commit

Permalink
Issue #44: Create teams endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
CarlosRodrigo committed Feb 6, 2020
1 parent da916b1 commit a1814a2
Show file tree
Hide file tree
Showing 11 changed files with 190 additions and 5 deletions.
4 changes: 3 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 8 additions & 2 deletions src/controllers/index.js
Original file line number Diff line number Diff line change
@@ -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
53 changes: 53 additions & 0 deletions src/controllers/teamController.js
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion src/environment/FirestoreDB/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
24 changes: 24 additions & 0 deletions src/model/team.js
Original file line number Diff line number Diff line change
@@ -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
5 changes: 5 additions & 0 deletions src/repositories/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const NoteRepository = require('./noteRepository')
const SessionRepository = require('./sessionRepository')
const TeamRepository = require('./teamRepository')

class RepositoriesProvider {
constructor (db) {
Expand All @@ -13,6 +14,10 @@ class RepositoriesProvider {
provideSessionsRepository () {
return new SessionRepository(this.db)
}

provideTeamsRepository () {
return new TeamRepository(this.db)
}
}

module.exports = RepositoriesProvider
24 changes: 24 additions & 0 deletions src/repositories/teamRepository/index.js
Original file line number Diff line number Diff line change
@@ -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
7 changes: 6 additions & 1 deletion src/router/index.js
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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())
}
}

Expand Down
1 change: 1 addition & 0 deletions src/router/router.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class Router {
res.send(response)
}
} catch (error) {
console.log(error)
res.status(400)
res.send({ 'error': error })
}
Expand Down
43 changes: 43 additions & 0 deletions src/router/teamRouter/index.js
Original file line number Diff line number Diff line change
@@ -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
22 changes: 22 additions & 0 deletions src/router/teamRouter/mapper.js
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit a1814a2

Please sign in to comment.