Skip to content

Commit 85fa4b2

Browse files
authored
Merge pull request #8 from 4GeeksAcademy/ft002-home
renderizado terminado
2 parents e013acd + 8322500 commit 85fa4b2

File tree

8 files changed

+189
-64
lines changed

8 files changed

+189
-64
lines changed

Diff for: migrations/versions/2e3a70a695d4_.py

-35
This file was deleted.

Diff for: migrations/versions/a08fba8a0180_.py renamed to migrations/versions/a9b7f08f1a62_.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
"""empty message
22
3-
Revision ID: a08fba8a0180
3+
Revision ID: a9b7f08f1a62
44
Revises:
5-
Create Date: 2025-03-05 14:44:28.016416
5+
Create Date: 2025-03-06 10:20:42.876362
66
77
"""
88
from alembic import op
99
import sqlalchemy as sa
1010

1111

1212
# revision identifiers, used by Alembic.
13-
revision = 'a08fba8a0180'
13+
revision = 'a9b7f08f1a62'
1414
down_revision = None
1515
branch_labels = None
1616
depends_on = None

Diff for: src/api/commands.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def insert_data_catfood():
4141
catfood.ingredients = "ads"
4242
catfood.weight = 1.
4343
catfood.price = 1.
44-
catfood.animal_type = "asd"
44+
catfood.animal_type = "gato"
4545
catfood.age = "sd"
4646
catfood.pathologies = "asd"
4747
db.session.add(catfood)
@@ -91,7 +91,7 @@ def insert_data_exoticfood():
9191
exoticfood.ingredients = "ads"
9292
exoticfood.price = 1.
9393
exoticfood.pathologies = "asd"
94-
exoticfood.animal_type = "asd"
94+
exoticfood.animal_type = "exótico"
9595
exoticfood.age = "asd"
9696
exoticfood.weight = 1.
9797
db.session.add(exoticfood)

Diff for: src/api/routes.py

+25
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,31 @@ def get_pet_suggestions(pet_id):
101101
return "no suggestions found", 404
102102
return [food[0].serialize() for food in food_suggestions], 200
103103

104+
# #obtener todos los alimentos según tipo de animal
105+
@api.route('/foods/cat', methods=['GET'])
106+
def get_all_cat_food():
107+
food_cat = db.session.query(Food).filter(Food.animal_type.ilike("%gato%")).all()
108+
print("Datos obtenidos:", food_cat)
109+
if not food_cat:
110+
return jsonify({"error": "No cat food found"}), 404
111+
return jsonify([food.serialize() for food in food_cat]), 200
112+
113+
@api.route('/foods/dog', methods=['GET'])
114+
def get_all_dog_food():
115+
food_dog = db.session.query(Food).filter(Food.animal_type.ilike("%perro%")).all()
116+
print("Datos obtenidos:", food_dog)
117+
if not food_dog:
118+
return jsonify({"error": "No dog food found"}), 404
119+
return jsonify([food.serialize() for food in food_dog]), 200
120+
121+
@api.route('/foods/exotic', methods=['GET'])
122+
def get_all_exotic_food():
123+
food_exotic = db.session.query(Food).filter(Food.animal_type.ilike("%exótico%")).all()
124+
print("Datos obtenidos:", food_exotic)
125+
if not food_exotic:
126+
return jsonify({"error": "No exotic food found"}), 404
127+
return jsonify([food.serialize() for food in food_exotic]), 200
128+
104129
# Obtener todos los accesorios
105130
@api.route('/accessories', methods=['GET'])
106131
def get_accessories():

Diff for: src/front/js/component/card.js

+11-6
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
import React, { Component } from "react";
2+
import { useContext } from "react";
3+
import { Context } from "../store/appContext";
24

3-
export const Card = () => {
4-
return (
5+
export const Card = ({name, id, description}) => {
6+
7+
const { store, actions } = useContext(Context);
8+
9+
return (
510
<div className="card m-2" style={{ width: "18rem" }}>
6-
<img
11+
{/* <img
712
src="https://static.zoomalia.com/prod_img/46527/la_53533e8075e9970de0cfea955afd4644bb21537446021.jpg"
813
style={{ width: "150px", height: "200px" }}
914
className="card-img-top mx-auto d-block mt-2"
1015
alt="..."
11-
/>
16+
/> */}
1217
<div className="card-body text-center">
13-
<h5 className="card-title">Título</h5>
14-
<p className="card-text">Some quick example text to build on the card.</p>
18+
<h5 className="card-title">{name}</h5>
19+
<p className="card-text">{description}</p>
1520
</div>
1621
<div className="mt-auto text-center">
1722
<button className="btn btn-primary m-2">Añadir carrito</button>

Diff for: src/front/js/layout.js

+4
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import ScrollToTop from "./component/scrollToTop";
44
import { BackendURL } from "./component/backendURL";
55

66
import { Home } from "./pages/home";
7+
78
import { Demo } from "./pages/demo";
89
import { Single } from "./pages/single";
910
import injectContext from "./store/appContext";
1011

1112
import { Navbar } from "./component/navbar";
1213
import { Footer } from "./component/footer";
1314

15+
1416
//create your first component
1517
const Layout = () => {
1618
//the basename is used when your project is published in a subdirectory and not in the root of the domain
@@ -26,6 +28,8 @@ const Layout = () => {
2628
<Navbar />
2729
<Routes>
2830
<Route element={<Home />} path="/" />
31+
32+
2933
<Route element={<Demo />} path="/demo" />
3034
<Route element={<Single />} path="/single/:theid" />
3135
<Route element={<h1>Not found!</h1>} />

Diff for: src/front/js/pages/home.js

+54-16
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
1-
import React, { useContext } from "react";
1+
import React, { useContext, useEffect } from "react";
22
import { Context } from "../store/appContext";
33
import { Card } from "../component/card";
44
import "../../styles/home.css";
55

66
export const Home = () => {
7+
78
const { store, actions } = useContext(Context);
89

10+
11+
useEffect(()=>{
12+
actions.getDogFood()
13+
},[])
14+
15+
useEffect(()=>{
16+
actions.getCatFood()
17+
},[])
18+
19+
useEffect(()=>{
20+
actions.getExoticFood()
21+
},[])
22+
923
return (
1024

1125
<div className="container m-0">
@@ -16,35 +30,59 @@ export const Home = () => {
1630
alt="Banner"
1731
/>
1832
</div>
33+
1934
<div className="sección perros m-5">
35+
{/* <div className="cards d-flex overflow-auto m-4"> */}
2036
<h3>Productos top para perros</h3>
2137
<div className="row">
22-
<Card className="col-md-3" />
23-
<Card className="col-md-3" />
24-
<Card className="col-md-3" />
25-
<Card className="col-md-3" />
26-
</div>
38+
39+
{store.dogFood.map((dogFood, index) => {
40+
return(
41+
<Card
42+
name={dogFood.name}
43+
category={"dogFood"}
44+
id={dogFood.id}
45+
description={dogFood.description}
46+
key={index}/>
47+
);
48+
})}</div>
2749
</div>
2850

51+
2952
<div className="sección gatos m-5">
3053
<h3>Productos top para gatos</h3>
3154
<div className="row">
32-
<Card className="col-md-3" />
33-
<Card className="col-md-3" />
34-
<Card className="col-md-3" />
35-
<Card className="col-md-3" />
36-
</div>
55+
56+
{store.catFood.map((catFood, index) => {
57+
return(
58+
<Card
59+
name={catFood.name}
60+
category={"catFood"}
61+
id={catFood.id}
62+
description={catFood.description}
63+
key={index}/>
64+
);
65+
})}</div>
3766
</div>
3867

68+
3969
<div className="sección exóticos m-5">
4070
<h3>Productos top para animales exóticos</h3>
4171
<div className="row">
42-
<Card className="col-md-3" />
43-
<Card className="col-md-3" />
44-
<Card className="col-md-3" />
45-
<Card className="col-md-3" />
46-
</div>
72+
73+
{store.exoticFood.map((exoticFood, index) => {
74+
return(
75+
<Card
76+
name={exoticFood.name}
77+
category={"exóticFood"}
78+
id={exoticFood.id}
79+
description={exoticFood.description}
80+
key={index}/>
81+
);
82+
})}</div>
4783
</div>
84+
85+
4886
</div>
4987
);
5088
};

Diff for: src/front/js/store/flux.js

+90-2
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,114 @@ const getState = ({ getStore, getActions, setStore }) => {
1313
background: "white",
1414
initial: "white"
1515
}
16-
]
16+
],
17+
dogFood: [],
18+
catFood: [] ,
19+
exoticFood: []
1720
},
1821
actions: {
1922
// Use getActions to call a function within a fuction
2023
exampleFunction: () => {
2124
getActions().changeColor(0, "green");
2225
},
2326

27+
getDogFood: async () => {
28+
const myHeaders = new Headers();
29+
myHeaders.append("Cookie", ".Tunnels.Relay.WebForwarding.Cookies=CfDJ8Cs4yarcs6pKkdu0hlKHsZs0q_CxPIxRcsYOazLvQz4rP7s5FWFmvGJndFqy0N7fvoY5B6Jou5i4ZPgwsQZsEYGDV4DoaNhJP3xwIvv1aGmoRIVdScF1G2c_hWBWqeCTHFNCvGD1Dy0sm3kBmaNdXiMsSO0myHKUFvlWHCed2AdtyCiC6CHBqk9DHs32cYjJV4GQr4cxW2IXl6QDukWwCPSYuzTnP699Rz_4pCbB8OPOQNBDyDtdks_LUoMZR2Qt6IWKmUnLGt-n3JLFjeQMZiSeKEXKNTcJknrz4p25p9-5rh3BY2FBX_kg6MtH3cLbqOyS6yqrG4cjJPpyZbVfN3iEYSR6lzEGiGZDFPvokcj_PM8fq32HR1_olrhti8nYtDctNR_8YRewW5quhBNW6mtF_-SqGTbCQVH1CiLUF2UKK_H_nGmwvWAce2n4Cdw1BLUCZhlCr3GAKWJWHqLI1K5n9OekmI4zs0TI_60R6urTRxIQx2IgkRPYizg-AUdyr6bORhYr7s3c6oFBrdA4yBShqyJFOo4fuMkQuHflmg717cZeB1MDnWgSm9Xnl4qmOlcta0fCSq15GNUPvXhAwvclIoK9NTrmSSd1wvRhoqz7ypodxTSOafQx0ybhJZwTxDeS_gv-4KjbyFngwj7Bj1TluB2qE5Hijbi4uhZb2KILE9AGYHKWSW-IWoSmEXW71c7HhH8mBEbBxidpsSi_Rip3CdXL2oUO-8TGtLx2HgJtExj_7AyTD1trSanlKgDurPSEfDuXuwtqxawfWf0a1sbp9BGk0pRLOA-tVKrxmMiFAPiNCVC1W2EXb95TKydzKIwtbcC70YyDJ4dFwnHrQmgPYxzIz7PYzICzKqZ-VDpO4lf7C3jf4OBJ9ZMV4JRvPiR2kUwMNX_c5CuMLaKrZNzqCFwZBUa4N4AUyTT83mtzFQGAZjMXDeZNok7mjTYBp121qquiSKX8ft05b1MTsVtRfg3ETiFdOHmYQ2-1EcSwBY-VhjWIlkQiFr1yBWXk-g");
30+
31+
const requestOptions = {
32+
method: "GET",
33+
headers: myHeaders,
34+
redirect: "follow"
35+
};
36+
37+
try {
38+
const response = await fetch("https://silver-meme-jj4x947jg76ghqjg9-3001.app.github.dev/api/foods/dog", requestOptions);
39+
40+
if (!response.ok) {
41+
throw new Error('Network response was not ok');
42+
}
43+
44+
const data = await response.json();
45+
setStore({ dogFood: data }); // Asegúrate de que data.result sea la estructura correcta
46+
console.log(data);
47+
} catch (error) {
48+
console.error('Error fetching dog food:', error);
49+
}
50+
}
51+
52+
53+
54+
55+
,
56+
getCatFood: async ()=>{
57+
58+
const myHeaders = new Headers();
59+
myHeaders.append("Cookie", ".Tunnels.Relay.WebForwarding.Cookies=CfDJ8Cs4yarcs6pKkdu0hlKHsZsFuWJUB8pT978IgBH2YtuNtjrSfloWcBx8Cb4ny9waQSc6YIxDXdFsnq7Re1iGbqt37RMJ8vfb6ibKLFqvloDFsbiBuxDcqwi_MvYRhr2Z463usLkj3RbhHXQfm0TDnuAtNaE3deMSqRX9yv4T0Ui6indSlqpCNa-EX0tvUPEUYniNtvBPGilr_PC-U4inRAN5RaUZvcfD9vs4fenjYjUAaDpz49MnUZT8uGDozBeAZynLSYkXtpY9Rb2GuG-eOvk-8noe3tIekVKBOTjnaeis5QUJJpYcv73D6GOrYSIpavdb29mY6QWEsir-s4vxW2wE0dCb8n5g4MldUigDSxrKnndHoBleQih8VqWGo5AZKTYLT3Y735A7ZsmFGvFjRGrrGCPQ6YU28RddH4ieKxoVlTt2PG2uD17_QI5FmUNuvz3Z8YDAK878jEXK-_jXm5SIi4oLvfCr9sezmoc8NgcvJBAH0lVlJCf3kz9Z7_y_5wwU9a4Nk6-rH2p__Jb49iHxfOuRu0EzOLdNHiPfznR8iEp41VsK7ie7ECmM5Q6SANKFM9AtYkbXqCmn5tAdmrCFaGKNAu8w7gZ_r97mDMzcHVOwUktErNC1y2j6yUPv6SAU9hVk4_xFev-2wI7h5PEaPCY3khPgI6Z1UPNC_SkodFGHbEdRUSMc8ICYoAv4llTD8xtfOqzMDms4HG1xcbJrE1NTWh4rpfv7KiEIi6iqE6uizX7_CmWJkcA9SGig9hk9A9abtYb2Pg8Z8GG2cEan7FFpl7kbvTobFfSGn_N9ukSCqYuuoldgSno8yyH5P3E7oqqVnO1eT3kpRGZ9EdtmL5zXv8Fs-x3GDrQ2z1_V6sqMxy6LlXHXJ7m6MYUy4sET4nISyUJ1H2eBbC-Ttk7_7om7ByATu_oEZjPFefBf7sXaCZ2ng9ZBYYOOZHtbUEs2rrFAiL6dmrgjKVaXUyz3KiiP73Dy5OR7g9ccYBD5t74jdyVYPLmgoasQocdBEA");
60+
61+
const requestOptions = {
62+
method: "GET",
63+
headers: myHeaders,
64+
redirect: "follow"
65+
};
66+
67+
try {
68+
const response = await fetch("https://silver-meme-jj4x947jg76ghqjg9-3001.app.github.dev/api/foods/cat", requestOptions);
69+
if (!response.ok) {
70+
throw new Error('Network response was not ok');
71+
}
72+
73+
const data = await response.json();
74+
setStore({ catFood: data });
75+
console.log(data);
76+
} catch (error) {
77+
console.error('Error fetching cat food:', error);
78+
}
79+
}
80+
,
81+
82+
getExoticFood: async ()=>{
83+
const myHeaders = new Headers();
84+
myHeaders.append("Cookie", ".Tunnels.Relay.WebForwarding.Cookies=CfDJ8Cs4yarcs6pKkdu0hlKHsZuqp5-e7T1vVCCdEQ0C1wStd1vPjajnZKjnPSA5Hq6rqD8KnBNHzrxCrSBqwnlunA0rkm36DsRzpvbpKLHVNklCfX8GBsMZKstrANOENBUzsSi1PBxW5_TibtPeRePzgNe5pBHuYx5F-1zm7-FoplLOZKZUFeRu1ua1DgiPeOiqvYSnKMQISiWoLb64DlQlSfXIGkFzVDFsFNPJ5lN-NHmI9dQ4O8b8EtoLAvXug1GQ5WkthHTcarTf_lXY5fcoEJbvhObGkUw7LC07jfKn2BTk27bZGx_F2kXNKq2N32CJ_46MMiulhV3sVpuuBUenZ-P7eLMcyMYuz6LcVrybPlrmHBiCnIbgcmgn-jnL-P3rcWL49L8RpPU84Ul4CaOZTFZ7eFCUqa1m1YKjX21YEdJlEm8fyYpFYcFp_9mGziKaxChcel7DevH4J4NV-E1mEUnQP-wDBMVq1IH0wdb4_HSnZ8aBhyyb8GvuEuLIhlH4soY8xtKNlaM73kynXCEhJ2OH-eKM6XIkWQHVIENwRoWzjj8G-8jQcJjz1Clyo9lMuFB98AWfsJgqe_PO7PgIw_Ms8_hRKyGG_aej9UuBo8rS-u4vTGaj5v_1vp6_PrZ-qEp8iyGGK_0OERl5OH0S3_mcXOd1wQcpFQ76RR6qtXqju2G8WkN9e3xC9XvP3SWVDIc5195fVj_1gRGLUCC20Uu5uPC0yzuE2X_TrcjKq0-SeWiyVIphc1T7AoJ2PvAu74js-66UPPcjXqoQvGXCzwrwhPdzXAp8n6sVwGcfRthrk2AOD4U8XJz68aBA5aRx77sqsMKKFIbCRXjRfOcAoa214qR5Oz7-nnKj1dII9Rx_g9ZD7SS_Mjm5Sk3M_Mr0zZNDzN7YWd_j3WhN9Gvr1MOeU6aFKssi2wzLgyNAVHNaXxjKms7cV1bDDwVzfYcHa6L-oLvvPk1FRmoRsD4J_3I7TgE1iO2LOtWD4ZLYilAcmmiHh3OPqNpQrKkl5uK2zg");
85+
86+
const requestOptions = {
87+
method: "GET",
88+
headers: myHeaders,
89+
redirect: "follow"
90+
};
91+
92+
try {
93+
const response = await fetch("https://silver-meme-jj4x947jg76ghqjg9-3001.app.github.dev/api/foods/exotic", requestOptions);
94+
if (!response.ok) {
95+
throw new Error('Network response was not ok');
96+
}
97+
98+
const data = await response.json();
99+
setStore({ exoticFood: data });
100+
console.log(data);
101+
} catch (error) {
102+
console.error('Error fetching cat food:', error);
103+
}
104+
}
105+
,
106+
107+
108+
109+
24110
getMessage: async () => {
25111
try{
26112
// fetching data from the backend
27113
const resp = await fetch(process.env.BACKEND_URL + "/api/hello")
28114
const data = await resp.json()
29-
setStore({ message: data.message })
115+
setStore({ exoticFood: data })
30116
// don't forget to return something, that is how the async resolves
31117
return data;
32118
}catch(error){
33119
console.log("Error loading message from backend", error)
34120
}
35121
},
122+
123+
36124
changeColor: (index, color) => {
37125
//get the store
38126
const store = getStore();

0 commit comments

Comments
 (0)