From 72985076cbff7207ef7d7d997629c30fa0d6a1de Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Wed, 12 Jun 2024 03:00:32 +0900 Subject: [PATCH 01/12] feat: auth router --- routes/auth/__init__.py | 0 routes/auth/route.py | 78 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 routes/auth/__init__.py create mode 100644 routes/auth/route.py diff --git a/routes/auth/__init__.py b/routes/auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routes/auth/route.py b/routes/auth/route.py new file mode 100644 index 0000000..0bbdeba --- /dev/null +++ b/routes/auth/route.py @@ -0,0 +1,78 @@ +from fastapi import APIRouter, Request +from fastapi.responses import JSONResponse + +from pytz import timezone + +from utilities.config import GetConfig +from utilities.database.func import GetDatabase + +import smtplib +from email.message import EmailMessage + +router = APIRouter() + +config = GetConfig() + +database = GetDatabase(config["DATABASE"]["URI"]) + +SMTP_SERVER = 'smtp-mail.outlook.com' +SMTP_PORT = 587 + +NEULBOM_ADDRESS = config["EMAIL"]["ADDRESS"] +NEULBOM_PASSWORD = config["EMAIL"]["PASSWORD"] + +@router.get("/send/{userId}/") +async def SendEmailToUser(request: Request, userId: str): + findUser = await database["pending"].find_one({"userId" : userId}) + + if findUser is None: + return JSONResponse( + status_code=500, content={"message": "Pending User Not Found"} + ) + + smtp = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) + smtp.starttls() + smtp.login(NEULBOM_ADDRESS, NEULBOM_PASSWORD) + + message = EmailMessage() + message.set_content('귀하의 이메일 인증 코드는 다음과 같습니다. : ' + findUser["authCode"] + '\n대문자로 입력해주세요.') + message["Subject"] = "늘봄 이메일 인증 코드" + message["From"] = NEULBOM_ADDRESS + message["To"] = findUser["email"] + + smtp.send_message(message) + smtp.quit() + + return JSONResponse( + status_code=200, content={"message" : "Email sent"} + ) + + + +@router.post("/check/{userId}") +async def AuthPendingUser(request: Request, userId): + findUser = await database["pending"].find_one({"userId" : userId}) + authData = await request.json() + + if findUser is None: + return JSONResponse( + status_code=500, + content={"message": "Pending User Not Found"} + ) + + if await database["pending"].find_one({"authCode": authData["authCode"]}) is None: + return JSONResponse( + status_code=400, + content={"message": "Invalid Authorization Code"} + ) + + del findUser["authCode"] + + await database["user"].insert_one(findUser) + + del findUser + + return JSONResponse( + status_code=200, + content={"message": "User Successfully Authorized"} + ) \ No newline at end of file From aeacdd1305adabcba433e00bb768867ccb5de873 Mon Sep 17 00:00:00 2001 From: G1ltchy <59166191+G1ltchy@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:26:58 +0900 Subject: [PATCH 02/12] fix: auth router pending DB delete --- routes/auth/route.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/auth/route.py b/routes/auth/route.py index 0bbdeba..495c1c5 100644 --- a/routes/auth/route.py +++ b/routes/auth/route.py @@ -70,9 +70,9 @@ async def AuthPendingUser(request: Request, userId): await database["user"].insert_one(findUser) - del findUser + await database["pending"].delete_one({"userId": userId}) return JSONResponse( status_code=200, content={"message": "User Successfully Authorized"} - ) \ No newline at end of file + ) From 0931fcf95097c836ca8f0e390995c0c25565e32f Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Fri, 14 Jun 2024 23:57:43 +0900 Subject: [PATCH 03/12] feat: EmailSender module --- .gitignore | 1 + requirements.txt | 3 ++- utilities/emailSender.py | 45 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 utilities/emailSender.py diff --git a/.gitignore b/.gitignore index 9995358..5f63196 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ test.py temp.txt utilities\login.py settings.json +launch.json testIgnore # C extensions diff --git a/requirements.txt b/requirements.txt index 79bfe34..67749c6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,4 +9,5 @@ pytz pick pyjwt python-barcode -pillow \ No newline at end of file +pillow +aiosmtplib \ No newline at end of file diff --git a/utilities/emailSender.py b/utilities/emailSender.py new file mode 100644 index 0000000..02ba2b3 --- /dev/null +++ b/utilities/emailSender.py @@ -0,0 +1,45 @@ +from utilities.config import GetConfig +from utilities.database.func import GetDatabase + +import aiosmtplib +from email.message import EmailMessage + +config = GetConfig() + +database = GetDatabase(config["DATABASE"]["URI"]) + +SMTP_SERVER = "smtp-mail.outlook.com" +SMTP_PORT = 587 + +NEULBOM_ADDRESS = config["EMAIL"]["ADDRESS"] +NEULBOM_PASSWORD = config["EMAIL"]["PASSWORD"] + + +async def SendEmail(receiver: str, subject: str, content: str): + """ + Parameters + - receiver: str, 받는 사람 + - subject: str, 메일의 제목 + - contect: str, 메일의 내용 + + Demonstration + 메일의 제목을 subject으로 정하고 내용을 content로 정한 다음, receiver한테 전송한다 + + Return + 해당없음 + """ + + smtp = aiosmtplib.SMTP(hostname=SMTP_SERVER, port=SMTP_PORT) + await smtp.connect() + await smtp.login(NEULBOM_ADDRESS, NEULBOM_PASSWORD) + message = EmailMessage() + + message["Subject"] = subject + message.set_content(content) + message["From"] = NEULBOM_ADDRESS + message["To"] = receiver + + await smtp.send_message(message) + await smtp.quit() + + return From 272eebfb00c59fb772fd91371da72feb88243872 Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Sat, 15 Jun 2024 00:16:51 +0900 Subject: [PATCH 04/12] fix: auth router is now async --- routes/auth/route.py | 45 ++++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/routes/auth/route.py b/routes/auth/route.py index 495c1c5..544fee9 100644 --- a/routes/auth/route.py +++ b/routes/auth/route.py @@ -5,9 +5,8 @@ from utilities.config import GetConfig from utilities.database.func import GetDatabase +from utilities.emailSender import SendEmail -import smtplib -from email.message import EmailMessage router = APIRouter() @@ -15,57 +14,50 @@ database = GetDatabase(config["DATABASE"]["URI"]) -SMTP_SERVER = 'smtp-mail.outlook.com' +SMTP_SERVER = "smtp-mail.outlook.com" SMTP_PORT = 587 NEULBOM_ADDRESS = config["EMAIL"]["ADDRESS"] NEULBOM_PASSWORD = config["EMAIL"]["PASSWORD"] + @router.get("/send/{userId}/") async def SendEmailToUser(request: Request, userId: str): - findUser = await database["pending"].find_one({"userId" : userId}) + findUser = await database["pending"].find_one({"userId": userId}) if findUser is None: return JSONResponse( status_code=500, content={"message": "Pending User Not Found"} ) - - smtp = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) - smtp.starttls() - smtp.login(NEULBOM_ADDRESS, NEULBOM_PASSWORD) - - message = EmailMessage() - message.set_content('귀하의 이메일 인증 코드는 다음과 같습니다. : ' + findUser["authCode"] + '\n대문자로 입력해주세요.') - message["Subject"] = "늘봄 이메일 인증 코드" - message["From"] = NEULBOM_ADDRESS - message["To"] = findUser["email"] - smtp.send_message(message) - smtp.quit() + await SendEmail( + receiver=findUser["email"], + subject="늘봄 이메일 인증 코드", + content="귀하의 이메일 인증 코드는 다음과 같습니다. : " + + findUser["authCode"] + + "\n대문자로 입력해주세요.", + ) return JSONResponse( - status_code=200, content={"message" : "Email sent"} + status_code=200, content={"message": "Email sent to " + findUser["email"]} ) - @router.post("/check/{userId}") async def AuthPendingUser(request: Request, userId): - findUser = await database["pending"].find_one({"userId" : userId}) + findUser = await database["pending"].find_one({"userId": userId}) authData = await request.json() if findUser is None: return JSONResponse( - status_code=500, - content={"message": "Pending User Not Found"} + status_code=500, content={"message": "Pending User Not Found"} ) - + if await database["pending"].find_one({"authCode": authData["authCode"]}) is None: return JSONResponse( - status_code=400, - content={"message": "Invalid Authorization Code"} + status_code=400, content={"message": "Invalid Authorization Code"} ) - + del findUser["authCode"] await database["user"].insert_one(findUser) @@ -73,6 +65,5 @@ async def AuthPendingUser(request: Request, userId): await database["pending"].delete_one({"userId": userId}) return JSONResponse( - status_code=200, - content={"message": "User Successfully Authorized"} + status_code=200, content={"message": "User Successfully Authorized"} ) From e244af6739e985342793cf65281f1d5d371a853b Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Sat, 15 Jun 2024 01:21:04 +0900 Subject: [PATCH 05/12] chore: deleted unused library from auth router --- routes/auth/route.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/routes/auth/route.py b/routes/auth/route.py index 544fee9..5b7129b 100644 --- a/routes/auth/route.py +++ b/routes/auth/route.py @@ -1,8 +1,6 @@ from fastapi import APIRouter, Request from fastapi.responses import JSONResponse -from pytz import timezone - from utilities.config import GetConfig from utilities.database.func import GetDatabase from utilities.emailSender import SendEmail @@ -14,12 +12,6 @@ database = GetDatabase(config["DATABASE"]["URI"]) -SMTP_SERVER = "smtp-mail.outlook.com" -SMTP_PORT = 587 - -NEULBOM_ADDRESS = config["EMAIL"]["ADDRESS"] -NEULBOM_PASSWORD = config["EMAIL"]["PASSWORD"] - @router.get("/send/{userId}/") async def SendEmailToUser(request: Request, userId: str): From 3f43bed0c9a0041778031134d70c3b01e1122fc2 Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Sat, 15 Jun 2024 01:22:00 +0900 Subject: [PATCH 06/12] chore: deleted unused library from userGenerator module --- utilities/userGenerator.py | 39 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/utilities/userGenerator.py b/utilities/userGenerator.py index 3d781ca..b1eff89 100644 --- a/utilities/userGenerator.py +++ b/utilities/userGenerator.py @@ -1,30 +1,29 @@ -import time import pytz -import base64 -from json import dumps -from aiohttp import ClientSession -from datetime import datetime, timedelta +from datetime import datetime from utilities.security import HashPassword, GenerateSalt, GenerateAuthCode -def CreateUser(userId: str, username: str, email: str, stduentId: str, userpassword: str): + +def CreateUser( + userId: str, username: str, email: str, stduentId: str, userpassword: str +): salt = GenerateSalt(saltLength=64) hashedPassword = HashPassword(password=userpassword, salt=salt) authCode = GenerateAuthCode() return { - "userId": userId, - "username": username, - "email": email, - "studentId": stduentId, - "password": hashedPassword, - "salt": salt, - "authCode": authCode, - "isSuper": False, - "isTeacher": False, - "lastLogin": datetime.now(tz=pytz.timezone("Asia/Seoul")).strftime( - "%Y-%m-%d %H:%M:%S" - ), - "graduated": False, - } \ No newline at end of file + "userId": userId, + "username": username, + "email": email, + "studentId": stduentId, + "password": hashedPassword, + "salt": salt, + "authCode": authCode, + "isSuper": False, + "isTeacher": False, + "lastLogin": datetime.now(tz=pytz.timezone("Asia/Seoul")).strftime( + "%Y-%m-%d %H:%M:%S" + ), + "graduated": False, + } From 3bd02ce38742e0ae9c838b9054ff24bb4ebb203e Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Sat, 15 Jun 2024 01:25:23 +0900 Subject: [PATCH 07/12] fix: imported modules that should be loaded from security module --- utilities/security.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/utilities/security.py b/utilities/security.py index 0e43628..0d74dbc 100644 --- a/utilities/security.py +++ b/utilities/security.py @@ -2,6 +2,9 @@ import random import string +from utilities.config import GetConfig +from utilities.database.func import GetDatabase + def GenerateSalt(saltLength: int = 64) -> str: """ @@ -26,6 +29,7 @@ def HashPassword(password: str, salt: str) -> bytes: """ return scrypt.hash(password, salt) + async def GenerateAuthCode() -> str: """ Generates a random 5 bytes Authorize Code @@ -33,14 +37,13 @@ async def GenerateAuthCode() -> str: :return: Authorize Code """ + config = GetConfig() database = GetDatabase(config["DATABASE"]["URI"]) authCode = str() while True: - authCode = "".join( - random.choice(string.ascii_uppercase) - for _ in range(5) - ) - if await database["pending"].find_one({"authCode" : authCode}) is None: break + authCode = "".join(random.choice(string.ascii_uppercase) for _ in range(5)) + if await database["pending"].find_one({"authCode": authCode}) is None: + break return authCode From e574ee0c4e0014dce36493e7c62539040dc407f4 Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Sat, 15 Jun 2024 01:26:05 +0900 Subject: [PATCH 08/12] chore: deleted unused library from barcodeGenerator module --- utilities/barcodeGenerator.py | 1 - 1 file changed, 1 deletion(-) diff --git a/utilities/barcodeGenerator.py b/utilities/barcodeGenerator.py index 1f33917..2ae9522 100644 --- a/utilities/barcodeGenerator.py +++ b/utilities/barcodeGenerator.py @@ -1,5 +1,4 @@ from barcode import Code39 -from barcode.writer import SVGWriter import barcode From 6d865b06f2206f19d1770e072a30cec15da4fdc2 Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Sat, 15 Jun 2024 01:27:21 +0900 Subject: [PATCH 09/12] chore: deleted unused library from barcodeGenerator module --- utilities/mealJSONConverter.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/utilities/mealJSONConverter.py b/utilities/mealJSONConverter.py index b47519a..a021466 100644 --- a/utilities/mealJSONConverter.py +++ b/utilities/mealJSONConverter.py @@ -1,6 +1,3 @@ -import json -from collections import OrderedDict - def ConvertJSON(mealObject: dict) -> dict: """ !ISSUE!; 인코딩 상태에 문제 있을 수 있음, 한번에 하나씩만 처리함 @@ -11,27 +8,29 @@ def ConvertJSON(mealObject: dict) -> dict: if mealObject["MMEAL_SC_NM"] == "중식": convertedMealObject["isLunch"] = True - else : + else: convertedMealObject["isLunch"] = False - + convertedMealObject["date"] = mealObject["MLSV_YMD"] - - menus = mealObject["DDISH_NM"].split('
') + + menus = mealObject["DDISH_NM"].split("
") menuJSONList = list() for menu in menus: - menu = menu.replace('*', '') + menu = menu.replace("*", "") menuWithAllergy = dict() - menuWithAllergy["name"] = menu.split(' ', 1)[0].replace('1', '').replace('(완)', '') + menuWithAllergy["name"] = ( + menu.split(" ", 1)[0].replace("1", "").replace("(완)", "") + ) allergyList = list() - if(menu.find('(')): - menu = menu.replace('(', '') - menu = menu.replace(')', '') - menu = menu.split(' ')[1] - allergyList = menu.split('.') + if menu.find("("): + menu = menu.replace("(", "") + menu = menu.replace(")", "") + menu = menu.split(" ")[1] + allergyList = menu.split(".") i = 0 @@ -44,11 +43,12 @@ def ConvertJSON(mealObject: dict) -> dict: menuWithAllergy["allergies"] = allergyList menuJSONList.append(menuWithAllergy) - + convertedMealObject["menu"] = menuJSONList return convertedMealObject + def BatchConvertJSON(mealObject: list) -> list: """ JSON List를 입력으로 받으면 전부 변환하여 바꿔줌 From 258924d6f62d733c775a32467f37ba68d329059e Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Sun, 14 Jul 2024 21:02:49 +0900 Subject: [PATCH 10/12] test: added test file folder --- test/mealList/meal.json | 2011 +++++++++++++++++++++++++++++++++++ test/mealList/meal0710.json | 1509 ++++++++++++++++++++++++++ test/temp.py | 63 ++ test/testAuthCode.py | 3 + test/testMealConverter.py | 10 + test/testRunEmail.py | 5 + test/testUserGenerator.py | 3 + 7 files changed, 3604 insertions(+) create mode 100644 test/mealList/meal.json create mode 100644 test/mealList/meal0710.json create mode 100644 test/temp.py create mode 100644 test/testAuthCode.py create mode 100644 test/testMealConverter.py create mode 100644 test/testRunEmail.py create mode 100644 test/testUserGenerator.py diff --git a/test/mealList/meal.json b/test/mealList/meal.json new file mode 100644 index 0000000..bb7999d --- /dev/null +++ b/test/mealList/meal.json @@ -0,0 +1,2011 @@ +[ + { + "isLunch": true, + "date": "20240603", + "menu": [ + { + "name": "흰밥", + "allergies": [] + }, + { + "name": "스팸순두부찌개", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 13, + 15, + 16 + ] + }, + { + "name": "새우호박볶음", + "allergies": [ + 9, + 13 + ] + }, + { + "name": "만두강정", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 16, + 18 + ] + }, + { + "name": "탄두리돼지훈제", + "allergies": [ + 2, + 5, + 6, + 10, + 12, + 13 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "요구르트", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240604", + "menu": [ + { + "name": "현미밥", + "allergies": [] + }, + { + "name": "돼지LA갈비찜", + "allergies": [ + 5, + 6, + 10, + 12, + 13 + ] + }, + { + "name": "연두부/양념장", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "오징어버터구이", + "allergies": [ + 2, + 5, + 13, + 17 + ] + }, + { + "name": "육개장", + "allergies": [ + 1, + 5, + 6, + 16 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240605", + "menu": [ + { + "name": "참치캔비빔밥", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "미소국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "새우버터구이", + "allergies": [ + 2, + 9 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "제티", + "allergies": [ + 2 + ] + }, + { + "name": "우유", + "allergies": [ + 2 + ] + }, + { + "name": "고구마샐러드", + "allergies": [ + 2, + 13 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240607", + "menu": [ + { + "name": "흰밥", + "allergies": [] + }, + { + "name": "치즈코돈부르", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "워터젤리", + "allergies": [] + }, + { + "name": "롤케잌", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "귤맛살샐러드", + "allergies": [ + 1, + 2, + 5, + 6, + 8, + 13, + 18 + ] + }, + { + "name": "크루통스프", + "allergies": [ + 2, + 5, + 6, + 13, + 16 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240610", + "menu": [ + { + "name": "차조밥", + "allergies": [] + }, + { + "name": "뼈없는", + "allergies": [] + }, + { + "name": "어묵국", + "allergies": [ + 1, + 5, + 6 + ] + }, + { + "name": "양송이메추리알조림", + "allergies": [ + 1, + 5, + 6, + 13 + ] + }, + { + "name": "콩나물무침", + "allergies": [ + 5 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "수리취복떡", + "allergies": [] + } + ] + }, + { + "isLunch": true, + "date": "20240611", + "menu": [ + { + "name": "흰밥", + "allergies": [] + }, + { + "name": "양지탕", + "allergies": [ + 1, + 5, + 6, + 13, + 16 + ] + }, + { + "name": "아삭고추된장무침", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "치킨직화스테이크/스위트칠리소스", + "allergies": [ + 5, + 6, + 12, + 13, + 15 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "아이스크림", + "allergies": [ + 1, + 2, + 5 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240612", + "menu": [ + { + "name": "치킨마요덮밥", + "allergies": [ + 1, + 5, + 6, + 13, + 15, + 18 + ] + }, + { + "name": "옥수수빵", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "유부장국", + "allergies": [ + 5 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "바나나우유", + "allergies": [ + 2 + ] + }, + { + "name": "딸기샐러드", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240613", + "menu": [ + { + "name": "현미밥", + "allergies": [] + }, + { + "name": "북어국", + "allergies": [ + 1, + 5, + 6 + ] + }, + { + "name": "순살족발", + "allergies": [ + 5, + 6, + 10, + 13 + ] + }, + { + "name": "볼어묵볶음", + "allergies": [ + 1, + 5, + 6, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "부추겉절이", + "allergies": [ + 13 + ] + }, + { + "name": "파인애플", + "allergies": [] + } + ] + }, + { + "isLunch": true, + "date": "20240614", + "menu": [ + { + "name": "중국식계란볶음밥", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 13, + 15, + 16, + 18 + ] + }, + { + "name": "자장라면", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 10, + 13, + 15, + 16 + ] + }, + { + "name": "소떡소떡", + "allergies": [ + 1, + 5, + 6, + 10, + 12, + 13, + 15, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "레몬에이드", + "allergies": [] + }, + { + "name": "블루베리샐러드", + "allergies": [ + 1, + 2, + 5, + 6, + 11 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240617", + "menu": [ + { + "name": "흰밥/후리가케", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 13, + 16, + 18 + ] + }, + { + "name": "불닭볶음면", + "allergies": [ + 1, + 5, + 6, + 13, + 15 + ] + }, + { + "name": "모듬묵무침", + "allergies": [] + }, + { + "name": "계란스크램블", + "allergies": [ + 1, + 5 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "카프리썬", + "allergies": [ + 11, + 12 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240618", + "menu": [ + { + "name": "기장밥", + "allergies": [] + }, + { + "name": "건새우근대국", + "allergies": [ + 5, + 6, + 9 + ] + }, + { + "name": "돈사태김치찜", + "allergies": [ + 9, + 10 + ] + }, + { + "name": "무생채", + "allergies": [ + 13 + ] + }, + { + "name": "김구이", + "allergies": [] + }, + { + "name": "생선까스", + "allergies": [ + 1, + 5, + 6, + 13 + ] + }, + { + "name": "메론", + "allergies": [] + } + ] + }, + { + "isLunch": true, + "date": "20240619", + "menu": [ + { + "name": "큐브스테이크덮밥", + "allergies": [ + 1, + 5, + 6, + 10, + 12, + 13, + 16 + ] + }, + { + "name": "유부장국", + "allergies": [ + 5 + ] + }, + { + "name": "맛볼감자튀김", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "파인애플쥬스", + "allergies": [ + 13 + ] + }, + { + "name": "망고샐러드", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240620", + "menu": [ + { + "name": "현미밥", + "allergies": [] + }, + { + "name": "부대찌개/라면사리", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 10, + 13, + 15, + 16 + ] + }, + { + "name": "크린베리멸치볶음", + "allergies": [ + 5, + 13 + ] + }, + { + "name": "새송이맛살볶음", + "allergies": [ + 1, + 5, + 6, + 8 + ] + }, + { + "name": "유린기", + "allergies": [ + 1, + 2, + 5, + 6, + 15 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "아이스경단", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240621", + "menu": [ + { + "name": "장조림버터비빔밥", + "allergies": [ + 1, + 2, + 16 + ] + }, + { + "name": "냉모밀국수", + "allergies": [ + 3, + 5, + 6, + 13 + ] + }, + { + "name": "무말랭이진미채무침", + "allergies": [ + 5, + 6, + 13, + 17 + ] + }, + { + "name": "타코야끼", + "allergies": [ + 1, + 2, + 5, + 6, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "초코우유", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240624", + "menu": [ + { + "name": "스파게티", + "allergies": [ + 1, + 5, + 6, + 10, + 12, + 13 + ] + }, + { + "name": "즉석피자", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 15, + 16 + ] + }, + { + "name": "오렌지주스", + "allergies": [ + 13 + ] + }, + { + "name": "초코수제쿠키", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "단무지/피클", + "allergies": [] + }, + { + "name": "케이준샐러드", + "allergies": [ + 1, + 2, + 5, + 6, + 13, + 15, + 18 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240625", + "menu": [ + { + "name": "흑미밥", + "allergies": [] + }, + { + "name": "만두국", + "allergies": [ + 1, + 5, + 6, + 10, + 15, + 16, + 18 + ] + }, + { + "name": "견과류콩조림", + "allergies": [ + 4, + 5, + 6, + 13, + 14 + ] + }, + { + "name": "피망감자채볶음", + "allergies": [ + 5, + 10 + ] + }, + { + "name": "너비아니구이", + "allergies": [ + 5, + 6, + 10, + 15, + 16, + 18 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "인포켓치즈", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240626", + "menu": [ + { + "name": "김가루밥", + "allergies": [ + 1, + 5, + 6, + 9, + 13, + 16, + 18 + ] + }, + { + "name": "국물떡볶이", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 13, + 15, + 16, + 18 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "이온음료", + "allergies": [] + }, + { + "name": "바나나", + "allergies": [] + }, + { + "name": "과일젤리샐러드", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240627", + "menu": [ + { + "name": "보리밥", + "allergies": [] + }, + { + "name": "배추국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "도토리묵무침", + "allergies": [ + 5, + 6, + 9, + 13 + ] + }, + { + "name": "상추겉절이", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "삼겹살새송이구이", + "allergies": [ + 5, + 6, + 10 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "비피더스", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240628", + "menu": [ + { + "name": "한우파프리카볶음밥", + "allergies": [ + 5, + 13, + 16 + ] + }, + { + "name": "비빔국수", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "오징어초무침", + "allergies": [ + 5, + 6, + 13, + 17 + ] + }, + { + "name": "치즈스틱", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "두유", + "allergies": [ + 5 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240603", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "북어국", + "allergies": [ + 1, + 5, + 6 + ] + }, + { + "name": "두부조림", + "allergies": [ + 5, + 6, + 10, + 12, + 13, + 18 + ] + }, + { + "name": "콩나물불고기", + "allergies": [ + 5, + 6, + 10, + 13 + ] + }, + { + "name": "볼어묵볶음", + "allergies": [ + 1, + 5, + 6, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "망고쥬스", + "allergies": [ + 13 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240604", + "menu": [ + { + "name": "치즈오븐스파게티", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 15, + 16 + ] + }, + { + "name": "수제마늘빵", + "allergies": [ + 2, + 5, + 6, + 13 + ] + }, + { + "name": "바나나", + "allergies": [] + }, + { + "name": "카프리썬", + "allergies": [ + 11, + 12 + ] + }, + { + "name": "피클", + "allergies": [] + }, + { + "name": "콘샐러드", + "allergies": [ + 1, + 2, + 5, + 6, + 8, + 13 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240605", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "비빔막국수", + "allergies": [ + 3, + 6 + ] + }, + { + "name": "조랑떡새우조림", + "allergies": [ + 9, + 13 + ] + }, + { + "name": "보쌈", + "allergies": [ + 5, + 6, + 10 + ] + }, + { + "name": "미나리무생채", + "allergies": [ + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "식혜", + "allergies": [] + } + ] + }, + { + "isLunch": false, + "date": "20240607", + "menu": [ + { + "name": "베이컨건파래볶음밥", + "allergies": [ + 5, + 10, + 13 + ] + }, + { + "name": "김치국수", + "allergies": [ + 5, + 6, + 9 + ] + }, + { + "name": "감자샐러드", + "allergies": [ + 1, + 5, + 13 + ] + }, + { + "name": "닭꼬치", + "allergies": [ + 5, + 6, + 15 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "초코우유", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240610", + "menu": [ + { + "name": "미소국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "치커리유자샐러드", + "allergies": [ + 13 + ] + }, + { + "name": "로제치즈떡볶이", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 15, + 16 + ] + }, + { + "name": "불고기덮밥", + "allergies": [ + 16, + 5, + 6, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "포도쥬스", + "allergies": [ + 13 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240611", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "고추장찌개/수제비", + "allergies": [ + 5, + 6, + 10 + ] + }, + { + "name": "돈갈비찜", + "allergies": [ + 5, + 6, + 10, + 13 + ] + }, + { + "name": "열무무침", + "allergies": [] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "초코파이", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240612", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "가쓰오장국", + "allergies": [ + 1, + 2, + 5, + 6, + 9 + ] + }, + { + "name": "새알심떡조림", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 13, + 16 + ] + }, + { + "name": "진미채무침", + "allergies": [ + 5, + 6, + 13, + 17 + ] + }, + { + "name": "돈까스/브라운소스", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "아이스튜브", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240613", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "순대국", + "allergies": [ + 2, + 5, + 6, + 10, + 13, + 16 + ] + }, + { + "name": "도토리묵무침", + "allergies": [ + 5, + 6, + 9, + 13 + ] + }, + { + "name": "파닭", + "allergies": [ + 1, + 2, + 5, + 6, + 12, + 13, + 15, + 18 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "아이스튜브", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240614", + "menu": [ + { + "name": "계란파국", + "allergies": [ + 1 + ] + }, + { + "name": "탕평채", + "allergies": [ + 1, + 5, + 6 + ] + }, + { + "name": "무교동낙지비빔밥", + "allergies": [ + 5, + 6, + 17 + ] + }, + { + "name": "핫도그", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "헬로엔요", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240617", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "참치김치찌개", + "allergies": [ + 5, + 9 + ] + }, + { + "name": "새우브로컬리복음", + "allergies": [ + 5, + 9, + 13 + ] + }, + { + "name": "김자반", + "allergies": [ + 5 + ] + }, + { + "name": "오징어튀김", + "allergies": [ + 1, + 5, + 6, + 17 + ] + }, + { + "name": "맥적구이", + "allergies": [ + 5, + 6, + 10 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240618", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "어묵국", + "allergies": [ + 1, + 5, + 6 + ] + }, + { + "name": "안동찜닭", + "allergies": [ + 5, + 6, + 13, + 15 + ] + }, + { + "name": "비빔만두", + "allergies": [ + 1, + 5, + 6, + 10, + 16, + 18 + ] + }, + { + "name": "상추겉절이", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240619", + "menu": [ + { + "name": "가츠동", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 10, + 13 + ] + }, + { + "name": "떡꼬치", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "파인애플쥬스", + "allergies": [ + 13 + ] + }, + { + "name": "브라우니초코케이크", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "황도샐러드", + "allergies": [ + 5, + 6, + 11 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240620", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "육개장", + "allergies": [ + 1, + 13, + 16 + ] + }, + { + "name": "두부강정", + "allergies": [ + 1, + 2, + 5, + 6, + 12, + 13, + 15, + 16, + 18 + ] + }, + { + "name": "훈제오리구이", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "오이부추무침", + "allergies": [] + } + ] + }, + { + "isLunch": false, + "date": "20240621", + "menu": [ + { + "name": "닭살마파두부덮밥", + "allergies": [ + 5, + 6, + 12, + 13, + 15, + 18 + ] + }, + { + "name": "유부국", + "allergies": [ + 5 + ] + }, + { + "name": "치커리사과무침", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "꿔바로우탕수육", + "allergies": [ + 1, + 5, + 6, + 10, + 11, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "사과쥬스", + "allergies": [ + 13 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240624", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "돼지고기국밥", + "allergies": [ + 2, + 5, + 6, + 10 + ] + }, + { + "name": "아삭고추된장무침", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "비엔나조림", + "allergies": [ + 2, + 5, + 6, + 10, + 12, + 15, + 16 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "파인애플", + "allergies": [] + } + ] + }, + { + "isLunch": false, + "date": "20240625", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "팽이버섯장국", + "allergies": [] + }, + { + "name": "오이양파무침", + "allergies": [ + 13 + ] + }, + { + "name": "돈육짜장볶음", + "allergies": [ + 2, + 5, + 6, + 10, + 13 + ] + }, + { + "name": "치즈볼", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "감귤쥬스", + "allergies": [ + 13 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240626", + "menu": [ + { + "name": "전주식비빔밥", + "allergies": [ + 1, + 5, + 6, + 10 + ] + }, + { + "name": "두부미소국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "회오리감자", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "돌핀젤리스무디", + "allergies": [] + }, + { + "name": "열대과일샐러드", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240627", + "menu": [ + { + "name": "돈코츠라멘", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 13, + 15, + 16 + ] + }, + { + "name": "순살치킨강정", + "allergies": [ + 1, + 2, + 5, + 6, + 12, + 13, + 15 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "아이스크림", + "allergies": [ + 1, + 2, + 5 + ] + }, + { + "name": "생크림오믈렛", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + } +] \ No newline at end of file diff --git a/test/mealList/meal0710.json b/test/mealList/meal0710.json new file mode 100644 index 0000000..44b5f5c --- /dev/null +++ b/test/mealList/meal0710.json @@ -0,0 +1,1509 @@ +[ + { + "isLunch": true, + "date": "20240701", + "menu": [ + { + "name": "흰밥", + "allergies": [] + }, + { + "name": "닭다리삼계탕", + "allergies": [ + 15 + ] + }, + { + "name": "로제미트볼", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 15, + 16 + ] + }, + { + "name": "아삭고추된장무침", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "냉동망고", + "allergies": [] + } + ] + }, + { + "isLunch": true, + "date": "20240702", + "menu": [ + { + "name": "초코패스트리", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "이온음료", + "allergies": [] + }, + { + "name": "크리스피롤", + "allergies": [ + 1, + 2, + 5, + 6, + 14 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240703", + "menu": [ + { + "name": "도우넛", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "레드자몽에이드", + "allergies": [] + }, + { + "name": "미니뿌셔", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240704", + "menu": [ + { + "name": "크림치즈데니쉬", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "망고쥬스", + "allergies": [ + 13 + ] + }, + { + "name": "젤리", + "allergies": [] + } + ] + }, + { + "isLunch": true, + "date": "20240705", + "menu": [ + { + "name": "전주식비빔밥", + "allergies": [ + 1, + 5, + 6, + 10 + ] + }, + { + "name": "두부미소국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "회오리감자", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "돌핀젤리스무디", + "allergies": [ + 11 + ] + }, + { + "name": "열대과일샐러드", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240708", + "menu": [ + { + "name": "베이컨김치볶음밥", + "allergies": [ + 5, + 6, + 9, + 10 + ] + }, + { + "name": "옛날통닭(/2)", + "allergies": [ + 15 + ] + }, + { + "name": "이온음료", + "allergies": [ + 2, + 11 + ] + }, + { + "name": "치킨무", + "allergies": [] + }, + { + "name": "딸기샐러드", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "파인애플", + "allergies": [] + } + ] + }, + { + "isLunch": true, + "date": "20240709", + "menu": [ + { + "name": "현미밥", + "allergies": [] + }, + { + "name": "수제비국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "부추겉절이", + "allergies": [ + 13 + ] + }, + { + "name": "볼어묵볶음", + "allergies": [ + 1, + 5, + 6, + 13 + ] + }, + { + "name": "훈제오리구이", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "요플레", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240710", + "menu": [ + { + "name": "흰밥", + "allergies": [] + }, + { + "name": "비빔막국수", + "allergies": [ + 3, + 6 + ] + }, + { + "name": "보쌈", + "allergies": [ + 5, + 6, + 10 + ] + }, + { + "name": "미나리무생채", + "allergies": [ + 13 + ] + }, + { + "name": "탕평채", + "allergies": [ + 1, + 5, + 6 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "요구르트", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240711", + "menu": [ + { + "name": "차조밥", + "allergies": [] + }, + { + "name": "부대찌개/라면사리", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 10, + 13, + 15, + 16 + ] + }, + { + "name": "조랑떡새우조림", + "allergies": [ + 9, + 13 + ] + }, + { + "name": "오이부추무침", + "allergies": [] + }, + { + "name": "김자반", + "allergies": [ + 5 + ] + }, + { + "name": "콘치즈떡갈비", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 13, + 16 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240712", + "menu": [ + { + "name": "냉모밀국수", + "allergies": [ + 3, + 5, + 6, + 13 + ] + }, + { + "name": "제육덮밥", + "allergies": [ + 5, + 6, + 10, + 13 + ] + }, + { + "name": "오징어버터구이", + "allergies": [ + 2, + 5, + 13, + 17 + ] + }, + { + "name": "치즈스틱", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "사과쥬스", + "allergies": [ + 13 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240715", + "menu": [ + { + "name": "기장밥", + "allergies": [] + }, + { + "name": "콩나물국", + "allergies": [ + 5 + ] + }, + { + "name": "돈갈비매운찜", + "allergies": [ + 10 + ] + }, + { + "name": "피망감자채볶음", + "allergies": [ + 5, + 10 + ] + }, + { + "name": "연어스테이크", + "allergies": [ + 1, + 5, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240716", + "menu": [ + { + "name": "오므라이스/미니폭립", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 15, + 16 + ] + }, + { + "name": "도우넛", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "유부장국", + "allergies": [ + 5 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "초코우유", + "allergies": [ + 2 + ] + }, + { + "name": "귤맛살샐러드", + "allergies": [ + 1, + 2, + 5, + 6, + 8, + 13, + 18 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240717", + "menu": [ + { + "name": "열무보리비빔밥", + "allergies": [ + 1, + 5, + 6, + 9, + 16 + ] + }, + { + "name": "팽이된장국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "모듬묵무침", + "allergies": [] + }, + { + "name": "새우튀김/머스타드", + "allergies": [ + 1, + 2, + 5, + 6, + 9 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "카프리썬", + "allergies": [ + 11, + 12 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240718", + "menu": [ + { + "name": "흰밥/후리가케", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 13, + 16, + 18 + ] + }, + { + "name": "콩튀각멸치볶음", + "allergies": [ + 5, + 13 + ] + }, + { + "name": "피자돈까스", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "망고쥬스", + "allergies": [ + 13 + ] + }, + { + "name": "블루베리샐러드", + "allergies": [ + 1, + 2, + 5, + 6, + 11 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240722", + "menu": [ + { + "name": "스팸김치마요덮밥", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 10, + 13, + 15, + 16 + ] + }, + { + "name": "팽이된장국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "치커리유자샐러드", + "allergies": [ + 13 + ] + }, + { + "name": "닭꼬치", + "allergies": [ + 6, + 12, + 13 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "레몬에이드", + "allergies": [] + } + ] + }, + { + "isLunch": true, + "date": "20240723", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "치즈불닭", + "allergies": [ + 2, + 5, + 6, + 13, + 15 + ] + }, + { + "name": "콩나물국", + "allergies": [ + 5 + ] + }, + { + "name": "오이양파무침", + "allergies": [ + 13 + ] + }, + { + "name": "볼어묵볶음", + "allergies": [ + 1, + 5, + 6, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "수박폐기율을", + "allergies": [] + } + ] + }, + { + "isLunch": true, + "date": "20240724", + "menu": [ + { + "name": "상추불고기비빔밥", + "allergies": [ + 5, + 6, + 10 + ] + }, + { + "name": "유부국", + "allergies": [ + 5 + ] + }, + { + "name": "명엽채볶음", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "소떡소떡", + "allergies": [ + 1, + 5, + 6, + 10, + 12, + 13, + 15, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "리얼딸기우유", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240725", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "건새우맑은국", + "allergies": [ + 9 + ] + }, + { + "name": "두부조림", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "순살바베큐", + "allergies": [ + 10 + ] + }, + { + "name": "삼색감자채볶음", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 15, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240726", + "menu": [ + { + "name": "차슈볶음밥", + "allergies": [ + 1, + 5, + 6, + 10, + 13 + ] + }, + { + "name": "물냉면", + "allergies": [ + 1, + 3, + 5, + 6, + 13, + 16 + ] + }, + { + "name": "갈비만두", + "allergies": [ + 1, + 5, + 6, + 10, + 16, + 18 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "복숭아에이드", + "allergies": [ + 11 + ] + }, + { + "name": "냉동망고", + "allergies": [] + } + ] + }, + { + "isLunch": true, + "date": "20240729", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "어묵국", + "allergies": [ + 1, + 5, + 6 + ] + }, + { + "name": "김치찜닭", + "allergies": [ + 2, + 9, + 15 + ] + }, + { + "name": "연두부/양념장", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "콩나물무침", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "김구이", + "allergies": [] + }, + { + "name": "요구르트", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240730", + "menu": [ + { + "name": "영양닭죽", + "allergies": [ + 15 + ] + }, + { + "name": "오이지무침", + "allergies": [ + 13 + ] + }, + { + "name": "미트볼핫도그", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 15, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "이온음료", + "allergies": [] + }, + { + "name": "콘샐러드", + "allergies": [ + 1, + 2, + 5, + 6, + 8, + 13 + ] + } + ] + }, + { + "isLunch": true, + "date": "20240731", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "진미채무침", + "allergies": [ + 5, + 6, + 13, + 17 + ] + }, + { + "name": "돈까스/브라운소스", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "초코우유", + "allergies": [ + 2 + ] + }, + { + "name": "크루통스프", + "allergies": [ + 2, + 5, + 6, + 13, + 16 + ] + }, + { + "name": "양상추샐러드/딸기드레싱", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240708", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "어묵국", + "allergies": [ + 1, + 5, + 6 + ] + }, + { + "name": "연두부/양념장", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "큐브스테이크", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 13, + 15, + 16, + 18 + ] + }, + { + "name": "새우호박볶음", + "allergies": [ + 9, + 13 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "피크닉", + "allergies": [] + } + ] + }, + { + "isLunch": false, + "date": "20240709", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "닭곰탕", + "allergies": [ + 1, + 15 + ] + }, + { + "name": "불고기떡볶음", + "allergies": [ + 5, + 6, + 13, + 16 + ] + }, + { + "name": "원형스팸햄구이", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 15, + 16 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "오이부추무침", + "allergies": [] + }, + { + "name": "레몬에이드", + "allergies": [] + } + ] + }, + { + "isLunch": false, + "date": "20240710", + "menu": [ + { + "name": "흰밥/후리가케", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 13, + 16, + 18 + ] + }, + { + "name": "잔멸치땅콩조림", + "allergies": [ + 4, + 13 + ] + }, + { + "name": "경희정식", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 10, + 12, + 13, + 15, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "아이스튜브", + "allergies": [ + 2 + ] + }, + { + "name": "과일젤리샐러드", + "allergies": [ + 1, + 2, + 5, + 6 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240711", + "menu": [ + { + "name": "날치알김치비빔밥", + "allergies": [ + 5, + 6, + 9 + ] + }, + { + "name": "미니우동", + "allergies": [ + 1, + 2, + 5, + 6, + 9, + 13 + ] + }, + { + "name": "불고기퀘사디아", + "allergies": [ + 2, + 5, + 6, + 13, + 16 + ] + }, + { + "name": "오이지무침", + "allergies": [ + 13 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + }, + { + "name": "시리얼우유", + "allergies": [ + 2 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240712", + "menu": [ + { + "name": "차슈덮밥", + "allergies": [ + 1, + 5, + 6, + 10, + 13 + ] + }, + { + "name": "두부미소국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "오이치커리무침", + "allergies": [ + 13 + ] + }, + { + "name": "핫도그", + "allergies": [ + 1, + 2, + 5, + 6, + 10, + 12, + 16 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + }, + { + "name": "수박폐기율을", + "allergies": [] + } + ] + }, + { + "isLunch": false, + "date": "20240715", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "열무된장국", + "allergies": [ + 5, + 6 + ] + }, + { + "name": "양송이메추리알조림", + "allergies": [ + 1, + 5, + 6, + 13 + ] + }, + { + "name": "도토리묵무침", + "allergies": [ + 5, + 6, + 9, + 13 + ] + }, + { + "name": "삼겹살새송이구이", + "allergies": [ + 5, + 6, + 10 + ] + }, + { + "name": "배추김치", + "allergies": [ + 9 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240716", + "menu": [ + { + "name": "쌀밥", + "allergies": [] + }, + { + "name": "생크림꽈배기", + "allergies": [ + 1, + 2, + 5, + 6 + ] + }, + { + "name": "순대국", + "allergies": [ + 6, + 10, + 13, + 16, + 2, + 5 + ] + }, + { + "name": "아삭고추된장무침", + "allergies": [ + 5, + 6, + 13 + ] + }, + { + "name": "너비아니구이", + "allergies": [ + 5, + 6, + 10, + 15, + 16, + 18 + ] + }, + { + "name": "깍두기", + "allergies": [ + 9 + ] + } + ] + }, + { + "isLunch": false, + "date": "20240718", + "menu": [ + { + "name": "김가루밥", + "allergies": [ + 1, + 5, + 6, + 9, + 13, + 16, + 18 + ] + }, + { + "name": "짜장면", + "allergies": [ + 2, + 5, + 6, + 10, + 13 + ] + }, + { + "name": "후르츠탕수육", + "allergies": [ + 1, + 5, + 6, + 10, + 11, + 13 + ] + }, + { + "name": "단무지", + "allergies": [] + }, + { + "name": "바나나우유", + "allergies": [ + 2 + ] + } + ] + } +] \ No newline at end of file diff --git a/test/temp.py b/test/temp.py new file mode 100644 index 0000000..66f636b --- /dev/null +++ b/test/temp.py @@ -0,0 +1,63 @@ +import json +from collections import OrderedDict + +def ConvertJSON(mealObject: dict) -> dict: + """ + !ISSUE!; 인코딩 상태에 문제 있을 수 있음, 한번에 하나씩만 처리함 + Parameters : JSON menuWithAllergy + return : JSON menuWithAllergy + """ + convertedMealObject = dict() + + if mealObject["MMEAL_SC_NM"] == "중식": + convertedMealObject["isLunch"] = True + else : + convertedMealObject["isLunch"] = False + + convertedMealObject["date"] = mealObject["MLSV_YMD"] + + menus = mealObject["DDISH_NM"].split('
') + + menuJSONList = list() + + for menu in menus: + menu = menu.replace('*', '') + menuWithAllergy = dict() + menuWithAllergy["name"] = menu.split(' ', 1)[0].replace('1', '').replace('(완)', '') + + allergyList = list() + + if(menu.find('(')): + menu = menu.replace('(', '') + menu = menu.replace(')', '') + menu = menu.split(' ')[1] + allergyList = menu.split('.') + + i = 0 + + for _ in allergyList: + try: + allergyList[i] = int(allergyList[i]) + except: + allergyList = list() + i += 1 + + menuWithAllergy["allergies"] = allergyList + menuJSONList.append(menuWithAllergy) + + convertedMealObject["menu"] = menuJSONList + + return convertedMealObject + +def BatchConvertJSON(mealObject: list) -> list: + """ + JSON List를 입력으로 받으면 전부 변환하여 바꿔줌 + Parameter : JSON List + return JSON List + """ + mealJSONList = list() + + for JSON in mealObject: + mealJSONList.append(ConvertJSON(JSON)) + + return mealJSONList \ No newline at end of file diff --git a/test/testAuthCode.py b/test/testAuthCode.py new file mode 100644 index 0000000..ac8c420 --- /dev/null +++ b/test/testAuthCode.py @@ -0,0 +1,3 @@ +from utilities.security import GenerateAuthCode + +print(GenerateAuthCode()) \ No newline at end of file diff --git a/test/testMealConverter.py b/test/testMealConverter.py new file mode 100644 index 0000000..ace8684 --- /dev/null +++ b/test/testMealConverter.py @@ -0,0 +1,10 @@ +import json +from utilities import mealJSONConverter + +with open("C:\\goosebumps.json", "r", encoding="utf-8") as f: + data = json.load(f) + +JSON = mealJSONConverter.BatchConvertJSON(data) + +with open("meal.json", "w", encoding="utf-8") as f: + json.dump(JSON, f, ensure_ascii=False, indent="\t") diff --git a/test/testRunEmail.py b/test/testRunEmail.py new file mode 100644 index 0000000..0338c79 --- /dev/null +++ b/test/testRunEmail.py @@ -0,0 +1,5 @@ +from utilities.emailSender import SendEmail +import asyncio + + +asyncio.run(SendEmail("23-20606@kyungheeboy.hs.kr", "테스트", "테에스트으")) diff --git a/test/testUserGenerator.py b/test/testUserGenerator.py new file mode 100644 index 0000000..b88c7b6 --- /dev/null +++ b/test/testUserGenerator.py @@ -0,0 +1,3 @@ +from utilities import userGenerator, security + +print(userGenerator.CreateUser("asdf", "김래현", "raykim1012@gmail.com", "30706", "ThisIsPassword")) \ No newline at end of file From 2d68efc2890bf5e35f02676ba43624e5199a3b9e Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Sun, 14 Jul 2024 21:05:57 +0900 Subject: [PATCH 11/12] chore: deleted module barcodeGenerator.py (/w it's dependancy) --- .gitignore | 1 + requirements.txt | 2 -- test/testUserGenerator.py | 3 --- utilities/barcodeGenerator.py | 18 ------------------ 4 files changed, 1 insertion(+), 23 deletions(-) delete mode 100644 test/testUserGenerator.py delete mode 100644 utilities/barcodeGenerator.py diff --git a/.gitignore b/.gitignore index 5f63196..6e23e39 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ utilities\login.py settings.json launch.json testIgnore +legacy # C extensions *.so diff --git a/requirements.txt b/requirements.txt index 67749c6..1d2d69e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,4 @@ scrypt pytz pick pyjwt -python-barcode -pillow aiosmtplib \ No newline at end of file diff --git a/test/testUserGenerator.py b/test/testUserGenerator.py deleted file mode 100644 index b88c7b6..0000000 --- a/test/testUserGenerator.py +++ /dev/null @@ -1,3 +0,0 @@ -from utilities import userGenerator, security - -print(userGenerator.CreateUser("asdf", "김래현", "raykim1012@gmail.com", "30706", "ThisIsPassword")) \ No newline at end of file diff --git a/utilities/barcodeGenerator.py b/utilities/barcodeGenerator.py deleted file mode 100644 index 2ae9522..0000000 --- a/utilities/barcodeGenerator.py +++ /dev/null @@ -1,18 +0,0 @@ -from barcode import Code39 -import barcode - - -async def GenerateBarcode(stringInput: str) -> str: - """ - Parameters : stringInput - return : anImage - File-like SVG image Object - Demonstration : - 입력으로 문자열 stringInput을 받아 Code39 포맷으로 SVG 이미지 반환 - """ - - barcode.base.Barcode.default_writer_options["write_text"] = False - barcode.base.Barcode.default_writer_options["background"] = "transparent" - - anImage = Code39(stringInput, add_checksum=False) - anImage = anImage.render() - return anImage From d58842231b7c51563742c1641ff27e93c29ed5ea Mon Sep 17 00:00:00 2001 From: G1ltchy Date: Sun, 14 Jul 2024 21:13:17 +0900 Subject: [PATCH 12/12] docs: bringing README.md up to date --- README.md | 19 +++++++++++++++++-- test/testRunEmail.py | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index db5cf64..2be7071 100644 --- a/README.md +++ b/README.md @@ -16,14 +16,29 @@ │ ├── user │ │ ├── __init__.py │ │ ├── route.py +│ ├── board +│ │ ├── __init__.py +│ │ ├── route.py +│ ├── auth +│ │ ├── __init__.py +│ │ ├── route.py +├── test +│ ├── mealList +│ ├── temp.py +│ ├── testAuthCode.py +│ ├── testMealConverter.py +│ ├── testRunEmail.py ├── utilities +│ ├── __init__.py │ ├── config.py -│ ├── logger.py +│ ├── emailSender.py │ ├── http.py +│ ├── logger.py +│ ├── mealJSONConverter.py │ ├── security.py +│ ├── userGenerator.py │ ├── database │ │ ├── func.py -│ │ ├── schema.py ├── config.ini ├── config.example.ini ├── requirements.txt diff --git a/test/testRunEmail.py b/test/testRunEmail.py index 0338c79..00c776e 100644 --- a/test/testRunEmail.py +++ b/test/testRunEmail.py @@ -2,4 +2,4 @@ import asyncio -asyncio.run(SendEmail("23-20606@kyungheeboy.hs.kr", "테스트", "테에스트으")) +asyncio.run(SendEmail("[insert Email Here]", "테스트", "테에스트으"))