Skip to content

Commit

Permalink
Feat: upload
Browse files Browse the repository at this point in the history
  • Loading branch information
yunjaeeun44 committed Jun 3, 2023
1 parent 2685857 commit b192cff
Show file tree
Hide file tree
Showing 9 changed files with 304 additions and 153 deletions.
2 changes: 1 addition & 1 deletion Server/src/controllers/orderController.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,5 +133,5 @@ const getOrderListByUserIdWithPage = async (req, res) => {
export default {
getOrderById,
postOrder,
getOrderListByUserIdWithPage
getOrderListByUserIdWithPage,
};
40 changes: 34 additions & 6 deletions Server/src/controllers/restrtController.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,10 @@ const postMenu = async (req, res) => {
*/
const postOption = async (req, res) => {
const data = req.body;
const { id } = req.params;
const restrtId = req.params.restrtId;
const menuId = req.params.menuId;
try {
const postOption = await restrtService.postOption(id, data);
const postOption = await restrtService.postOption(restrtId, menuId, data);
return res.status(200).json({
status: 200,
success: true,
Expand Down Expand Up @@ -179,9 +180,10 @@ const getMenuList = async (req, res) => {
};

const getMenuWithOptions = async (req, res) => {
const { id } = req.params;
const restrtId = req.params.restrtId;
const menuId = req.params.menuId;
try {
const getMenuWithOptions = await restrtService.getMenuWithOptions(id);
const getMenuWithOptions = await restrtService.getMenuWithOptions(restrtId, menuId);
return res.status(200).json({
status: 200,
success: true,
Expand Down Expand Up @@ -254,9 +256,9 @@ const deleteMenu = async (req, res) => {
* @access Private
*/
const deleteOption = async (req, res) => {
const { menuId, optionId} = req.params;
const { restrtId, menuId, optionId} = req.params;
try {
const deleteOption = await restrtService.deleteOption(menuId, optionId);
const deleteOption = await restrtService.deleteOption(restrtId, menuId, optionId);
return res.status(200).json({
status: 200,
success: true,
Expand Down Expand Up @@ -299,6 +301,31 @@ const searchRestrt = async (req, res) => {
}
};

/**
* @route GET /restrt/search/:data
* @desc searching restrt data in restrtDB
* @access Private
*/
const getRevenue = async (req, res) => {
const { id } = req.params;
try {
const getRevenue = await restrtService.getRevenue(id);
return res.status(200).json({
status: 200,
success: true,
message: "식당 매출 읽기 성공",
data: getRevenue,
});
}catch (error){
console.log(error);
res.status(400).json({
status: 400,
success: false,
message: error.message,
});
}
};

export default {
postRestrt,
postMenu,
Expand All @@ -312,4 +339,5 @@ export default {
deleteOption,
searchRestrt,
getRestrtListWithCategory,
getRevenue,
};
27 changes: 27 additions & 0 deletions Server/src/controllers/reviewController.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,32 @@ const postReview = async (req, res) => {
}
};

/**
* @route POST /review/emoji
* @desc post emoji data
* @access Private
*/
const postEmoji = async (req, res) => {
const { id } = req.params;
const data = req.body;
try {
const postEmoji = await reviewService.postEmoji(id, data);
return res.status(200).json({
status: 200,
success: true,
message: "리뷰 이모지 생성 성공",
data: postEmoji,
});
}catch (error){
console.log(error);
res.status(400).json({
status: 400,
success: false,
message: error.message,
});
}
};

/**
* @route GET /review/restrt/:id
* @desc get restaurant reviews data
Expand Down Expand Up @@ -148,6 +174,7 @@ const deleteReview = async (req, res) => {

export default {
postReview,
postEmoji,
getReviewListByRestrtIdWithPage,
getReviewListByUserIdWithPage,
deleteReview,
Expand Down
68 changes: 62 additions & 6 deletions Server/src/middleware/changeState.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import schedule from 'node-schedule-tz';
import schedule from 'node-schedule';
import { fbDB } from '../config/firebase.js';
import { Timestamp, FieldValue } from 'firebase-admin/firestore';

Expand Down Expand Up @@ -47,7 +47,6 @@ const changeState = async (id) =>{
const nowDay = koreaNow.getDay(); //요일 일월화수목금토
const nowHour = koreaNow.getHours(); //시
const nowMinutes = koreaNow.getMinutes(); //분

const dayTime = timeList[(nowDay + 6) % 7]; //가게 특정요일 운영시간

if(dayTime == "휴무"){
Expand All @@ -58,12 +57,10 @@ const changeState = async (id) =>{
const openMinute = Number(dayTime.slice(3, 5));
const closeHour = Number(dayTime.slice(-5, -3));
const closeMinute = Number(dayTime.slice(-2));

console.log(id);
console.log('현재', nowHour, nowMinutes, nowDay);
console.log(openHour, openMinute, closeHour, closeMinute);


if (openHour > nowHour){
changeClosed(id);
console.log('끝1');
Expand Down Expand Up @@ -96,14 +93,71 @@ const changeState = async (id) =>{
}
};

const makeMonthRevenueDoc = async (id) => {
try{
const revenueRef = fbDB.collection('restaurants').doc(id).collection('revenues');
const now = new Date();
const utcNow = now.getTime() + (now.getTimezoneOffset() * 60 * 1000); // 현재 시간을 utc로 변환한 밀리세컨드값
const koreaTimeDiff = 9 * 60 * 60 * 1000; // 한국 시간은 UTC보다 9시간 빠름
const koreaNow = new Date(utcNow + koreaTimeDiff); // utc로 변환된 값을 한국 시간으로 변환시키기 위해 9시간(밀리세컨드)를 더함
const nowYear = koreaNow.getFullYear(); //요일 일월화수목금토
const nowMonth = ("0" + (1 + koreaNow.getMonth())).slice(-2);
const revenueId = nowYear + nowMonth;
const data = {total_revenue: 0};
const newDoc = await revenueRef.doc(revenueId).set(data);
}catch (error){
console.log(error);
throw error;
}
};

const makeDayRevenueDoc = async (id) => {
try{
const revenueRef = fbDB.collection('restaurants').doc(id).collection('revenues');
const now = new Date();
const utcNow = now.getTime() + (now.getTimezoneOffset() * 60 * 1000); // 현재 시간을 utc로 변환한 밀리세컨드값
const koreaTimeDiff = 9 * 60 * 60 * 1000; // 한국 시간은 UTC보다 9시간 빠름
const koreaNow = new Date(utcNow + koreaTimeDiff); // utc로 변환된 값을 한국 시간으로 변환시키기 위해 9시간(밀리세컨드)를 더함
const nowYear = koreaNow.getFullYear(); //요일 일월화수목금토
const nowMonth = ("0" + (1 + koreaNow.getMonth())).slice(-2);
const nowDay = koreaNow.getDate() + "";
const revenueId = nowYear + nowMonth;
const update = await revenueRef.doc(revenueId).update({[nowDay]: 0});
}catch (error){
console.log(error);
throw error;
}
};

const makeSchedule = async (id) => {
try{
const restrtRef = fbDB.collection('restaurants').doc(id);
const restrtSnapshot = await restrtRef.get();
const timeList = restrtSnapshot.data().opening_hours; //월화수목금토일

//자정마다 order number 초기화
const initOrderNumber = schedule.scheduleJob(`00 00 15 * * *`, function () {
//매월 초마다 매출 문서 생성하는 스케줄
const monthRule = new schedule.RecurrenceRule();
monthRule.date = 1;
monthRule.hour = 0;
monthRule.minute = 0;
monthRule.second = 1;
monthRule.tz = 'Asia/Seoul';
const initMonthRevenue = schedule.scheduleJob(monthRule, function () {
makeMonthRevenueDoc(id);
console.log(`${id}식당 Month Revenu init`);
});
//자정마다 매출 문서 생성하는 스케줄
const DayRule = new schedule.RecurrenceRule();
DayRule.hour = 0;
DayRule.minute = 0;
DayRule.second = 10;
DayRule.tz = 'Asia/Seoul';
const initDayRevenue = schedule.scheduleJob(DayRule, function () { //-9시간
makeDayRevenueDoc(id);
console.log(`${id}식당 Day Revenu init`);
});
//자정마다 order number 초기화하는 스케줄
const initOrderNumber = schedule.scheduleJob(`0 0 15 * * *`, function () {
changeOrderNumber(id);
console.log(`${id}식당 order number init`);
});
Expand Down Expand Up @@ -182,6 +236,8 @@ export {
changeClosed,
changeState,
changeOrderNumber,
makeDayRevenueDoc,
makeMonthRevenueDoc,
makeSchedule,
init,
}
7 changes: 4 additions & 3 deletions Server/src/routes/restrtRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,16 @@ const router = Router();

router.post('/', multer.single('img'), restrtController.postRestrt);
router.post('/menus', multer.array('img'), restrtController.postMenu);
router.post('/options/:id', restrtController.postOption);
router.post('/options/:restrtId/:menuId', restrtController.postOption);
router.get('/', restrtController.getRestrtList);
router.get('/category/:c', restrtController.getRestrtListWithCategory);
router.get('/menu-list/:id', restrtController.getMenuList);
router.get('/:id', restrtController.getRestrt);
router.get('/menu/:id', restrtController.getMenuWithOptions);
router.get('/menu/:restrtId/:menuId', restrtController.getMenuWithOptions);
router.delete('/:id', restrtController.deleteRestrt);
router.delete('/:restrtId/:menuId', restrtController.deleteMenu);
router.delete('/menu/:menuId/:optionId', restrtController.deleteOption);
router.delete('/menu/:restrtId/:menuId/:optionId', restrtController.deleteOption);
router.get('/search/:data', restrtController.searchRestrt);
router.get('/revenue/:id', restrtController.getRevenue);

export default router;
1 change: 1 addition & 0 deletions Server/src/routes/reviewRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {multer} from '../middleware/image.js';
const router = Router();

router.post('', multer.single('img'), reviewController.postReview);
router.post('/emoji/:id', reviewController.postEmoji);
router.get('/restrt/:id', reviewController.getReviewListByRestrtIdWithPage); //?page=2&size=3
router.get('/user/:id', reviewController.getReviewListByUserIdWithPage); //?page=2&size=3
router.delete('/:id', reviewController.deleteReview);
Expand Down
93 changes: 28 additions & 65 deletions Server/src/service/orderService.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,102 +4,65 @@ import { Timestamp, FieldValue } from 'firebase-admin/firestore';
const getOrderById = async (id) => {
try{
const orderRef = fbDB.collection('orders').doc(id);
const ordersnapshot = await orderRef.get();
const orderMenuIdList = ordersnapshot.data().menu_id_list; //주문메뉴 id 리스트
let orderMenuList = [];
for (let orderMenuId of orderMenuIdList){ //async/await은 forEach문 안에서 사용할 수 없다.
const orderMenuRef = fbDB.collection('order-menus').doc(orderMenuId);
const orderMenusnapshot = await orderMenuRef.get();
const menuId = orderMenusnapshot.data().menu_id; //메뉴 id
const menuRef = fbDB.collection('menus').doc(menuId);
const menusnapshot = await menuRef.get(); //메뉴 이름 확인용
let optionList = [];
for (let op of orderMenusnapshot.data().options){ //주문한 메뉴의 옵션 리스트
const optionRef = fbDB.collection('menu-options').doc(op.ops_id); //옵션 id
const optionsnapshot = await optionRef.get();
let contentList = [];
for (let cid of op.content_id){ //["1", "2"]
for (let i of optionsnapshot.data().content){
if (i.id == cid){
contentList.push({id: cid, name: i.name, price: i.price, container: i.container});
}
}
}
optionList.push({id: op.ops_id, option_name: optionsnapshot.data().option_name, content: contentList}) //옵션 아이디, 옵션 이름, 콘텐츠 id
};
orderMenuList.push({orderMenuId: orderMenuId, name: menusnapshot.data().name, amount: orderMenusnapshot.data().amount, price: menusnapshot.data().price,
menu_option: optionList, container: menusnapshot.data().container });
};
const restrtRef = fbDB.collection('restaurants').doc(ordersnapshot.data().restrt_id); //옵션 id
const restrtsnapshot = await restrtRef.get();
const order = {id:ordersnapshot.id, user_id: ordersnapshot.data().user_id, state: ordersnapshot.data().state, restrt_id: ordersnapshot.data().restrt_id, orderMenuList: orderMenuList,
total_price: ordersnapshot.data().total_price, requirements: ordersnapshot.data().requirements, payment_method: ordersnapshot.data().payment_method,
order_number: ordersnapshot.data().order_number, created_at: ordersnapshot.data().created_at,
restrt_name: restrtsnapshot.data().name, restrt_img: restrtsnapshot.data().img, check_review: ordersnapshot.data().check_review
};
return order;
const orderDoc = await orderRef.get();
const resData = orderDoc.data();
console.log(resData);
resData.id = id;
return resData;
}catch (error){
console.log(error);
throw error;
}
};

//for test
const changeOrderState = async (id) => {
try{
const orderRef = fbDB.collection('orders').doc(id);
setTimeout(() => orderRef.update({state: "accepted"}), 5000);
setTimeout(() => orderRef.update({state: "cooked"}), 10000);
setTimeout(() => {
orderRef.update({state: "packed"});
orderRef.update({packed_time: FieldValue.serverTimestamp()});
}, 15000);

}catch (error){
console.log(error);
throw error;
}

}

const postOrder = async (data) => {
try{
let menu_list = [];
for (let menu of data.orderMenuList){
const res = await fbDB.collection('order-menus').add(menu);
menu_list.push(res.id);
}
//식당 DB의 order_num 갱신
const restrtRef = fbDB.collection('restaurants').doc(data.restrt_id);
const updateOrdernum = await restrtRef.update({order_number:FieldValue.increment(1)});
//식당DB revenues 컬렉션 문서 갱신
const now = new Date();
const utcNow = now.getTime() + (now.getTimezoneOffset() * 60 * 1000); // 현재 시간을 utc로 변환한 밀리세컨드값
const koreaTimeDiff = 9 * 60 * 60 * 1000; // 한국 시간은 UTC보다 9시간 빠름
const koreaNow = new Date(utcNow + koreaTimeDiff); // utc로 변환된 값을 한국 시간으로 변환시키기 위해 9시간(밀리세컨드)를 더함
const nowYear = koreaNow.getFullYear(); //요일 일월화수목금토
const nowMonth = ("0" + (1 + koreaNow.getMonth())).slice(-2);
const nowDay = koreaNow.getDate() + "";
const revenueId = nowYear + nowMonth;
const revenueRef = restrtRef.collection('revenues').doc(revenueId);
const updateRevenue = await revenueRef.update({
total_revenue:FieldValue.increment(Number(data.total_price)), //달 매출 갱신
[nowDay]: FieldValue.increment(Number(data.total_price)), //하루 매출 갱신
});
//order 정보 생성
const refsnapshot = await restrtRef.get();
const order = {
const orderData = {
restrt_id : data.restrt_id,
user_id : data.user_id,
requirements : data.requirements,
payment_method : data.payment_method,
total_price : Number(data.total_price),
created_at: FieldValue.serverTimestamp(),
menu_id_list: menu_list,
order_number: Number(refsnapshot.data().order_number),
state: "checking",
packed_time: null,
check_review: false,
preview_text: data.preview_text,
orderMenuList: data.orderMenuList
};
const res = await fbDB.collection('orders').add(order);
const ref = fbDB.collection('orders').doc(res.id);
const orderRes = await fbDB.collection('orders').add(orderData);
const ref = fbDB.collection('orders').doc(orderRes.id);
const snapshot = await ref.get();
const resData = snapshot.data();
resData.id = res.id;
//for test
changeOrderState(res.id);
resData.id = orderRes.id;
return resData;
}catch (error){
console.log(error);
throw error;
}
};

const getOrderListByUserId = async (id) => {
const getOrderListByUserId = async (id) => { //비홀성화
try{
const orderRef = fbDB.collection('orders').where('user_id', '==', id).orderBy('created_at', 'desc');
const ordersnapshot = await orderRef.get();
Expand Down
Loading

0 comments on commit b192cff

Please sign in to comment.