Skip to content

Commit

Permalink
Update sync_routes.py and inputs.py, and add get_google_drive_files m…
Browse files Browse the repository at this point in the history
…ethod***
  • Loading branch information
StanGirard committed May 15, 2024
1 parent 1b9a39f commit 4e3c34b
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 19 deletions.
1 change: 0 additions & 1 deletion backend/modules/sync/controller/sync_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,6 @@ async def get_active_syncs_for_user(current_user: UserIdentity = Depends(get_cur

@sync_router.get(
"/sync/active/{sync_id}/files",
response_model=SyncsActive,
dependencies=[Depends(AuthBearer())],
tags=["Sync"],
)
Expand Down
7 changes: 4 additions & 3 deletions backend/modules/sync/dto/inputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,17 @@ class SyncsUserInput(BaseModel):
class SyncUserUpdateInput(BaseModel):
credentials: dict
state: dict



class SyncsActiveInput(BaseModel):
name: str
user_id: str
id_syncs_user: int
syncs_user_id: int
sync_interval_minutes: int
settings: dict


class SyncsActiveUpdateInput(BaseModel):
name: str
sync_interval_minutes: int
settings: dict

8 changes: 5 additions & 3 deletions backend/modules/sync/entity/sync.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from pydantic import BaseModel
from datetime import datetime

from pydantic import BaseModel


class SyncsActive(BaseModel):
id: int
name: str
id_syncs_user: int
syncs_user_id: int
user_id: str
settings: dict
last_synced: datetime
sync_interval_minutes: int
sync_interval_minutes: int
71 changes: 59 additions & 12 deletions backend/modules/sync/repository/sync.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json
import os
from typing import List

from logger import get_logger
Expand All @@ -7,6 +8,10 @@
from modules.sync.repository.sync_interfaces import SyncInterface
from modules.sync.dto.inputs import SyncsActiveInput, SyncsActiveUpdateInput
from modules.sync.entity.sync import SyncsActive
from google.auth.transport.requests import Request as GoogleRequest
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

logger = get_logger(__name__)

Expand Down Expand Up @@ -88,16 +93,15 @@ def create_sync_active(self, sync_active_input: SyncsActiveInput) -> SyncsActive

def get_syncs_active(self, user_id: str) -> List[SyncsActive]:
response = (
self.db.from_("syncs_active")
.select("*")
.eq("user_id", user_id)
.execute()
self.db.from_("syncs_active").select("*").eq("user_id", user_id).execute()
)
if response.data:
return [SyncsActive(**sync) for sync in response.data]
return []

def update_sync_active(self, sync_id: str, sync_active_input: SyncsActiveUpdateInput):
def update_sync_active(
self, sync_id: str, sync_active_input: SyncsActiveUpdateInput
):
response = (
self.db.from_("syncs_active")
.update(sync_active_input.model_dump())
Expand All @@ -109,20 +113,63 @@ def update_sync_active(self, sync_id: str, sync_active_input: SyncsActiveUpdateI
return None

def delete_sync_active(self, sync_active_id: int, user_id: str):
response = self.db.from_("syncs_active").delete().eq("id", sync_active_id).eq("user_id", user_id).execute()
response = (
self.db.from_("syncs_active")
.delete()
.eq("id", sync_active_id)
.eq("user_id", user_id)
.execute()
)
if response.data:
return response.data[0]
return None

def get_details_sync_active(self, sync_active_id: int):
response = self.db.from_("syncs_active").select("*").eq("id", sync_active_id).execute()
# Get the syncs_user connect to the syncs_active via the syncs_user_id key
response = (
self.db.table("syncs_active")
.select("*, syncs_user(sync_name, credentials)")
.eq("id", sync_active_id)
.execute()
)
if response.data:
logger.info("Getting details sync active")
logger.info(response.data)
return response.data[0]
return None

def get_google_drive_files(self, credentials: dict, folder_id: str = None):
creds = Credentials.from_authorized_user_info(credentials)
if creds.expired and creds.refresh_token:
creds.refresh(GoogleRequest())

try:
service = build("drive", "v3", credentials=creds)
query = f"'{folder_id}' in parents" if folder_id else None
results = (
service.files()
.list(q=query, pageSize=10, fields="nextPageToken, files(id, name, mimeType)")
.execute()
)
items = results.get("files", [])

if not items:
return {"files": "No files found."}

files = [{"name": item["name"], "id": item["id"], "is_folder": item["mimeType"] == "application/vnd.google-apps.folder"} for item in items]
return {"files": files}
except HttpError as error:
logger.error(f"An error occurred: {error}")
return {"error": f"An error occurred: {error}"}

def get_files_folder_active_sync(self, sync_active_id: str, folder_id: str = None):
## Check wether the sync is google or azure
sync_active: SyncsActive = self.get_details_sync_active(sync_active_id)
if sync_active.name.lower() == "google":
## Check whether the sync is google or azure
sync_active = self.get_details_sync_active(sync_active_id)
logger.info(sync_active)
if sync_active["syncs_user"]["sync_name"].lower() == "google":
logger.info("Getting files for google sync")

return self.get_google_drive_files(sync_active["syncs_user"]["credentials"], folder_id)
if sync_active["syncs_user"]["sync_name"].lower() == "azure":
logger.info("Getting files for azure sync")
return "Azure"
return "No sync found"

0 comments on commit 4e3c34b

Please sign in to comment.