Skip to content

Commit 86bc98a

Browse files
author
bu2000
committed
메뉴 추천까지 프런트 백앤드 연결완료 하지만 음성은 아직 테스트 못함 데스크 탑에 마이크가 없음으로 인해....
1 parent 770d5b7 commit 86bc98a

14 files changed

Lines changed: 1425 additions & 664 deletions

File tree

.screen-graph.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -193,15 +193,15 @@
193193
}
194194
},
195195
{
196-
"id": "src\\screens\\Desktop\\sections\\IngredientInventory\\IngredientInventory.jsx:58:8-to-src\\screens\\AddIngredientPage\\AddIngredientPage.jsx",
196+
"id": "src\\screens\\Desktop\\sections\\IngredientInventory\\IngredientInventory.jsx:134:8-to-src\\screens\\AddIngredientPage\\AddIngredientPage.jsx",
197197
"source": "src\\screens\\Desktop\\Desktop.jsx",
198198
"target": "src\\screens\\AddIngredientPage\\AddIngredientPage.jsx",
199199
"data": {
200200
"viaRoute": "/addingredient",
201201
"trigger": {
202-
"element": "<Link \r\n to=\"/addingredient\" \r\n className=\"add-new-ingredient\"\r\n >\r\n <div className=\"add-new-container\">\r\n <div className=\"add-new-header\">\r\n <div className=\"add-new-header-text\">추가하기</div>\r\n </div>\r\n\r\n <div className=\"add-new-section\">\r\n <img\r\n className=\"add-new-icon\"\r\n alt=\"Add new icon\"\r\n src=\"https://c.animaapp.com/sjWITF5i/img/addnewicon.svg\"\r\n />\r\n </div>\r\n </div>\r\n </Link>",
203-
"line": 58,
204-
"endLine": 75,
202+
"element": "<Link to=\"/addingredient\" className=\"add-new-ingredient\">\r\n <div className=\"add-new-container\">\r\n <div className=\"add-new-header\">\r\n <div className=\"add-new-header-text\">추가하기</div>\r\n </div>\r\n\r\n <div className=\"add-new-section\">\r\n <img\r\n className=\"add-new-icon\"\r\n alt=\"Add new icon\"\r\n src=\"https://c.animaapp.com/sjWITF5i/img/addnewicon.svg\"\r\n />\r\n </div>\r\n </div>\r\n </Link>",
203+
"line": 134,
204+
"endLine": 148,
205205
"column": 8,
206206
"endColumn": 15,
207207
"sourceFile": "src\\screens\\Desktop\\sections\\IngredientInventory\\IngredientInventory.jsx"
@@ -801,31 +801,31 @@
801801
}
802802
},
803803
{
804-
"id": "src\\screens\\AddIngredientPage\\AddIngredientPage.jsx:111:8-to-src\\screens\\Desktop\\Desktop.jsx",
804+
"id": "src\\screens\\AddIngredientPage\\AddIngredientPage.jsx:172:8-to-src\\screens\\Desktop\\Desktop.jsx",
805805
"source": "src\\screens\\AddIngredientPage\\AddIngredientPage.jsx",
806806
"target": "src\\screens\\Desktop\\Desktop.jsx",
807807
"data": {
808808
"viaRoute": "/desktop",
809809
"trigger": {
810810
"element": "navigate(\"/desktop\")",
811-
"line": 111,
812-
"endLine": 111,
811+
"line": 172,
812+
"endLine": 172,
813813
"column": 8,
814814
"endColumn": 28,
815815
"sourceFile": "src\\screens\\AddIngredientPage\\AddIngredientPage.jsx"
816816
}
817817
}
818818
},
819819
{
820-
"id": "src\\screens\\AddIngredientPage\\AddIngredientPage.jsx:212:12-to-src\\screens\\Desktop\\Desktop.jsx",
820+
"id": "src\\screens\\AddIngredientPage\\AddIngredientPage.jsx:273:12-to-src\\screens\\Desktop\\Desktop.jsx",
821821
"source": "src\\screens\\AddIngredientPage\\AddIngredientPage.jsx",
822822
"target": "src\\screens\\Desktop\\Desktop.jsx",
823823
"data": {
824824
"viaRoute": "/desktop",
825825
"trigger": {
826826
"element": "<Link to=\"/desktop\" className=\"add-ingredient-cancel-btn\">\r\n 취소\r\n </Link>",
827-
"line": 212,
828-
"endLine": 214,
827+
"line": 273,
828+
"endLine": 275,
829829
"column": 12,
830830
"endColumn": 19,
831831
"sourceFile": "src\\screens\\AddIngredientPage\\AddIngredientPage.jsx"

src/api/Recipe/geminiRecipeApi.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import axios from "axios";
2+
const BACKEND_DOMAIN = "http://localhost:8080/recipes/recommend";
3+
4+
export const recommendPrefer = async (prefer) => {
5+
const token = localStorage.getItem("accessToken");
6+
try {
7+
const response = await axios.post(`${BACKEND_DOMAIN}/prefer`, prefer, {
8+
headers: {
9+
Authorization: `Bearer ${token}`,
10+
},
11+
});
12+
return response.data;
13+
} catch (error) {
14+
if (error.response) {
15+
console.log(error.response.status);
16+
console.log(error.response.data);
17+
}
18+
throw error;
19+
}
20+
};
21+
22+
export const recommendCondition = async (condition) => {
23+
const token = localStorage.getItem("accessToken");
24+
try {
25+
const response = await axios.post(
26+
`${BACKEND_DOMAIN}/condition`,
27+
condition,
28+
{
29+
headers: {
30+
Authorization: `Bearer ${token}`,
31+
},
32+
}
33+
);
34+
return response.data;
35+
} catch (error) {
36+
if (error.response) {
37+
console.log(error.response.status);
38+
console.log(error.response.data);
39+
}
40+
throw error;
41+
}
42+
};
43+
44+
export const recommendExpir = async (expire) => {
45+
const token = localStorage.getItem("accessToken");
46+
try {
47+
const response = await axios.post(`${BACKEND_DOMAIN}/expir`, expire, {
48+
headers: {
49+
Authorization: `Bearer ${token}`,
50+
},
51+
});
52+
return response.data;
53+
} catch (error) {
54+
if (error.response) {
55+
console.log(error.response.status);
56+
console.log(error.response.data);
57+
}
58+
throw error;
59+
}
60+
};

src/api/Recipe/recipeApi.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import axios from "axios";
2+
const BACKEND_DOMAIN = "http://localhost:8080/api/recipes";
3+
4+
export const getRandomRecipe = async (ingredientName) => {
5+
const token = localStorage.getItem("accessToken");
6+
try {
7+
const response = await axios.get(`${BACKEND_DOMAIN}/search`, {
8+
headers: {
9+
Authorization: `Bearer ${token}`,
10+
},
11+
params: {
12+
ingredient: ingredientName,
13+
},
14+
});
15+
return response.data;
16+
} catch (error) {
17+
if (error.response) {
18+
console.log(error.response.status);
19+
console.log(error.response.data);
20+
}
21+
throw error;
22+
}
23+
};
24+
25+
export const getRandomRecipeMultiple = async (ingredients) => {
26+
const token = localStorage.getItem("accessToken");
27+
console.log("헤더 값 확인:", `Bearer ${token}`);
28+
try {
29+
const response = await axios.get(`${BACKEND_DOMAIN}/search-multi`, {
30+
headers: {
31+
Authorization: `Bearer ${token}`,
32+
},
33+
params: {
34+
ingredients: ingredients.join(","),
35+
},
36+
});
37+
return response.data;
38+
} catch (error) {
39+
if (error.response) {
40+
console.log("에러 상태 코드:", error.response.status);
41+
console.log("에러 데이터:", error.response.data);
42+
}
43+
throw error;
44+
}
45+
};

src/api/Stt/sttApi.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import axios from "axios";
2+
const BACKEND_DOMAIN = "http://localhost:8080/api";
3+
4+
/**
5+
* * @param {Blob} audioBlob - Voice.js에서 녹음된 오디오 Blob 객체
6+
* @returns {Promise<Array>} - 추천된 레시피 리스트 (List<GeminiRecipeResponse>)
7+
*/
8+
export const recommendByVoice = async (audioBlob) => {
9+
const token = localStorage.getItem("accessToken");
10+
const userId = localStorage.getItem("userId");
11+
12+
if (!userId) {
13+
console.error("User ID not found. Please login.");
14+
throw new Error("로그인이 필요한 서비스입니다.");
15+
}
16+
17+
const formData = new FormData();
18+
19+
formData.append("audio", audioBlob, "voice.webm");
20+
21+
formData.append("userId", userId);
22+
23+
try {
24+
const response = await axios.post(`${BACKEND_DOMAIN}/stt`, formData, {
25+
headers: {
26+
Authorization: `Bearer ${token}`,
27+
"Content-Type": "multipart/form-data",
28+
},
29+
});
30+
31+
console.log("음성 검색 성공, 레시피 개수:", response.data.length);
32+
return response.data;
33+
} catch (error) {
34+
if (error.response) {
35+
console.error(
36+
"음성 검색 요청 실패:",
37+
error.response.status,
38+
error.response.data
39+
);
40+
} else {
41+
console.error("서버 연결 실패:", error.message);
42+
}
43+
throw error;
44+
}
45+
};

src/api/fridgeApi.js

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import axios from "axios";
2+
const BACKEND_DOMAIN = "http://localhost:8080/fridge";
3+
export const registerIngredientManual = async (ingredients) => {
4+
const token = localStorage.getItem("accessToken");
5+
try {
6+
const response = await axios.post(
7+
`${BACKEND_DOMAIN}/ingredient/register/manual`,
8+
{ ingredients },
9+
{
10+
headers: {
11+
Authorization: `Bearer ${token}`,
12+
},
13+
}
14+
);
15+
return response.data;
16+
} catch (error) {
17+
if (error.response) {
18+
console.log(error.response.status);
19+
console.log(error.response.data);
20+
}
21+
throw error;
22+
}
23+
};
24+
25+
export const updateIngredientInfo = async (ingredient) => {
26+
const token = localStorage.getItem("accessToken");
27+
try {
28+
const response = await axios.patch(
29+
`${BACKEND_DOMAIN}/ingredient/update`,
30+
ingredient,
31+
{
32+
headers: {
33+
Authorization: `Bearer ${token}`,
34+
},
35+
}
36+
);
37+
return response.data;
38+
} catch (error) {
39+
if (error.response) {
40+
console.log(error.response.status);
41+
console.log(error.response.data);
42+
}
43+
throw error;
44+
}
45+
};
46+
47+
export const deleteIngredientInfo = async (id) => {
48+
const token = localStorage.getItem("accessToken");
49+
try {
50+
await axios.delete(`${BACKEND_DOMAIN}/ingredient/${id}`, {
51+
headers: {
52+
Authorization: `Bearer ${token}`,
53+
},
54+
});
55+
return true;
56+
} catch (error) {
57+
if (error.response) {
58+
console.log(error.response.status);
59+
console.log(error.response.data);
60+
}
61+
throw error;
62+
}
63+
};
64+
65+
export const updateIngredients = async (ingredients) => {
66+
const token = localStorage.getItem("accessToken");
67+
try {
68+
const response = await axios.patch(
69+
`${BACKEND_DOMAIN}/ingredients/register/update`,
70+
ingredients,
71+
{
72+
headers: {
73+
Authorization: `Bearer ${token}`,
74+
},
75+
}
76+
);
77+
return response.data;
78+
} catch (error) {
79+
if (error.response) {
80+
console.log(error.response.status);
81+
console.log(error.response.data);
82+
}
83+
throw error;
84+
}
85+
};
86+
87+
export const getFridgeIngredients = async () => {
88+
const token = localStorage.getItem("accessToken");
89+
try {
90+
const response = await axios.get(`${BACKEND_DOMAIN}/ingredients`, {
91+
headers: {
92+
Authorization: `Bearer ${token}`,
93+
},
94+
});
95+
return response.data;
96+
} catch (error) {
97+
if (error.response) {
98+
console.log(error.response.status);
99+
console.log(error.response.data);
100+
}
101+
throw error;
102+
}
103+
};
104+
105+
export const filterFridgeIngredientsByCategory = async (category) => {
106+
const token = localStorage.getItem("accessToken");
107+
try {
108+
const response = await axios.get(`${BACKEND_DOMAIN}/ingredients`, {
109+
headers: {
110+
Authorization: `Bearer ${token}`,
111+
},
112+
params: {
113+
category: category,
114+
},
115+
});
116+
return response.data;
117+
} catch (error) {
118+
if (error.response) {
119+
console.log(error.response.status);
120+
console.log(error.response.data);
121+
}
122+
throw error;
123+
}
124+
};

0 commit comments

Comments
 (0)