Loren commited on
Commit
01a35a9
·
verified ·
1 Parent(s): 730d09f

Upload 2 files

Browse files
Files changed (2) hide show
  1. app/database.py +47 -18
  2. app/main.py +63 -10
app/database.py CHANGED
@@ -45,11 +45,25 @@ def fetch_tags() -> List[str]:
45
  Récupère la liste de tous les tags disponibles dans la base de données.
46
 
47
  Returns:
48
- List[str]: Une liste de chaînes de caractères correspondant aux noms des tags, triés par ordre alphabétique.
 
 
 
 
 
 
 
 
 
 
 
49
  """
50
- query = "SELECT tag_name FROM tags ORDER BY tag_name"
51
- result = con.execute(query).fetchall()
52
- return [row[0] for row in result]
 
 
 
53
 
54
  def fetch_articles_by_tags(tags: List[str]) -> List[Dict]:
55
  """
@@ -59,24 +73,39 @@ def fetch_articles_by_tags(tags: List[str]) -> List[Dict]:
59
  tags (List[str]): Une liste de noms de tags pour filtrer les articles.
60
 
61
  Returns:
62
- List[Dict]: Une liste de dictionnaires, chacun représentant un article avec les clés:
63
- - 'article_id': ID de l'article
64
- - 'article_title': Titre de l'article
65
- - 'article_url': URL de l'article
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
  Notes:
68
  - Si la liste `tags` est vide, la fonction retourne une liste vide.
69
  - Les résultats incluent uniquement les articles correspondant à au moins un des tags fournis.
70
  """
71
  if not tags:
72
- return []
73
 
74
- placeholders = ",".join(["?"] * len(tags))
75
- query = f"""SELECT distinct a.article_id, a.article_title, a.article_url
76
- FROM tags t, tag_article ta, articles a
77
- WHERE t.tag_id = ta.tag_id
78
- AND ta.article_id = a.article_id
79
- AND t.tag_name IN ({placeholders})
80
- """
81
- result = con.execute(query, tags).fetchdf()
82
- return result.to_dict(orient="records")
 
 
 
 
45
  Récupère la liste de tous les tags disponibles dans la base de données.
46
 
47
  Returns:
48
+ Dict: Un dictionnaire contenant le statut et les résultats.
49
+ - Si succès :
50
+ {
51
+ "status": "ok",
52
+ "result": List[str] # Liste des noms de tags triés par ordre alphabétique
53
+ }
54
+ - En cas d'erreur :
55
+ {
56
+ "status": "error",
57
+ "code": str, # Nom de l'exception
58
+ "message": str # Message de l'exception
59
+ }
60
  """
61
+ try:
62
+ query = "SELECT tag_name FROM tags ORDER BY tag_name"
63
+ result = con.execute(query).fetchall()
64
+ return {"status": "ok", "result": [row[0] for row in result]}
65
+ except Exception as e:
66
+ return {"status": "error", "code": type(e).__name__, "message": str(e)}
67
 
68
  def fetch_articles_by_tags(tags: List[str]) -> List[Dict]:
69
  """
 
73
  tags (List[str]): Une liste de noms de tags pour filtrer les articles.
74
 
75
  Returns:
76
+ Dict: Un dictionnaire contenant le statut et les résultats.
77
+ - Si succès :
78
+ {
79
+ "status": "ok",
80
+ "result": List[Dict] # Liste de dictionnaires représentant les articles
81
+ }
82
+ Chaque dictionnaire contient les clés :
83
+ - 'article_id': int, ID de l'article
84
+ - 'article_title': str, Titre de l'article
85
+ - 'article_url': str, URL de l'article
86
+ - En cas d'erreur ou si aucun tag fourni :
87
+ {
88
+ "status": "error",
89
+ "code": str, # Code d'erreur ou nom de l'exception
90
+ "message": str # Message d'erreur
91
+ }
92
 
93
  Notes:
94
  - Si la liste `tags` est vide, la fonction retourne une liste vide.
95
  - Les résultats incluent uniquement les articles correspondant à au moins un des tags fournis.
96
  """
97
  if not tags:
98
+ return {"status": "error", "code": "no_tags", "message": "Aucun tag fourni."}
99
 
100
+ try:
101
+ placeholders = ",".join(["?"] * len(tags))
102
+ query = f"""SELECT distinct a.article_id, a.article_title, a.article_url
103
+ FROM tags t, tag_article ta, articles a
104
+ WHERE t.tag_id = ta.tag_id
105
+ AND ta.article_id = a.article_id
106
+ AND t.tag_name IN ({placeholders})
107
+ """
108
+ result = con.execute(query, tags).fetchdf()
109
+ return {"status": "ok", "result": result.to_dict(orient="records")}
110
+ except Exception as e:
111
+ return {"status": "error", "code": type(e).__name__, "message": str(e)}
app/main.py CHANGED
@@ -21,18 +21,71 @@ app.add_middleware(
21
  @app.get("/get_tags")
22
  def get_tags():
23
  """
24
- Retourne la liste de tous les tags
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  """
26
- tags = database.fetch_tags()
27
- return {"tags": tags}
 
 
 
 
 
 
28
 
29
  @app.get("/get_articles_with_tags")
30
- def get_articles_with_tags(
31
- tags: List[str] = Query(..., description="Liste des tags à filtrer")
32
- ):
33
  """
34
- Retourne les articles correspondant aux tags donnés
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  """
36
- articles = database.fetch_articles_by_tags(tags)
37
- return {"tags": tags,
38
- "articles": articles}
 
 
 
 
 
 
 
21
  @app.get("/get_tags")
22
  def get_tags():
23
  """
24
+ Récupère la liste de tous les tags disponibles via l'API.
25
+
26
+ Returns:
27
+ Dict: Un dictionnaire contenant soit la liste des tags, soit les informations d'erreur.
28
+ - Si succès :
29
+ {
30
+ "tags": List[str] # Liste des noms de tags triés par ordre alphabétique
31
+ }
32
+ - En cas d'erreur :
33
+ {
34
+ "status": "error",
35
+ "code": str, # Nom de l'exception
36
+ "message": str # Message de l'exception
37
+ }
38
+
39
+ Notes:
40
+ - L'appel de cet endpoint effectue un accès à la base de données via la fonction `fetch_tags`.
41
+ - En cas de problème avec la base de données, un message d'erreur détaillé est retourné.
42
  """
43
+ try:
44
+ dict_result = database.fetch_tags()
45
+ if dict_result["status"] == "ok":
46
+ return {"tags": dict_result["result"]}
47
+ else:
48
+ return dict_result
49
+ except Exception as e:
50
+ return {"status": "error", "code": type(e).__name__, "message": str(e)}
51
 
52
  @app.get("/get_articles_with_tags")
53
+ def get_articles_with_tags(tags: List[str] = Query(..., description="Liste des tags à filtrer")):
 
 
54
  """
55
+ Récupère les articles associés à une ou plusieurs tags spécifiés.
56
+
57
+ Args:
58
+ tags (List[str]): Liste des noms de tags utilisés pour filtrer les articles.
59
+ Doit contenir au moins un tag.
60
+
61
+ Returns:
62
+ Dict: Un dictionnaire contenant soit les articles correspondants, soit les informations d'erreur.
63
+ - Si succès :
64
+ {
65
+ "tags": List[str], # Tags utilisés pour filtrer
66
+ "articles": List[Dict] # Liste des articles correspondants
67
+ }
68
+ Chaque article est un dictionnaire contenant :
69
+ - 'article_id': int, ID de l'article
70
+ - 'article_title': str, Titre de l'article
71
+ - 'article_url': str, URL de l'article
72
+ - En cas d'erreur :
73
+ {
74
+ "status": "error",
75
+ "code": str, # Code d'erreur ou nom de l'exception
76
+ "message": str # Message d'erreur
77
+ }
78
+
79
+ Notes:
80
+ - Si la liste `tags` est vide, la fonction retourne une erreur avec le code "no_tags".
81
+ - L'appel de cet endpoint utilise la fonction `fetch_articles_by_tags` pour récupérer les articles.
82
  """
83
+ try:
84
+ dict_result = database.fetch_articles_by_tags(tags)
85
+ if dict_result["status"] == "ok":
86
+ return {"tags": tags,
87
+ "articles": dict_result["result"]}
88
+ else:
89
+ return dict_result
90
+ except Exception as e:
91
+ return {"status": "error", "code": type(e).__name__, "message": str(e)}