trash_sync_service.dart 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import 'package:dio/dio.dart';
  2. import 'package:logging/logging.dart';
  3. import 'package:photos/core/configuration.dart';
  4. import 'package:photos/core/network.dart';
  5. import 'package:photos/db/files_db.dart';
  6. import 'package:photos/db/trash_db.dart';
  7. import 'package:photos/models/trash_item_request.dart';
  8. import 'package:photos/utils/trash_diff_fetcher.dart';
  9. import 'package:shared_preferences/shared_preferences.dart';
  10. class TrashSyncService {
  11. final _logger = Logger("TrashSyncService");
  12. final _diffFetcher = TrashDiffFetcher();
  13. final _filesDB = FilesDB.instance;
  14. final _trashDB = TrashDB.instance;
  15. static const kDiffLimit = 2500;
  16. static const kLastTrashSyncTime = "last_trash_sync_time";
  17. SharedPreferences _prefs;
  18. TrashSyncService._privateConstructor();
  19. static final TrashSyncService instance =
  20. TrashSyncService._privateConstructor();
  21. final _dio = Network.instance.getDio();
  22. Future<void> init() async {
  23. _prefs = await SharedPreferences.getInstance();
  24. }
  25. Future<void> syncTrash() async {
  26. final lastSyncTime = getSyncTime();
  27. _logger.fine('sync trash sinceTime : $lastSyncTime');
  28. var diff = await _diffFetcher.getTrashFilesDiff(lastSyncTime, kDiffLimit);
  29. if (diff.trashedFiles.isNotEmpty) {
  30. _logger.fine("inserting ${diff.trashedFiles.length} items in trash");
  31. await _trashDB.insertMultiple(diff.trashedFiles);
  32. }
  33. if (diff.deletedFiles.isNotEmpty) {
  34. _logger.fine("discard ${diff.deletedFiles.length} deleted items");
  35. await _trashDB
  36. .delete(diff.deletedFiles.map((e) => e.file.uploadedFileID).toList());
  37. }
  38. if (diff.restoredFiles.isNotEmpty) {
  39. _logger.fine("discard ${diff.restoredFiles.length} restored items");
  40. await _trashDB.delete(
  41. diff.restoredFiles.map((e) => e.file.uploadedFileID).toList());
  42. }
  43. if (diff.lastSyncedTimeStamp != 0) {
  44. await setSyncTime(diff.lastSyncedTimeStamp);
  45. }
  46. if (diff.fetchCount == kDiffLimit) {
  47. return await syncTrash();
  48. }
  49. }
  50. Future<void> setSyncTime(int time) async {
  51. if (time == null) {
  52. return _prefs.remove(kLastTrashSyncTime);
  53. }
  54. return _prefs.setInt(kLastTrashSyncTime, time);
  55. }
  56. int getSyncTime() {
  57. return _prefs.getInt(kLastTrashSyncTime) ?? 0;
  58. }
  59. Future<void> trashFilesOnServer(List<TrashRequest> trashRequestItems) async {
  60. final params = <String, dynamic>{};
  61. params["items"] = [];
  62. for (final item in trashRequestItems) {
  63. params["items"].add(item.toJson());
  64. }
  65. return await _dio.post(
  66. Configuration.instance.getHttpEndpoint() + "/files/trash",
  67. options: Options(
  68. headers: {
  69. "X-Auth-Token": Configuration.instance.getToken(),
  70. },
  71. ),
  72. data: params,
  73. );
  74. }
  75. }