{"openapi":"3.1.0","info":{"title":"WFood 대사성질환 AI 식단 생성 API","description":"대사성질환(고혈압·당뇨병·이상지질혈증)별 개인 맞춤 식단을 요청한 일수만큼 생성·반환하는 REST API","version":"1.0"},"paths":{"/api/signup":{"post":{"summary":"Signup","operationId":"signup_api_signup_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/login":{"post":{"summary":"Login","operationId":"login_api_login_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google":{"post":{"summary":"Google Login","description":"웹(브라우저) GIS id_token 로그인. 앱 로그인 시 dc가 오면 폴링용으로 세션을 저장(외부 브라우저 경유).","operationId":"google_login_api_auth_google_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/callback":{"get":{"summary":"Google Callback","operationId":"google_callback_api_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/poll":{"get":{"summary":"Google Poll","operationId":"google_poll_api_auth_google_poll_get","parameters":[{"name":"dc","in":"query","required":false,"schema":{"type":"string","default":"","title":"Dc"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me":{"get":{"summary":"Me","operationId":"me_api_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logout":{"post":{"summary":"Logout","operationId":"logout_api_logout_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/profile":{"post":{"summary":"Profile","operationId":"profile_api_profile_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meals":{"get":{"summary":"List Meals","operationId":"list_meals_api_meals_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Add Meal","operationId":"add_meal_api_meals_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meals/{mid}":{"delete":{"summary":"Del Meal","operationId":"del_meal_api_meals__mid__delete","parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"integer","title":"Mid"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meal-plans":{"post":{"summary":"Save Plan","description":"생성된 추천 식단 저장. body = meal-plan 응답 전체(+선택 title)","operationId":"save_plan_api_meal_plans_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Plans","description":"추천 식단 목록(요약만). 상세는 /api/meal-plans/{id}","operationId":"list_plans_api_meal_plans_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meal-plans/{pid}":{"get":{"summary":"Get Plan","description":"추천 식단 상세(저장 당시 전체 식단·검증·근거)","operationId":"get_plan_api_meal_plans__pid__get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Del Plan","operationId":"del_plan_api_meal_plans__pid__delete","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/foods":{"get":{"summary":"Search Foods","operationId":"search_foods_api_foods_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":12,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/meal-plan":{"post":{"summary":"Meal Plan","description":"대사질환별 개인 맞춤 N일치 식단 생성.\n입력정보 연계 → KDRIs 목표산출 → 안전후보 필터 → 질환 적합도 스코어 →\n끼니 구성 → 포션 스케일링 → 적합도 검증 → 30일 식단표+영양분석+진료지침 근거.","operationId":"meal_plan_api_meal_plan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MealPlanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meal-plan/meta":{"get":{"summary":"Meal Plan Meta","description":"식단 API 메타데이터 — 지원 질환·알레르기·활동량·진료지침 출처.","operationId":"meal_plan_meta_api_meal_plan_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/analyze":{"post":{"summary":"Analyze","operationId":"analyze_api_analyze_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyze_api_analyze_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_analyze_api_analyze_post":{"properties":{"image":{"type":"string","contentMediaType":"application/octet-stream","title":"Image"}},"type":"object","required":["image"],"title":"Body_analyze_api_analyze_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MealPlanRequest":{"properties":{"sex":{"type":"string","title":"Sex","description":"성별 M/F","default":"M"},"age":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Age","description":"연령(세)","default":55},"height":{"type":"number","exclusiveMinimum":0.0,"title":"Height","description":"키(cm)","default":168},"weight":{"type":"number","exclusiveMinimum":0.0,"title":"Weight","description":"몸무게(kg)","default":70},"act":{"type":"string","title":"Act","description":"활동량 low/mid/high","default":"low"},"dz":{"items":{"type":"string"},"type":"array","title":"Dz","description":"대사질환(고혈압/당뇨병/이상지질혈증) 복수 선택"},"alg":{"items":{"type":"string"},"type":"array","title":"Alg","description":"알레르기(우유/계란/대두/밀/갑각류 등)"},"dislike":{"type":"string","title":"Dislike","description":"기피식품(쉼표구분)","default":""},"sbp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sbp","description":"수축기혈압(mmHg) — 검진 정밀화"},"ldl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ldl","description":"LDL 콜레스테롤(mg/dL) — 검진 정밀화"},"days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Days","description":"생성 일수(요청한 일수만큼 생성·반환, 1~365, 기본 30)","default":30},"seed":{"type":"integer","minimum":1.0,"title":"Seed","description":"재생성 카운터(재현성)","default":1}},"type":"object","title":"MealPlanRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}