Skip to content

Commit 1df47c4

Browse files
authored
Merge pull request #35 from crane-cloud/develop
chore: deploy to production
2 parents b9f2d2a + 4fd7f07 commit 1df47c4

1 file changed

Lines changed: 111 additions & 78 deletions

File tree

app/routes.py

Lines changed: 111 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -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")
4850
def 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")
222190
def 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")
659692
def 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

Comments
 (0)