Skip to content

Commit f418c62

Browse files
committedJan 8, 2022
fix nginx.conf
dockerize whole project and fix docker issues add profile related stuff route/controller/service/schema add poster and cover to elasticsearch fix ejs rendering
1 parent 667fd07 commit f418c62

24 files changed

+531
-175
lines changed
 

‎.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ server/parse-csv.js
1212
server/file.csv
1313
server/src/views/user/movies copy.ejs
1414
server/.eslintrc.json
15-
server/example.env
15+
server/example.env
16+
elasticsearch/
17+
mysql

‎docker-compose.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@ services:
3333
build: ./server
3434
container_name: streaming-app-nodejs
3535
volumes:
36-
- ./server:/usr/src/app
36+
- ./server:/usr/src/app/server
37+
- ./media:/usr/src/app/media
3738
networks:
3839
- streaming-app-network
3940
depends_on:
4041
- mysql
4142
- elasticsearch
4243
- redis
44+
restart: always
4345

4446
nginx:
4547
build: ./nginx

‎nginx/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ RUN CONFARGS=$(nginx -V 2>&1 | sed -n -e 's/^.*arguments: //p')\
3838
unzip "lua-module.zip" -d /usr/src && \
3939
unzip "luajit2.zip" -d /usr/src && \
4040
unzip "lua-resty-core.zip" -d /usr/src && \
41-
unzip "ua-resty-lrucache.zip" -d /usr/src && \
41+
unzip "lua-resty-lrucache.zip" -d /usr/src && \
4242
export LUAJIT_LIB=/usr/local/luajit/lib && \
4343
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.1 && \
4444
cd /usr/src/luajit2-2.1-20211210 && make && make install PREFIX=/usr/local/luajit && \

‎nginx/default.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ server {
2121
header_filter_by_lua_block {
2222
local h = ngx.resp.get_headers()["x-userid"] or 0
2323
if (tonumber(h) < tonumber(ngx.var[1]) ) then
24-
return ngx.exit(400)
24+
return ngx.exit(401)
2525
end
2626
}
2727
}

‎nginx/nginx.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,6 @@ http {
2727
keepalive_timeout 65;
2828

2929
#gzip on;
30+
client_max_body_size 100M;
3031
include /etc/nginx/conf.d/*.conf;
3132
}

‎server/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
FROM node:16-alpine
1+
FROM node:latest
22

3-
WORKDIR /usr/src/app
3+
WORKDIR /usr/src/app/server
44

55
# COPY package.json package-lock.json ./
66
# RUN npm install

‎server/src/controllers/movie.controller.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// required packages
2-
// const config = require('../config')
2+
const config = require('../config')
33

44
// required services
55
const movieService = new (require('../services/movie.service'))()
@@ -46,7 +46,7 @@ module.exports = class MovieController {
4646
title: movie.title,
4747
relates: [],
4848
screenshots: [],
49-
url: 'http://127.0.0.1:3005'
49+
url: config.app.url
5050
})
5151
}
5252

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// required services
2+
const profileService = new (require('../services/profile.service'))()
3+
4+
module.exports = class ProfileController {
5+
async index (req, res) {
6+
return res.render('user/profile', { title: 'My Profile' })
7+
}
8+
9+
async update (req, res) {
10+
try {
11+
await profileService.updateProfile({ user: req.user, body: req.body })
12+
req.flash('success', 'Info saved successfuly')
13+
} catch (error) {
14+
req.flash('error', error.message)
15+
}
16+
17+
return res.redirect('/profile')
18+
}
19+
20+
async updatePassword (req, res) {
21+
try {
22+
await profileService.updatePassword({ user: req.user, body: req.body })
23+
const maxAge = req.session.cookie.maxAge
24+
return req.session.regenerate(_err => {
25+
req.session.reload(_err => {
26+
req.login(req.user, _err => {})
27+
req.session.cookie.maxAge = maxAge
28+
req.flash('success', 'Password changed successfuly')
29+
req.session.save(_err => {
30+
res.redirect('/profile')
31+
})
32+
})
33+
})
34+
} catch (error) {
35+
req.flash('error', error.message)
36+
return res.redirect('/profile')
37+
}
38+
}
39+
}

‎server/src/database/elasticsearch/create.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ module.exports = async function (movie) {
99
title: movie.title,
1010
year: movie.year,
1111
rate: movie.rate,
12+
poster: movie.poster,
13+
cover: movie.cover,
1214
country: movie.country,
1315
description: movie.description,
1416
duration: movie.duration,

‎server/src/database/elasticsearch/initializer.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ const body = {
3939
duration: {
4040
enabled: false
4141
},
42+
poster: {
43+
enabled: false
44+
},
45+
cover: {
46+
enabled: false
47+
},
4248
rate: {
4349
type: 'double'
4450
},
Lines changed: 90 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,118 @@
1-
//required packages
1+
// required packages
22
const client = require('./client')
33

4-
5-
64
const SORT = {
7-
"Recent": { id: { order: "desc" } },
8-
"Rating": { rate: { order: "desc" } },
9-
"Year": { year: { order: "desc" } },
5+
Recent: { id: { order: 'desc' } },
6+
Rating: { rate: { order: 'desc' } },
7+
Year: { year: { order: 'desc' } }
108
}
119

12-
1310
const getMovies = async ({ size, from, query, sortBy }) => {
14-
let sort = []
15-
if (SORT[sortBy]) {
16-
sort.push(SORT[sortBy])
11+
const sort = []
12+
if (SORT[sortBy]) {
13+
sort.push(SORT[sortBy])
14+
}
15+
16+
console.log(JSON.stringify({
17+
index: 'movies',
18+
body: {
19+
size,
20+
from,
21+
query,
22+
sort
1723
}
24+
}))
25+
26+
const result = await client.search({
27+
index: 'movies',
28+
body: {
29+
size,
30+
from,
31+
query,
32+
sort
33+
}
34+
})
1835

19-
console.log(JSON.stringify({
20-
index: 'movies',
21-
body: {
22-
size,
23-
from,
24-
query,
25-
sort
26-
}
27-
}))
28-
29-
const result = await client.search({
30-
index: 'movies',
31-
body: {
32-
size,
33-
from,
34-
query,
35-
sort
36-
}
37-
})
38-
39-
return result?.body?.hits?.hits
36+
return result?.body?.hits?.hits
4037
}
4138

42-
4339
const getMoviesCount = async (query) => {
44-
const result = await client.count({
45-
index: 'movies',
46-
body: {
47-
query
48-
}
49-
})
40+
const result = await client.count({
41+
index: 'movies',
42+
body: {
43+
query
44+
}
45+
})
5046

51-
return result?.body?.count
47+
return result?.body?.count
5248
}
5349

5450
const buildFilterQuery = ({ genre, rate, year, q }) => {
55-
const query = {
56-
"bool": {
57-
"must": [
58-
59-
],
60-
"filter": [
61-
]
62-
}
63-
}
64-
if (q) {
65-
query.bool.must.push({
66-
"multi_match": {
67-
"query": q,
68-
"fields": ["title", "description"]
69-
}
70-
})
71-
} else {
72-
query.bool.must.push({ "match_all": {} })
73-
}
51+
const query = {
52+
bool: {
53+
must: [
7454

75-
if (genre) {
76-
query.bool.filter.push({ "term": { "genre": genre } })
77-
}
78-
if (rate) {
79-
query.bool.filter.push({ "range": { "rate": { "gte": rate } } })
55+
],
56+
filter: [
57+
]
8058
}
81-
82-
if (year) {
83-
query.bool.filter.push({ "term": { "year": year } })
84-
}
85-
86-
return query
59+
}
60+
if (q) {
61+
query.bool.must.push({
62+
multi_match: {
63+
query: q,
64+
fields: ['title', 'description']
65+
}
66+
})
67+
} else {
68+
query.bool.must.push({ match_all: {} })
69+
}
70+
71+
if (genre) {
72+
query.bool.filter.push({ term: { genre: genre } })
73+
}
74+
if (rate) {
75+
query.bool.filter.push({ range: { rate: { gte: rate } } })
76+
}
77+
78+
if (year) {
79+
query.bool.filter.push({ term: { year: year } })
80+
}
81+
82+
return query
8783
}
8884

8985
const paginator = async ({ size, page, filter, sort }) => {
90-
page = parseInt(page) || 1;
91-
size = parseInt(size) || 24;
92-
93-
const filterQuery = buildFilterQuery({ ...filter })
94-
let count = await getMoviesCount(filterQuery)
95-
count = count > 10000 ? 10000 : count
86+
page = parseInt(page) || 1
87+
size = parseInt(size) || 24
9688

97-
const pages = Math.ceil(count / size);
89+
const filterQuery = buildFilterQuery({ ...filter })
90+
let count = await getMoviesCount(filterQuery)
91+
count = count > 10000 ? 10000 : count
9892

99-
const hasOther = pages > 1 ? true : false;
100-
const hasNext = page < pages && hasOther ? true : false;
101-
const hasPerv = page > 1 && hasOther ? true : false;
93+
const pages = Math.ceil(count / size)
10294

103-
const from = (page - 1) * size <= 10000 ? (page - 1) * size : 10000 - size;
95+
const hasOther = pages > 1
96+
const hasNext = !!(page < pages && hasOther)
97+
const hasPerv = !!(page > 1 && hasOther)
10498

105-
if (page > pages) {
106-
page = pages;
107-
}
99+
const from = (page - 1) * size <= 10000 ? (page - 1) * size : 10000 - size
108100

109-
const records = await getMovies({ size, from, query: filterQuery, sortBy: sort })
101+
if (page > pages) {
102+
page = pages
103+
}
110104

111-
return {
112-
records,
113-
page,
114-
pages,
115-
hasOther,
116-
hasNext,
117-
hasPerv,
118-
count,
119-
};
120-
};
105+
const records = await getMovies({ size, from, query: filterQuery, sortBy: sort })
121106

107+
return {
108+
records,
109+
page,
110+
pages,
111+
hasOther,
112+
hasNext,
113+
hasPerv,
114+
count
115+
}
116+
}
122117

123-
module.exports = paginator
118+
module.exports = paginator

‎server/src/database/elasticsearch/update.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ module.exports = async function (movie) {
88
{
99
conflicts: 'proceed',
1010
script: {
11-
source: 'ctx._source.id=(params.id);ctx._source.title = (params.title);ctx._source.year = (params.year);ctx._source.country = (params.country);ctx._source.rate = (params.rate);ctx._source.description = (params.description);ctx._source.duration = (params.duration);ctx._source.genres = (params.genres);',
11+
source: 'ctx._source.id=(params.id);ctx._source.title = (params.title);ctx._source.year = (params.year);ctx._source.country = (params.country);ctx._source.rate = (params.rate);ctx._source.poster = (params.poster);ctx._source.cover = (params.cover);ctx._source.description = (params.description);ctx._source.duration = (params.duration);ctx._source.genres = (params.genres);',
1212
params: {
1313
id: movie.id,
1414
title: movie.title,
1515
year: movie.year,
1616
rate: movie.rate,
17+
poster: movie.poster,
18+
cover: movie.cover,
1719
country: movie.country,
1820
description: movie.description,
1921
duration: movie.duration,

‎server/src/middlewares/validateBody.middleware.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ const { validationResult } = require('express-validator')
33
function validate (req, res, next) {
44
const error = validationResult(req).formatWith(({ msg }) => msg)
55
if (!error.isEmpty()) {
6-
console.log(error.array())
76
req.flash('error', error.array())
7+
if (req.originalUrl === '/change-password') {
8+
return res.redirect('/profile')
9+
}
810
return res.redirect(req.originalUrl)
911
}
1012
next()

‎server/src/queues/register.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ const transcodingProcessor = require('./processors/transcoding.processor')
22
const { transcodingQueue } = require('./queue')
33

44
transcodingQueue.process(transcodingProcessor)
5-
console.log('queue processors registerd')
5+
console.log('[*] Queue processors registerd')

‎server/src/router.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ router.use(require('./routes/auth.route')(passport))
77
router.use(require('./routes/movie.route'))
88
router.use('/admin', require('./routes/admin.route'))
99
router.use(require('./routes/subscription.route'))
10+
router.use(require('./routes/profile.route'))
1011

1112
module.exports = router

0 commit comments

Comments
 (0)
Please sign in to comment.