Skip to content
Snippets Groups Projects
Commit e97b483f authored by Gwangbin's avatar Gwangbin
Browse files

Add: DB connection and service

parent 08fa0eeb
No related branches found
No related tags found
No related merge requests found
import Article from '../models/article.js';
const articleService = {
async createArticle(articleData) {
try {
const article = new Article(articleData);
await article.save();
return article;
} catch (err) {
throw err;
}
},
async findArticleById(articleId) {
try {
} catch (err) {
throw err;
}
}
};
export default articleService;
\ No newline at end of file
import User from '../models/User.js';
const userService = {
async createUser(userData) {
try {
const user = new User(userData);
await user.save();
return user;
} catch (err) {
throw err;
}
},
async findUserByEmail(email) {
try {
const user = await User.findOne({ email });
return user;
} catch (err) {
throw err;
}
},
};
export default userService;
\ No newline at end of file
import dotenv from "dotenv"; import dotenv from 'dotenv';
import mongoose from "mongoose"; import mongoose from 'mongoose';
dotenv.config(); dotenv.config();
const GoogleProviderSchema = new mongoose.Schema({ // const GoogleProviderSchema = new mongoose.Schema({
id: { // id: {
type: String, // type: String,
required: true, // required: true,
//unique: true, // //unique: true,
}, // },
profileUrl: { // profileUrl: {
type: String, // type: String,
}, // },
}); // });
const UserSchema = new mongoose.Schema({ // const UserSchema = new mongoose.Schema({
user_id: { // nickname: {
type: String, // type: String,
required: true, // },
//unique: true, // email: {
}, // type: String,
nickname: { // //unique: true,
type: String, // },
}, // google: {
email: { // type: GoogleProviderSchema,
type: String, // }
//unique: true, // });
},
google: {
type: GoogleProviderSchema,
}
});
const UserModel = mongoose.model("User", UserSchema); // const UserModel = mongoose.model("User", UserSchema);
const CommentSchema = new mongoose.Schema({ // const CommentSchema = new mongoose.Schema({
/* // content: {
commentId: { // type: String,
type: String, // required: true,
required: true, // },
unique: false, // author: {
}, // type: UserSchema,
*/ // required: true,
content: { // },
type: String, // createdAt: {
required: true, // type: Date,
}, // default: Date.now,
author: { // },
type: UserSchema, // });
required: true, // CommentSchema.index( { commentId: 1 } , { sparse: true } )
},
createdAt: {
type: Date,
default: Date.now,
},
});
CommentSchema.index( { commentId: 1 } , { sparse: true } )
const ArticleSchema = new mongoose.Schema({ // const ArticleSchema = new mongoose.Schema({
title: { // title: {
type: String, // type: String,
required: true, // required: true,
}, // },
/* // content: {
articleId: { // type: String,
type: String, // required: true,
unique: true, // },
}, // imageUrls: {
*/ // type: [String],
content: { // },
type: String, // author: {
required: true, // type: UserSchema,
}, // required: true,
imageUrls: { // },
type: [String], // comments: {
}, // type: [CommentSchema],
author: { // unique: false,
type: UserSchema, // },
required: true, // likes: {
}, // type: [UserSchema],
comments: { // },
type: [CommentSchema], // createdAt: {
unique: false, // type: Date,
}, // default: Date.now,
likes: { // },
type: [UserSchema], // });
},
createdAt: {
type: Date,
default: Date.now,
},
});
ArticleSchema.index({articleId:1}, { sparse: true }) // ArticleSchema.index({articleId:1}, { sparse: true })
const ArticleModel = mongoose.model("Article", ArticleSchema); // const ArticleModel = mongoose.model("Article", ArticleSchema);
const connectDB = async () => { const connectDB = async () => {
const url = process.env.MONGODB_URI; const url = process.env.MONGODB_URI;
let db;
try { try {
db = await mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }); await mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true });
console.log('Database connected');
} catch (error) { } catch (error) {
console.error(error); console.error('Database connection failed',error);
} }
return db; };
}
export default { connectDB, UserModel, ArticleModel } export default connectDB;
\ No newline at end of file \ No newline at end of file
import express from "express" import express from 'express';
import cors from 'cors' import cors from 'cors';
import path from 'path' import path from 'path';
import process from 'process' import process from 'process';
import moment from 'moment'; import moment from 'moment';
import cookieParser from 'cookie-parser'; import cookieParser from 'cookie-parser';
import session from 'express-session'; import session from 'express-session';
import db from './db.js' import connectDB from './db.js';
import userService from './data/userService.js';
import articleService from './data/articleService.js';
const app = express(); const app = express();
const PORT = 8080; const PORT = 8080;
db.connectDB(); connectDB();
app.use(express.static(path.join(process.cwd(), '../frontend/build'))); app.use(express.static(path.join(process.cwd(), '../frontend/build')));
...@@ -62,23 +64,20 @@ app.post('/login', async (req, res) => { ...@@ -62,23 +64,20 @@ app.post('/login', async (req, res) => {
TODO: 토큰의 무결성 체크 TODO: 토큰의 무결성 체크
토큰이 이상이 없다면, 로그인/회원가입 로직을 수행 후 jwt 쿠키를 보낸다. 토큰이 이상이 없다면, 로그인/회원가입 로직을 수행 후 jwt 쿠키를 보낸다.
*/ */
const expires = moment().add('60','m').toDate() const expires = moment().add('60','m').toDate();
// 정보가 없다면 회원 가입 (강제?) // 정보가 없다면 회원 가입 (강제?)
const user = await db.UserModel.find({ user_id: req.body.email }); const user = await userService.findUserByEmail(req.body.email);
if (!user.length) { // 유저가 없다면 회원 가입 후 세션 생성 if (!user) { // 유저가 없다면 회원 가입 후 세션 생성
let userProfilePicture = req.body.picture || null;
let userProfilePicture = req.body.picture || null await userService.createUser({
const userModel = new db.UserModel({ nickname: req.body.name,
user_id: req.body.email, email: req.body.email,
nickname: req.body.name, google: {
email: req.body.email, id: req.body.sub,
google: { profileUrl: userProfilePicture,
id: req.body.sub, },
profileUrl: userProfilePicture, });
},
});
await userModel.save();
console.log('new user saved!') console.log('new user saved!')
} }
console.log('login done') console.log('login done')
...@@ -127,16 +126,15 @@ app.post("/post", async (req, res) => { ...@@ -127,16 +126,15 @@ app.post("/post", async (req, res) => {
const inputContent = req.body.content const inputContent = req.body.content
const inputImage = [] const inputImage = []
const useremail = req.session.sessionid.email const useremail = req.session.sessionid.email
const author = await db.UserModel.find({ user_id: useremail }); const author = await userService.findUserByEmail(useremail);
const articleModel = new db.ArticleModel({ await articleService.createArticle({
title: inputTitle, title: inputTitle,
content: inputContent, content: inputContent,
imageUrls: inputImage, imageUrls: inputImage,
author: author[0], author: author[0],
comments: [], comments: [],
likes: [] likes: []
}); });
await articleModel.save();
console.log('saved.') console.log('saved.')
res.send(); res.send();
}); });
......
import mongoose from 'mongoose';
import UserSchema from './User.js';
const CommentSchema = new mongoose.Schema({
content: {
type: String,
required: true,
},
author: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true,
},
createdAt: {
type: Date,
default: Date.now,
},
});
const ArticleSchema = new mongoose.Schema({
title: {
type: String,
required: true,
},
content: {
type: String,
required: true,
},
imageUrls: {
type: [String],
},
author: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true,
},
comments: {
type: [CommentSchema],
unique: false,
},
likes: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
}],
createdAt: {
type: Date,
default: Date.now,
},
});
const Article = mongoose.model("Article", ArticleSchema);
export default Article;
\ No newline at end of file
import mongoose from 'mongoose';
const GoogleProviderSchema = new mongoose.Schema({
id: {
type: String,
required: true,
//unique: true,
},
profileUrl: {
type: String,
},
});
const UserSchema = new mongoose.Schema({
nickname: {
type: String,
},
email: {
type: String,
//unique: true,
},
google: {
type: GoogleProviderSchema,
}
});
const User = mongoose.model("User", UserSchema);
export default User;
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment