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 authored and jvpessoa10 committed Feb 10, 2020
1 parent da916b1 commit f9280b6
Show file tree
Hide file tree
Showing 20 changed files with 326 additions and 7 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 @@ -23,9 +23,14 @@ const db = dbFactory.getDB(config.db)
const repositories = new RepositoriesProvider(db)
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,10 +1,12 @@
const NoteController = require('./noteController')
const SessionController = require('./sessionController')
const MeetingsController = require('./meetingsController')

class ControllersProvider {
constructor (noteRepository, sessionRepository) {
constructor (noteRepository, sessionRepository, meetingsService) {
this.noteRepository = noteRepository
this.sessionRepository = sessionRepository
this.meetingsService = meetingsService
}

provideNotesController () {
Expand All @@ -14,6 +16,10 @@ class ControllersProvider {
getSessionsController () {
return new SessionController(this.sessionRepository)
}

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

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

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

async insertMeeting (meeting) {
validateMeeting(meeting, this.schema.getInsertMeetingSchema())
return this.service.insertMeeting(meeting)
}

async getMeeting (meetingFilter) {
validateMeeting(meetingFilter, this.schema.getGetMeetingSchema())
return this.service.getMeeting(meetingFilter)
}

async updateMeeting (meeting) {
validateMeeting(meeting, this.schema.getUpdateMeetingSchema())
return this.service.updateMeeting(meeting)
}

async deleteMeeting (meeting) {
validateMeeting(meeting, this.schema.getDeleteMeetingSchema())
return this.service.deleteMeeting(meeting.id)
}
}

function validateMeeting (meeting, validator) {
validator.validate(meeting)
}

module.exports = MeetingsController
15 changes: 14 additions & 1 deletion src/environment/FirestoreDB/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class FirestoreDB {
if (data) {
console.log('filtering')
for (var field in data) {
if (data[field] !== undefined && data[field] !== null) {
if (data[field] !== undefined && data[field] !== null && !Array.isArray(data[field])) {
if (field === 'id') {
query = query.doc(data[field])
} else {
Expand Down Expand Up @@ -67,6 +67,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
}
27 changes: 27 additions & 0 deletions src/model/Meeting.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
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 () {
let meeting = {
teamId: this.teamId,
name: this.name,
date: this.date,
to: this.to,
location: this.location
}
for (let field in meeting) {
if (meeting[field] === undefined || meeting[field == null]) delete meeting[field]
}
return meeting
}
}

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
9 changes: 7 additions & 2 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 SessionsRepository = require('./sessionRepository')
const MeetingsRepository = require('./meetingsRepository')

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

provideSessionsRepository () {
return new SessionRepository(this.db)
return new SessionsRepository(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 (meetingId) {
return this.db.executeDelete('/meetings', meetingId)
}
}

module.exports = MeetingsRepository
6 changes: 6 additions & 0 deletions src/router/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
const notesFromSessionURL = '/notes/'
const sessionURL = '/sessions/'
const meetingURL = '/meetings/'

const NotesRouter = require('./notesRouter')
const SessionRouter = require('./sessionRouter')
const MeetingRouter = require('./meetingsRouter')

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

var sessionRouter = new SessionRouter(this.controllers.getSessionsController())
this.app.use(sessionURL, sessionRouter.getRoutes())

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

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

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

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

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

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

return this.app
}
}

module.exports = MeetingsRouter
18 changes: 18 additions & 0 deletions src/router/meetingsRouter/mapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const Meeting = require('../../model/Meeting')
const Session = require('../../model/Session')

class MeetingMapper {
mapToDomain ({ body, query, params }) {
const meeting = new Meeting(body.id ? body.id : params.meeting_id,
query.team_id ? query.team_id : body.team_id, body.name, body.date, body.to, body.location, [])

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

module.exports = MeetingMapper
2 changes: 1 addition & 1 deletion src/router/router.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class Router {
}
} catch (error) {
res.status(400)
res.send({ 'error': error })
res.send({ 'error': error.message })
}
}
}
Expand Down
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
41 changes: 41 additions & 0 deletions src/schemas/meetingsSchema.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const Joi = require('joi')
const sessionSchemas = require('./sessionsSchema')

class MeetingsSchema {
getInsertMeetingSchema () {
return Joi.object().keys({
id: Joi.string(),
teamId: 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)
})
}

getGetMeetingSchema () {
return Joi.object().keys({
id: Joi.string(),
teamId: Joi.string()
})
}

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

getDeleteMeetingSchema () {
return Joi.object().keys({
id: Joi.string().required()
})
}
}

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()
})

0 comments on commit f9280b6

Please sign in to comment.