diff --git a/app.js b/app.js index 1841e8c6b62a0e6775f02957149ac40c1e651885..941531d2072a4fb028bf97eeb75365056cc3f1c3 100644 --- a/app.js +++ b/app.js @@ -58,13 +58,13 @@ app.use(flash()); //app.set('trust proxy', 1); console.log('MongoDB URI:', process.env.MONGO_URI); //라우터 등록 -const authRoutes = require('./routes/auth'); +const authRoutes = require('./routes/authRoute'); app.use('/api/auth', authRoutes); -const scheduleRoutes = require('./routes/schedule'); +const scheduleRoutes = require('./routes/scheduleRoute'); app.use('/api/schedule', scheduleRoutes); -const friendRoutes = require('./routes/friend'); +const friendRoutes = require('./routes/friendRoute'); app.use('/api/friend', friendRoutes); const meetingRoutes = require('./routes/meetingRoute'); @@ -76,7 +76,7 @@ app.use('/api/chat', chatRoutes); const memberRoutes = require('./routes/memberRoute'); app.use('/api/member', memberRoutes); -const sessionRouter = require('./routes/session'); +const sessionRouter = require('./routes/sessionRoute'); app.use('/api/session', sessionRouter); // 스케줄 클리너 초기화 diff --git a/models/index.js b/models/index.js index 7c656bce5e72aacf3846966653feac308ca30f29..7caa67277dc86e3f1dcc043a15e8897cbc7ee641 100644 --- a/models/index.js +++ b/models/index.js @@ -10,35 +10,106 @@ const Invite =require('./invite') const MeetingParticipant = require('./meetingParticipant'); // const ChatRooms = require('./ChatRooms'); -// 관계 설정 -Friend.belongsTo(User, { foreignKey: 'requester_id', as: 'requester' }); // 친구 요청을 보낸 사용자 -Friend.belongsTo(User, { foreignKey: 'receiver_id', as: 'receiver' }); // 친구 요청을 받은 사용자 +// Friend 관계 설정 +Friend.belongsTo(User, { + foreignKey: 'requester_id', + as: 'requester', + onDelete: 'CASCADE', +}); +Friend.belongsTo(User, { + foreignKey: 'receiver_id', + as: 'receiver', + onDelete: 'CASCADE', +}); +User.hasMany(Friend, { + foreignKey: 'requester_id', + as: 'sentRequests', + onDelete: 'CASCADE', +}); +User.hasMany(Friend, { + foreignKey: 'receiver_id', + as: 'receivedRequests', + onDelete: 'CASCADE', +}); -User.hasMany(Friend, { foreignKey: 'requester_id', as: 'sentRequests' }); // 친구 요청을 보낸 목록 -User.hasMany(Friend, { foreignKey: 'receiver_id', as: 'receivedRequests' }); // 친구 요청을 받은 목록 -// 연관 관계 설정 -Meeting.belongsTo(User, { foreignKey: 'created_by', as: 'creator' }); -User.hasMany(Meeting, { foreignKey: 'created_by', as: 'meetings' }); +// Meeting 관계 설정 +Meeting.belongsTo(User, { + foreignKey: 'created_by', + as: 'creator', + onDelete: 'SET NULL', +}); +User.hasMany(Meeting, { + foreignKey: 'created_by', + as: 'meetings', + onDelete: 'SET NULL', +}); -MeetingParticipant.belongsTo(Meeting, { foreignKey: 'meeting_id', as: 'meeting' }); -Meeting.hasMany(MeetingParticipant, { foreignKey: 'meeting_id', as: 'participants' }); +// MeetingParticipant 관계 설정 +MeetingParticipant.belongsTo(Meeting, { + foreignKey: 'meeting_id', + as: 'meeting', + onDelete: 'CASCADE', +}); +Meeting.hasMany(MeetingParticipant, { + foreignKey: 'meeting_id', + as: 'participants', + onDelete: 'CASCADE', +}); +MeetingParticipant.belongsTo(User, { + foreignKey: 'user_id', + as: 'user', + onDelete: 'CASCADE', +}); +User.hasMany(MeetingParticipant, { + foreignKey: 'user_id', + as: 'meetingParticipations', + onDelete: 'CASCADE', +}); -MeetingParticipant.belongsTo(User, { foreignKey: 'user_id', as: 'user' }); -User.hasMany(MeetingParticipant, { foreignKey: 'user_id', as: 'meetingParticipations' }); +// Schedule 관계 설정 +Schedule.belongsTo(User, { + foreignKey: 'user_id', + as: 'user', + onDelete: 'CASCADE', +}); +User.hasMany(Schedule, { + foreignKey: 'user_id', + as: 'schedules', + onDelete: 'CASCADE', +}); -Schedule.belongsTo(User, { foreignKey: 'user_id', as: 'user' }); -User.hasMany(Schedule, { foreignKey: 'user_id', as: 'schedules' }); +// Invite 관계 설정 +Invite.belongsTo(Meeting, { + foreignKey: 'meeting_id', + as: 'meeting', + onDelete: 'CASCADE', +}); +Invite.belongsTo(User, { + foreignKey: 'inviter_id', + as: 'inviter', + onDelete: 'CASCADE', +}); +Invite.belongsTo(User, { + foreignKey: 'invitee_id', + as: 'invitee', + onDelete: 'CASCADE', +}); +User.hasMany(Invite, { + foreignKey: 'inviter_id', + as: 'sentInvites', + onDelete: 'CASCADE', +}); +User.hasMany(Invite, { + foreignKey: 'invitee_id', + as: 'receivedInvites', + onDelete: 'CASCADE', +}); +Meeting.hasMany(Invite, { + foreignKey: 'meeting_id', + as: 'invites', + onDelete: 'CASCADE', +}); -FcmToken.belongsTo(User, { foreignKey: 'userId', as: 'user' }); -User.hasMany(FcmToken, { foreignKey: 'userId', as: 'fcmTokenList' }); - -Invite.belongsTo(Meeting, { foreignKey: 'meeting_id', as: 'meeting' }); -Invite.belongsTo(User, { foreignKey: 'inviter_id', as: 'inviter' }); // 초대한 사용자 -Invite.belongsTo(User, { foreignKey: 'invitee_id', as: 'invitee' }); // 초대받은 사용자 - -User.hasMany(Invite, { foreignKey: 'inviter_id', as: 'sentInvites' }); // 보낸 초대 목록 -User.hasMany(Invite, { foreignKey: 'invitee_id', as: 'receivedInvites' }); // 받은 초대 목록 -Meeting.hasMany(Invite, { foreignKey: 'meeting_id', as: 'invites' }); // 해당 미팅의 모든 초대 module.exports = { sequelize, diff --git a/routes/auth.js b/routes/auth.js deleted file mode 100644 index 186b15d2074cc30200de1f2e047fb6a8ef93646e..0000000000000000000000000000000000000000 --- a/routes/auth.js +++ /dev/null @@ -1,50 +0,0 @@ -const express = require('express'); -const passport = require('passport'); - -const router = express.Router(); - -// Google OAuth 로그인 라우터 -router.get( - '/login', - passport.authenticate('google', { - scope: ['profile', 'email'], // 사용자 정보 요청을 위한 scope - failureRedirect: `${process.env.FRONT_URL}/login` - }) -); - -router.get( - '/google/callback', - passport.authenticate('google', { - failureRedirect: `${process.env.FRONT_URL}/login` // 수정된 부분 - }), - (req, res) => { - const redirectUrl = process.env.FRONT_URL; - req.session.save((err) => { - if (err) { - console.error('세션 저장 오류:', err); - return res.status(500).json({ error: '서버 오류' }); - } - res.redirect(redirectUrl); - }); - } -); - -// 로그아웃 라우터 -router.get('/logout', (req, res) => { - if (req.session) { - req.session.destroy((err) => { - if (err) { - console.error('세션 삭제 오류:', err); - return res.status(500).json({ error: '서버 오류' }); - } - const redirectUrl = process.env.FRONT_URL; - res.redirect(redirectUrl); - }); - } else { - // 세션이 없는 경우에도 리다이렉트 - const redirectUrl = process.env.FRONT_URL; - res.redirect(redirectUrl); - } -}); - -module.exports = router; \ No newline at end of file diff --git a/routes/authRoute.js b/routes/authRoute.js new file mode 100644 index 0000000000000000000000000000000000000000..e6f2d553e56f361aec5c9f6ca82d664c1b5034ff --- /dev/null +++ b/routes/authRoute.js @@ -0,0 +1,84 @@ + const express = require('express'); + const passport = require('passport'); + + const router = express.Router(); + + // Google OAuth 로그인 라우터 + router.get( + '/login', + passport.authenticate('google', { + scope: ['profile', 'email'], // 사용자 정보 요청을 위한 scope + failureRedirect: `${process.env.FRONT_URL}/login` + }) + ); + + router.get( + '/google/callback', + passport.authenticate('google', { + failureRedirect: `${process.env.FRONT_URL}/login` + }), + (req, res) => { + const redirectUrl = process.env.FRONT_URL; + req.session.save((err) => { + if (err) { + console.error('세션 저장 오류:', err); + return res.status(500).json({ error: '서버 오류' }); + } + res.redirect(redirectUrl); + }); + } + ); + + // 로그아웃 라우터 + router.get('/logout', (req, res) => { + if (req.session) { + req.session.destroy((err) => { + if (err) { + console.error('세션 삭제 오류:', err); + return res.status(500).json({ error: '서버 오류' }); + } + const redirectUrl = process.env.FRONT_URL; + res.redirect(redirectUrl); + }); + } else { + // 세션이 없는 경우에도 리다이렉트 + const redirectUrl = process.env.FRONT_URL; + res.redirect(redirectUrl); + } + }); + + // 사용자 삭제 라우터 +router.delete('/leave', async (req, res) => { + try { + // 인증된 사용자 확인 + if (!req.user) { + return res.status(401).json({ error: '인증되지 않은 사용자입니다.' }); + } + + const userId = req.user.id; + + // 사용자 삭제 + const deleted = await User.destroy({ + where: { id: userId } + }); + + if (!deleted) { + return res.status(404).json({ error: '사용자를 찾을 수 없습니다.' }); + } + + // 세션 삭제 + req.session.destroy((err) => { + if (err) { + console.error('세션 삭제 오류:', err); + return res.status(500).json({ error: '서버 오류' }); + } + // 성공 메시지 반환 (리다이렉트 대신 JSON 응답) + res.status(200).json({ message: '사용자 계정이 성공적으로 삭제되었습니다.' }); + }); + } catch (error) { + console.error('사용자 삭제 오류:', error); + res.status(500).json({ error: '서버 오류' }); + } +}); + + module.exports = router; \ No newline at end of file diff --git a/routes/friend.js b/routes/friendRoute.js similarity index 100% rename from routes/friend.js rename to routes/friendRoute.js diff --git a/routes/inviteRoutes.js b/routes/inviteRoute.js similarity index 100% rename from routes/inviteRoutes.js rename to routes/inviteRoute.js diff --git a/routes/schedule.js b/routes/scheduleRoute.js similarity index 100% rename from routes/schedule.js rename to routes/scheduleRoute.js diff --git a/routes/session.js b/routes/sessionRoute.js similarity index 100% rename from routes/session.js rename to routes/sessionRoute.js