Skip to content

Commit 4c2d062

Browse files
author
Jean Rauwers
committed
WIP: Introduce docker, build container for the api and introduce mongodb image
1 parent eea46b0 commit 4c2d062

File tree

9 files changed

+147
-43
lines changed

9 files changed

+147
-43
lines changed

backend/.dockerignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
npm-debug.log

backend/.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
node_modules
2-
.env
2+
.env
3+
data

backend/Dockerfile

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
FROM node:14
2+
3+
# Create app directory
4+
WORKDIR /usr/src/app
5+
6+
# Install app dependencies
7+
# A wildcard is used to ensure both package.json AND package-lock.json are copied
8+
# where available (npm@5+)
9+
COPY package*.json ./
10+
11+
# RUN npm install
12+
# If you are building your code for production
13+
RUN npm ci --only=production
14+
15+
# Bundle app source
16+
COPY . .
17+
18+
EXPOSE 8080
19+
CMD [ "node", "src/server.js" ]

backend/docker-compose.yml

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
version: "3"
2+
services:
3+
node-api:
4+
container_name: node-api
5+
image: react-native-bootcamp/backend
6+
restart: always
7+
build: .
8+
ports:
9+
- "8080:8080"
10+
links:
11+
- mongo
12+
mongo:
13+
container_name: mongo
14+
image: mongo
15+
volumes:
16+
- ./data:/data/db
17+
ports:
18+
- "27017:27017"

backend/package.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
"scripts": {
77
"lint": "eslint ./src --fix",
88
"start": "node src/server.js",
9-
"dev": "nodemon src/server.js"
9+
"dev": "nodemon src/server.js",
10+
"build-docker-image": "docker build . -t react-native-bootcamp/backend",
11+
"run-docker-image": "docker-compose up"
1012
},
1113
"keywords": [],
1214
"author": "",
@@ -27,4 +29,4 @@
2729
"eslint": "^7.0.0",
2830
"nodemon": "^2.0.3"
2931
}
30-
}
32+
}

backend/src/controllers/EventController.js

+39-3
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,51 @@ const Event = require('../models/Event')
22
const User = require('../models/User')
33
const jwt = require('jsonwebtoken')
44

5+
6+
7+
58
module.exports = {
9+
// reverting upload to S3
10+
// createEvent(req, res) {
11+
// jwt.verify(req.token, 'secret', async (err, authData) => {
12+
// if (err) {
13+
// res.statusCode(401)
14+
// } else {
15+
// const { title, description, price, sport, date } = req.body
16+
// const { location } = req.file
17+
18+
// const user = await User.findById(authData.user._id)
19+
20+
// if (!user) {
21+
// return res.status(400).json({ message: 'User does not exist!' })
22+
// }
23+
24+
// try {
25+
// const event = await Event.create({
26+
// title,
27+
// description,
28+
// sport,
29+
// price: parseFloat(price),
30+
// user: authData.user._id,
31+
// thumbnail: location,
32+
// date
33+
// })
34+
35+
// return res.json(event)
36+
// } catch (error) {
37+
// return res.status(400).json({ message: error })
38+
// }
39+
// }
40+
// })
41+
42+
// },
643
createEvent(req, res) {
744
jwt.verify(req.token, 'secret', async (err, authData) => {
845
if (err) {
946
res.statusCode(401)
1047
} else {
1148
const { title, description, price, sport, date } = req.body
12-
const { location } = req.file
49+
const { filename } = req.file
1350

1451
const user = await User.findById(authData.user._id)
1552

@@ -24,7 +61,7 @@ module.exports = {
2461
sport,
2562
price: parseFloat(price),
2663
user: authData.user._id,
27-
thumbnail: location,
64+
thumbnail: filename,
2865
date
2966
})
3067

@@ -34,7 +71,6 @@ module.exports = {
3471
}
3572
}
3673
})
37-
3874
},
3975

4076
delete(req, res) {

backend/src/models/Event.js

+26-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,28 @@
1+
// reverting API to do not use S3
2+
// const mongoose = require('mongoose')
3+
4+
// const EventSchema = new mongoose.Schema({
5+
// title: String,
6+
// description: String,
7+
// price: Number,
8+
// thumbnail: String,
9+
// sport: String,
10+
// date: Date,
11+
// user: {
12+
// type: mongoose.Schema.Types.ObjectId,
13+
// ref: 'User'
14+
// }
15+
// }, {
16+
// toJSON: {
17+
// virtuals: true
18+
// }
19+
// })
20+
21+
// EventSchema.virtual('thumbnail_url').get(function () { return this.thumbnail })
22+
23+
// module.exports = mongoose.model('Event', EventSchema)
24+
25+
126
const mongoose = require('mongoose')
227

328
const EventSchema = new mongoose.Schema({
@@ -17,6 +42,6 @@ const EventSchema = new mongoose.Schema({
1742
}
1843
})
1944

20-
EventSchema.virtual('thumbnail_url').get(function () { return this.thumbnail })
45+
EventSchema.virtual('thumbnail_url').get(function () { return `http://localhost:8080/files/${this.thumbnail}` })
2146

2247
module.exports = mongoose.model('Event', EventSchema)

backend/src/routes.js

+20-16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const express = require('express')
22
const verifyToken = require('./config/verifyToken')
3+
const multer = require('multer')
34

45
const UserController = require('./controllers/UserController')
56
const EventController = require('./controllers/EventController')
@@ -8,35 +9,38 @@ const LoginController = require('./controllers/LoginController')
89
const RegistrationController = require('./controllers/RegistrationController')
910
const ApprovalController = require('./controllers/ApprovalController')
1011
const RejectionController = require('./controllers/RejectionController')
11-
const uploadToS3 = require('./config/s3Upload');
12+
// const uploadToS3 = require('./config/s3Upload'); removing s3Upload support
13+
const uploadConfig = require('./config/upload')
1214
const routes = express.Router()
15+
const upload = multer(uploadConfig)
1316

14-
routes.get('/status', (req, res) => {
17+
routes.get('/api/status', (req, res) => {
1518
res.send({ status: 200 })
1619
})
1720

1821
//Registration
19-
routes.post('/registration/:eventId', verifyToken, RegistrationController.create)
20-
routes.get('/registration', verifyToken, RegistrationController.getMyRegistrations)
21-
routes.get('/registration/:registration_id', RegistrationController.getRegistration)
22-
routes.post('/registration/:registration_id/approvals', verifyToken, ApprovalController.approval)
23-
routes.post('/registration/:registration_id/rejections', verifyToken, RejectionController.rejection)
22+
routes.post('/api/registration/:eventId', verifyToken, RegistrationController.create)
23+
routes.get('/api/registration', verifyToken, RegistrationController.getMyRegistrations)
24+
routes.get('/api/registration/:registration_id', RegistrationController.getRegistration)
25+
routes.post('/api/registration/:registration_id/approvals', verifyToken, ApprovalController.approval)
26+
routes.post('/api/registration/:registration_id/rejections', verifyToken, RejectionController.rejection)
2427

2528
//Login
26-
routes.post('/login', LoginController.store)
29+
routes.post('/api/login', LoginController.store)
2730

2831
//Dashboard
29-
routes.get('/dashboard/:sport', verifyToken, DashboardController.getAllEvents)
30-
routes.get('/dashboard', verifyToken, DashboardController.getAllEvents)
31-
routes.get('/user/events', verifyToken, DashboardController.getEventsByUserId)
32-
routes.get('/event/:eventId', verifyToken, DashboardController.getEventById)
32+
routes.get('/api/dashboard/:sport', verifyToken, DashboardController.getAllEvents)
33+
routes.get('/api/dashboard', verifyToken, DashboardController.getAllEvents)
34+
routes.get('/api/user/events', verifyToken, DashboardController.getEventsByUserId)
35+
routes.get('/api/event/:eventId', verifyToken, DashboardController.getEventById)
3336

3437
//Events
35-
routes.post('/event', verifyToken, uploadToS3.single('thumbnail'), EventController.createEvent)
36-
routes.delete('/event/:eventId', verifyToken, EventController.delete)
38+
// routes.post('/api/event', verifyToken, uploadToS3.single('thumbnail'), EventController.createEvent) removes s3 support
39+
routes.post('/api/event', verifyToken, upload.single('thumbnail'), EventController.createEvent)
40+
routes.delete('/api/event/:eventId', verifyToken, EventController.delete)
3741

3842
//User
39-
routes.post('/user/register', UserController.createUser)
40-
routes.get('/user/:userId', UserController.getUserById)
43+
routes.post('/api/user/register', UserController.createUser)
44+
routes.get('/api/user/:userId', UserController.getUserById)
4145

4246
module.exports = routes

backend/src/server.js

+17-20
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,18 @@ const cors = require('cors')
44
const routes = require('./routes')
55
const path = require('path')
66
const http = require('http')
7-
const socketio = require('socket.io')
8-
const PORT = process.env.PORT || 8000
9-
10-
7+
// const socketio = require('socket.io')
8+
const PORT = process.env.PORT || 8080
119
const app = express()
1210
const server = http.Server(app)
13-
const io = socketio(server)
1411

15-
if (process.env.NODE_ENV !== 'production') {
16-
require('dotenv').config()
17-
}
12+
// const io = socketio(server)
13+
// if (process.env.NODE_ENV !== 'production') {
14+
// require('dotenv').config()
15+
// }
1816

1917
try {
20-
mongoose.connect(process.env.MONGO_DB_SECRET, {
18+
mongoose.connect('mongodb://mongo:27017/docker-node-mongo', {
2119
useNewUrlParser: true,
2220
useUnifiedTopology: true,
2321
})
@@ -26,20 +24,19 @@ try {
2624
console.log(error)
2725
}
2826

29-
const connectUsers = {}
3027

31-
io.on('connection', socket => {
32-
const { user } = socket.handshake.query
28+
// const connectUsers = {};
29+
// io.on('connection', socket => {
30+
// const { user } = socket.handshake.query
31+
// connectUsers[user] = socket.id
32+
// })
3333

34-
connectUsers[user] = socket.id
35-
})
34+
// app.use((req, res, next) => {
35+
// req.io = io
36+
// req.connectUsers = connectUsers
37+
// return next()
38+
// })
3639

37-
//app.use()
38-
app.use((req, res, next) => {
39-
req.io = io
40-
req.connectUsers = connectUsers
41-
return next()
42-
})
4340
app.use(cors())
4441
app.use(express.json())
4542
app.use('/files', express.static(path.resolve(__dirname, '..', 'files')))

0 commit comments

Comments
 (0)