Skip to content

Commit b53435b

Browse files
author
HasanGeorge13
committed
first commit
0 parents  commit b53435b

File tree

1,382 files changed

+265921
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,382 files changed

+265921
-0
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
"# Songs-Movies-REST-API"
2+
3+
In this backend API users can register/login and and create their favorite songs and movies list in their profiles. Also with accessing the correct endpoints, they can reach to the other users profiles and like or comment the songs and movies. I tried to write this API according to ES7 standarts and used express framework and node packages for making it more asynchronous and practical.

controllers/admin.js

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const User = require("../models/User");
2+
const errorHandler = require("../helpers/error/errorHandler")
3+
const MyError = require("../helpers/error/Error");
4+
5+
const deleteUser = errorHandler(async function(req,res,next){
6+
const {user_id} = req.params;
7+
await User.findByIdAndDelete(user_id);
8+
res
9+
.status(200)
10+
.json({
11+
success : true,
12+
message : "Deleting succesful"
13+
})
14+
15+
})
16+
17+
const editUser = errorHandler(async function(req,res,next){
18+
const {user_id} = req.params;
19+
20+
const infos = req.body;
21+
const user = await User.findByIdAndUpdate(user_id,infos,{
22+
23+
new : true,
24+
runValidators : true
25+
});
26+
res
27+
.status(200)
28+
.json({
29+
success : true,
30+
message : "Editing succesful",
31+
data : user
32+
33+
})
34+
35+
})
36+
37+
38+
module.exports = {deleteUser,editUser}

controllers/auth.js

+154
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
const User = require("../models/User");
2+
const errorHandler = require("../helpers/error/errorHandler")
3+
const {sendTokenWithResponse} = require("../helpers/authentication/tokenOperations");
4+
const MyError = require("../helpers/error/Error");
5+
const {checkPasswordMatches,checkInputsExist} = require("../helpers/database/databaseHelpers");
6+
const crypto = require('crypto');
7+
const nodemailer = require("nodemailer");
8+
9+
10+
11+
12+
const register = errorHandler(async function(req,res,next){
13+
const {name,email,password,role,secretKey} = req.body;
14+
15+
16+
const user = await User.create({
17+
name,
18+
email,
19+
password,
20+
role,
21+
secretKey
22+
})
23+
sendTokenWithResponse(user,res);
24+
25+
})
26+
27+
const login = errorHandler(async function(req,res,next){
28+
29+
const {email,password} = req.body;
30+
if(!checkInputsExist(email,password)){
31+
return next(new MyError("Please fill your inputs",400))
32+
}
33+
34+
const user = await User.findOne({email}).select("+password")
35+
36+
if(!user || !checkPasswordMatches(password,user.password)){
37+
return next(new MyError("user doesn't match",400))
38+
}
39+
40+
41+
sendTokenWithResponse(user,res);
42+
43+
})
44+
45+
const logout = errorHandler(async function(req,res,next){
46+
47+
res
48+
.status(200)
49+
.cookie("token",null,{
50+
expires : new Date(Date.now()),
51+
httpOnly:true
52+
})
53+
.json({
54+
success : true,
55+
message : "Logout Successful"
56+
})
57+
})
58+
59+
const passwordForgot = errorHandler(async function(req,res,next){
60+
const {email} = req.body;
61+
62+
const user = await User.findOne({
63+
email : email
64+
})
65+
66+
const algorithm = 'aes-256-ctr';
67+
const secretKey = 'vOVH6sdmpNWjRRIqCc7rdxs01lwHzfr3';
68+
const iv = crypto.randomBytes(16);
69+
70+
const cipher = crypto.createCipheriv(algorithm, secretKey, iv);
71+
72+
const encrypted = Buffer.concat([cipher.update(user.secretKey), cipher.final()]);
73+
74+
75+
const vector = iv.toString('hex')
76+
const token = encrypted.toString('hex')
77+
78+
79+
80+
var transporter = nodemailer.createTransport({
81+
service: 'gmail',
82+
auth: {
83+
user: 'tokulhasan24@gmail.com',
84+
pass: 'Doutzen2301'
85+
}
86+
});
87+
88+
const resetPasswordUrl = `http://localhost:5000/api/auth/passwordreset?encryptedToken=${token}&vector=${vector}`;
89+
90+
91+
92+
const emailTemplate = `
93+
94+
<p>In this <a href = '${resetPasswordUrl}' target = '_blank'>link</a> you can access your temporary token</p>
95+
96+
`
97+
98+
var mailOptions = {
99+
from: 'tokulhasan24@gmail.com',
100+
to: email,
101+
subject: 'Reset Password',
102+
html: emailTemplate
103+
};
104+
105+
transporter.sendMail(mailOptions, function(error, info){
106+
if (error) {
107+
return next(new MyError("Email could not be sent"))
108+
}
109+
})
110+
111+
112+
res
113+
.status(200)
114+
.json({
115+
success : true,
116+
message : "email is sended check !"
117+
})
118+
})
119+
120+
121+
const passwordReset = errorHandler(async function(req,res,next){
122+
123+
const {encryptedToken,vector} = req.params;
124+
const password = req.body;
125+
console.log(encryptedToken)
126+
127+
const algorithm = 'aes-256-ctr';
128+
const secretKey = 'vOVH6sdmpNWjRRIqCc7rdxs01lwHzfr3';
129+
130+
const decipher = crypto.createDecipheriv(algorithm, secretKey, Buffer.from(vector, 'hex'));
131+
132+
const decrpyted = Buffer.concat([decipher.update(Buffer.from(encryptedToken, 'hex')), decipher.final()]);
133+
134+
decryptedKey = decrpyted.toString();
135+
136+
const user = await User.findOne({
137+
secretKey : decryptedKey
138+
})
139+
console.log(user)
140+
user.password = password;
141+
await user.save()
142+
res
143+
.status(200)
144+
.json({
145+
success : true,
146+
message : "The password has been changed"
147+
})
148+
149+
})
150+
151+
152+
153+
module.exports = {register,login,logout,passwordForgot,passwordReset}
154+

controllers/movie.js

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
const errorHandler = require("../helpers/error/errorHandler");
2+
const MyError = require("../helpers/error/Error");
3+
const Movie = require("../models/Movie");
4+
const User = require("../models/User");
5+
const Comment = require("../models/Comment")
6+
7+
const listAllMovies = errorHandler(async function(req,res,next){
8+
const movies = await Movie.find().populate({path: "user",select: "name"})
9+
10+
res
11+
.status(200)
12+
.json({
13+
success : true,
14+
movies : movies
15+
})
16+
})
17+
18+
const likeMovie = errorHandler(async function(req,res,next){
19+
const {movie_id} = req.params;
20+
const id = req.user.id;
21+
const movie = await Movie.findById(movie_id);
22+
if(movie.likes.includes(id)){
23+
return next(new MyError("You have already liked this movie",400))
24+
}
25+
movie.likes.push(id);
26+
27+
await movie.save()
28+
res
29+
.status(200)
30+
.json({
31+
success : true,
32+
data : movie
33+
})
34+
})
35+
36+
const commentMovie = errorHandler(async function(req,res,next){
37+
const {movie_id} = req.params;
38+
const content = req.body;
39+
const comment = await Comment.create({
40+
...content,
41+
user : req.user.id,
42+
movie: movie_id
43+
})
44+
const movie = await Movie.findById(movie_id).populate({path: "comments",select: "content user"})
45+
movie.comments.push(comment)
46+
47+
await movie.save();
48+
49+
res
50+
.status(200)
51+
.json({
52+
success : true,
53+
movie : movie
54+
})
55+
})
56+
57+
const getMovieWithDetails = errorHandler(async function(req,res,next){
58+
const {movie_id} = req.params;
59+
const movie = await Movie.findById(movie_id).populate([
60+
{path: "comments",select: "content" ,populate:{path: "user",select: "name"}},
61+
{path: "likes",select: "name"},
62+
{path: "user",select: "name"}
63+
])
64+
res
65+
.status(200)
66+
.json({
67+
success: true,
68+
movie : movie
69+
})
70+
})
71+
72+
73+
module.exports = {listAllMovies,likeMovie,getMovieWithDetails,commentMovie};

0 commit comments

Comments
 (0)