user.controller.js 9.16 KB
Newer Older
한규민's avatar
한규민 committed
1
2
import jwt from "jsonwebtoken";
import config from "../config/app.config.js";
한규민's avatar
한규민 committed
3
import { User, Role } from '../db/index.js';
한규민's avatar
한규민 committed
4
import fs from "fs";
한규민's avatar
한규민 committed
5

한규민's avatar
한규민 committed
6
7
const getUser = async (req, res) => {
    try {
한규민's avatar
한규민 committed
8
        if (req.cookies.butterStudio) {
한규민's avatar
한규민 committed
9
10
11
12
13
14
15
16
17
18
19
20
            const token = req.cookies.butterStudio;
            const decoded = jwt.verify(token, config.jwtSecret);
            res.json(decoded);
        } else {
            res.json({ id: 0, role: "user" });
        }
    } catch (error) {
        console.error(error);
        return res.status(500).send("유저를 가져오지 못했습니다.");
    }
}

Jiwon Yoon's avatar
Jiwon Yoon committed
21
const login = async (req, res) => {
한규민's avatar
한규민 committed
22
23
24
25
26
27
28
    try {
        const { id, password } = req.body;
        //사용자 존재 확인
        const user = await User.scope("withPassword").findOne({ where: { userId: id } });
        if (!user) {
            return res.status(422).send(`사용자가 존재하지 않습니다`);
        }
한규민's avatar
한규민 committed
29
        // 2) 비밀번호 확인은 데이터베이스 프로토타입 메소드에서 처리(사용자가 입력한 비밀번호와 서버에 있는 비번 비교)
한규민's avatar
한규민 committed
30
31
32
        const passwordMatch = await user.comparePassword(password);
        if (passwordMatch) {
            // 3) 비밀번호가 맞으면 토큰 생성
한규민's avatar
push    
한규민 committed
33
            const userRole = await user.getRole();
한규민's avatar
한규민 committed
34
            const signData = {
한규민's avatar
한규민 committed
35
                id: user.id,
한규민's avatar
push    
한규민 committed
36
                role: userRole.name,
한규민's avatar
한규민 committed
37
38
39
40
            };
            const token = jwt.sign(signData, config.jwtSecret, {
                expiresIn: config.jwtExpires,
            });
한규민's avatar
한규민 committed
41
            console.log(token);
한규민's avatar
한규민 committed
42
43
44
45
46
47
48
49
50
            // 4) 토큰을 쿠키에 저장
            res.cookie(config.cookieName, token, {
                maxAge: config.cookieMaxAge,
                path: "/",
                httpOnly: config.env === "production",
                secure: config.env === "production",
            });
            // 5) 사용자 반환
            res.json({
한규민's avatar
한규민 committed
51
                id: user.id,
한규민's avatar
context    
한규민 committed
52
                role: userRole.name,
한규민's avatar
한규민 committed
53
54
55
56
57
58
59
60
61
62
63
64
            });
        } else {
            // 6) 비밀번호 불일치
            res.status(401).send("비밀번호가 일치하지 않습니다");
        }
    } catch (error) {
        console.error(error);
        return res.status(500).send("로그인 에러");
    }

}

Jiwon Yoon's avatar
Jiwon Yoon committed
65
66
const logout = async (req, res) => {
    try {
한규민's avatar
한규민 committed
67
        res.clearCookie(config.cookieName);
한규민's avatar
한규민 committed
68
69
70
71
        res.json({
            id: 0,
            role: "user",
        })
한규민's avatar
한규민 committed
72
        res.send('successfully cookie cleared.')
Jiwon Yoon's avatar
Jiwon Yoon committed
73
    } catch (error) {
한규민's avatar
context    
한규민 committed
74
75
        console.error(error);
        return res.status(500).send("로그인 에러");
한규민's avatar
한규민 committed
76
    }
Jiwon Yoon's avatar
Jiwon Yoon committed
77
}
한규민's avatar
한규민 committed
78

한규민's avatar
한규민 committed
79
const compareId = async (req, res) => {
한규민's avatar
한규민 committed
80
81
82
83
84
85
86
87
88
89
90
    try {
        const id = req.params.userId;
        const userid = await User.findOne({ where: { userId: id } });
        if (userid !== null) {
            return res.json(true);
        } else {
            return res.json(false);
        }
    } catch (error) {
        console.error(error);
        return res.status(500).send("아이디 중복 확인 에러");
한규민's avatar
한규민 committed
91
92
93
    }
}

한규민's avatar
한규민 committed
94
95
96
97
const confirmMbnum = async (req, res) => {
    const id = req.params.id;
    const token = req.params.token;

한규민's avatar
한규민 committed
98
99
100
101
102
103
    // const client = Twilio(id, token);
    // // console.log(client);
    // client.messages
    //     .create({
    //         to: '+8201086074580',
    //         from: '+14159428621',
한규민's avatar
한규민 committed
104
    //         body: '[config.cookieName] 인증번호[1234]를 입력해주세요',
한규민's avatar
한규민 committed
105
106
107
    //     })
    //     .then(message => console.log(message.sid))
    //     .catch(e => console.log(error));
한규민's avatar
한규민 committed
108
    // console.log("id = ", id, "token = ", token);
한규민's avatar
한규민 committed
109
    res.json(true);
한규민's avatar
한규민 committed
110
111
}

한규민's avatar
한규민 committed
112
const signup = async (req, res) => {
한규민's avatar
한규민 committed
113
    const { userId, userEmail, userNickName, userBirthday, userMbnum, userPassword } = req.body;
한규민's avatar
한규민 committed
114
115
    // 휴대폰 중복 확인
    try {
Jiwon Yoon's avatar
Jiwon Yoon committed
116
        const mbnum = await User.findOne({ where: { phoneNumber: userMbnum } });
한규민's avatar
한규민 committed
117
118
119
120
121
122
123
        const email = await User.findOne({ where: { email: userEmail } });

        if (mbnum && email) {
            return res.status(422).send(`이미 있는 이메일, 휴대폰번호입니다.`);
        } else if (!mbnum && email) {
            return res.status(422).send(`이미 있는 이메일입니다.`);
        } else if (mbnum && !email) {
한규민's avatar
한규민 committed
124
            return res.status(422).send(`이미 있는 휴대폰번호입니다.`);
한규민's avatar
한규민 committed
125
126
127
128
129
130
131
132
133
134
135
136
        } else {
            const role = await Role.findOne({ where: { name: "member" } })
            const newUser = await User.create({
                userId: userId,
                email: userEmail,
                nickname: userNickName,
                birth: userBirthday,
                phoneNumber: userMbnum,
                password: userPassword,
                roleId: role.id
            });
            res.json(newUser);
한규민's avatar
한규민 committed
137
138
139
140
141
142
143
        }
    } catch (error) {
        console.error(error.message);
        res.status(500).send("회원가입 에러. 나중에 다시 시도 해주세요");
    }
};

한규민's avatar
한규민 committed
144
const getMember = async (req, res) => {
한규민's avatar
한규민 committed
145
    try {
한규민's avatar
한규민 committed
146
147
148
        const token = req.cookies.butterStudio;
        const decoded = jwt.verify(token, config.jwtSecret);
        if (decoded.role === "member") {
한규민's avatar
한규민 committed
149
150
            const user = await User.findOne({ where: { id: decoded.id } });
            res.json({nickname : user.nickname, img : user.img});
한규민's avatar
한규민 committed
151
152
153
        } else {
            res.status(401).send("잘못된 접근입니다.");
        }
한규민's avatar
한규민 committed
154
    } catch (error) {
한규민's avatar
한규민 committed
155
156
157
158
159
        console.error("error : ", error.message);
        res.status(500).send("잘못된 접근입니다.");
    }
}

한규민's avatar
한규민 committed
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
const uploadProfile = async (req, res) => {
    try {
        const image = req.file.filename;
        console.log(req.file);
        const token = req.cookies.butterStudio;
        const decoded = jwt.verify(token, config.jwtSecret);

        if (decoded) {
            const img = await User.findOne({ where: { id:decoded.id }, attributes : ["img"]});
            console.log("여기여기");
            fs.unlink( "upload"+`\\${img.img}`, function(data){ console.log(data);});

            const user = await User.update({
                img: image
            }, { where: { id: decoded.id } });
            if(user){
                const success = await User.findOne({ where: { id: decoded.id }, attributes: ["img"]});
                res.json(success)
            }else{
                throw new Error("프로필 등록 실패")
            }
        }
    } catch (error) {
        console.error(error.message);
        res.status(500).send("프로필 에러");
    }
}

한규민's avatar
한규민 committed
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
const comparePw = async (req, res) => {
    try {
        //쿠키 안 토큰에서 id추출
        const token = req.cookies.butterStudio;
        const decoded = jwt.verify(token, config.jwtSecret);
        //해당 id의 행 추출
        const user = await User.scope("withPassword").findOne({ where: { id: decoded.id } });
        //입력한 비번과 해당 행 비번을 비교
        const passwordMatch = await user.comparePassword(req.params.pw);
        //클라이언트로 동일여부를 전송
        if (passwordMatch) {
            return res.json(true)
        } else {
            return res.json(false)
        }
    } catch (error) {
        console.error("error : ", error.message);
        res.status(500).send("인증 에러");
한규민's avatar
한규민 committed
206
207
    }
}
한규민's avatar
한규민 committed
208

한규민's avatar
한규민 committed
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
const overlap = async (decoded, dataType, data) => {
    try {
        let overlap = await User.findOne({ where: { id: decoded.id } });
        console.log("overlap : ", overlap, "overlap[dataType] :    ", overlap[dataType]);
        if (overlap[dataType] === data) {
            console.log("여기여기")
            return true
        } else {
            overlap = await User.findOne({ where: { id: decoded.id }, attributes: [dataType] });
            if (overlap) {
                return false
            } else {
                return true
            }
        }
    }catch(error){
        console.error(error.message);
    }
}

한규민's avatar
한규민 committed
229
230
const modifyUser = async (req, res) => {
    try {
한규민's avatar
한규민 committed
231
232
233
        const token = req.cookies.butterStudio;
        const decoded = jwt.verify(token, config.jwtSecret);
        const { userEmail, userNickName, userMbnum, userPassword } = req.body;
한규민's avatar
한규민 committed
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
        const overlapEmail = await overlap(decoded, "email", userEmail);
        const overlapMbnum = await overlap(decoded, "phoneNumber", userMbnum);
        console.log("overlapEmail", overlapEmail, " overlapMbnum : ", overlapMbnum);

        if (overlapEmail && overlapMbnum) {
            const user = await User.update({
                email: userEmail,
                nickname: userNickName,
                phoneNumber: userMbnum,
                password: userPassword,
            }, { where: { id: decoded.id } });
            console.log("user22 :", user);
            res.json(user);
        } else if (!overlapEmail && overlapMbnum) {
            res.status(500).send("이미 있는 이메일입니다.");
        } else if (overlapEmail && !overlapMbnum) {
            res.status(500).send("이미 있는 이메일입니다.");
한규민's avatar
한규민 committed
251
        } else {
한규민's avatar
한규민 committed
252
            res.status(500).send("이미 있는 이메일, 핸드폰번호입니다.");
한규민's avatar
한규민 committed
253
254
255
256
257
258
259
        }
    } catch (error) {
        console.error(error.message);
        res.status(500).send("수정 에러. 나중에 다시 시도 해주세요");
    }
};

한규민's avatar
한규민 committed
260
export default {
한규민's avatar
한규민 committed
261
    getUser,
한규민's avatar
한규민 committed
262
    login,
한규민's avatar
push    
한규민 committed
263
    logout,
한규민's avatar
한규민 committed
264
    compareId,
한규민's avatar
한규민 committed
265
266
    confirmMbnum,
    signup,
한규민's avatar
한규민 committed
267
268
    getMember,
    uploadProfile,
한규민's avatar
한규민 committed
269
    comparePw,
한규민's avatar
한규민 committed
270
    modifyUser
한규민's avatar
한규민 committed
271
}