Skip to content

initial OOD implementation #162

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: development
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
201 changes: 120 additions & 81 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
require('./config/mongoose')
const Connection = require('./config/mongoose')
const express = require('express')
const morgan = require('morgan')
const cookieParser = require('cookie-parser')
Expand All @@ -22,92 +22,131 @@ const commentRouter = require('./app/routes/comment')
const projectRouter = require('./app/routes/project')
const notificationRouter = require('./app/routes/notification')
const proposalRouter = require('./app/routes/proposal')

const app = express()
const server = require('http').Server(app)

app.use(cors())

app.use(bodyParser.json({ limit: '200mb' }))
app.use(bodyParser.urlencoded(fileConstants.fileParameters))

const memoryStorage = multer.memoryStorage()
app.use(multer({ storage: memoryStorage }).single('file'))

if (process.env.NODE_ENV !== 'testing') {
server.listen(process.env.SOCKET_PORT || 8810)
}
// WARNING: app.listen(80) will NOT work here!

const io = socket.listen(server)
let count = 0
io.on('connection', (socket) => {
console.log('socket connected count ', count++)
io.emit('user connected')
})

// view engine setup
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'ejs')

morgan.token('data', (req, res) => {
return JSON.stringify(req.body)
})

app.use(
morgan(
':remote-addr - :remote-user [:date[clf]] ":method :url" :status :res[content-length] ":referrer" ":user-agent" :data',
{ stream: winston.stream }
)
)

app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(cookieParser())
app.use(express.static(path.join(__dirname, 'public')))
app.use((req, res, next) => {
req.io = io
next()
})

app.use('/notification', notificationRouter)
app.use('/', indexRouter)
app.use('/auth', authRouter)
app.use('/user', usersRouter)
app.use('/post', postRouter)
app.use('/org', organizationRouter)
app.use('/event', eventRouter)
app.use('/shortUrl', shortUrlRouter)
app.use('/comment', commentRouter)
app.use('/project', projectRouter)
app.use('/proposal', proposalRouter)

// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404, "route doesn't exist"))
})

// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message
res.locals.error = req.app.get('env') === 'development' ? err : {}

// To include winston logging (Error)
winston.error(
`${err.status || 500} - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip} - ${req.body}`
)

// render the error page
res.status(err.status || 500)
res.render('error')

// Socket event error handler (On max event)
req.io.on('error', function (err) {
console.error('------REQ ERROR')
console.error(err.stack)
})
next()
})

class ServerBuilder {
constructor () {
this.#initDB()
this.#initMiddleware()
this.#initViewEngine()
this.#initLogger()
this.#initSocket()
this.#initRouter()
this.#initErrorHandler()
}

// PRIVATE METHOD (ES6)
#initDB = async () => {
await Connection.connect()
}

// PRIVATE METHOD (ES6)
#initMiddleware = () => {
app.use(cors())

app.use(bodyParser.json({ limit: '200mb' }))
app.use(bodyParser.urlencoded(fileConstants.fileParameters))

const memoryStorage = multer.memoryStorage()
app.use(multer({ storage: memoryStorage }).single('file'))
app.use(express.json())
app.use(express.urlencoded({
extended: false
}))
app.use(cookieParser())
}

// PRIVATE METHOD (ES6)
#initViewEngine = () => {
// view engine setup
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'ejs')
}

// PRIVATE METHOD (ES6)
#initLogger = () => {
morgan.token('data', (req, res) => {
return JSON.stringify(req.body)
})
app.use(
morgan(
':remote-addr - :remote-user [:date[clf]] ":method :url" :status :res[content-length] ":referrer" ":user-agent" :data', {
stream: winston.stream
}
)
)
}

// PRIVATE METHOD (ES6)
#initSocket = () => {
let count = 0
io.on('connection', (socket) => {
console.log('socket connected count ', count++)
io.emit('user connected')
})
app.use(express.static(path.join(__dirname, 'public')))
app.use((req, res, next) => {
req.io = io
next()
})
}

// PRIVATE METHOD (ES6)
#initRouter = () => {
app.use('/notification', notificationRouter)
app.use('/', indexRouter)
app.use('/auth', authRouter)
app.use('/user', usersRouter)
app.use('/post', postRouter)
app.use('/org', organizationRouter)
app.use('/event', eventRouter)
app.use('/shortUrl', shortUrlRouter)
app.use('/comment', commentRouter)
app.use('/project', projectRouter)
app.use('/proposal', proposalRouter)
}

// PRIVATE METHOD (ES6)
#initErrorHandler = () => {
// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404, "route doesn't exist"))
})

// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message
res.locals.error = req.app.get('env') === 'development' ? err : {}

// To include winston logging (Error)
winston.error(
`${err.status || 500} - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip} - ${req.body}`
)

// render the error page
res.status(err.status || 500)
res.render('error')

// Socket event error handler (On max event)
req.io.on('error', function (err) {
console.error('------REQ ERROR')
console.error(err.stack)
})
next()
})
}
static startServer() {
return new ServerBuilder()
}
}

// STATIC METHOD CALLED
ServerBuilder.startServer()
module.exports = { app, io }
31 changes: 23 additions & 8 deletions app/controllers/auth.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,36 @@
const User = require('../models/User')
const HttpStatus = require('http-status-codes')
module.exports = {
authenticateUser: async (req, res, next) => {

class Auth {
constructor (UserModel) {
this.UserModel = UserModel
this.#initBinding()
}

// PRIVATE ES6
#initBinding = () => {
this.authenticateUser = this.authenticateUser.bind(this)
this.logout = this.logout.bind(this)
this.logoutAll = this.logoutAll.bind(this)
}

async authenticateUser (req, res, next) {
const email = req.body.email
const password = req.body.password
try {
const user = await User.findByCredentials(email, password)
const user = await this.UserModel.findByCredentials(email, password)
const token = await user.generateAuthToken()
res.send({ user: user, token: token })
} catch (error) {
res.status(HttpStatus.BAD_REQUEST).json({ error: error.message })
}
},
logout: (req, res, next) => {
}

logout (req, res, next) {
res.status(HttpStatus.OK).json({ success: 'ok' })
},
logoutAll: (req, res, next) => {
}

logoutAll (req, res, next) {
res.status(HttpStatus.OK).json({ success: 'ok' })
}
}
module.exports = Auth
Loading