diff --git a/.gitignore b/.gitignore index a1e4186..756cdc1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ - +*.env # Created by https://www.toptal.com/developers/gitignore/api/macos,androidstudio,node # Edit at https://www.toptal.com/developers/gitignore?templates=macos,androidstudio,node diff --git a/server/models/User.js b/server/models/User.js index d34e6a7..2a25152 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -27,6 +27,24 @@ const userSchema = new mongoose.Schema({ required: true, unique: true, }, + + + licenseNumber: { + type: String, + required: true, + unique: true, + }, + + licensePrimaryKey: { + type: String, + required: true, + unique: true, + }, + + licenseType: { + type: String, + required: true, + }, }); module.exports = mongoose.model("User", userSchema); diff --git a/server/routes/trailer.js b/server/routes/trailer.js index 6372fe1..e4fa20b 100644 --- a/server/routes/trailer.js +++ b/server/routes/trailer.js @@ -1,54 +1,78 @@ -const express = require('express'); +const express = require("express"); const router = express.Router(); -const Trailer = require('../models/Trailer'); -const bcryptjs = require('bcryptjs'); -const user_jwt = require('../middleware/user_jwt'); +const Trailer = require("../models/Trailer"); +const bcryptjs = require("bcryptjs"); +const user_jwt = require("../middleware/user_jwt"); +require("dotenv").config(); +const multer = require("multer"); +const AWS = require("aws-sdk"); +const { v4: uuidv4 } = require("uuid"); -//트레일러 정보 등록 API -router.post('/trailers', user_jwt, async(req, res, next) => { - try { - const trailer = await Trailer.create({ - userId: req.user.id, - trailerPhoto: req.body.trailerPhoto, - trailerName: req.body.trailerName, - license: req.body.license, - rentalPlace: req.body.rentalPlace, - cost: req.body.cost, - capacity: req.body.capacity, - facilities: req.body.facilities, - description: req.body.description - }); +const upload = multer(); - if(!trailer) { - res.status(400).json({ - success: false, - msg: 'Something went wrong' +//트레일러 정보 등록 API +router.post( + "/trailers", + user_jwt, + upload.single("data"), + async (req, res, next) => { + try { + const imageName = uuidv4(); + const trailer = await Trailer.create({ + userId: req.user.id, + trailerPhoto: imageName, + trailerName: req.body.trailerName, + license: req.body.license, + rentalPlace: req.body.rentalPlace, + cost: req.body.cost, + capacity: req.body.capacity, + facilities: req.body.facilities, + description: req.body.description, + }); + const S3 = new AWS.S3({ + endpoint: new AWS.Endpoint("https://kr.object.ncloudstorage.com"), + region: "kr-standard", + credentials: { + accessKeyId: process.env.NAVER_ACCESS_KEY, + secretAccessKey: process.env.NAVER_SECRET_KEY, + }, }); + await S3.putObject({ + Bucket: "trailer-image", + Key: `${imageName}.PNG`, + ACL: "public-read", + Body: req.file.buffer, + }).promise(); + if (!trailer) { + res.status(400).json({ + success: false, + msg: "Something went wrong", + }); + } + + res.status(200).json({ + success: true, + trailer: trailer, + msg: "Successfully created", + }); + } catch (error) { + next(error); } - - res.status(200).json({ - success: true, - trailer: trailer, - msg: 'Successfully created' - }); - } catch(error) { - next(error); } - -}); +); //메인화면 모든 트레일러 정보 호출 API -router.get('/trailers', user_jwt, async(req,res,next) => { +router.get("/trailers", user_jwt, async (req, res, next) => { try { const trailers = await Trailer.find(); const user = req.user.id; console.log(user); - if(trailers.length == 0) { + if (trailers.length == 0) { res.status(400).json({ success: false, - msg: 'Trailer not exists' + msg: "Trailer not exists", }); } @@ -57,23 +81,23 @@ router.get('/trailers', user_jwt, async(req,res,next) => { totalNumberOfTrailers: trailers.length, user: user, trailer: trailers, - msg: 'Successfully fetched' + msg: "Successfully fetched", }); - } catch(error) { + } catch (error) { next(error); } }); //트레일러 선택시 트레일러에 대한 상세 정보 확인 API -router.get('/trailers/:id', user_jwt, async(req, res, next) => { +router.get("/trailers/:id", user_jwt, async (req, res, next) => { try { let trailer = await Trailer.findById(req.params.id); const user = req.user.id; - if(!trailer) { + if (!trailer) { res.status(400).json({ success: false, - msg: 'trailerInfo not exists' + msg: "trailerInfo not exists", }); } @@ -81,22 +105,22 @@ router.get('/trailers/:id', user_jwt, async(req, res, next) => { success: true, user: user, trailer: trailer, - msg: 'Successfully fetched' + msg: "Successfully fetched", }); - } catch(error) { + } catch (error) { next(error); } -}) +}); //등록한 트레일러 삭제 API - 문제 발생 -router.delete('/trailers/:id', user_jwt, async(req, res, next) => { +router.delete("/trailers/:id", user_jwt, async (req, res, next) => { try { let registeredTrailer = await Trailer.findById(req.params.id); - if(!registeredTrailer) { + if (!registeredTrailer) { res.status(400).json({ success: false, - msg: 'Trailer not exists' + msg: "Trailer not exists", }); } @@ -104,12 +128,11 @@ router.delete('/trailers/:id', user_jwt, async(req, res, next) => { res.status(200).json({ success: true, - msg: 'Successfully Deleted Trailer' + msg: "Successfully Deleted Trailer", }); - } catch(error) { + } catch (error) { next(error); } }); - module.exports = router; diff --git a/server/routes/user.js b/server/routes/user.js index 50ce9dc..aa6cc38 100644 --- a/server/routes/user.js +++ b/server/routes/user.js @@ -1,363 +1,391 @@ -const express = require('express'); +const express = require("express"); const router = express.Router(); -const User = require('../models/User'); -const Trailer = require('../models/Trailer'); -const bcryptjs = require('bcryptjs'); -const user_jwt = require('../middleware/user_jwt'); -const jwt = require('jsonwebtoken'); -const { token } = require('morgan'); +const User = require("../models/User"); +const Trailer = require("../models/Trailer"); +const bcryptjs = require("bcryptjs"); +const user_jwt = require("../middleware/user_jwt"); +const jwt = require("jsonwebtoken"); +const { token } = require("morgan"); //회원가입 API -router.post('/users',async(req, res, next) => { - const{ username, email, password, nickname, phone } = req.body; +router.post("/users", async (req, res, next) => { + const { + userName, + email, + password, + nickname, + phoneNumber, + licenseNumber, + licensePrimaryKey, + licenseType, + } = req.body; - try { - let user_exits = await User.findOne({ email: email }) + try { + let user_exits = await User.findOne({ email: email }); - if(user_exits) { - return res.status(400).json({ - success: false, - msg: 'User already exists' - }); - } + if (user_exits) { + return res.status(400).json({ + success: false, + msg: "User already exists", + }); + } - let user = new User(); + let user = new User(); - user.username = username - user.email = email + user.userName = userName; + user.email = email; - const salt = await bcryptjs.genSalt(10); - user.password = await bcryptjs.hash(password, salt); + const salt = await bcryptjs.genSalt(10); + user.password = await bcryptjs.hash(password, salt); - user.nickname = nickname - user.phone = phone + user.nickname = nickname; + user.phoneNumber = phoneNumber; + user.licenseNumber = licenseNumber; + user.licensePrimaryKey = licensePrimaryKey; + user.licenseType = licenseType; - await user.save(); + await user.save(); - const payload = { - user: { - id: user.id - } - } + const payload = { + user: { + id: user.id, + }, + }; - console.log(user.id); - console.log(user._id); + console.log(user.id); + console.log(user._id); - jwt.sign(payload, process.env.jwtUserSecret, { - expiresIn: 360000 - }, (err,token) => { - if(err) throw err; - res.status(200).json({ - success: true, - token: token - }); + jwt.sign( + payload, + process.env.jwtUserSecret, + { + expiresIn: 360000, + }, + (err, token) => { + if (err) throw err; + res.status(200).json({ + success: true, + token: token, }); - - } catch(err) { - console.log(err); - } + } + ); + } catch (err) { + console.log(err); + } }); //로그인 API -router.post('/login', async(req, res, next) => { - const email = req.body.email; - const password = req.body.password; +router.post("/login", async (req, res, next) => { + const email = req.body.email; + const password = req.body.password; - try { - let user = await User.findOne({ - email: email - }); + try { + let user = await User.findOne({ + email: email, + }); - if(!user) { - return res.status(400).json({ - success: false, - msg:'User not exists go & register to continue.' - }); - } + if (!user) { + return res.status(400).json({ + success: false, + msg: "User not exists go & register to continue.", + }); + } - const isMatch = await bcryptjs.compare(password, user.password) + const isMatch = await bcryptjs.compare(password, user.password); - if(!isMatch) { - return res.status(400).json({ - success: false, - msg: 'Invalid password' - }); + if (!isMatch) { + return res.status(400).json({ + success: false, + msg: "Invalid password", + }); } const payload = { - user: { - id: user.id - } - } + user: { + id: user.id, + }, + }; jwt.sign( - payload, process.env.jwtUserSecret, - { - expiresIn: 360000 - }, (err,token) => { - if(err) throw err; - - res.status(200).json({ - success: true, - msg: 'User logged in', - token: token, - user: user - }); - } - ) - - } catch(error) { - console.log(error.message); - res.status(500).json({ - success: false, - msg: 'Server Error' - }) - } + payload, + process.env.jwtUserSecret, + { + expiresIn: 360000, + }, + (err, token) => { + if (err) throw err; + + res.status(200).json({ + success: true, + msg: "User logged in", + token: token, + user: user, + }); + } + ); + } catch (error) { + console.log(error.message); + res.status(500).json({ + success: false, + msg: "Server Error", + }); + } }); //마이페이지 개인정보 호출 API -router.get('/users', user_jwt, async(req, res, next) => { - try { - const user = await User.findById(req.user.id).select('-password -__v'); - res.status(200).json({ - success: true, - user: user - }); - } catch(error) { - console.log(error.message); - res.status(500).json({ - success: false, - msg: 'Server Error' - }) - } -}) +router.get("/users", user_jwt, async (req, res, next) => { + try { + const user = await User.findById(req.user.id).select("-password -__v"); + res.status(200).json({ + success: true, + user: user, + }); + } catch (error) { + console.log(error.message); + res.status(500).json({ + success: false, + msg: "Server Error", + }); + } +}); //개인정보 수정 API -router.put('/users/:id', user_jwt, async(req, res, next) => { +router.put("/users/:id", user_jwt, async (req, res, next) => { try { let user = await User.findById(req.params.id); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'UserInfo not exists' + msg: "UserInfo not exists", }); } user = await User.findByIdAndUpdate(req.params.id, req.body, { new: true, - runValidators: true - }).select('-password -__v'); + runValidators: true, + }).select("-password -__v"); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'Something went wrong.' + msg: "Something went wrong.", }); } res.status(200).json({ success: true, user: user, - msg: 'Successfully updated' + msg: "Successfully updated", }); - - } catch(error) { + } catch (error) { next(error); } }); //관심 목록 등록 API -router.put('/users/:id/likeLists', user_jwt, async(req, res, next) => { +router.put("/users/:id/likeLists", user_jwt, async (req, res, next) => { try { let user = await User.findById(req.params.id); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'User not exists' + msg: "User not exists", }); } - user = await User.findByIdAndUpdate(req.params.id, { $push: { likeLists: req.body } }, { - new: true, - }); + user = await User.findByIdAndUpdate( + req.params.id, + { $push: { likeLists: req.body } }, + { + new: true, + } + ); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'Something went wrong.' + msg: "Something went wrong.", }); } res.status(200).json({ success: true, user: user, - msg: 'Successfully likeList registered' + msg: "Successfully likeList registered", }); - - } catch(error) { + } catch (error) { next(error); } }); //관심 목록 가져오기 API -router.get('/users/:id/likeLists', user_jwt, async(req, res, next) => { +router.get("/users/:id/likeLists", user_jwt, async (req, res, next) => { try { let user = await User.findById(req.params.id); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'User not exists' + msg: "User not exists", }); } - let likedTrailer = await User.findById(req.params.id).select('-_id -username -email -password -nickname -phone -__v -reservationLists'); + let likedTrailer = await User.findById(req.params.id).select( + "-_id -userName -email -password -nickname -phoneNumber -__v -reservationLists" + ); - if(!likedTrailer) { + if (!likedTrailer) { res.status(400).json({ success: false, - msg: 'likedTrailer not exists.' + msg: "likedTrailer not exists.", }); } res.status(200).json({ success: true, trailer: likedTrailer, - msg: 'Successfully likeList registered' + msg: "Successfully likeList registered", }); - - } catch(error) { + } catch (error) { next(error); } }); //관심 목록 등록 해제 API -router.delete('/users/:id/likeLists', user_jwt, async(req, res, next) => { +router.delete("/users/:id/likeLists", user_jwt, async (req, res, next) => { try { let user = await User.findById(req.params.id); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'User not exists' + msg: "User not exists", }); } - let likedTrailer = await User.findByIdAndUpdate(req.params.id, { $pull: { likeLists: { trailerId: req.body.trailerId } } }); + let likedTrailer = await User.findByIdAndUpdate(req.params.id, { + $pull: { likeLists: { trailerId: req.body.trailerId } }, + }); - if(!likedTrailer) { + if (!likedTrailer) { res.status(400).json({ success: false, - msg: 'LikedTrailer went wrong' + msg: "LikedTrailer went wrong", }); } res.status(200).json({ - success: true + success: true, }); - } catch(error) { + } catch (error) { next(error); } }); //예약하기 API -router.put('/users/:id/reservationLists', user_jwt, async(req, res, next) => { +router.put("/users/:id/reservationLists", user_jwt, async (req, res, next) => { try { let user = await User.findById(req.params.id); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'User not exists' + msg: "User not exists", }); } - user = await User.findByIdAndUpdate(req.params.id, { $push: { reservationLists: req.body } }, { - new: true, - }); + user = await User.findByIdAndUpdate( + req.params.id, + { $push: { reservationLists: req.body } }, + { + new: true, + } + ); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'Something went wrong.' + msg: "Something went wrong.", }); } res.status(200).json({ success: true, user: user, - msg: 'Successfully registered' + msg: "Successfully registered", }); - - } catch(error) { + } catch (error) { next(error); } }); //예약 목록 가져오기 API -router.get('/users/:id/reservationLists', user_jwt, async(req, res, next) => { +router.get("/users/:id/reservationLists", user_jwt, async (req, res, next) => { try { let user = await User.findById(req.params.id); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'User not exists' + msg: "User not exists", }); } - let reservedTrailer = await User.findById(req.params.id).select('-_id -username -email -password -nickname -phone -__v -likeLists'); + let reservedTrailer = await User.findById(req.params.id).select( + "-_id -userName -email -password -nickname -phoneNumber -__v -likeLists" + ); - if(!reservedTrailer) { + if (!reservedTrailer) { res.status(400).json({ success: false, - msg: 'ReservedTrailer not exists.' + msg: "ReservedTrailer not exists.", }); } res.status(200).json({ success: true, trailer: reservedTrailer, - msg: 'Successfully retrieved' + msg: "Successfully retrieved", }); - - } catch(error) { + } catch (error) { next(error); } }); //회원 탈퇴 API -router.delete('/users/:id', user_jwt, async(req, res, next) => { +router.delete("/users/:id", user_jwt, async (req, res, next) => { try { let user = await User.findById(req.params.id); - if(!user) { + if (!user) { res.status(400).json({ success: false, - msg: 'User not exists ' + msg: "User not exists ", }); } //해당 유저가 등록한 트레일러 삭제 let registeredTrailer = await Trailer.findOne({ userId: req.params.id }); - if(!registeredTrailer) { + if (!registeredTrailer) { res.status(200).json({ success: true, - msg: 'Registered trailer not exists' + msg: "Registered trailer not exists", }); } - registeredTrailer = await Trailer.findOneAndDelete({ userId: req.params.id }); + registeredTrailer = await Trailer.findOneAndDelete({ + userId: req.params.id, + }); user = await User.findByIdAndDelete(req.params.id); res.status(200).json({ success: true, - msg: 'Successfully Deleted User' + msg: "Successfully Deleted User", }); - } catch(error) { + } catch (error) { next(error); } }); diff --git a/server/server.js b/server/server.js index 6b0d76e..54dfbb5 100644 --- a/server/server.js +++ b/server/server.js @@ -1,33 +1,35 @@ -const express = require('express') -const dotenv = require('dotenv') //.env 파일에서 process.env로 환경 변수를 로드하는 모듈. -const connectDB = require('./config/db') -const colors = require('colors') //터미널에 컬러를 넣어 보여줌. -const morgan = require('morgan') // HTTP request logger middleware(로그 포맷을 지정) -const userRouter = require('./routes/user') -const trailerRouter = require('./routes/trailer') +const express = require("express"); +const dotenv = require("dotenv"); //.env 파일에서 process.env로 환경 변수를 로드하는 모듈. +const connectDB = require("./config/db"); +const colors = require("colors"); //터미널에 컬러를 넣어 보여줌. +const morgan = require("morgan"); // HTTP request logger middleware(로그 포맷을 지정) +const userRouter = require("./routes/user"); +const trailerRouter = require("./routes/trailer"); const app = express(); -app.use(morgan('dev')); //로그 포맷을 'dev'지정 - -app.use(express.json({ limit: '50mb'})); //Express v4.16.0 부터는 json으로 이루어진 request body를 받기 위해서 body-parser가 아닌 express.json 사용 -app.use(express.json({ - limit: '50mb', - express: true -})) +app.use(morgan("dev")); //로그 포맷을 'dev'지정 +app.use(express.json({ limit: "50mb" })); //Express v4.16.0 부터는 json으로 이루어진 request body를 받기 위해서 body-parser가 아닌 express.json 사용 +app.use( + express.json({ + limit: "50mb", + express: true, + }) +); // use dotenv file for DB connection dotenv.config({ - path:'./config/config.env' + path: "./config/config.env", }); connectDB(); -app.use('/api/pickt', userRouter); -app.use('/api/pickt', trailerRouter); +app.use("/api/pickt", userRouter); +app.use("/api/pickt", trailerRouter); const PORT = process.env.PORT || 3001; -app.listen(PORT, - console.log(`Server running mode on port ${PORT}`.red.underline.bold) +app.listen( + PORT, + console.log(`Server running mode on port ${PORT}`.red.underline.bold) );