diff --git a/backend/app.js b/backend/app.js index d6870c1..a22fd60 100644 --- a/backend/app.js +++ b/backend/app.js @@ -9,12 +9,13 @@ const passport = require("passport"); dotenv.config(); const pageRouter = require("./routes/page"); const authRouter = require("./routes/auth"); -const postRouter = require("./routes/post"); const { sequelize } = require("./models"); const passportConfig = require("./passport"); const cors = require("cors"); const app = express(); +app.use(cors()); + passportConfig(); app.set("port", process.env.PORT || 8001); app.set("view engine", "html"); @@ -23,7 +24,7 @@ nunjucks.configure("views", { watch: true, }); sequelize - .sync({ force: false }) //sequelize가 초기화 될 때 DB에 필요한 테이블 생성 + .sync({ force: false }) .then(() => { console.log("데이터베이스 연결 성공"); }) @@ -34,7 +35,6 @@ sequelize app.use(morgan("dev")); app.use(express.static(path.join(__dirname, "public"))); app.use("/img", express.static(path.join(__dirname, "uploads"))); -app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); @@ -54,7 +54,6 @@ app.use(passport.initialize()); app.use(passport.session()); app.use("/", pageRouter); app.use("/auth", authRouter); -app.use("/post", postRouter); app.use((req, res, next) => { const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); diff --git a/backend/controllers/contributeProjects/index.js b/backend/controllers/contributeProjects/index.js index 43f9ec5..63d2733 100644 --- a/backend/controllers/contributeProjects/index.js +++ b/backend/controllers/contributeProjects/index.js @@ -5,7 +5,6 @@ const { upload_commit, } = require("../../routes/middlewares"); const { Post, User, Comment } = require("../../models"); -//field값 const createContriProjectAPI = async (req, res) => { let id = req.params.id; diff --git a/backend/controllers/index.js b/backend/controllers/index.js deleted file mode 100644 index a42326d..0000000 --- a/backend/controllers/index.js +++ /dev/null @@ -1,36 +0,0 @@ -// const express = require("express"); -// const router = express.Router(); - -// const userInformationAPI = (req, res) => { -// try { -// const myinfo = await User.findOne({ -// attributes: ["email", "introduce"], -// where: { -// email: req.user.email, -// }, -// }); -// res.status(200).json({ -// email: myinfo, -// }); -// } catch (err) { -// res.status(400).json({ -// error: err, -// }); -// } -// }; - -const createContributeProjectAPI = (req, res) => {}; -const readRequestProjectsAPI = (req, res) => {}; -const readContributeProjectsAPI = (req, res) => { - if (!id) { - res.status(400).json({ error: "you don't send requestProject Id!" }); - } - - res.status(200).json({ contributeProject: projects }); -}; -module.exports = { - userInformationAPI, - createContributeProjectAPI, - readRequestProjectsAPI, - readContributeProjectsAPI, -}; diff --git a/backend/controllers/mypage/index.js b/backend/controllers/mypage/index.js index d0f0468..35c697c 100644 --- a/backend/controllers/mypage/index.js +++ b/backend/controllers/mypage/index.js @@ -2,7 +2,7 @@ const express = require("express"); const router = express.Router(); const { isLoggedIn, isNotLoggedIn } = require("../../routes/middlewares"); const { Post, User } = require("../../models"); -//field값 + const readMyPageAPI = async (req, res, next) => { try { const myinfo = await User.findOne({ diff --git a/backend/controllers/requestProjects/index.js b/backend/controllers/requestProjects/index.js index 4dc7af0..767348e 100644 --- a/backend/controllers/requestProjects/index.js +++ b/backend/controllers/requestProjects/index.js @@ -5,7 +5,6 @@ const { upload, } = require("../../routes/middlewares"); const { Post, User, Comment } = require("../../models"); -//field값 const createProjectAPI = async (req, res) => { if (req.file) { @@ -16,9 +15,10 @@ const createProjectAPI = async (req, res) => { mood: req.body.mood, lyrics_text: req.body.lyrics_text, audioFile: req.file.location, - music_field: Boolean(req.body.music_field), - lyrics_field: Boolean(req.body.lyrics_field), - instrument_field: Boolean(req.body.instrument_field), + music_field: req.body.music_field, + lyrics_field: req.body.lyrics_field, + instrument_field: req.body.instrument_field, + uid: req.user.id, }); if (!post) { res.status(400).json({ @@ -26,18 +26,23 @@ const createProjectAPI = async (req, res) => { post: post, }); } else { - const post = await Post.create({ - title: req.body.title, - description: req.body.description, - genre: req.body.genre, - mood: req.body.mood, - lyrics_text: req.body.lyrics_text, - music_field: req.body.music_field, - lyrics_field: req.body.lyrics_field, - instrument_field: req.body.instrument_field, - uid: req.user.id, + res.status(200).json({ + sucess: true, + post: post, }); } + } else { + const post = await Post.create({ + title: req.body.title, + description: req.body.description, + genre: req.body.genre, + mood: req.body.mood, + lyrics_text: req.body.lyrics_text, + music_field: req.body.music_field, + lyrics_field: req.body.lyrics_field, + instrument_field: req.body.instrument_field, + uid: req.user.id, + }); if (!post) { res.status(400).json({ sucess: false, @@ -53,9 +58,14 @@ const createProjectAPI = async (req, res) => { const mainInfoAPI = async (req, res) => { const maininfo = await Post.findAll({ + include: [ + { + model: User, + attributes: ["email"], + }, + ], attributes: [ - "email", - "pid", + "id", "title", "music_field", "lyrics_field", @@ -66,6 +76,7 @@ const mainInfoAPI = async (req, res) => { "lyrics_text", ], }); + res.set({ "access-control-allow-origin": "*" }); if (!maininfo) { res.status(400).json({ success: false, @@ -79,13 +90,16 @@ const commentsAPI = async (req, res, next) => { let id = req.params.id; try { const comments = await Comment.findAll({ - include: { - model: Post, - where: { id: id }, - }, + where: { uid: id }, }); - const project = await Post.findAll({ - where: { id: id }, + const project = await Post.findOne({ + where: { id }, + include: [ + { + model: User, + attributes: ["introduce", "email"], + }, + ], }); res.status(200).json({ comments, project }); } catch (err) { diff --git a/backend/controllers/user/index.js b/backend/controllers/user/index.js deleted file mode 100644 index 81d9240..0000000 --- a/backend/controllers/user/index.js +++ /dev/null @@ -1,2 +0,0 @@ -// const express = require("express"); -// const router = express.Router(); diff --git a/backend/models/comment.js b/backend/models/comment.js index 389ab34..955cc67 100644 --- a/backend/models/comment.js +++ b/backend/models/comment.js @@ -39,6 +39,3 @@ module.exports = class Comment extends Sequelize.Model { db.Comment.belongsTo(db.User, { foreignKey: "uid", sourceKey: "id" }); } }; -//requestid 외래키 -//uid 외래키 -//constraint uid foreign key uid references user.uid on delete cascade on update cascade diff --git a/backend/models/index.js b/backend/models/index.js index e77ff0a..ed323bd 100644 --- a/backend/models/index.js +++ b/backend/models/index.js @@ -1,6 +1,6 @@ const Sequelize = require("sequelize"); -const env = "test" || "development"; //config.json의 development 가져오기 -const config = require("../config/config")[env]; //config.json의 development 가져오기 +const env = "test" || "development"; +const config = require("../config/config")[env]; const User = require("./user"); const Post = require("./post"); const Comment = require("./comment"); @@ -17,7 +17,7 @@ db.sequelize = sequelize; db.User = User; db.Post = Post; db.Comment = Comment; -//사람과 게시글은 1:1관계, 게시글과 해시태그는 1:N 관계 + User.init(sequelize); Post.init(sequelize); Comment.init(sequelize); diff --git a/backend/models/post.js b/backend/models/post.js index 7ddb9b3..7794215 100644 --- a/backend/models/post.js +++ b/backend/models/post.js @@ -5,7 +5,6 @@ module.exports = class Post extends Sequelize.Model { return super.init( { title: { - //id 생략. -> sequlize에서는 id가 생략될 수 있음. type: Sequelize.STRING(140), allowNull: false, }, @@ -56,8 +55,8 @@ module.exports = class Post extends Sequelize.Model { underscored: false, modelName: "Post", tableName: "posts", - paranoid: false, //deleted at false -> 게시글 삭제시 완전 삭제 - charset: "utf8mb4", //이모티콘 + paranoid: false, + charset: "utf8mb4", collate: "utf8mb4_general_ci", } ); diff --git a/backend/models/user.js b/backend/models/user.js index 14cd16a..c61a269 100644 --- a/backend/models/user.js +++ b/backend/models/user.js @@ -34,13 +34,13 @@ module.exports = class User extends Sequelize.Model { }, { sequelize, - timestamps: true, //생성일 수정일 삭제일이 기록 + timestamps: true, underscored: false, modelName: "User", tableName: "users", paranoid: true, charset: "utf8", - collate: "utf8_general_ci", //한글 지원 + collate: "utf8_general_ci", } ); } diff --git a/backend/passport/index.js b/backend/passport/index.js index ec34bd4..9ee9522 100644 --- a/backend/passport/index.js +++ b/backend/passport/index.js @@ -4,7 +4,7 @@ const User = require("../models/user"); module.exports = () => { passport.serializeUser((user, done) => { - done(null, user.id); // 세션에 user 의 id 만 저장 + done(null, user.id); }); passport.deserializeUser((id, done) => { @@ -15,5 +15,3 @@ module.exports = () => { local(); }; - -//serializeuser는 diff --git a/backend/passport/localStrategy.js b/backend/passport/localStrategy.js index 05de452..425a5b3 100644 --- a/backend/passport/localStrategy.js +++ b/backend/passport/localStrategy.js @@ -1,30 +1,35 @@ -const passport = require('passport'); -const LocalStrategy = require('passport-local').Strategy; -const bcrypt = require('bcrypt'); +const passport = require("passport"); +const LocalStrategy = require("passport-local").Strategy; +const bcrypt = require("bcrypt"); -const User = require('../models/user'); +const User = require("../models/user"); -module.exports = () => {//로그인 로직. 모듈임. - passport.use(new LocalStrategy({ - usernameField: 'email', //req.body.email - passwordField: 'password', //req.body.password - }, async (email, password, done) => { - try { - const exUser = await User.findOne({ where: { email } });//그 email을 가진 사람이 있나 찾기 - if (exUser) { - const result = await bcrypt.compare(password, exUser.password);//brypt.compare로 비번이랑, 디비에 비번이랑 비교 - if (result) { - done(null, exUser); - } else { - done(null, false, { message: '비밀번호가 일치하지 않습니다.' }); +module.exports = () => { + passport.use( + new LocalStrategy( + { + usernameField: "email", + passwordField: "password", + }, + async (email, password, done) => { + try { + const exUser = await User.findOne({ where: { email } }); + if (exUser) { + const result = await bcrypt.compare(password, exUser.password); + if (result) { + done(null, exUser); + } else { + done(null, false, { message: "비밀번호가 일치하지 않습니다." }); + } + } else { + done(null, false, { message: "가입되지 않은 회원입니다." }); + } + } catch (error) { + console.error(error); + done(error); } - } else { - done(null, false, { message: '가입되지 않은 회원입니다.' }); } - } catch (error) { - console.error(error); - done(error); - } - })); + ) + ); }; //email, password로 로그인하는 것을 적은 파일 diff --git a/backend/routes/auth.js b/backend/routes/auth.js index ff7d9bd..f31c641 100644 --- a/backend/routes/auth.js +++ b/backend/routes/auth.js @@ -9,14 +9,14 @@ const router = express.Router(); router.post("/join", isNotLoggedIn, async (req, res, next) => { const { email, password } = req.body; try { - const exUser = await User.findOne({ where: { email } }); //기존이메일로 가입한 사람이 있나? + const exUser = await User.findOne({ where: { email } }); if (exUser) { return res.status(401).json({ msg: "User already exist", success: false, - }); //프론트에서 이미 가입한 메일이라고 알림 + }); } - const hash = await bcrypt.hash(password, 12); //기존이메일이 아니면 password를 해쉬화 해서 저장 + const hash = await bcrypt.hash(password, 12); await User.create({ email, password: hash, @@ -38,7 +38,6 @@ router.post("/login", isNotLoggedIn, (req, res, next) => { return next(authError); } if (!user) { - //로그인 실패한 경우; return res.status(200).json({ msg: `${info.message}`, success: false, diff --git a/backend/routes/page.js b/backend/routes/page.js index 8319b1a..1f99f87 100644 --- a/backend/routes/page.js +++ b/backend/routes/page.js @@ -11,17 +11,15 @@ const mypageController = require("../controllers/mypage"); const requestProjectController = require("../controllers/requestProjects"); const contributeProjectController = require("../controllers/contributeProjects"); const { request } = require("express"); +const cors = require("cors"); router.get("/mypage", isLoggedIn, mypageController.readMyPageAPI); router.post( "/requestProjects", upload.single("data"), - requestProjectController.createProjectAPI -); -router.get( - "/requestProjects", isLoggedIn, - requestProjectController.mainInfoAPI + requestProjectController.createProjectAPI ); +router.get("/requestProjects", requestProjectController.mainInfoAPI); router.get( "/requestProjects/:id/comments", isLoggedIn, @@ -33,62 +31,3 @@ router.post( contributeProjectController.createContriProjectAPI ); module.exports = router; -// router.get("/", async (req, res, next) => { -// try { -// const posts = await Post.findAll({ -// include: { -// model: User, -// attributes: ["id"], -// }, -// order: [["createdAt", "DESC"]], -// }); -// res.render("main", { -// title: "collusic", -// twits: posts, -// }); -// } catch (err) { -// console.error(err); -// next(err); -// } -// }); - -// router.get("/mypage", isLoggedIn, async (req, res, next) => { -// try { -// const myinfo = await User.findOne({ -// attributes: ["email", "introduce"], -// where: { -// email: req.user.email, -// }, -// }); -// res.status(200).json({ -// email: myinfo, -// }); -// } catch (err) { -// res.status(400).json({ -// error: err, -// }); -// } -// }); - -// router.get("/join", isNotLoggedIn, (req, res) => { -// res.render("join", { title: "회원가입 - collusic" }); -// }); - -// router.get("/", async (req, res, next) => { -// try { -// const posts = await Post.findAll({ -// include: { -// model: User, -// attributes: ["id", "nick"], -// }, -// order: [["createdAt", "DESC"]], -// }); -// res.render("main", { -// title: "collusic", -// twits: posts, -// }); -// } catch (err) { -// console.error(err); -// next(err); -// } -// }); diff --git a/backend/routes/post.js b/backend/routes/post.js deleted file mode 100644 index 579a10f..0000000 --- a/backend/routes/post.js +++ /dev/null @@ -1,62 +0,0 @@ -const express = require("express"); -const multer = require("multer"); -const path = require("path"); -const fs = require("fs"); - -const { Post, Contri } = require("../models"); -const { isLoggedIn } = require("./middlewares"); - -const router = express.Router(); - -try { - fs.readdirSync("uploads"); -} catch (error) { - console.error("uploads 폴더가 없어 uploads 폴더를 생성합니다."); - fs.mkdirSync("uploads"); -} - -const upload = multer({ - storage: multer.diskStorage({ - destination(req, file, cb) { - cb(null, "uploads/"); - }, - filename(req, file, cb) { - const ext = path.extname(file.originalname); - cb(null, path.basename(file.originalname, ext) + Date.now() + ext); - }, - }), - limits: { fileSize: 5 * 1024 * 1024 }, -}); - -router.post("/img", isLoggedIn, upload.single("img"), (req, res) => { - console.log(req.file); - res.json({ url: `/img/${req.file.filename}` }); -}); - -const upload2 = multer(); -router.post("/", isLoggedIn, upload2.none(), async (req, res, next) => { - try { - const post = await Post.create({ - content: req.body.content, - img: req.body.url, - UserId: req.user.id, - }); - const hashtags = req.body.content.match(/#[^\s#]*/g); - if (hashtags) { - const result = await Promise.all( - hashtags.map((tag) => { - return Hashtag.findOrCreate({ - where: { title: tag.slice(1).toLowerCase() }, - }); - }) - ); - await post.addHashtags(result.map((r) => r[0])); - } - res.redirect("/"); - } catch (error) { - console.error(error); - next(error); - } -}); - -module.exports = router; diff --git a/backend/views/error.html b/backend/views/error.html deleted file mode 100644 index 87cc731..0000000 --- a/backend/views/error.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'layout.html' %} - -{% block content %} -

{{message}}

-

{{error.status}}

-
{{error.stack}}
-{% endblock %} diff --git a/backend/views/join.html b/backend/views/join.html deleted file mode 100644 index 621a9e3..0000000 --- a/backend/views/join.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends 'layout.html' %} - -{% block content %} -
-
-
- -
-
- -
-
- - -
- -
-
-{% endblock %} - -{% block script %} - -{% endblock %} diff --git a/backend/views/layout.html b/backend/views/layout.html deleted file mode 100644 index c46c369..0000000 --- a/backend/views/layout.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - {{title}} - - - - - -
-
-
- {% if user and user.id %} -
{{'안녕하세요! ' + user.nick + '님'}}
- - 내 프로필 - 로그아웃 - {% else %} -
-
- - -
-
- - -
- 회원가입 - -
- {% endif %} -
- -
- {% block content %} - {% endblock %} -
- - - {% block script %} - {% endblock %} - - diff --git a/backend/views/main.html b/backend/views/main.html deleted file mode 100644 index 6cda02e..0000000 --- a/backend/views/main.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends 'layout.html' %} - -{% block content %} -
- {% if user %} -
-
-
- -
-
- - -
-
- - - -
-
-
- {% endif %} -
-
- - -
- {% for twit in twits %} -
- - -
{{twit.User.nick}}
- {% if not followerIdList.includes(twit.User.id) and twit.User.id !== user.id %} - - {% endif %} -
{{twit.content}}
- {% if twit.img %} -
섬네일
- {% endif %} -
- {% endfor %} -
-
-{% endblock %} - -{% block script %} - -{% endblock %}