[server] Clean up emergency contacts on account deletion

This commit is contained in:
Neeraj Gupta 2024-12-12 15:32:10 +05:30
parent c648127ff8
commit 38d679f574
4 changed files with 66 additions and 7 deletions

View File

@ -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,

View File

@ -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, ""))

View File

@ -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, ""))

View File

@ -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"), "")