Skip to content

Commit b192cff

Browse files
committed
Feat: upload
1 parent 2685857 commit b192cff

9 files changed

Lines changed: 304 additions & 153 deletions

File tree

Server/src/controllers/orderController.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,5 @@ const getOrderListByUserIdWithPage = async (req, res) => {
133133
export default {
134134
getOrderById,
135135
postOrder,
136-
getOrderListByUserIdWithPage
136+
getOrderListByUserIdWithPage,
137137
};

Server/src/controllers/restrtController.js

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,10 @@ const postMenu = async (req, res) => {
6060
*/
6161
const postOption = async (req, res) => {
6262
const data = req.body;
63-
const { id } = req.params;
63+
const restrtId = req.params.restrtId;
64+
const menuId = req.params.menuId;
6465
try {
65-
const postOption = await restrtService.postOption(id, data);
66+
const postOption = await restrtService.postOption(restrtId, menuId, data);
6667
return res.status(200).json({
6768
status: 200,
6869
success: true,
@@ -179,9 +180,10 @@ const getMenuList = async (req, res) => {
179180
};
180181

181182
const getMenuWithOptions = async (req, res) => {
182-
const { id } = req.params;
183+
const restrtId = req.params.restrtId;
184+
const menuId = req.params.menuId;
183185
try {
184-
const getMenuWithOptions = await restrtService.getMenuWithOptions(id);
186+
const getMenuWithOptions = await restrtService.getMenuWithOptions(restrtId, menuId);
185187
return res.status(200).json({
186188
status: 200,
187189
success: true,
@@ -254,9 +256,9 @@ const deleteMenu = async (req, res) => {
254256
* @access Private
255257
*/
256258
const deleteOption = async (req, res) => {
257-
const { menuId, optionId} = req.params;
259+
const { restrtId, menuId, optionId} = req.params;
258260
try {
259-
const deleteOption = await restrtService.deleteOption(menuId, optionId);
261+
const deleteOption = await restrtService.deleteOption(restrtId, menuId, optionId);
260262
return res.status(200).json({
261263
status: 200,
262264
success: true,
@@ -299,6 +301,31 @@ const searchRestrt = async (req, res) => {
299301
}
300302
};
301303

304+
/**
305+
* @route GET /restrt/search/:data
306+
* @desc searching restrt data in restrtDB
307+
* @access Private
308+
*/
309+
const getRevenue = async (req, res) => {
310+
const { id } = req.params;
311+
try {
312+
const getRevenue = await restrtService.getRevenue(id);
313+
return res.status(200).json({
314+
status: 200,
315+
success: true,
316+
message: "식당 매출 읽기 성공",
317+
data: getRevenue,
318+
});
319+
}catch (error){
320+
console.log(error);
321+
res.status(400).json({
322+
status: 400,
323+
success: false,
324+
message: error.message,
325+
});
326+
}
327+
};
328+
302329
export default {
303330
postRestrt,
304331
postMenu,
@@ -312,4 +339,5 @@ export default {
312339
deleteOption,
313340
searchRestrt,
314341
getRestrtListWithCategory,
342+
getRevenue,
315343
};

Server/src/controllers/reviewController.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,32 @@ const postReview = async (req, res) => {
2727
}
2828
};
2929

30+
/**
31+
* @route POST /review/emoji
32+
* @desc post emoji data
33+
* @access Private
34+
*/
35+
const postEmoji = async (req, res) => {
36+
const { id } = req.params;
37+
const data = req.body;
38+
try {
39+
const postEmoji = await reviewService.postEmoji(id, data);
40+
return res.status(200).json({
41+
status: 200,
42+
success: true,
43+
message: "리뷰 이모지 생성 성공",
44+
data: postEmoji,
45+
});
46+
}catch (error){
47+
console.log(error);
48+
res.status(400).json({
49+
status: 400,
50+
success: false,
51+
message: error.message,
52+
});
53+
}
54+
};
55+
3056
/**
3157
* @route GET /review/restrt/:id
3258
* @desc get restaurant reviews data
@@ -148,6 +174,7 @@ const deleteReview = async (req, res) => {
148174

149175
export default {
150176
postReview,
177+
postEmoji,
151178
getReviewListByRestrtIdWithPage,
152179
getReviewListByUserIdWithPage,
153180
deleteReview,

Server/src/middleware/changeState.js

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import schedule from 'node-schedule-tz';
1+
import schedule from 'node-schedule';
22
import { fbDB } from '../config/firebase.js';
33
import { Timestamp, FieldValue } from 'firebase-admin/firestore';
44

@@ -47,7 +47,6 @@ const changeState = async (id) =>{
4747
const nowDay = koreaNow.getDay(); //요일 일월화수목금토
4848
const nowHour = koreaNow.getHours(); //시
4949
const nowMinutes = koreaNow.getMinutes(); //분
50-
5150
const dayTime = timeList[(nowDay + 6) % 7]; //가게 특정요일 운영시간
5251

5352
if(dayTime == "휴무"){
@@ -58,12 +57,10 @@ const changeState = async (id) =>{
5857
const openMinute = Number(dayTime.slice(3, 5));
5958
const closeHour = Number(dayTime.slice(-5, -3));
6059
const closeMinute = Number(dayTime.slice(-2));
61-
6260
console.log(id);
6361
console.log('현재', nowHour, nowMinutes, nowDay);
6462
console.log(openHour, openMinute, closeHour, closeMinute);
6563

66-
6764
if (openHour > nowHour){
6865
changeClosed(id);
6966
console.log('끝1');
@@ -96,14 +93,71 @@ const changeState = async (id) =>{
9693
}
9794
};
9895

96+
const makeMonthRevenueDoc = async (id) => {
97+
try{
98+
const revenueRef = fbDB.collection('restaurants').doc(id).collection('revenues');
99+
const now = new Date();
100+
const utcNow = now.getTime() + (now.getTimezoneOffset() * 60 * 1000); // 현재 시간을 utc로 변환한 밀리세컨드값
101+
const koreaTimeDiff = 9 * 60 * 60 * 1000; // 한국 시간은 UTC보다 9시간 빠름
102+
const koreaNow = new Date(utcNow + koreaTimeDiff); // utc로 변환된 값을 한국 시간으로 변환시키기 위해 9시간(밀리세컨드)를 더함
103+
const nowYear = koreaNow.getFullYear(); //요일 일월화수목금토
104+
const nowMonth = ("0" + (1 + koreaNow.getMonth())).slice(-2);
105+
const revenueId = nowYear + nowMonth;
106+
const data = {total_revenue: 0};
107+
const newDoc = await revenueRef.doc(revenueId).set(data);
108+
}catch (error){
109+
console.log(error);
110+
throw error;
111+
}
112+
};
113+
114+
const makeDayRevenueDoc = async (id) => {
115+
try{
116+
const revenueRef = fbDB.collection('restaurants').doc(id).collection('revenues');
117+
const now = new Date();
118+
const utcNow = now.getTime() + (now.getTimezoneOffset() * 60 * 1000); // 현재 시간을 utc로 변환한 밀리세컨드값
119+
const koreaTimeDiff = 9 * 60 * 60 * 1000; // 한국 시간은 UTC보다 9시간 빠름
120+
const koreaNow = new Date(utcNow + koreaTimeDiff); // utc로 변환된 값을 한국 시간으로 변환시키기 위해 9시간(밀리세컨드)를 더함
121+
const nowYear = koreaNow.getFullYear(); //요일 일월화수목금토
122+
const nowMonth = ("0" + (1 + koreaNow.getMonth())).slice(-2);
123+
const nowDay = koreaNow.getDate() + "";
124+
const revenueId = nowYear + nowMonth;
125+
const update = await revenueRef.doc(revenueId).update({[nowDay]: 0});
126+
}catch (error){
127+
console.log(error);
128+
throw error;
129+
}
130+
};
131+
99132
const makeSchedule = async (id) => {
100133
try{
101134
const restrtRef = fbDB.collection('restaurants').doc(id);
102135
const restrtSnapshot = await restrtRef.get();
103136
const timeList = restrtSnapshot.data().opening_hours; //월화수목금토일
104137

105-
//자정마다 order number 초기화
106-
const initOrderNumber = schedule.scheduleJob(`00 00 15 * * *`, function () {
138+
//매월 초마다 매출 문서 생성하는 스케줄
139+
const monthRule = new schedule.RecurrenceRule();
140+
monthRule.date = 1;
141+
monthRule.hour = 0;
142+
monthRule.minute = 0;
143+
monthRule.second = 1;
144+
monthRule.tz = 'Asia/Seoul';
145+
const initMonthRevenue = schedule.scheduleJob(monthRule, function () {
146+
makeMonthRevenueDoc(id);
147+
console.log(`${id}식당 Month Revenu init`);
148+
});
149+
//자정마다 매출 문서 생성하는 스케줄
150+
const DayRule = new schedule.RecurrenceRule();
151+
DayRule.hour = 0;
152+
DayRule.minute = 0;
153+
DayRule.second = 10;
154+
DayRule.tz = 'Asia/Seoul';
155+
const initDayRevenue = schedule.scheduleJob(DayRule, function () { //-9시간
156+
makeDayRevenueDoc(id);
157+
console.log(`${id}식당 Day Revenu init`);
158+
});
159+
//자정마다 order number 초기화하는 스케줄
160+
const initOrderNumber = schedule.scheduleJob(`0 0 15 * * *`, function () {
107161
changeOrderNumber(id);
108162
console.log(`${id}식당 order number init`);
109163
});
@@ -182,6 +236,8 @@ export {
182236
changeClosed,
183237
changeState,
184238
changeOrderNumber,
239+
makeDayRevenueDoc,
240+
makeMonthRevenueDoc,
185241
makeSchedule,
186242
init,
187243
}

Server/src/routes/restrtRouter.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@ const router = Router();
66

77
router.post('/', multer.single('img'), restrtController.postRestrt);
88
router.post('/menus', multer.array('img'), restrtController.postMenu);
9-
router.post('/options/:id', restrtController.postOption);
9+
router.post('/options/:restrtId/:menuId', restrtController.postOption);
1010
router.get('/', restrtController.getRestrtList);
1111
router.get('/category/:c', restrtController.getRestrtListWithCategory);
1212
router.get('/menu-list/:id', restrtController.getMenuList);
1313
router.get('/:id', restrtController.getRestrt);
14-
router.get('/menu/:id', restrtController.getMenuWithOptions);
14+
router.get('/menu/:restrtId/:menuId', restrtController.getMenuWithOptions);
1515
router.delete('/:id', restrtController.deleteRestrt);
1616
router.delete('/:restrtId/:menuId', restrtController.deleteMenu);
17-
router.delete('/menu/:menuId/:optionId', restrtController.deleteOption);
17+
router.delete('/menu/:restrtId/:menuId/:optionId', restrtController.deleteOption);
1818
router.get('/search/:data', restrtController.searchRestrt);
19+
router.get('/revenue/:id', restrtController.getRevenue);
1920

2021
export default router;

Server/src/routes/reviewRouter.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {multer} from '../middleware/image.js';
55
const router = Router();
66

77
router.post('', multer.single('img'), reviewController.postReview);
8+
router.post('/emoji/:id', reviewController.postEmoji);
89
router.get('/restrt/:id', reviewController.getReviewListByRestrtIdWithPage); //?page=2&size=3
910
router.get('/user/:id', reviewController.getReviewListByUserIdWithPage); //?page=2&size=3
1011
router.delete('/:id', reviewController.deleteReview);

Server/src/service/orderService.js

Lines changed: 28 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,102 +4,65 @@ import { Timestamp, FieldValue } from 'firebase-admin/firestore';
44
const getOrderById = async (id) => {
55
try{
66
const orderRef = fbDB.collection('orders').doc(id);
7-
const ordersnapshot = await orderRef.get();
8-
const orderMenuIdList = ordersnapshot.data().menu_id_list; //주문메뉴 id 리스트
9-
let orderMenuList = [];
10-
for (let orderMenuId of orderMenuIdList){ //async/await은 forEach문 안에서 사용할 수 없다.
11-
const orderMenuRef = fbDB.collection('order-menus').doc(orderMenuId);
12-
const orderMenusnapshot = await orderMenuRef.get();
13-
const menuId = orderMenusnapshot.data().menu_id; //메뉴 id
14-
const menuRef = fbDB.collection('menus').doc(menuId);
15-
const menusnapshot = await menuRef.get(); //메뉴 이름 확인용
16-
let optionList = [];
17-
for (let op of orderMenusnapshot.data().options){ //주문한 메뉴의 옵션 리스트
18-
const optionRef = fbDB.collection('menu-options').doc(op.ops_id); //옵션 id
19-
const optionsnapshot = await optionRef.get();
20-
let contentList = [];
21-
for (let cid of op.content_id){ //["1", "2"]
22-
for (let i of optionsnapshot.data().content){
23-
if (i.id == cid){
24-
contentList.push({id: cid, name: i.name, price: i.price, container: i.container});
25-
}
26-
}
27-
}
28-
optionList.push({id: op.ops_id, option_name: optionsnapshot.data().option_name, content: contentList}) //옵션 아이디, 옵션 이름, 콘텐츠 id
29-
};
30-
orderMenuList.push({orderMenuId: orderMenuId, name: menusnapshot.data().name, amount: orderMenusnapshot.data().amount, price: menusnapshot.data().price,
31-
menu_option: optionList, container: menusnapshot.data().container });
32-
};
33-
const restrtRef = fbDB.collection('restaurants').doc(ordersnapshot.data().restrt_id); //옵션 id
34-
const restrtsnapshot = await restrtRef.get();
35-
const order = {id:ordersnapshot.id, user_id: ordersnapshot.data().user_id, state: ordersnapshot.data().state, restrt_id: ordersnapshot.data().restrt_id, orderMenuList: orderMenuList,
36-
total_price: ordersnapshot.data().total_price, requirements: ordersnapshot.data().requirements, payment_method: ordersnapshot.data().payment_method,
37-
order_number: ordersnapshot.data().order_number, created_at: ordersnapshot.data().created_at,
38-
restrt_name: restrtsnapshot.data().name, restrt_img: restrtsnapshot.data().img, check_review: ordersnapshot.data().check_review
39-
};
40-
return order;
7+
const orderDoc = await orderRef.get();
8+
const resData = orderDoc.data();
9+
console.log(resData);
10+
resData.id = id;
11+
return resData;
4112
}catch (error){
4213
console.log(error);
4314
throw error;
4415
}
4516
};
4617

47-
//for test
48-
const changeOrderState = async (id) => {
49-
try{
50-
const orderRef = fbDB.collection('orders').doc(id);
51-
setTimeout(() => orderRef.update({state: "accepted"}), 5000);
52-
setTimeout(() => orderRef.update({state: "cooked"}), 10000);
53-
setTimeout(() => {
54-
orderRef.update({state: "packed"});
55-
orderRef.update({packed_time: FieldValue.serverTimestamp()});
56-
}, 15000);
57-
58-
}catch (error){
59-
console.log(error);
60-
throw error;
61-
}
62-
63-
}
64-
6518
const postOrder = async (data) => {
6619
try{
67-
let menu_list = [];
68-
for (let menu of data.orderMenuList){
69-
const res = await fbDB.collection('order-menus').add(menu);
70-
menu_list.push(res.id);
71-
}
20+
//식당 DB의 order_num 갱신
7221
const restrtRef = fbDB.collection('restaurants').doc(data.restrt_id);
7322
const updateOrdernum = await restrtRef.update({order_number:FieldValue.increment(1)});
23+
//식당DB revenues 컬렉션 문서 갱신
24+
const now = new Date();
25+
const utcNow = now.getTime() + (now.getTimezoneOffset() * 60 * 1000); // 현재 시간을 utc로 변환한 밀리세컨드값
26+
const koreaTimeDiff = 9 * 60 * 60 * 1000; // 한국 시간은 UTC보다 9시간 빠름
27+
const koreaNow = new Date(utcNow + koreaTimeDiff); // utc로 변환된 값을 한국 시간으로 변환시키기 위해 9시간(밀리세컨드)를 더함
28+
const nowYear = koreaNow.getFullYear(); //요일 일월화수목금토
29+
const nowMonth = ("0" + (1 + koreaNow.getMonth())).slice(-2);
30+
const nowDay = koreaNow.getDate() + "";
31+
const revenueId = nowYear + nowMonth;
32+
const revenueRef = restrtRef.collection('revenues').doc(revenueId);
33+
const updateRevenue = await revenueRef.update({
34+
total_revenue:FieldValue.increment(Number(data.total_price)), //달 매출 갱신
35+
[nowDay]: FieldValue.increment(Number(data.total_price)), //하루 매출 갱신
36+
});
37+
//order 정보 생성
7438
const refsnapshot = await restrtRef.get();
75-
const order = {
39+
const orderData = {
7640
restrt_id : data.restrt_id,
7741
user_id : data.user_id,
7842
requirements : data.requirements,
7943
payment_method : data.payment_method,
8044
total_price : Number(data.total_price),
8145
created_at: FieldValue.serverTimestamp(),
82-
menu_id_list: menu_list,
8346
order_number: Number(refsnapshot.data().order_number),
8447
state: "checking",
8548
packed_time: null,
8649
check_review: false,
50+
preview_text: data.preview_text,
51+
orderMenuList: data.orderMenuList
8752
};
88-
const res = await fbDB.collection('orders').add(order);
89-
const ref = fbDB.collection('orders').doc(res.id);
53+
const orderRes = await fbDB.collection('orders').add(orderData);
54+
const ref = fbDB.collection('orders').doc(orderRes.id);
9055
const snapshot = await ref.get();
9156
const resData = snapshot.data();
92-
resData.id = res.id;
93-
//for test
94-
changeOrderState(res.id);
57+
resData.id = orderRes.id;
9558
return resData;
9659
}catch (error){
9760
console.log(error);
9861
throw error;
9962
}
10063
};
10164

102-
const getOrderListByUserId = async (id) => {
65+
const getOrderListByUserId = async (id) => { //비홀성화
10366
try{
10467
const orderRef = fbDB.collection('orders').where('user_id', '==', id).orderBy('created_at', 'desc');
10568
const ordersnapshot = await orderRef.get();

0 commit comments

Comments
 (0)