userController.js
5.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import passport from "passport";
import routes from "../routes";
import User from "../models/User";
// 회원가입 -> 완료 -> 홈화면으로 Redirect
export const getJoin = (req, res) => {
res.render("join", { pageTitle: "Join" });
};
export const postJoin = async (req, res, next) => {
const {
body: { name, email, password, password2 },
} = req;
if (password !== password2) {
req.flash("error", "Passwords don't match");
res.status(400);
res.render("join", { pageTitle: "Join" });
} else {
try {
const user = await User({
name,
email,
});
await User.register(user, password);
next();
} catch (error) {
// eslint-disable-next-line no-console
console.log(error);
res.redirect(routes.home);
}
// To Do: Register User
// To Do: Log user in
}
};
export const getLogin = (req, res) =>
res.render("login", { pageTitle: "Login" });
export const postLogin = passport.authenticate("local", {
failureRedirect: routes.login,
successRedirect: routes.home,
successFlash: "Welcome",
failureFlash: "Can't log in. Check email and/or password",
});
// 깃허브 로그인
export const githubLogin = passport.authenticate("github", {
successFlash: "Welcome",
failureFlash: "Can't log in. Check email and/or password",
});
// call back 받아오는 함수
export const githubLoginCallback = async (
accessToken,
refreshToken,
profile,
cb
) => {
// callback 정보 확인용 console.log
// console.log(accessToken, refreshToken, profile, cb);
const {
_json: { id, avatar_url: avatarUrl, name, email },
} = profile;
// profile 파라미터로 가져온 내용들
// 파라미터로 받은 cb함수가 처리해준다. True->정보를 쿠키에.. False->error
try {
const user = await User.findOne({ email });
if (user) {
user.githubId = id;
user.save();
return cb(null, user);
}
const newUser = await User.create({
email,
name,
githubId: id,
avatarUrl,
});
return cb(null, newUser);
} catch (error) {
return cb(error, null);
}
};
export const postGithubLogin = (req, res) => {
res.redirect(routes.home);
};
export const facebookLogin = passport.authenticate("facebook", {
successFlash: "Welcome",
failureFlash: "Can't log in. Check email and/or password",
});
// http://www.passportjs.org/packages/passport-facebook/ 참고하였습니다.
export const facebookLoginCallback = async (_, __, profile, cb) => {
const {
_json: { id, name, email },
} = profile;
try {
const user = await User.findOne({ email });
if (user) {
user.facebookId = id;
user.avatarUrl = `https://graph.facebook.com/${id}/picture?type=large`;
user.save();
return cb(null, user);
} // graph API 참조.
const newUser = await User.create({
email,
name,
facebookId: id,
avatarUrl: `https://graph.facebook.com/${id}/picture?type=large`,
});
return cb(null, newUser);
} catch (error) {
return cb(error, null);
}
// console.log(accessToken, refreshToken, profile, cb);
};
export const postFacebookLogin = (req, res) => {
res.redirect(routes.home);
};
// 로그아웃을 클릭하면 LogOut페이지로 가는 것 대신에, 로그아웃을 처리한 후
// home 페이지로 Redirect로 표현할 것이다.
// 즉, 초반에 만들어둔 logout.pug는 삭제해도 좋다.
export const logout = (req, res) => {
// res.render("logout", { pageTitle: "Logout" });
req.flash("info", "Logged out, see you later");
req.logout();
res.redirect(routes.home);
};
// 미들웨어로 부터 로그인한 user를 받는다.
export const getMe = async (req, res) => {
try {
const user = await User.findById(req.user.id).populate("videos");
res.render("userDetail", { pageTitle: "User Detail", user });
} catch (error) {
res.redirect(routes.home);
}
};
// req.user -> 로그인된 유저
// export const users = (req, res) => res.render("users", { pageTitle: "Users" });
export const userDetail = async (req, res) => {
const {
params: { id },
} = req; // req로 부터 params의 id가져오기
try {
const user = await User.findById(id).populate("videos");
res.render("userDetail", { pageTitle: "User Detail", user });
} catch (error) {
req.flash("error", "User not found");
res.redirect(routes.home);
}
};
export const getEditProfile = (req, res) =>
res.render("editProfile", { pageTitle: "Edit Profile" });
export const postEditProfile = async (req, res) => {
const {
body: { name, email },
file,
} = req;
try {
// 로그인된 user의 id 가져오면 됨
await User.findByIdAndUpdate(req.user.id, {
name,
email,
avatarUrl: file ? file.location : req.user.avatarUrl, // S3 적용때메 file.path -> file.location 변경(06/24)
});
req.flash("success", "Profile updated");
res.redirect(routes.me);
} catch (error) {
req.flash("error", "Can't update profile");
res.redirect(`/users${routes.editProfile}`);
}
};
export const getChangePassword = (req, res) =>
res.render("changePassword", { pageTitle: "Change Password" });
export const postChangePassword = async (req, res) => {
const {
body: { oldPassword, newPassword, newPassword1 },
} = req;
try {
if (newPassword !== newPassword1) {
req.flash("error", "Passwords don't match");
res.status(400);
res.redirect(`/users${routes.changePassword}`);
return;
}
await req.user.changePassword(oldPassword, newPassword);
res.redirect(routes.me);
} catch (error) {
req.flash("error", "Can't change password");
res.status(400);
res.redirect(`/users${routes.changePassword}`);
}
};