diff --git a/babel.config.json b/babel.config.json new file mode 100644 index 0000000..ff3059c --- /dev/null +++ b/babel.config.json @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env"] +} \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index d70fb96..0000000 --- a/index.js +++ /dev/null @@ -1,46 +0,0 @@ -const express=require('express'); -const path=require('path'); -const compression=require('compression'); -const cors=require('cors'); -const methodOverride = require('method-override'); -const webSocket = require('./src/socket'); -require('dotenv').config(); - -var db = require('./db') - -const app=express(); - - -app.set('view engine','ejs'); -app.set('views',path.join(__dirname,'views')); -app.use(express.static(path.join(__dirname,'public'))); -app.use(express.static('uploads')); -app.use(compression()); -app.use(express.json()); -app.use(express.urlencoded({extended: true})); -app.use(methodOverride()); -app.use(cors()); - -require('./src/routers/chatRouter')(app); -require('./src/routers/authRouter')(app); -require('./src/routers/profileRouter')(app); -require('./src/routers/postRouter')(app); -require('./src/routers/userRouter')(app); - -app.get('/',(req,res)=>{ - return res.send("hello developers"); -}); - -app.use((err,req,res,next)=>{ - if(!err.status){ - return res.json({ - code:500, - success:false, - message:'서버 에러' - }); - } - }); - -const server=app.listen(process.env.PORT); - -webSocket(server, app); diff --git a/package.json b/package.json index 3b43e88..01fbd2b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "", "main": "index.js", "scripts": { - "start": "node index.js" + "start": "node index.js", + "dev": "nodemon --exec babel-node src/init --delay 2s" }, "author": "", "license": "ISC", diff --git a/src/controllers/authController.js b/src/controllers/authController.js index 3b1b712..d74d47e 100644 --- a/src/controllers/authController.js +++ b/src/controllers/authController.js @@ -1,29 +1,23 @@ -let User = require('../models/User'); -let Post = require('../models/Post'); -let mongoose = require('mongoose'); - -const dotenv = require('dotenv'); -dotenv.config(); -const regexEmail = require('regex-email'); -const jwt = require('jsonwebtoken'); -const nodemailer = require('nodemailer'); -const {startSession}=require('mongoose'); +import User from '../models/User'; +import Post from '../models/Post'; +import mongoose from 'mongoose'; + +import regexEmail from 'regex-email'; +import jwt from 'jsonwebtoken'; +import nodemailer from 'nodemailer'; +import {startSession}from 'mongoose'; //const fs=require('fs'); //const path=require('path'); //const redis=require('redis'); //const client=redis.createClient(process.env.REDIS_URL); -const {encrypt,decrypt}=require('../utils/function'); +import {encrypt,decrypt} from '../utils/function'; const webMails = ["snu.ac.kr","korea.ac.kr","yonsei.ac.kr","g.skku.edu","skku.edu","sogang.ac.kr","hanyang.ac.kr","kaist.ac.kr","postech.ac.kr"]; const universitys=["서울대학교","고려대학교","연세대학교","성균관대학교","성균관대학교","서강대학교","한양대학교","카이스트","포스텍"]; let authEmail=new Map(); - - - - -exports.checkEmail=async (req,res,next)=>{ +export const checkEmail = async (req,res,next)=>{ const {email,code}=req.body; if(!email){ @@ -115,7 +109,7 @@ exports.checkEmail=async (req,res,next)=>{ } } -exports.sendEmail=async (req,res,next)=>{ +export const sendEmail = async (req,res,next)=>{ const {email}=req.body; @@ -254,7 +248,7 @@ exports.sendEmail=async (req,res,next)=>{ -exports.checkName=async (req,res,next)=>{ +export const checkName = async (req,res,next)=>{ const {displayName}=req.body; if(!displayName){ @@ -299,7 +293,7 @@ exports.checkName=async (req,res,next)=>{ } -exports.postUser=async (req,res,next)=>{ +export const postUser = async (req,res,next)=>{ req.body.data=JSON.parse(req.body.data); @@ -599,7 +593,7 @@ exports.postUser=async (req,res,next)=>{ } } -exports.login=async (req,res,next)=>{ +export const login = async (req,res,next)=>{ const {password,displayName}=req.body; @@ -688,7 +682,7 @@ exports.login=async (req,res,next)=>{ -exports.findInfo=async (req,res,next)=>{ +export const findInfo = async (req,res,next)=>{ const {email}=req.body; if(!email){ @@ -810,4 +804,3 @@ exports.findInfo=async (req,res,next)=>{ } } - diff --git a/src/controllers/postController.js b/src/controllers/postController.js index c237921..b4a48ee 100644 --- a/src/controllers/postController.js +++ b/src/controllers/postController.js @@ -1,97 +1,98 @@ -let User = require('../models/User'); -let Post = require('../models/Post'); -let mongoose = require('mongoose'); -const moment=require('moment'); -const dotenv = require('dotenv'); -dotenv.config(); +import mongoose from 'mongoose'; +import moment from 'moment'; +import User from '../models/User'; +import Post from '../models/Post'; +export const postPost = async (req, res, next) => { + const userId = req.id; -exports.postPost=async (req,res,next)=>{ + req.body.data = JSON.parse(req.body.data); - const userId=req.id; + const { + articleContent, + articleInterest, + articleTitle + } = req.body.data; + let { + articleTagArr + } = req.body.data; - req.body.data=JSON.parse(req.body.data); + if (!articleTagArr) articleTagArr = []; - const {articleContent,articleInterest,articleTitle}=req.body.data; - let {articleTagArr}=req.body.data; - - if(!articleTagArr) articleTagArr=[]; - - if(!articleContent){ + if (!articleContent) { return res.json({ - code:439, - success:false, - message:'게시물을 입력해주세요' + code: 439, + success: false, + message: '게시물을 입력해주세요' }) } - if(!articleInterest){ + if (!articleInterest) { return res.json({ - code:444, - success:false, - message:'게시물 관심사를 입력해주세요' + code: 444, + success: false, + message: '게시물 관심사를 입력해주세요' }) } - if(!articleTitle){ + if (!articleTitle) { return res.json({ - code:445, - success:false, - message:'게시물을 입력해주세요' + code: 445, + success: false, + message: '게시물을 입력해주세요' }) } - if(typeof(articleContent)!='string'){ + if (typeof (articleContent) != 'string') { return res.json({ - code:446, - success:false, - message:'게시물은 문자열입니다' + code: 446, + success: false, + message: '게시물은 문자열입니다' }) } - if(typeof(articleTitle)!='string'){ + if (typeof (articleTitle) != 'string') { return res.json({ - code:447, - success:false, - message:'게시물 제목은 문자열입니다' + code: 447, + success: false, + message: '게시물 제목은 문자열입니다' }) } - if(!req.file||!req.file.filename){ + if (!req.file || !req.file.filename) { return res.json({ - code:431, - success:false, - message:'게시물 사진을 입력해주세요' + code: 431, + success: false, + message: '게시물 사진을 입력해주세요' }) } - try{ + try { await Post.create({ - userId:userId, - content:articleContent, - title:articleTitle, - uploadedPhoto:[process.env.URL+req.file.filename], - likeUserId:[], - hashtags:articleInterest, - extraHashtags:articleTagArr + userId: userId, + content: articleContent, + title: articleTitle, + uploadedPhoto: [process.env.URL + req.file.filename], + likeUserId: [], + hashtags: articleInterest, + extraHashtags: articleTagArr }) - - - + + + return res.json({ - code:200, - message:'게시물 작성 성공', - success:true + code: 200, + message: '게시물 작성 성공', + success: true }) - } - catch(err){ + } catch (err) { console.log(err); next(err); } @@ -101,97 +102,100 @@ exports.postPost=async (req,res,next)=>{ -exports.getPost=async (req,res,next)=>{ +export const getPost = async (req, res, next) => { - let postUserId=req.params.userId; + let postUserId = req.params.userId; - const interest=req.query.interest; - let page=req.query.page; + const interest = req.query.interest; + let page = req.query.page; - - if(!page){ + + if (!page) { return res.json({ - code:430, - isSuccess:false, - message:"페이지 번호를 입력해주세요" + code: 430, + isSuccess: false, + message: "페이지 번호를 입력해주세요" }) } - if(!postUserId){ + if (!postUserId) { return res.json({ - code:430, - isSuccess:false, - message:"유저아이디를 입력해주세요" + code: 430, + isSuccess: false, + message: "유저아이디를 입력해주세요" }) } - postUserId=mongoose.mongo.ObjectId(postUserId); - + postUserId = mongoose.mongo.ObjectId(postUserId); + - let regexp=/[^0-9]/g; - let regres=page.search(regexp); - if(regres!=-1){ + let regexp = /[^0-9]/g; + let regres = page.search(regexp); + if (regres != -1) { return res.json({ - code:449, - isSuccess:false, - message:"페이지 번호는 숫자입니다" + code: 449, + isSuccess: false, + message: "페이지 번호는 숫자입니다" }) } - page=Number(page); + page = Number(page); - if(!interest){ + if (!interest) { return res.json({ - code:445, - success:false, - message:'관심사를 입력해주세요' + code: 445, + success: false, + message: '관심사를 입력해주세요' }) } - - try{ - const postUser=await User.findOne({_id:postUserId}); + try { + + const postUser = await User.findOne({ + _id: postUserId + }); - if(!postUser){ + if (!postUser) { return res.json({ - success:false, - code:454, - message:'없는 유저아이디입니다' + success: false, + code: 454, + message: '없는 유저아이디입니다' }); } - - const post=await Post.find({ - userId:postUserId, - hashtags:{ - $elemMatch:{$eq:interest} + + const post = await Post.find({ + userId: postUserId, + hashtags: { + $elemMatch: { + $eq: interest + } } - }).skip(8*page).limit(8).select('content createdAt title uploadedPhoto extraHashtags _id') - - let result=[]; - - - for(let _ of post){ - var ob={}; - ob.articleImgSrcs=_.uploadedPhoto; - ob.postId=_._id; - ob.articleTitle=_.title; - ob.content=_.content; - ob.extraHashtags=_.extraHashtags; - ob.createdAt=moment(_.createdAt).add(9,'h').format('YY/MM/DD HH:mm'); + }).skip(8 * page).limit(8).select('content createdAt title uploadedPhoto extraHashtags _id') + + let result = []; + + + for (let _ of post) { + var ob = {}; + ob.articleImgSrcs = _.uploadedPhoto; + ob.postId = _._id; + ob.articleTitle = _.title; + ob.content = _.content; + ob.extraHashtags = _.extraHashtags; + ob.createdAt = moment(_.createdAt).add(9, 'h').format('YY/MM/DD HH:mm'); result.push(ob); } - + return res.json({ - code:200, - message:'게시물 조회 성공', - success:true, - data:result + code: 200, + message: '게시물 조회 성공', + success: true, + data: result }) - } - catch(err){ + } catch (err) { console.log(err); next(err); } @@ -201,114 +205,120 @@ exports.getPost=async (req,res,next)=>{ -exports.updatePost=async (req,res,next)=>{ +export const updatePost = async (req, res, next) => { - const userId=req.id; + const userId = req.id; - let postId=req.params.postId; - if(!postId){ + let postId = req.params.postId; + if (!postId) { return res.json({ - code:448, - success:false, - message:'게시물 아이디를 입력해주세요' + code: 448, + success: false, + message: '게시물 아이디를 입력해주세요' }) } - postId=mongoose.mongo.ObjectId(postId); - req.body.data=JSON.parse(req.body.data); + postId = mongoose.mongo.ObjectId(postId); + req.body.data = JSON.parse(req.body.data); - const {articleContent,articleInterest,articleTitle}=req.body.data; - let {articleTagArr}=req.body.data; + const { + articleContent, + articleInterest, + articleTitle + } = req.body.data; + let { + articleTagArr + } = req.body.data; - if(!articleTagArr) articleTagArr=[]; + if (!articleTagArr) articleTagArr = []; - if(!articleContent){ + if (!articleContent) { return res.json({ - code:439, - success:false, - message:'게시물을 입력해주세요' + code: 439, + success: false, + message: '게시물을 입력해주세요' }) } - if(!articleInterest){ + if (!articleInterest) { return res.json({ - code:444, - success:false, - message:'게시물 관심사를 입력해주세요' + code: 444, + success: false, + message: '게시물 관심사를 입력해주세요' }) } - if(!articleTitle){ + if (!articleTitle) { return res.json({ - code:445, - success:false, - message:'게시물을 입력해주세요' + code: 445, + success: false, + message: '게시물을 입력해주세요' }) } - if(typeof(articleContent)!='string'){ + if (typeof (articleContent) != 'string') { return res.json({ - code:446, - success:false, - message:'게시물은 문자열입니다' + code: 446, + success: false, + message: '게시물은 문자열입니다' }) } - if(typeof(articleTitle)!='string'){ + if (typeof (articleTitle) != 'string') { return res.json({ - code:447, - success:false, - message:'게시물 제목은 문자열입니다' + code: 447, + success: false, + message: '게시물 제목은 문자열입니다' }) } - try{ + try { - const post=await Post.findOne({_id:postId}).select('uploadedPhoto'); + const post = await Post.findOne({ + _id: postId + }).select('uploadedPhoto'); - if(!post){ + if (!post) { return res.json({ - success:false, - code:454, - message:'없는 게시물아이디입니다' + success: false, + code: 454, + message: '없는 게시물아이디입니다' }); } let articleImgSrc; - if(req.file){ - articleImgSrc=[process.env.URL+req.file.filename]; - fs.unlinkSync(path.join(__dirname,`../../uploads/${post.uploadedPhoto[0].split('/').pop()}`)); + if (req.file) { + articleImgSrc = [process.env.URL + req.file.filename]; + fs.unlinkSync(path.join(__dirname, `../../uploads/${post.uploadedPhoto[0].split('/').pop()}`)); + } else { + articleImgSrc = [post.uploadedPhoto[0]]; } - else{ - articleImgSrc=[post.uploadedPhoto[0]]; - } - + await Post.findOneAndUpdate({ - userId:userId - },{ - content:articleContent, - title:articleTitle, - uploadedPhoto:articleImgSrc, - likeUserId:[], - hashtags:articleInterest, - extraHashtags:articleTagArr + userId: userId + }, { + content: articleContent, + title: articleTitle, + uploadedPhoto: articleImgSrc, + likeUserId: [], + hashtags: articleInterest, + extraHashtags: articleTagArr }) - - - + + + return res.json({ - code:200, - message:'게시물 수정 성공', - success:true + code: 200, + message: '게시물 수정 성공', + success: true }) - } - catch(err){ + } catch (err) { console.log(err); next(err); } @@ -318,35 +328,36 @@ exports.updatePost=async (req,res,next)=>{ -exports.deletePost=async (req,res,next)=>{ +export const deletePost = async (req, res, next) => { - let postId=req.params.postId; - if(!postId){ + let postId = req.params.postId; + if (!postId) { return res.json({ - code:448, - success:false, - message:'게시물 아이디를 입력해주세요' + code: 448, + success: false, + message: '게시물 아이디를 입력해주세요' }) } - postId=mongoose.mongo.ObjectId(postId); - + postId = mongoose.mongo.ObjectId(postId); + + + + try { + + + await Post.deleteOne({ + _id: postId + }); - try{ - - await Post.deleteOne({_id:postId}); - - - return res.json({ - code:200, - message:'게시물 삭제 성공', - success:true + code: 200, + message: '게시물 삭제 성공', + success: true }) - } - catch(err){ + } catch (err) { console.log(err); next(err); } @@ -356,75 +367,87 @@ exports.deletePost=async (req,res,next)=>{ -exports.searchHashtag=async (req,res,next)=>{ +export const searchHashtag = async (req, res, next) => { + + const userId = req.id; - const userId=req.id; + let page = req.query.page; + const hashtag = req.query.hashtag; - let page=req.query.page; - const hashtag=req.query.hashtag; - - if(!page){ + if (!page) { return res.json({ - code:430, - isSuccess:false, - message:"페이지 번호를 입력해주세요" + code: 430, + isSuccess: false, + message: "페이지 번호를 입력해주세요" }) } - - let regexp=/[^0-9]/g; - let regres=page.search(regexp); - if(regres!=-1){ + + let regexp = /[^0-9]/g; + let regres = page.search(regexp); + if (regres != -1) { return res.json({ - code:449, - isSuccess:false, - message:"페이지 번호는 숫자입니다" + code: 449, + isSuccess: false, + message: "페이지 번호는 숫자입니다" }) } - page=Number(page); + page = Number(page); - if(!hashtag){ + if (!hashtag) { return res.json({ - code:409, - success:false, - message:'해시태그를 입력해주세요' + code: 409, + success: false, + message: '해시태그를 입력해주세요' }) } - try{ - - - const post=await Post.aggregate([ - {$unwind:'$extraHashtags'}, - {$match:{ - extraHashtags:{$regex:hashtag} - }}, - {$skip:page*10}, - {$limit:10}, - {$project:{hashtag:'$extraHashtags'}} + try { + + + const post = await Post.aggregate([{ + $unwind: '$extraHashtags' + }, + { + $match: { + extraHashtags: { + $regex: hashtag + } + } + }, + { + $skip: page * 10 + }, + { + $limit: 10 + }, + { + $project: { + hashtag: '$extraHashtags' + } + } ]); - const result=[]; - for(let _ of post){ + const result = []; + for (let _ of post) { result.push(_.hashtag); } - - + + return res.json({ - code:200, - message:'해시태그 검색 성공', - success:true, - data:{ - hashtag:[...new Set(result)] + code: 200, + message: '해시태그 검색 성공', + success: true, + data: { + hashtag: [...new Set(result)] } }) - } - catch(err){ + } catch (err) { console.log(err); next(err); } @@ -433,90 +456,108 @@ exports.searchHashtag=async (req,res,next)=>{ -exports.searchPost=async (req,res,next)=>{ +export const searchPost = async (req, res, next) => { - let page=req.query.page; - const hashtag=req.query.hashtag; + let page = req.query.page; + const hashtag = req.query.hashtag; - - if(!page){ + + if (!page) { return res.json({ - code:430, - isSuccess:false, - message:"페이지 번호를 입력해주세요" + code: 430, + isSuccess: false, + message: "페이지 번호를 입력해주세요" }) } - - let regexp=/[^0-9]/g; - let regres=page.search(regexp); - if(regres!=-1){ + + let regexp = /[^0-9]/g; + let regres = page.search(regexp); + if (regres != -1) { return res.json({ - code:449, - isSuccess:false, - message:"페이지 번호는 숫자입니다" + code: 449, + isSuccess: false, + message: "페이지 번호는 숫자입니다" }) } - page=Number(page); + page = Number(page); - if(!hashtag){ + if (!hashtag) { return res.json({ - code:409, - success:false, - message:'해시태그를 입력해주세요' + code: 409, + success: false, + message: '해시태그를 입력해주세요' }) } - try{ - - - const post=await Post.aggregate([ - {$unwind:'$extraHashtags'}, - {$match:{ - extraHashtags:{$regex:hashtag} - }}, - {$sort:{createdAt:-1}}, - {$skip:page*10}, - {$limit:10}, - {$project:{content:'$content',createdAt:'$createdAt',title:'$title',uploadedPhoto:'$uploadedPhoto'}} + try { + + + const post = await Post.aggregate([{ + $unwind: '$extraHashtags' + }, + { + $match: { + extraHashtags: { + $regex: hashtag + } + } + }, + { + $sort: { + createdAt: -1 + } + }, + { + $skip: page * 10 + }, + { + $limit: 10 + }, + { + $project: { + content: '$content', + createdAt: '$createdAt', + title: '$title', + uploadedPhoto: '$uploadedPhoto' + } + } ]); - let result=[]; - for(let _ of post){ - var ob={}; - ob.articleImgSrcs=_.uploadedPhoto; - ob.postId=_._id; - ob.articleTitle=_.title; - ob.content=_.content; - ob.createdAt=moment(_.createdAt).add(9,'h').format('YY/MM/DD HH:mm'); + let result = []; + for (let _ of post) { + var ob = {}; + ob.articleImgSrcs = _.uploadedPhoto; + ob.postId = _._id; + ob.articleTitle = _.title; + ob.content = _.content; + ob.createdAt = moment(_.createdAt).add(9, 'h').format('YY/MM/DD HH:mm'); - const hashtags=await Post.findOne({_id:_._id}).select('extraHashtags'); - ob.extraHashtags=hashtags.extraHashtags; + const hashtags = await Post.findOne({ + _id: _._id + }).select('extraHashtags'); + ob.extraHashtags = hashtags.extraHashtags; result.push(ob); } - - + + return res.json({ - code:200, - message:'해시태그 검색 성공', - success:true, - data:{ - post:result + code: 200, + message: '해시태그 검색 성공', + success: true, + data: { + post: result } }) - } - catch(err){ + } catch (err) { console.log(err); next(err); } -} - - - +} \ No newline at end of file diff --git a/db.js b/src/db.js similarity index 85% rename from db.js rename to src/db.js index 61b814b..516d92c 100644 --- a/db.js +++ b/src/db.js @@ -1,5 +1,4 @@ -var mongoose = require('mongoose') -require('dotenv').config(); +import mongoose from 'mongoose'; mongoose.connect(process.env.MONGO_URL, { useNewUrlParser: true, diff --git a/src/init.js b/src/init.js new file mode 100644 index 0000000..079d6b5 --- /dev/null +++ b/src/init.js @@ -0,0 +1,11 @@ +import 'dotenv/config'; +import './db'; +import './models/Post'; +import './models/User'; +import app from './server'; + +const handleListening = () => { + console.log(`✅ Server listenting on http://localhost:${process.env.PORT} 🚀`) +} + +app.listen(process.env.PORT, handleListening); \ No newline at end of file diff --git a/src/models/Chat.js b/src/models/Chat.js index 9f55f2e..8b4aac2 100644 --- a/src/models/Chat.js +++ b/src/models/Chat.js @@ -1,4 +1,4 @@ -const mongoose = require('mongoose') +import mongoose from 'mongoose'; const ChatSchema = new mongoose.Schema({ message:String, @@ -7,4 +7,4 @@ const ChatSchema = new mongoose.Schema({ createdAt : {type:Date , default: Date.now}, }) const model = mongoose.model("Chat",ChatSchema); -module.exports = model; \ No newline at end of file +export default model; \ No newline at end of file diff --git a/src/models/Post.js b/src/models/Post.js index d053907..d1f753b 100644 --- a/src/models/Post.js +++ b/src/models/Post.js @@ -1,4 +1,4 @@ -const mongoose = require('mongoose') +import mongoose from 'mongoose'; const PostSchema = new mongoose.Schema({ @@ -36,4 +36,4 @@ const PostSchema = new mongoose.Schema({ }) const model = mongoose.model("Post",PostSchema); -module.exports = model; \ No newline at end of file +export default model; \ No newline at end of file diff --git a/src/models/Room.js b/src/models/Room.js index f506a63..a97507f 100644 --- a/src/models/Room.js +++ b/src/models/Room.js @@ -1,4 +1,4 @@ -const mongoose = require('mongoose') +import mongoose from 'mongoose'; const RoomSchema = new mongoose.Schema({ member : [ @@ -10,4 +10,4 @@ const RoomSchema = new mongoose.Schema({ type:String }) const model = mongoose.model("Room",RoomSchema); -module.exports = model; \ No newline at end of file +export default model; \ No newline at end of file diff --git a/src/models/User.js b/src/models/User.js index 64b26c8..dbd5b21 100644 --- a/src/models/User.js +++ b/src/models/User.js @@ -1,4 +1,4 @@ -const mongoose = require('mongoose') +import mongoose from 'mongoose'; const UserSchema = new mongoose.Schema({ @@ -54,4 +54,4 @@ const UserSchema = new mongoose.Schema({ }) const model = mongoose.model("User",UserSchema); -module.exports = model; \ No newline at end of file +export default model; \ No newline at end of file diff --git a/src/routers/adminRouter.js b/src/routers/adminRouter.js index 4c8df24..54482de 100644 --- a/src/routers/adminRouter.js +++ b/src/routers/adminRouter.js @@ -1,15 +1,28 @@ -module.exports = (app)=>{ - const admin = require('../controllers/adminController'); - const {upload,resize}=require('../utils/middleware'); +import { + getUser, + postUser, + patchUser, + deleteUser, + getPost, + deletePost, + update, + update1 +} from '../controllers/authController'; - app.get('/admin/users',admin.getUser); - app.post('/admin/user',upload.single('profileImgSrc'),admin.postUser); - app.patch('/admin/user/:userId',upload.single('profileImgSrc'),admin.patchUser); - app.delete('/admin/user/:userId',admin.deleteUser); - app.get('/admin/posts',admin.getPost); - app.delete('/admin/post/:postId',admin.deletePost); +import { + upload, +} from '../utils/middleware'; - app.post('/admin/update',admin.update); - app.get('/admin/update',admin.update1); +const adminRouter = express.Router(); -} \ No newline at end of file +adminRouter.get('/users', getUser); +adminRouter.post('/user', upload.single('profileImgSrc'), postUser); +adminRouter.patch('/user/:userId', upload.single('profileImgSrc'), patchUser); +adminRouter.delete('/user/:userId', deleteUser); +adminRouter.get('/posts', getPost); +adminRouter.delete('/post/:postId', deletePost); + +adminRouter.post('/update', update); +adminRouter.get('/update', update1); + +export default adminRouter; \ No newline at end of file diff --git a/src/routers/authRouter.js b/src/routers/authRouter.js index 71e9349..2bda0e0 100644 --- a/src/routers/authRouter.js +++ b/src/routers/authRouter.js @@ -1,18 +1,25 @@ -module.exports = (app)=>{ - const auth = require('../controllers/authController'); - const {upload,verify,resize}=require('../utils/middleware'); +import express from 'express'; +import { + checkEmail, + sendEmail, + checkName, + postUser, + login, + findInfo +} from '../controllers/authController'; +import { + upload, + verify, + resize +} from '../utils/middleware'; - - app.post('/check/email',auth.checkEmail); - app.post('/email',auth.sendEmail); - app.post('/check/name',auth.checkName); - app.post('/user',upload.single('profileImgSrc'),resize,auth.postUser); - app.post('/login',auth.login); - app.post('/find/info',auth.findInfo); +const authRouter = express.Router(); +authRouter.post('/check/email', checkEmail); +authRouter.post('/email', sendEmail); +authRouter.post('/check/name', checkName); +authRouter.post('/user', upload.single('profileImgSrc'), resize, postUser); +authRouter.post('/login', login); +authRouter.post('/find/info', findInfo); - - - - -} \ No newline at end of file +export default authRouter; \ No newline at end of file diff --git a/src/routers/chatRouter.js b/src/routers/chatRouter.js index 5cff7c0..c1139ba 100644 --- a/src/routers/chatRouter.js +++ b/src/routers/chatRouter.js @@ -1,7 +1,12 @@ -module.exports = (app)=>{ - const chat = require('../controllers/chatController'); - const {verify}=require('../utils/middleware'); +import express from 'express'; +import {} from '../controllers/chatController'; +const { + verify +} = require('../utils/middleware'); - //app.get('/chat',verify,chat.getChat); - //app.post('/message',verify,createRoom); -} \ No newline at end of file +const chatRouter = express.Router(); + +chatRouter.get('/',verify,chat.getChat); +chatRouter.post('/message',verify,createRoom); + +export default chatRouter; \ No newline at end of file diff --git a/src/routers/postRouter.js b/src/routers/postRouter.js index 7bfb794..ec97f43 100644 --- a/src/routers/postRouter.js +++ b/src/routers/postRouter.js @@ -1,18 +1,31 @@ -module.exports = (app)=>{ - const post = require('../controllers/postController'); - const {upload,verify,resize}=require('../utils/middleware'); +import express from 'express'; +import { + getPost, + postPost, + updatePost, + deletePost, + searchHashtag, + searchPost +} from '../controllers/postController'; +import { + upload, + verify, + resize +} from '../utils/middleware'; - - app.post('/post',verify,upload.single('articleImgSrc'),resize,post.postPost); - - app.get('/post/user/:userId',verify,post.getPost); +const postRouter = express.Router(); - app.put('/post/:postId',verify,upload.single('articleImgSrc'),resize,post.updatePost); +postRouter.post('/', verify, upload.single('articleImgSrc'), resize, postPost); - app.delete('/post/:postId',verify,post.deletePost); +postRouter.get('/user/:userId', verify, getPost); - app.get('/post/search/tag',verify,post.searchHashtag); - app.get('/post/search',verify,post.searchPost); +postRouter.put('/:postId', verify, upload.single('articleImgSrc'), resize, updatePost); - //app.patch('/post/:postId/like',verify,post.likePost); -} \ No newline at end of file +postRouter.delete('/:postId', verify, deletePost); + +postRouter.get('/search/tag', verify, searchHashtag); +postRouter.get('/search', verify, searchPost); + +//postRouter.patch('/:postId/like',verify,likePost); + +export default postRouter; \ No newline at end of file diff --git a/src/routers/profileRouter.js b/src/routers/profileRouter.js index a2ee99c..a1926ce 100644 --- a/src/routers/profileRouter.js +++ b/src/routers/profileRouter.js @@ -1,13 +1,17 @@ -module.exports = (app)=>{ - const profile = require('../controllers/profileController'); - const {upload,verify,resize}=require('../utils/middleware'); +import express from 'express'; +import { getProfile, getPost, updateProfile } from '../controllers/profileController'; +import { + upload, + verify, + resize +} from '../utils/middleware'; - +const profileRouter = express.Router(); - app.get('/user/:userId/profile',verify,profile.getProfile); +profileRouter.get('/:userId/profile', verify, getProfile); +profileRouter.get('/:userId/profile/post', verify, getPost); - app.get('/user/:userId/profile/post',verify,profile.getPost); +profileRouter.put('/profile', upload.single('profileImgSrc'), resize, verify, updateProfile); - app.put('/user/profile',upload.single('profileImgSrc'),resize,verify,profile.updateProfile); -} \ No newline at end of file +export default profileRouter; \ No newline at end of file diff --git a/src/routers/userRouter.js b/src/routers/userRouter.js index b5ee2b1..2074f0b 100644 --- a/src/routers/userRouter.js +++ b/src/routers/userRouter.js @@ -1,7 +1,16 @@ -module.exports = (app)=>{ - const user = require('../controllers/userController'); - const {upload,verify}=require('../utils/middleware'); +import express from 'express'; +import { + follow, + getUsers +} from '../controllers/userController'; +import { + upload, + verify +} from '../utils/middleware'; - //app.patch('/user/:userId/follow',verify,user.follow); - app.get('/users',verify,user.getUsers); -} \ No newline at end of file +const userRouter = express.Router(); + +userRouter.get('/users', verify, user.getUsers); +// app.patch('/user/:userId/follow',verify,user.follow); + +export default userRouter; \ No newline at end of file diff --git a/src/server.js b/src/server.js new file mode 100644 index 0000000..3947b32 --- /dev/null +++ b/src/server.js @@ -0,0 +1,47 @@ +import express from 'express'; +import path from 'path'; +import compression from 'compression'; +import cors from 'cors'; +import methodOverride from 'method-override'; +import postRouter from './routers/postRouter'; +import authRouter from './routers/authRouter'; +import profileRouter from './routers/profileRouter'; +import userRouter from './routers/userRouter'; +import chatRouter from './routers/chatRouter'; + +const app = express(); + +app.set('view engine', 'ejs'); +app.set('views', path.join(__dirname, 'views')); +app.use(express.static(path.join(__dirname, 'public'))); +app.use(express.static('uploads')); +app.use(compression()); +app.use(express.json()); +app.use(express.urlencoded({ + extended: true +})); +app.use(methodOverride()); +app.use(cors()); + +app.use('/admin', adminRouter); +app.use('/auth', authRouter); +app.use('/post', postRouter); +app.use('/profile', profileRouter); +app.use('/user', userRouter); +app.use('/chat', chatRouter); + +app.get('/', (req, res) => { + return res.send("hello developers"); +}); + +app.use((err, req, res, next) => { + if (!err.status) { + return res.json({ + code: 500, + success: false, + message: '서버 에러' + }); + } +}); + +export default app; \ No newline at end of file diff --git a/src/utils/middleware.js b/src/utils/middleware.js index 82cc5f6..201c507 100644 --- a/src/utils/middleware.js +++ b/src/utils/middleware.js @@ -1,109 +1,108 @@ -const multer = require('multer'); -const path=require('path'); - - -const sharp=require('sharp'); -const jwt = require('jsonwebtoken'); -require('dotenv').config(); -const fs=require('fs'); -const {promisify}=require('util'); -let User = require('../models/User'); -let mongoose = require('mongoose'); - -const upload=multer({ - storage:multer.diskStorage({ - destination(req,file,cb){ - cb(null,'uploads/'); +import mongoose from 'mongoose'; +import multer from 'multer'; +import path from 'path'; +import sharp from 'sharp'; +import jwt from 'jsonwebtoken'; +import fs from 'fs'; +import { + promisify +} from 'util'; +import User from '../models/User'; + + +export const upload = multer({ + storage: multer.diskStorage({ + destination(req, file, cb) { + cb(null, 'uploads/'); }, - filename(req,file,cb){ - cb(null,new Date().valueOf()+path.extname(file.originalname)); + filename(req, file, cb) { + cb(null, new Date().valueOf() + path.extname(file.originalname)); } }), - limits:{fileSize:1024*1024*10}, - + limits: { + fileSize: 1024 * 1024 * 10 + }, + }) -exports.upload=upload; -const resize=async(req,res,next)=>{ +export const resize = async (req, res, next) => { - try{ + try { - if(req.file){ + if (req.file) { - const type=req.file.filename.split('.').pop(); - const types=['jpg','jpeg','png','JPG','JPEG','PNG'] - const filepath=req.file.path; + const type = req.file.filename.split('.').pop(); + const types = ['jpg', 'jpeg', 'png', 'JPG', 'JPEG', 'PNG'] + const filepath = req.file.path; - if(types.includes(type)){ - await sharp(filepath,{failOnError:false}) - .metadata() - .then(({ width }) => sharp(filepath,{failOnError:false}) - .resize(Math.round(width * 0.7)) - .withMetadata() - .toFile(path.join('uploads','7r'+req.file.filename))) - .then(global.gc); + if (types.includes(type)) { + await sharp(filepath, { + failOnError: false + }) + .metadata() + .then(({ + width + }) => sharp(filepath, { + failOnError: false + }) + .resize(Math.round(width * 0.7)) + .withMetadata() + .toFile(path.join('uploads', '7r' + req.file.filename))) + .then(global.gc); fs.unlinkSync(filepath); - - req.file.filename='7r'+req.file.filename; + + req.file.filename = '7r' + req.file.filename; } } next(); - } - catch(err){ + } catch (err) { console.log(err); next(err); } } -exports.resize=resize; - - - +export const verify = async (req, res, next) => { -const verify = async (req, res, next) => { - const token = req.headers['access-token']; - - if(!token) { + + if (!token) { return res.json({ - success:false, + success: false, code: 401, message: '로그인이 되어 있지 않습니다.' }); } - try{ + try { - const verify=promisify(jwt.verify); - const token=await verify(token,process.env.JWT_SECRET); + const verify = promisify(jwt.verify); + const token = await verify(token, process.env.JWT_SECRET); - const userId=await User.findOne({_id:token.id}).select('_id'); + const userId = await User.findOne({ + _id: token.id + }).select('_id'); - if(userId){ - req.id=mongoose.mongo.ObjectId(userId); - } - else{ - if(!user){ + if (userId) { + req.id = mongoose.mongo.ObjectId(userId); + } else { + if (!user) { return res.json({ - success:false, - code:454, - message:'없는 유저아이디입니다' + success: false, + code: 454, + message: '없는 유저아이디입니다' }); } } - } - catch(err){ + } catch (err) { console.log(err); return res.json({ - success:false, - code:401, - message:'검증실패' + success: false, + code: 401, + message: '검증실패' }) } -}; - -exports.verify = verify; \ No newline at end of file +}; \ No newline at end of file