diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 74b9d75e66..8d8bb00002 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -461,8 +461,14 @@ func main() { privateAPI.POST("/trash/delete", trashHandler.Delete) privateAPI.POST("/trash/empty", trashHandler.Empty) + emergencyCtrl := &emergency.Controller{ + Repo: &emergencyRepo.Repository{DB: db}, + UserRepo: userRepo, + UserCtrl: userController, + } userHandler := &api.UserHandler{ - UserController: userController, + UserController: userController, + EmergencyController: emergencyCtrl, } publicAPI.POST("/users/ott", userHandler.SendOTT) publicAPI.POST("/users/verify-email", userHandler.VerifyEmail) @@ -606,11 +612,6 @@ func main() { familiesJwtAuthAPI.DELETE("/family/remove-member/:id", familyHandler.RemoveMember) familiesJwtAuthAPI.DELETE("/family/revoke-invite/:id", familyHandler.RevokeInvite) - emergencyCtrl := &emergency.Controller{ - Repo: &emergencyRepo.Repository{DB: db}, - UserRepo: userRepo, - UserCtrl: userController, - } emergencyHandler := &api.EmergencyHandler{ Controller: emergencyCtrl, } @@ -665,6 +666,7 @@ func main() { UserAuthRepo: userAuthRepo, UserController: userController, FamilyController: familyController, + EmergencyController: emergencyCtrl, RemoteStoreController: remoteStoreController, FileRepo: fileRepo, StorageBonusRepo: storagBonusRepo, diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index 4e91321777..124d21078f 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -3,6 +3,7 @@ package api import ( "errors" "fmt" + "github.com/ente-io/museum/pkg/controller/emergency" "github.com/ente-io/museum/pkg/controller/remotestore" "github.com/ente-io/museum/pkg/repo/authenticator" "net/http" @@ -47,6 +48,7 @@ type AdminHandler struct { StorageBonusRepo *storagebonus.Repository BillingController *controller.BillingController UserController *user.UserController + EmergencyController *emergency.Controller FamilyController *family.Controller RemoteStoreController *remotestore.Controller ObjectCleanupController *controller.ObjectCleanupController @@ -182,6 +184,13 @@ func (h *AdminHandler) DeleteUser(c *gin.Context) { "req_id": requestid.Get(c), "req_ctx": "account_deletion", }) + + // todo: (neeraj) refactor this part, currently there's a circular dependency between user and emergency controllers + removeLegacyErr := h.EmergencyController.HandleAccountDeletion(c, user.ID, logger) + if removeLegacyErr != nil { + handler.Error(c, stacktrace.Propagate(removeLegacyErr, "")) + return + } response, err := h.UserController.HandleAccountDeletion(c, user.ID, logger) if err != nil { handler.Error(c, stacktrace.Propagate(err, "")) diff --git a/server/pkg/api/user.go b/server/pkg/api/user.go index f0ede26f2f..930ea6ec8c 100644 --- a/server/pkg/api/user.go +++ b/server/pkg/api/user.go @@ -4,6 +4,7 @@ import ( "database/sql" "errors" "fmt" + "github.com/ente-io/museum/pkg/controller/emergency" "github.com/gin-contrib/requestid" "github.com/sirupsen/logrus" "net/http" @@ -22,7 +23,8 @@ import ( // UserHandler exposes request handlers for all user related requests type UserHandler struct { - UserController *user.UserController + UserController *user.UserController + EmergencyController *emergency.Controller } // SendOTT generates and sends an OTT to the provided email address @@ -529,6 +531,17 @@ func (h *UserHandler) DeleteUser(c *gin.Context) { handler.Error(c, stacktrace.Propagate(err, "Could not bind request params")) return } + // todo: (neeraj) refactor this part, currently there's a circular dependency between user and emergency controllers + removeLegacyErr := h.EmergencyController.HandleAccountDeletion(c, auth.GetUserID(c.Request.Header), + logrus.WithFields(logrus.Fields{ + "user_id": auth.GetUserID(c.Request.Header), + "req_id": requestid.Get(c), + "req_ctx": "self_account_deletion", + })) + if removeLegacyErr != nil { + handler.Error(c, stacktrace.Propagate(removeLegacyErr, "")) + return + } response, err := h.UserController.SelfDeleteAccount(c, request) if err != nil { handler.Error(c, stacktrace.Propagate(err, "")) diff --git a/server/pkg/controller/emergency/controller.go b/server/pkg/controller/emergency/controller.go index 1cf399f86e..fb590bb984 100644 --- a/server/pkg/controller/emergency/controller.go +++ b/server/pkg/controller/emergency/controller.go @@ -64,6 +64,41 @@ func (c *Controller) UpdateContact(ctx *gin.Context, return nil } +func (c *Controller) HandleAccountDeletion(ctx *gin.Context, userID int64, logger *log.Entry) error { + logger.Info("Clean up emergency contacts on account deletion") + contacts, err := c.Repo.GetActiveContactForUser(ctx, userID) + if err != nil { + return stacktrace.Propagate(err, "") + } + if len(contacts) == 0 { + return nil + } + for _, contact := range contacts { + if contact.UserID == userID { + logger.Info("Removing emergency contact from user side") + removeErr := c.UpdateContact(ctx, userID, ente.UpdateContact{ + UserID: userID, + EmergencyContactID: contact.EmergencyContactID, + State: ente.UserRevokedContact, + }) + if removeErr != nil { + return stacktrace.Propagate(removeErr, "") + } + } else { + logger.Info("Removing user from emergency contact side") + leaveErr := c.UpdateContact(ctx, userID, ente.UpdateContact{ + UserID: contact.UserID, + EmergencyContactID: userID, + State: ente.ContactLeft, + }) + if leaveErr != nil { + return stacktrace.Propagate(leaveErr, "") + } + } + } + return nil +} + func validateUpdateReq(userID int64, req ente.UpdateContact) error { if req.EmergencyContactID == req.UserID { return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "")