From 44e45a5124d58e2b4716cc8649e002762f1ec909 Mon Sep 17 00:00:00 2001 From: Houkime <> Date: Wed, 7 Jun 2023 14:11:22 +0000 Subject: [PATCH] BREAKING CHANGE(backups): support only individual service backup requests(combinable) --- selfprivacy_api/backup/jobs.py | 8 +++ .../graphql/mutations/backup_mutations.py | 54 ++++++++++++------- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/selfprivacy_api/backup/jobs.py b/selfprivacy_api/backup/jobs.py index ebc2ea0..2293da0 100644 --- a/selfprivacy_api/backup/jobs.py +++ b/selfprivacy_api/backup/jobs.py @@ -12,6 +12,10 @@ def backup_job_type(service: Service) -> str: return f"{job_type_prefix(service)}.backup" +def restore_job_type(service: Service) -> str: + return f"{job_type_prefix(service)}.restore" + + def get_jobs_by_service(service: Service) -> List[Job]: result = [] for job in Jobs.get_jobs(): @@ -54,3 +58,7 @@ def get_job_by_type(type_id: str) -> Optional[Job]: def get_backup_job(service: Service) -> Optional[Job]: return get_job_by_type(backup_job_type(service)) + + +def get_restore_job(service: Service) -> Optional[Job]: + return get_job_by_type(restore_job_type(service)) diff --git a/selfprivacy_api/graphql/mutations/backup_mutations.py b/selfprivacy_api/graphql/mutations/backup_mutations.py index a227106..8ddd9f6 100644 --- a/selfprivacy_api/graphql/mutations/backup_mutations.py +++ b/selfprivacy_api/graphql/mutations/backup_mutations.py @@ -6,15 +6,18 @@ from strawberry.types import Info from selfprivacy_api.graphql import IsAuthenticated from selfprivacy_api.graphql.mutations.mutation_interface import ( GenericMutationReturn, + GenericJobButationReturn, MutationReturnInterface, ) from selfprivacy_api.graphql.queries.backup import BackupConfiguration from selfprivacy_api.graphql.queries.backup import Backup from selfprivacy_api.graphql.queries.providers import BackupProvider +from selfprivacy_api.graphql.common_types.jobs import job_to_api_job from selfprivacy_api.backup import Backups from selfprivacy_api.services import get_all_services, get_service_by_id from selfprivacy_api.backup.tasks import start_backup, restore_snapshot +from selfprivacy_api.backup.jobs import get_backup_job, get_restore_job @strawberry.input @@ -38,10 +41,6 @@ class GenericBackupConfigReturn(MutationReturnInterface): configuration: typing.Optional[BackupConfiguration] -class GenericJobMutationReturn: - pass - - @strawberry.type class BackupMutations: @strawberry.mutation(permission_classes=[IsAuthenticated]) @@ -76,28 +75,45 @@ class BackupMutations: @strawberry.mutation(permission_classes=[IsAuthenticated]) def start_backup( self, service_id: typing.Optional[str] = None - ) -> GenericJobMutationReturn: - """Start backup. If service not provided, backup all services""" - if service_id is None: - for service in get_all_services(): - start_backup(service) - else: - service = get_service_by_id(service_id) - if service is None: - raise ValueError(f"nonexistent service: {service_id}") - start_backup(service) + ) -> GenericJobButationReturn: + """Start backup""" - return GenericJobMutationReturn() + service = get_service_by_id(service_id) + if service is None: + return GenericJobButationReturn( + success=False, + code=300, + message=f"nonexistent service: {service_id}", + job=None, + ) + start_backup(service) + job = get_backup_job(service) + + return GenericJobButationReturn( + success=True, code=200, message="Backup job queued", job=job_to_api_job(job) + ) @strawberry.mutation(permission_classes=[IsAuthenticated]) - def restore_backup(self, snapshot_id: str) -> GenericJobMutationReturn: + def restore_backup(self, snapshot_id: str) -> GenericJobButationReturn: """Restore backup""" snap = Backups.get_snapshot_by_id(snapshot_id) - if snap in None: - raise ValueError(f"No such snapshot: {snapshot_id}") + service = get_service_by_id(snap.service_name) + if snap is None: + return GenericJobButationReturn( + success=False, + code=300, + message=f"No such snapshot: {snapshot_id}", + job=None, + ) + restore_snapshot(snap) - return GenericJobMutationReturn() + return GenericJobButationReturn( + success=True, + code=200, + message="restore job created", + jobs=[get_restore_job(service)], + ) @strawberry.mutation(permission_classes=[IsAuthenticated]) def force_snapshots_reload(self) -> GenericMutationReturn: