1- from fastapi import APIRouter , HTTPException , Request , status
1+ from typing import Annotated , List
2+
3+ from fastapi import APIRouter , Header , HTTPException , Request , status
24from pydantic import BaseModel
35
46from app .schemas import Library as LibrarySchema
7+ from app .schemas import LibraryNews
8+ from app .schemas import LibraryRequest as LibraryRequestSchema
59from app .schemas import Subscription as SubscriptionSchema
610from app .services .database .models import Library , Subscription
11+ from app .services .database .models .libraries_request import LibraryRequest
712from app .services .database .orm .library import (
13+ get_libraries_by_language ,
814 get_library_ids_by_multiple_names ,
915 insert_library ,
1016)
17+ from app .services .database .orm .library_request import insert_library_request
1118from app .services .database .orm .subscription import upsert_multiple_subscription
1219
1320
@@ -22,6 +29,41 @@ class SubscribeLibraryResponse(BaseModel):
2229def setup ():
2330 router = APIRouter (prefix = "/libraries" , tags = ["libraries" ])
2431
32+ @router .get (
33+ "" ,
34+ response_model = List [LibrarySchema ],
35+ status_code = status .HTTP_200_OK ,
36+ summary = "Get libraries by language" ,
37+ description = "Get libraries by language" ,
38+ )
39+ async def get_by_language (request : Request , language : str ):
40+ try :
41+ libraryList = await get_libraries_by_language (
42+ language = language , session = request .app .db_session_factory
43+ )
44+ return [
45+ LibrarySchema (
46+ library_name = libraryDb .library_name ,
47+ news = [
48+ LibraryNews (
49+ tag = news ["tag" ], description = news ["description" ]
50+ )
51+ for news in libraryDb .news
52+ ],
53+ logo = libraryDb .logo ,
54+ version = libraryDb .version ,
55+ release_date = libraryDb .release_date ,
56+ releases_doc_url = libraryDb .releases_doc_url ,
57+ fixed_release_url = libraryDb .fixed_release_url ,
58+ language = libraryDb .language ,
59+ )
60+ for libraryDb in libraryList
61+ ]
62+ except HTTPException as e :
63+ raise e
64+ except Exception as e :
65+ HTTPException (status_code = 500 , detail = f"Unexpected error: { e } " )
66+
2567 @router .post (
2668 "" ,
2769 response_model = LibraryResponse ,
@@ -35,16 +77,22 @@ async def create_library(
3577 ):
3678 library = Library (
3779 library_name = body .library_name ,
38- user_email = "" , # TODO: Considerar obter o email do usuário autenticado
39- releases_url = body .releases_url .encoded_string (),
40- logo = body .logo .encoded_string (),
80+ news = [news .model_dump () for news in body .news ],
81+ logo = body .logo ,
82+ version = body .version ,
83+ release_date = body .release_date ,
84+ releases_doc_url = body .releases_doc_url ,
85+ fixed_release_url = body .fixed_release_url ,
86+ language = body .language ,
4187 )
4288 try :
4389 await insert_library (library , request .app .db_session_factory )
4490 return LibraryResponse ()
91+ except HTTPException as e :
92+ raise e
4593 except Exception as e :
4694 raise HTTPException (
47- status_code = 500 , detail = f"Failed to create library : { e } "
95+ status_code = 500 , detail = f"Unexpected error : { e } "
4896 )
4997
5098 @router .post (
@@ -59,14 +107,22 @@ async def create_library(
59107 async def subscribe_libraries (
60108 request : Request ,
61109 body : SubscriptionSchema ,
110+ user_email : Annotated [str , Header (alias = "user-email" )],
62111 ):
63112 try :
64113 library_ids = await get_library_ids_by_multiple_names (
65114 body .libraries_list , request .app .db_session_factory
66115 )
67116
117+ if (library_ids is None ) or (len (library_ids ) == 0 ):
118+ raise HTTPException (
119+ status_code = 404 , detail = "Libraries not found"
120+ )
121+
68122 subscriptions = [
69- Subscription (email = body .email , tags = body .tags , library_id = id )
123+ Subscription (
124+ user_email = user_email , tags = body .tags , library_id = id
125+ )
70126 for id in library_ids
71127 ]
72128
@@ -75,9 +131,42 @@ async def subscribe_libraries(
75131 )
76132
77133 return SubscribeLibraryResponse ()
134+ except HTTPException as e :
135+ raise e
136+ except Exception as e :
137+ raise HTTPException (
138+ status_code = 500 , detail = f"Unexpected error: { e } "
139+ )
140+
141+ @router .post (
142+ "/request" ,
143+ response_model = LibraryResponse ,
144+ status_code = status .HTTP_200_OK ,
145+ summary = "Request a library" ,
146+ description = "Request a library to follow" ,
147+ )
148+ async def request_library (
149+ request : Request ,
150+ body : LibraryRequestSchema ,
151+ user_email : Annotated [str , Header (alias = "user-email" )],
152+ ):
153+ try :
154+ library_request = LibraryRequest (
155+ user_email = user_email ,
156+ library_name = body .library_name ,
157+ library_home_page = body .library_home_page ,
158+ )
159+
160+ await insert_library_request (
161+ library_request , request .app .db_session_factory
162+ )
163+
164+ return LibraryResponse ()
165+ except HTTPException as e :
166+ raise e
78167 except Exception as e :
79168 raise HTTPException (
80- status_code = 500 , detail = f"Subscription failed : { e } "
169+ status_code = 500 , detail = f"Unexpected error : { e } "
81170 )
82171
83172 return router
0 commit comments