diff --git a/FlaskWebProject/FlaskWebProject/lewy_api_v1.py b/FlaskWebProject/FlaskWebProject/lewy_api_v1.py index 58b2cc7..890a192 100644 --- a/FlaskWebProject/FlaskWebProject/lewy_api_v1.py +++ b/FlaskWebProject/FlaskWebProject/lewy_api_v1.py @@ -50,6 +50,16 @@ def not_implemented(data): # TODO: change list to string -> data, not data[0] return 501, f"not recognised/implemented: {data[0]}", [] +def __czy_x_istnieje(typ, **id): + rekord = getDb().simple_select_all(typ, **id) + if rekord is not None and rekord != []: + return True + else: + return False + +def czy_sportowiec_istnieje(id_zawodnika: str): + return __czy_x_istnieje("sportowcy", id_zawodnika=id_zawodnika) + # GET /api/v1 def stub_hello(): """ @@ -85,15 +95,36 @@ def stats(): return 200, "ok", data_to_send # GET /api/v1/matches -def get_matches(r): +def get_matches(r, id_zawodnika: str | None = None): """ - TODO: Zwraca mecze. + Zwraca mecze. + Przykład wywołania: + get_matches(r, id_zawodnika=1), tożsame z GET /api/v1/matches?id_zawodnika=1 + get_matches(r), tożsame z GET /api/v1/matches """ response_json = [] - mecze = getDb().simple_select_all("mecze") + mecze = None + + if id_zawodnika is None: + # Gdy nie podano id wprost, sprawdź, czy podano je przez parametr. + id_zawodnika = r.args.get('id_zawodnika', -1) + + # Sprawdź, czy podano jakiekolwiek ID sportowca. Jeżeli nie, wypisz wszystkie mecze. + if id_zawodnika == -1: + mecze = getDb().simple_select_all("mecze") + + # Sprawdź, czy sportowiec o podanym (lub niepodanym) id istnieje. + # Jeśli nie istnieje, wypisz wszystkie mecze. + elif not czy_sportowiec_istnieje(id_zawodnika=id_zawodnika): + return 404, "error", {"error_msg": "This sportsman has not been found in the database. Try: id_zawodnika=1"} + + # Gdy sportowiec istnieje, wypisz jego mecze. + else: + mecze = getDb().get_sportsman_matches(id_zawodnika=id_zawodnika) + for mecz in mecze: response_json.append(mecz.jsonify()) - print(response_json) + # print(f"zwracam mecze: {response_json}") return 200, "ok", response_json # GET /api/v1/debugger_halt?token=XXX... diff --git a/FlaskWebProject/FlaskWebProject/lewy_db.py b/FlaskWebProject/FlaskWebProject/lewy_db.py index b1e495f..5eb5964 100644 --- a/FlaskWebProject/FlaskWebProject/lewy_db.py +++ b/FlaskWebProject/FlaskWebProject/lewy_db.py @@ -95,7 +95,7 @@ class baza(): id_zawodnika: Mapped[ int] = mapped_column(ForeignKey(f"{tnp}sportowcy.id_zawodnika")) zawodnik: Mapped[ "sportowcy"] = relationship(back_populates="mecze_zawodnika") zewnetrzne_id_meczu: Mapped[ str] = mapped_column(ForeignKey(f"{tnp}mecze.zewnetrzne_id_meczu")) - mecz: Mapped[ "mecze"] = relationship() + mecz: Mapped[ "mecze"] = relationship() # back_populates="zawodnicy_w_meczu", foreign_keys=[zewnetrzne_id_meczu]) czas_gry: Mapped[ int] = mapped_column() goli: Mapped[ int] = mapped_column() asyst: Mapped[ int] = mapped_column() @@ -159,6 +159,8 @@ class baza(): skrocona_nazwa_turnieju: Mapped[ str] = mapped_column() flaga: Mapped[ int] = mapped_column() + # zawodnicy_w_meczu: Mapped[ List["sportowcy_w_meczach"]] = relationship(back_populates="mecz") + def __repr__(self): return f"" @@ -494,18 +496,49 @@ class baza(): if zewnetrzne_id_zawodnika is not None: id_zawodnika = self.get_id_zawodnika_by_zewnetrzne_id(zewnetrzne_id_zawodnika) + # Aliasy (dla czytelności) + SportowcyWMeczach = self.entities["sportowcy_w_meczach"] + Sportowcy = self.entities["sportowcy"] query = self.session.query( - self.entities["sportowcy_w_meczach"] + SportowcyWMeczach ).join( - self.entities["sportowcy_w_meczach"].zawodnik + SportowcyWMeczach.zawodnik ).filter( - self.entities["sportowcy"].id_zawodnika == id_zawodnika + Sportowcy.id_zawodnika == id_zawodnika ) - #print(query) + # print(f"get_sportowcy_w_meczach_by_sportsman_id: {query}") if order.lower() == "desc": - query = query.order_by(self.entities["sportowcy_w_meczach"].id_rekordu.desc()) + query = query.order_by(SportowcyWMeczach.id_rekordu.desc()) + + return query.all() + + @exit_gracefully + def get_sportsman_matches(self, id_zawodnika = None, zewnetrzne_id_zawodnika = None, order = "DESC"): + + if zewnetrzne_id_zawodnika is not None: + id_zawodnika = self.get_id_zawodnika_by_zewnetrzne_id(zewnetrzne_id_zawodnika) + + # Aliasy + Mecze = self.entities["mecze"] + SportowcyWMeczach = self.entities["sportowcy_w_meczach"] + Sportowcy = self.entities["sportowcy"] + + query = self.session.query( + Mecze + ).join( + SportowcyWMeczach, Mecze.zewnetrzne_id_meczu == SportowcyWMeczach.zewnetrzne_id_meczu + ).join( + Sportowcy, SportowcyWMeczach.id_zawodnika == Sportowcy.id_zawodnika + ).filter( + Sportowcy.id_zawodnika == id_zawodnika + ) + + # print(f"get_sportsman_matches: {query}") + + if order.lower() == "desc": + query = query.order_by(Mecze.data.desc()) return query.all()