@@ -29,8 +29,10 @@ def fetch_database_stats(access_token: str = Depends(security), db: Session = De
2929 total = 0
3030
3131 for flavour in database_flavours :
32- databases = db .query (Database ).filter_by (
33- database_flavour_name = flavour ['name' ]).all ()
32+ databases = db .query (Database ).filter (
33+ Database .database_flavour_name == flavour ['name' ],
34+ Database .deleted == False
35+ ).all ()
3436
3537 database_count = len (databases )
3638 dbs_per_flavour [f"{ flavour ['name' ]} _db_count" ] = database_count
@@ -46,28 +48,59 @@ def fetch_database_stats(access_token: str = Depends(security), db: Session = De
4648
4749@router .get ("/databases" )
4850def get_all_databases (
49- access_token : str = Depends (security ),
50- db : Session = Depends (get_db ),
51- project_id : str = Query (None , description = "Project ID" ),
52- database_flavour_name : str = Query (None , description = "Database flavour name" )
53- ):
51+ access_token : str = Depends (security ),
52+ db : Session = Depends (get_db ),
53+ project_id : str = Query (None , description = "Project ID" ),
54+ database_flavour_name : str = Query (
55+ None , description = "Database flavour name" ),
56+ page : int = Query (default = 1 , ge = 1 , description = "Page number" ),
57+ per_page : int = Query (default = 10 , ge = 1 , le = 100 ,
58+ description = "Items per page" )
59+ ):
5460 current_user = get_current_user (access_token .credentials )
5561 check_authentication (current_user )
5662
57- databases = db .query (Database )
63+ query = db .query (Database ). order_by ( Database . date_created . desc () )
5864
5965 if current_user .role != "administrator" :
60- databases = databases .filter (
66+ query = query .filter (
6167 Database .owner_id == current_user .id )
62-
68+
6369 if project_id :
64- databases = databases .filter (Database .project_id == project_id )
70+ query = query .filter (Database .project_id == project_id )
6571
6672 if database_flavour_name :
67- databases = databases .filter (
73+ query = query .filter (
6874 Database .database_flavour_name == database_flavour_name )
6975
70- return {"status_code" : 200 , "data" : {"databases" : databases .all ()}}
76+ # ensure at this point that deleted databases are not part of the query for the above filters
77+ query = query .filter (Database .deleted == False )
78+
79+ total_count = query .count ()
80+ total_pages = (total_count + per_page - 1 ) // per_page
81+
82+ offset = (page - 1 ) * per_page
83+ paginated_query = query .offset (offset ).limit (per_page )
84+
85+ databases = paginated_query .all ()
86+
87+ next_num = page + 1 if page < total_pages else None
88+ prev_num = page - 1 if page > 1 else None
89+
90+ return {
91+ "status_code" : 200 ,
92+ "data" : {
93+ "pagination" : {
94+ "total" : total_count ,
95+ "pages" : total_pages ,
96+ "page" : page ,
97+ "per_page" : per_page ,
98+ "next" : next_num ,
99+ "prev" : prev_num
100+ },
101+ "databases" : databases
102+ }
103+ }
71104
72105
73106@router .post ("/databases" )
@@ -153,71 +186,6 @@ def create_database(database: DatabaseFlavor, access_token: str = Depends(securi
153186 return SimpleNamespace (status_code = 201 , data = {"database" : database })
154187
155188
156- @router .get ("/databases/{database_id}" )
157- def single_database (database_id : str , access_token : str = Depends (security ), db : Session = Depends (get_db )):
158- current_user = get_current_user (access_token .credentials )
159- check_authentication (current_user )
160-
161- user_database = db .query (Database ).filter (
162- Database .id == database_id ).first ()
163- if not user_database :
164- raise HTTPException (status_code = 404 , detail = "Database not found" )
165-
166- flavour_name = user_database .database_flavour_name
167- if not flavour_name :
168- flavour_name = "mysql"
169-
170- db_flavour = get_db_flavour (flavour_name )
171-
172- if not db_flavour :
173- return dict (
174- status_code = 404 ,
175- message = f"""Database flavour with name
176- { user_database .database_flavour_name } is not mysql or postgres."""
177- )
178-
179- database_service = db_flavour ['class' ]
180-
181- # Get db status
182- try :
183- database_connection = database_service .create_db_connection (
184- user = user_database .user , password = user_database .password , db_name = user_database .name )
185- if not database_connection :
186- db_status = False
187- else :
188- db_status = True
189- except :
190- db_status = False
191- finally :
192- if database_connection :
193- if database_service == MysqlDbService ():
194- if database_connection .is_connected ():
195- database_connection .close ()
196- else :
197- database_connection .close ()
198-
199- database_dict = {
200- ** user_database .__dict__ ,
201- "db_status" : db_status ,
202- "default_storage_kb" : database_service .get_database_size (
203- user = user_database .user , password = user_database .password , db_name = user_database .name )
204- }
205-
206- return SimpleNamespace (status_code = 200 , data = {"database" : database_dict })
207-
208-
209- @router .get ("/databases/{database_id}/password" )
210- def get_database_password (database_id : str , access_token : str = Depends (security ), db : Session = Depends (get_db )):
211- current_user = get_current_user (access_token .credentials )
212- check_authentication (current_user )
213-
214- db_exists = db .query (Database ).filter (Database .id == database_id ).first ()
215- if not db_exists :
216- raise HTTPException (
217- status_code = 404 , detail = f"Database with ID { database_id } not found" )
218- return SimpleNamespace (status_code = 200 , data = {"database" : {"password" : db_exists .password }})
219-
220-
221189@router .post ("/databases/{database_id}/enable" )
222190def enable_database (database_id : str , access_token : str = Depends (security ), db : Session = Depends (get_db )):
223191 current_user = get_current_user (access_token .credentials )
@@ -655,6 +623,71 @@ def database_graph_data(start: Optional[str] = Query(description="Start date for
655623 return {"status_code" : 200 , 'data' : {'metadata' : metadata , 'graph_data' : db_info }}
656624
657625
626+ @router .get ("/databases/{database_id}" )
627+ def single_database (database_id : str , access_token : str = Depends (security ), db : Session = Depends (get_db )):
628+ current_user = get_current_user (access_token .credentials )
629+ check_authentication (current_user )
630+
631+ user_database = db .query (Database ).filter (
632+ Database .id == database_id ).first ()
633+ if not user_database :
634+ raise HTTPException (status_code = 404 , detail = "Database not found" )
635+
636+ flavour_name = user_database .database_flavour_name
637+ if not flavour_name :
638+ flavour_name = "mysql"
639+
640+ db_flavour = get_db_flavour (flavour_name )
641+
642+ if not db_flavour :
643+ return dict (
644+ status_code = 404 ,
645+ message = f"""Database flavour with name
646+ { user_database .database_flavour_name } is not mysql or postgres."""
647+ )
648+
649+ database_service = db_flavour ['class' ]
650+
651+ # Get db status
652+ try :
653+ database_connection = database_service .create_db_connection (
654+ user = user_database .user , password = user_database .password , db_name = user_database .name )
655+ if not database_connection :
656+ db_status = False
657+ else :
658+ db_status = True
659+ except :
660+ db_status = False
661+ finally :
662+ if database_connection :
663+ if database_service == MysqlDbService ():
664+ if database_connection .is_connected ():
665+ database_connection .close ()
666+ else :
667+ database_connection .close ()
668+
669+ database_dict = {
670+ ** user_database .__dict__ ,
671+ "db_status" : db_status ,
672+ "default_storage_kb" : database_service .get_database_size (
673+ user = user_database .user , password = user_database .password , db_name = user_database .name )
674+ }
675+
676+ return SimpleNamespace (status_code = 200 , data = {"database" : database_dict })
677+
678+
679+ @router .get ("/databases/{database_id}/password" )
680+ def get_database_password (database_id : str , access_token : str = Depends (security ), db : Session = Depends (get_db )):
681+ current_user = get_current_user (access_token .credentials )
682+ check_authentication (current_user )
683+
684+ db_exists = db .query (Database ).filter (Database .id == database_id ).first ()
685+ if not db_exists :
686+ raise HTTPException (
687+ status_code = 404 , detail = f"Database with ID { database_id } not found" )
688+ return SimpleNamespace (status_code = 200 , data = {"database" : {"password" : db_exists .password }})
689+
690+
658691@router .post ("/databases/{database_id}/revoke_write_access" )
659692def revoke_write_access (database_id : str , access_token : str = Depends (security ), db : Session = Depends (get_db )):
660693 current_user = get_current_user (access_token .credentials )
0 commit comments