Skip to content

Commit

Permalink
Implement delete media in dropbox
Browse files Browse the repository at this point in the history
  • Loading branch information
cp-pratik-k committed Nov 22, 2024
1 parent c4d20e7 commit f755098
Show file tree
Hide file tree
Showing 7 changed files with 154 additions and 15 deletions.
38 changes: 33 additions & 5 deletions data/lib/apis/dropbox/dropbox_content_endpoints.dart
Original file line number Diff line number Diff line change
Expand Up @@ -137,18 +137,46 @@ class DropboxDownloadEndpoint extends DownloadEndpoint {

@override
Map<String, dynamic> get headers => {
'Dropbox-API-Arg': jsonEncode({
'path': filePath,
}),
};
'Dropbox-API-Arg': jsonEncode({
'path': filePath,
}),
};

@override
CancelToken? get cancelToken => cancellationToken;

@override
@override
void Function(int p1, int p2)? get onReceiveProgress => onProgress;

@override
String? get storePath => storagePath;
}

class DropboxDeleteEndpoint extends Endpoint {
final String id;
final CancelToken? cancellationToken;

const DropboxDeleteEndpoint({
required this.id,
this.cancellationToken,
});

@override
String get baseUrl => BaseURL.dropboxV2;

@override
HttpMethod get method => HttpMethod.post;

@override
String get path => '/files/delete_v2';

@override
Map<String, dynamic> get headers => {
'Dropbox-API-Arg': jsonEncode({
'path': "id:$id",
}),
};

@override
CancelToken? get cancelToken => cancellationToken;
}
2 changes: 1 addition & 1 deletion data/lib/models/media_process/media_process.dart
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class UploadMediaProcess with _$UploadMediaProcess {
required String folder_id,
required MediaProvider provider,
required String path,
String? mime_type,
String? mime_type,
@Default(MediaQueueProcessStatus.waiting) MediaQueueProcessStatus status,
@LocalDatabaseBoolConverter() @Default(false) bool upload_using_auto_backup,
@Default(1) int total,
Expand Down
2 changes: 1 addition & 1 deletion data/lib/repositories/google_drive_process_repo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ class GoogleDriveProcessRepo extends ChangeNotifier {
element.copyWith(status: AppProcessStatus.deleting),
);
notifyListeners();
await _googleDriveService.deleteMedia(process.media.driveMediaRefId!);
await _googleDriveService.deleteMedia(id: process.media.driveMediaRefId!);
_deleteQueue.updateWhere(
where: (element) => element.id == process.id,
update: (element) => element.copyWith(status: AppProcessStatus.success),
Expand Down
96 changes: 89 additions & 7 deletions data/lib/repositories/media_process_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import '../errors/app_error.dart';
Expand All @@ -12,6 +13,14 @@ import '../services/dropbox_services.dart';
import '../services/google_drive_service.dart';
import '../services/local_media_service.dart';

final mediaProcessRepoProvider = Provider<MediaProcessRepo>((ref) {
return MediaProcessRepo(
ref.read(googleDriveServiceProvider),
ref.read(dropboxServiceProvider),
ref.read(localMediaServiceProvider),
);
});

class LocalDatabaseConstants {
static const String databaseName = 'cloud-gallery.db';
static const String uploadQueueTable = 'UploadQueue';
Expand Down Expand Up @@ -78,6 +87,78 @@ class MediaProcessRepo extends ChangeNotifier {
);
}

void autoBackupInGoogleDrive() async {
final backUpFolderId = await _googleDriveService.getBackUpFolderId();

if (backUpFolderId == null) {
throw BackUpFolderNotFound();
}

final res = await Future.wait([
_localMediaService.getAllLocalMedia(),
_googleDriveService.getDriveMedias(
backUpFolderId: backUpFolderId,
),
]);

final localMedias = res[0];
final dgMedias = res[1];

for (AppMedia localMedia in localMedias.toList()) {
if (_uploadQueue
.where((element) => element.id == localMedia.id)
.isNotEmpty ||
dgMedias
.where((gdMedia) => gdMedia.path == localMedia.id)
.isNotEmpty) {
localMedias.removeWhere((media) => media.id == localMedia.id);
}
}

uploadMedia(
medias: localMedias,
folderId: backUpFolderId,
provider: MediaProvider.googleDrive,
uploadUsingAutoBackup: true,
);
}

void autoBackupInDropbox() async {
final backUpFolderId = await _googleDriveService.getBackUpFolderId();

if (backUpFolderId == null) {
throw BackUpFolderNotFound();
}

final res = await Future.wait([
_localMediaService.getAllLocalMedia(),
_googleDriveService.getDriveMedias(
backUpFolderId: backUpFolderId,
),
]);

final localMedias = res[0];
final dgMedias = res[1];

for (AppMedia localMedia in localMedias.toList()) {
if (_uploadQueue
.where((element) => element.id == localMedia.id)
.isNotEmpty ||
dgMedias
.where((gdMedia) => gdMedia.path == localMedia.id)
.isNotEmpty) {
localMedias.removeWhere((media) => media.id == localMedia.id);
}
}

uploadMedia(
medias: localMedias,
folderId: backUpFolderId,
provider: MediaProvider.googleDrive,
uploadUsingAutoBackup: true,
);
}

void uploadMedia({
required List<AppMedia> medias,
required String folderId,
Expand Down Expand Up @@ -123,13 +204,14 @@ class MediaProcessRepo extends ChangeNotifier {
}

Future<void> updateQueue(Database db) async {
db.query(LocalDatabaseConstants.uploadQueueTable).then((value) {
_uploadQueue = value.map((e) => UploadMediaProcess.fromJson(e)).toList();
});
db.query(LocalDatabaseConstants.downloadQueueTable).then((value) {
_downloadQueue =
value.map((e) => DownloadMediaProcess.fromJson(e)).toList();
});
final res = await Future.wait([
db.query(LocalDatabaseConstants.uploadQueueTable),
db.query(LocalDatabaseConstants.downloadQueueTable),
]);

_uploadQueue = res[0].map((e) => UploadMediaProcess.fromJson(e)).toList();
_downloadQueue =
res[1].map((e) => DownloadMediaProcess.fromJson(e)).toList();

notifyListeners();
}
Expand Down
5 changes: 5 additions & 0 deletions data/lib/services/cloud_provider_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,9 @@ abstract class CloudProviderService {
CancelToken? cancelToken,
void Function(int sent, int total)? onProgress,
});

Future<void> deleteMedia({
required String id,
CancelToken? cancelToken,
});
}
20 changes: 20 additions & 0 deletions data/lib/services/dropbox_services.dart
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,24 @@ class DropboxService extends CloudProviderService {
throw AppError.fromError(e);
}
}

@override
Future<void> deleteMedia({
required String id,
CancelToken? cancelToken,
}) async {
try {
final res = await _dropboxAuthenticatedDio.req(
DropboxDeleteEndpoint(
id: id,
cancellationToken: cancelToken,
),
);
if (res.statusCode == 200) return;

throw AppError.fromError(res.statusMessage ?? '');
} catch (e) {
throw AppError.fromError(e);
}
}
}
6 changes: 5 additions & 1 deletion data/lib/services/google_drive_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,11 @@ class GoogleDriveService extends CloudProviderService {
}
}

Future<void> deleteMedia(String id) async {
@override
Future<void> deleteMedia({
required String id,
CancelToken? cancelToken,
}) async {
try {
final driveApi = await _getGoogleDriveAPI();
await driveApi.files.delete(id);
Expand Down

0 comments on commit f755098

Please sign in to comment.