Explorar el Código

Merge pull request #26 from ente-io/cf_worker_flag

Add feature flag to enable/disable CF Worker endpoint
Neeraj Gupta hace 3 años
padre
commit
69a9a0f67c
Se han modificado 3 ficheros con 84 adiciones y 2 borrados
  1. 2 0
      lib/main.dart
  2. 3 2
      lib/models/file.dart
  3. 79 0
      lib/services/feature_flag_service.dart

+ 2 - 0
lib/main.dart

@@ -13,6 +13,7 @@ import 'package:photos/core/network.dart';
 import 'package:photos/db/upload_locks_db.dart';
 import 'package:photos/services/billing_service.dart';
 import 'package:photos/services/collections_service.dart';
+import 'package:photos/services/feature_flag_service.dart';
 import 'package:photos/services/local_sync_service.dart';
 import 'package:photos/services/memories_service.dart';
 import 'package:photos/services/notification_service.dart';
@@ -142,6 +143,7 @@ Future<void> _init(bool isBackground) async {
   await RemoteSyncService.instance.init();
   await SyncService.instance.init();
   await MemoriesService.instance.init();
+  FeatureFlagService.instance.init();
   _logger.info("Initialization done");
   _initializationStatus.complete();
 }

+ 3 - 2
lib/models/file.dart

@@ -7,6 +7,7 @@ import 'package:photos/core/configuration.dart';
 import 'package:photos/core/constants.dart';
 import 'package:photos/models/file_type.dart';
 import 'package:photos/models/location.dart';
+import 'package:photos/services/feature_flag_service.dart';
 import 'package:photos/utils/crypto_util.dart';
 import 'dart:io' as io;
 
@@ -146,7 +147,7 @@ class File {
   }
 
   String getDownloadUrl() {
-    if (kDebugMode) {
+    if (kDebugMode || FeatureFlagService.instance.disableCFWorker()) {
       return Configuration.instance.getHttpEndpoint() +
           "/files/download/" +
           uploadedFileID.toString();
@@ -157,7 +158,7 @@ class File {
   }
 
   String getThumbnailUrl() {
-    if (kDebugMode) {
+    if (kDebugMode || FeatureFlagService.instance.disableCFWorker()) {
       return Configuration.instance.getHttpEndpoint() +
           "/files/preview/" +
           uploadedFileID.toString();

+ 79 - 0
lib/services/feature_flag_service.dart

@@ -0,0 +1,79 @@
+import 'dart:convert';
+
+import 'package:logging/logging.dart';
+import 'package:photos/core/network.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+class FeatureFlagService {
+  FeatureFlagService._privateConstructor();
+
+  static final FeatureFlagService instance =
+      FeatureFlagService._privateConstructor();
+  static const kBooleanFeatureFlagsKey = "feature_flags_key";
+
+  final _logger = Logger("FeatureFlagService");
+  FeatureFlags _featureFlags;
+  SharedPreferences _prefs;
+
+  Future<void> init() async {
+    _prefs = await SharedPreferences.getInstance();
+    await sync();
+  }
+
+  bool disableCFWorker() {
+    try {
+      _featureFlags ??=
+          FeatureFlags.fromJson(_prefs.getString(kBooleanFeatureFlagsKey));
+      return _featureFlags != null ? _featureFlags.disableCFWorker : false;
+    } catch (e) {
+      _logger.severe(e);
+      return false;
+    }
+  }
+
+  Future<void> sync() async {
+    try {
+      final response = await Network.instance
+          .getDio()
+          .get("https://static.ente.io/feature_flags.json");
+      final featureFlags = FeatureFlags.fromMap(response.data);
+      if (featureFlags != null) {
+        _prefs.setString(kBooleanFeatureFlagsKey, featureFlags.toJson());
+        _featureFlags = featureFlags;
+      }
+    } catch (e) {
+      _logger.severe("Failed to sync feature flags ", e);
+    }
+  }
+}
+
+class FeatureFlags {
+  bool disableCFWorker = false; // default to false
+
+  FeatureFlags(
+    this.disableCFWorker,
+  );
+
+  @override
+  Map<String, dynamic> toMap() {
+    return {
+      "disableCFWorker": disableCFWorker,
+    };
+  }
+
+  String toJson() => json.encode(toMap());
+
+  factory FeatureFlags.fromJson(String source) =>
+      FeatureFlags.fromMap(json.decode(source));
+
+  factory FeatureFlags.fromMap(Map<String, dynamic> json) {
+    return FeatureFlags(
+      json["disableCFWorker"] ?? false,
+    );
+  }
+
+  @override
+  String toString() {
+    return toMap().toString();
+  }
+}