diff --git a/.gitignore b/.gitignore
index 9995358..6e23e39 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,9 @@ test.py
temp.txt
utilities\login.py
settings.json
+launch.json
testIgnore
+legacy
# C extensions
*.so
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/requirements.txt b/requirements.txt
index 79bfe34..1d2d69e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,5 +8,4 @@ scrypt
pytz
pick
pyjwt
-python-barcode
-pillow
\ No newline at end of file
+aiosmtplib
\ No newline at end of file
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..5b7129b
--- /dev/null
+++ b/routes/auth/route.py
@@ -0,0 +1,61 @@
+from fastapi import APIRouter, Request
+from fastapi.responses import JSONResponse
+
+from utilities.config import GetConfig
+from utilities.database.func import GetDatabase
+from utilities.emailSender import SendEmail
+
+
+router = APIRouter()
+
+config = GetConfig()
+
+database = GetDatabase(config["DATABASE"]["URI"])
+
+
+@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"}
+ )
+
+ await SendEmail(
+ receiver=findUser["email"],
+ subject="늘봄 이메일 인증 코드",
+ content="귀하의 이메일 인증 코드는 다음과 같습니다. : "
+ + findUser["authCode"]
+ + "\n대문자로 입력해주세요.",
+ )
+
+ return JSONResponse(
+ 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})
+ 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)
+
+ await database["pending"].delete_one({"userId": userId})
+
+ return JSONResponse(
+ status_code=200, content={"message": "User Successfully Authorized"}
+ )
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..00c776e
--- /dev/null
+++ b/test/testRunEmail.py
@@ -0,0 +1,5 @@
+from utilities.emailSender import SendEmail
+import asyncio
+
+
+asyncio.run(SendEmail("[insert Email Here]", "테스트", "테에스트으"))
diff --git a/utilities/barcodeGenerator.py b/utilities/barcodeGenerator.py
deleted file mode 100644
index 1f33917..0000000
--- a/utilities/barcodeGenerator.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from barcode import Code39
-from barcode.writer import SVGWriter
-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
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
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를 입력으로 받으면 전부 변환하여 바꿔줌
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
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,
+ }