code_store.dart 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import 'dart:convert';
  2. import 'package:ente_auth/core/event_bus.dart';
  3. import 'package:ente_auth/events/codes_updated_event.dart';
  4. import 'package:ente_auth/models/authenticator/entity_result.dart';
  5. import 'package:ente_auth/models/code.dart';
  6. import 'package:ente_auth/services/authenticator_service.dart';
  7. import 'package:logging/logging.dart';
  8. class CodeStore {
  9. static final CodeStore instance = CodeStore._privateConstructor();
  10. CodeStore._privateConstructor();
  11. late AuthenticatorService _authenticatorService;
  12. final _logger = Logger("CodeStore");
  13. Future<void> init() async {
  14. _authenticatorService = AuthenticatorService.instance;
  15. }
  16. Future<List<Code>> getAllCodes() async {
  17. final List<EntityResult> entities =
  18. await _authenticatorService.getEntities();
  19. final List<Code> codes = [];
  20. for (final entity in entities) {
  21. final decodeJson = jsonDecode(entity.rawData);
  22. final code = Code.fromRawData(decodeJson);
  23. code.id = entity.generatedID;
  24. code.hasSynced = entity.hasSynced;
  25. codes.add(code);
  26. }
  27. codes.sort((c1, c2) {
  28. return c1.issuer.toLowerCase().compareTo(c2.issuer.toLowerCase());
  29. });
  30. return codes;
  31. }
  32. Future<void> addCode(
  33. Code code, {
  34. bool shouldSync = true,
  35. }) async {
  36. final codes = await getAllCodes();
  37. bool isExistingCode = false;
  38. for (final existingCode in codes) {
  39. if (existingCode == code) {
  40. _logger.info("Found duplicate code, skipping add");
  41. return;
  42. } else if (existingCode.id == code.id) {
  43. isExistingCode = true;
  44. break;
  45. }
  46. }
  47. if (isExistingCode) {
  48. await _authenticatorService.updateEntry(
  49. code.id!,
  50. jsonEncode(code.rawData),
  51. shouldSync,
  52. );
  53. } else {
  54. code.id = await _authenticatorService.addEntry(
  55. jsonEncode(code.rawData),
  56. shouldSync,
  57. );
  58. }
  59. Bus.instance.fire(CodesUpdatedEvent());
  60. }
  61. Future<void> removeCode(Code code) async {
  62. await _authenticatorService.deleteEntry(code.id!);
  63. Bus.instance.fire(CodesUpdatedEvent());
  64. }
  65. }