Skip to content

Commit

Permalink
Issue #71: Create logic to handle meetings creation
Browse files Browse the repository at this point in the history
  • Loading branch information
João Victor Pessoa committed Jan 31, 2020
1 parent 227e551 commit 5867a75
Show file tree
Hide file tree
Showing 20 changed files with 348 additions and 5 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ src/environment/FirestoreDB/keys/serviceAccountKey.json
.nyc_output

.DS_Store

.idea
7 changes: 6 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,14 @@ const db2 = dbFactory.getDB('firestore')
const repositories = new RepositoriesProvider(db, db2)
const notesRepository = repositories.provideNotesRepository()
const sessionsRepository = repositories.provideSessionsRepository()
const meetingsRepository = repositories.provideMeetingsRepository()

const ServicesProvider = require('./src/services')
const services = new ServicesProvider(meetingsRepository, sessionsRepository)
const meetingService = services.provideMeetingsService()

const ControllersProvider = env.controllers
const controllersProvider = new ControllersProvider(notesRepository, sessionsRepository)
const controllersProvider = new ControllersProvider(notesRepository, sessionsRepository, meetingService)

const auth = require('./src/middlewares/auth')
const RouterProvider = env.router
Expand Down
8 changes: 7 additions & 1 deletion src/controllers/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
const NotesController = require('./notesController')
const MeetingsController = require('./meetingsController')

class ControllersProvider {
constructor (notesRepository, sessionsRepository) {
constructor (notesRepository, sessionsRepository, meetingsService) {
this.notesRepository = notesRepository
this.sessionsRepository = sessionsRepository
this.meetingsService = meetingsService
}

provideNotesController () {
Expand All @@ -13,6 +15,10 @@ class ControllersProvider {
getSessionsController () {
return require('./sessionsController')(this.sessionsRepository)
}

provideMeetingsController () {
return new MeetingsController(this.meetingsService)
}
}

module.exports = ControllersProvider
57 changes: 57 additions & 0 deletions src/controllers/meetingsController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
const SchemaProvider = require('../schemas')
const MeetingsMapper = require('../mapper/MeetingsMapper')

class MeetingsController {
constructor (service) {
this.service = service
this.schema = new SchemaProvider().provideMeetingsSchema()
}

async insertMeeting (req, res) {
const rawMeeting = validateBody(req, res, this.schema.getInsertMeetingSchema())
const meeting = new MeetingsMapper().mapJsonToDomain(rawMeeting)

const result = await this.service.insertMeeting(meeting)
if (result.message) {
res.status(500)
res.send({ error: result.message })
return
}
res.send(result)
}

async getMeeting (req, res) {
const meetings = await this.service.getMeeting(req.body)

if (meetings.message) {
res.status(500)
res.send({ error: meetings.message })
}
res.send(meetings)
}

async updateMeeting (req, res) {
const meeting = validateBody(req, res, this.schema.getUpdateMeetingSchema())
const result = await this.service.updateMeeting(meeting)
res.send(result)
}

async deleteMeeting (req, res) {
const meetingId = req.params.meeting_id
const result = await this.service.deleteMeeting(meetingId)
res.send(result)
}
}

function validateBody (req, res, validator) {
const { error, value } = validator.validate(req.body)

if (error) {
res.status(400)
res.send(error)
return
}
return value
}

module.exports = MeetingsController
13 changes: 13 additions & 0 deletions src/environment/FirestoreDB/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,19 @@ class FirestoreDB {
return err
}
}

getDocument (url) {
return db.doc(url)
}

async executeTransaction (table, callback) {
return db.runTransaction(t => {
let collectionRef = db.collection(table)
return Promise.resolve(callback(collectionRef, t))
}).catch(err => {
return { message: err }
})
}
}

module.exports = FirestoreDB
4 changes: 3 additions & 1 deletion src/environment/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
const router = require('./../router')
const controllers = require('../controllers')
const schemas = require('../schemas')

module.exports = {
router: router,
controllers: controllers
controllers: controllers,
schemas: schemas
}
17 changes: 17 additions & 0 deletions src/mapper/MeetingsMapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const Meeting = require('../model/Meeting')
const Session = require('../model/Session')

class MeetingsMapper {
mapJsonToDomain (obj) {
const meeting = new Meeting(obj.id, obj.team_id, obj.name, obj.date, obj.to, obj.location, [])

if (obj.sessions !== undefined) {
obj.sessions.map(session => {
meeting.sessions.push(new Session(session.id, session.meeting_id, session.name, session.description, session.topics))
})
}
return meeting
}
}

module.exports = MeetingsMapper
23 changes: 23 additions & 0 deletions src/model/Meeting.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
class Meeting {
constructor (id, teamId, name, date, to, location, sessions) {
this.id = id
this.teamId = teamId
this.name = name
this.date = date
this.to = to
this.location = location
this.sessions = sessions
}

getMeeting () {
return {
team_id: this.teamId,
name: this.name,
date: this.date,
to: this.to,
location: this.location
}
}
}

module.exports = Meeting
20 changes: 20 additions & 0 deletions src/model/Session.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class Session {
constructor (id, meetingId, name, description, topics) {
this.id = id
this.meetingId = meetingId
this.name = name
this.description = description
this.topics = topics
}

getSession () {
return {
meeting_id: this.meetingId,
name: this.name,
description: this.description,
topics: this.topics
}
}
}

module.exports = Session
7 changes: 6 additions & 1 deletion src/repositories/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const NotesRepository = require('./notesRepository')
const SessionsRepository = require('./sessionsRepository')
const MeetingsRepository = require('./meetingsRepository')

class RepositoriesProvider {
constructor (db, db2) {
Expand All @@ -12,7 +13,11 @@ class RepositoriesProvider {
}

provideSessionsRepository () {
return new SessionsRepository(this.db2)
return new SessionsRepository(this.db2, this.db)
}

provideMeetingsRepository () {
return new MeetingsRepository(this.db)
}
}

Expand Down
23 changes: 23 additions & 0 deletions src/repositories/meetingsRepository/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
class MeetingsRepository {
constructor (db) {
this.db = db
}

async insertMeeting (meeting) {
return this.db.executeInsert('/meetings', meeting)
}

async getMeeting (filter) {
return this.db.executeGetDB('/meetings', filter)
}

async updateMeeting (meetingId, meeting) {
return this.db.executeUpdateDB('/meetings', meetingId, meeting)
}

async deleteMeeting (sessionId) {
return this.db.executeDelete('/meetings', sessionId)
}
}

module.exports = MeetingsRepository
12 changes: 11 additions & 1 deletion src/repositories/sessionsRepository/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
class SessionsRepository {
constructor (db) {
constructor (db, db2) {
this.db = db
this.db2 = db2
}

getSession (sessionId, res, callback) {
Expand Down Expand Up @@ -28,6 +29,15 @@ class SessionsRepository {
editSession (session, callback) {
this.db.editSession(session, callback)
}

// TODO replace by old one
async newCreateSession (session) {
return this.db2.executeInsert('sessions', session)
}

async newGetSession (filter) {
return this.db2.executeGetDB('sessions', filter)
}
}

module.exports = SessionsRepository
5 changes: 5 additions & 0 deletions src/router/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
const notesFromSessionURL = '/notes/'
const sessionURL = '/sessions/'
const meetingURL = '/meetings/'
const NotesRouter = require('./notesRouter')
const MeetingRouter = require('./meetingsRouter')

class RouterProvider {
constructor (app, controllers, auth) {
Expand All @@ -18,6 +20,9 @@ class RouterProvider {

var sessionsRouter = require('./sessionsRouter')(this.controllers.getSessionsController())
this.app.use(sessionURL, sessionsRouter)

var meetingRouter = new MeetingRouter(this.controllers.provideMeetingsController())
this.app.use(meetingURL, meetingRouter.getRoutes())
}
}

Expand Down
29 changes: 29 additions & 0 deletions src/router/meetingsRouter/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const express = require('express')

class MeetingsRouter {
constructor (meetingsController) {
this.meetingsController = meetingsController
this.app = express()
}
getRoutes () {
this.app.post('/', async (req, res) => {
await this.meetingsController.insertMeeting(req, res)
})

this.app.get('/', async (req, res) => {
await (this.meetingsController.getMeeting(req, res))
})

this.app.post('/edit', async (req, res) => {
await (this.meetingsController.updateMeeting(req, res))
})

this.app.delete('/:meeting_id', async (req, res) => {
await (this.meetingsController.deleteMeeting(req, res))
})

return this.app
}
}

module.exports = MeetingsRouter
9 changes: 9 additions & 0 deletions src/schemas/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const MeetingsSchema = require('./meetingsSchema')

class SchemasProvider {
provideMeetingsSchema () {
return new MeetingsSchema()
}
}

module.exports = SchemasProvider
39 changes: 39 additions & 0 deletions src/schemas/meetingsSchema.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
const Joi = require('joi')
const sessionSchemas = require('./sessionsSchema')

class MeetingsSchema {
getInsertMeetingSchema () {
return Joi.object().keys({
id: Joi.string(),
team_id: Joi.string().required(),
name: Joi.string().required(),
date: Joi.date().timestamp().required(),
to: Joi.date().timestamp().required(),
location: Joi.string(),
sessions: Joi.array().items(sessionSchemas)
})
}

getMeetingSchema () {
return Joi.object().keys({
id: Joi.string(),
team_id: Joi.string(),
name: Joi.string(),
date: Joi.date(),
to: Joi.date(),
location: Joi.string()
})
}
getUpdateMeetingSchema () {
return Joi.object().keys({
id: Joi.string().required(),
team_id: Joi.string(),
name: Joi.string(),
date: Joi.date().timestamp(),
to: Joi.date().timestamp(),
location: Joi.string()
})
}
}

module.exports = MeetingsSchema
9 changes: 9 additions & 0 deletions src/schemas/sessionsSchema.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const Joi = require('joi')

module.exports = Joi.object().keys({
id: Joi.string(),
meeting_id: Joi.string(),
name: Joi.string(),
description: Joi.string(),
topics: Joi.array().items(Joi.string())
})
6 changes: 6 additions & 0 deletions src/schemas/teamsSchema.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const Joi = require('joi')

module.exports = Joi.object().keys({
administrator: Joi.string().email().required(),
members: Joi.array().items(Joi.string().email().required()).required()
})
Loading

0 comments on commit 5867a75

Please sign in to comment.