diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index ba6e142dda..e6c727df31 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -11,6 +11,7 @@ import "package:photos/emergency/other_contact_page.dart"; import "package:photos/emergency/select_contact_page.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/l10n/l10n.dart"; +import "package:photos/service_locator.dart"; import "package:photos/theme/colors.dart"; import 'package:photos/theme/ente_theme.dart'; import "package:photos/ui/common/loading_widget.dart"; @@ -512,18 +513,22 @@ class _EmergencyPageState extends State { }, isInAlert: true, ), - // if (kDebugMode) - // ButtonWidget( - // labelText: "Approve recovery", - // buttonType: ButtonType.primary, - // buttonSize: ButtonSize.large, - // buttonAction: ButtonAction.second, - // shouldStickToDarkTheme: true, - // onTap: () async { - // showToast(context, "Coming soon for internal users"); - // }, - // isInAlert: true, - // ), + if (flagService.internalUser) + ButtonWidget( + labelText: "Approve recovery (internal)", + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + onTap: () async { + await EmergencyContactService.instance.approveRecovery(session); + if (mounted) { + setState(() {}); + } + unawaited(_fetchData()); + }, + isInAlert: true, + ), ButtonWidget( labelText: S.of(context).cancel, buttonType: ButtonType.tertiary, diff --git a/mobile/lib/emergency/emergency_service.dart b/mobile/lib/emergency/emergency_service.dart index 09c6c2816d..10d6ad7b0f 100644 --- a/mobile/lib/emergency/emergency_service.dart +++ b/mobile/lib/emergency/emergency_service.dart @@ -152,6 +152,22 @@ class EmergencyContactService { } } + Future approveRecovery(RecoverySessions session) async { + try { + await _enteDio.post( + "/emergency-contacts/approve-recovery", + data: { + "userID": session.user.id, + "emergencyContactID": session.emergencyContact.id, + "id": session.id, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to approve recovery', e, s); + rethrow; + } + } + Future<(String, KeyAttributes)> getRecoveryInfo( RecoverySessions sessions, ) async { diff --git a/server/migrations/93_emergency_contact.down.sql b/server/migrations/93_emergency_contact.down.sql index 2160ceaa15..9ecb876451 100644 --- a/server/migrations/93_emergency_contact.down.sql +++ b/server/migrations/93_emergency_contact.down.sql @@ -9,4 +9,4 @@ DROP INDEX IF EXISTS idx_emergency_recovery_limit_active_recovery; DROP TABLE IF EXISTS emergency_recovery; DROP TABLE IF EXISTS emergency_contact; -DROP FUNCTION IF EXISTS trigger_updated_at_microseconds_column; \ No newline at end of file +DROP FUNCTION IF EXISTS trigger_updated_at_microseconds_column; diff --git a/server/pkg/repo/emergency/recovery.go b/server/pkg/repo/emergency/recovery.go index 3e547babda..9d5a363b0f 100644 --- a/server/pkg/repo/emergency/recovery.go +++ b/server/pkg/repo/emergency/recovery.go @@ -73,9 +73,9 @@ func (repo *Repository) UpdateRecoveryStatusForID(ctx context.Context, sessionID result, err = repo.DB.ExecContext(ctx, `UPDATE emergency_recovery SET status=$1, wait_till=$2 WHERE id=$3 and status = ANY($4)`, status, time.Microseconds(), sessionID, pq.Array(validPrevStatus)) } else { result, err = repo.DB.ExecContext(ctx, `UPDATE emergency_recovery SET status=$1 WHERE id=$2 and status = ANY($3)`, status, sessionID, pq.Array(validPrevStatus)) - if err != nil { - return false, stacktrace.Propagate(err, "") - } + } + if err != nil { + return false, stacktrace.Propagate(err, "") } rows, _ := result.RowsAffected() return rows > 0, nil @@ -106,7 +106,6 @@ func validPreviousStatus(newStatus ente.RecoveryStatus) []ente.RecoveryStatus { break case ente.RecoveryStatusReady: result = append(result, ente.RecoveryStatusWaiting, ente.RecoveryStatusReady) - break case ente.RecoveryStatusStopped: result = append(result, ente.RecoveryStatusWaiting, ente.RecoveryStatusReady) case ente.RecoveryStatusRejected: