mirror of
https://github.com/ente-io/ente.git
synced 2025-05-08 05:53:24 +00:00
103 lines
3.4 KiB
Go
103 lines
3.4 KiB
Go
package emergency
|
|
|
|
import (
|
|
"github.com/ente-io/museum/ente"
|
|
"github.com/ente-io/stacktrace"
|
|
"github.com/gin-gonic/gin"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func (c *Controller) StartRecovery(ctx *gin.Context,
|
|
actorUserID int64,
|
|
req ente.ContactIdentifier) error {
|
|
if req.EmergencyContactID == req.UserID {
|
|
return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "")
|
|
}
|
|
if req.EmergencyContactID != actorUserID {
|
|
return stacktrace.Propagate(ente.ErrPermissionDenied, "only the emergency contact can start recovery")
|
|
}
|
|
|
|
contact, err := c.Repo.GetActiveEmergencyContact(ctx, req.UserID, req.EmergencyContactID)
|
|
if err != nil {
|
|
return stacktrace.Propagate(err, "")
|
|
}
|
|
|
|
hasUpdate, err := c.Repo.InsertIntoRecovery(ctx, req, *contact)
|
|
if !hasUpdate {
|
|
log.WithField("userID", actorUserID).WithField("req", req).
|
|
Warn("No need to send email")
|
|
} else {
|
|
go c.sendRecoveryNotification(ctx, req.UserID, req.EmergencyContactID, ente.RecoveryStatusInitiated, nil)
|
|
}
|
|
if err != nil {
|
|
return stacktrace.Propagate(err, "")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *Controller) RejectRecovery(ctx *gin.Context,
|
|
userID int64,
|
|
req ente.RecoveryIdentifier) error {
|
|
if req.EmergencyContactID == req.UserID {
|
|
return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "")
|
|
}
|
|
if req.UserID != userID {
|
|
return stacktrace.Propagate(ente.ErrPermissionDenied, "only account owner can reject recovery")
|
|
}
|
|
hasUpdate, err := c.Repo.UpdateRecoveryStatusForID(ctx, req.ID, ente.RecoveryStatusRejected)
|
|
if !hasUpdate {
|
|
log.WithField("userID", userID).WithField("req", req).
|
|
Warn("no row updated while rejecting recovery")
|
|
} else {
|
|
go c.sendRecoveryNotification(ctx, req.UserID, req.EmergencyContactID, ente.RecoveryStatusRejected, nil)
|
|
}
|
|
if err != nil {
|
|
return stacktrace.Propagate(err, "")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *Controller) ApproveRecovery(ctx *gin.Context,
|
|
userID int64,
|
|
req ente.RecoveryIdentifier) error {
|
|
if req.EmergencyContactID == req.UserID {
|
|
return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "")
|
|
}
|
|
if req.UserID != userID {
|
|
return stacktrace.Propagate(ente.ErrPermissionDenied, "only account owner can reject recovery")
|
|
}
|
|
hasUpdate, err := c.Repo.UpdateRecoveryStatusForID(ctx, req.ID, ente.RecoveryStatusReady)
|
|
if !hasUpdate {
|
|
log.WithField("userID", userID).WithField("req", req).
|
|
Warn("no row updated while rejecting recovery")
|
|
} else {
|
|
go c.sendRecoveryNotification(ctx, req.UserID, req.EmergencyContactID, ente.RecoveryStatusReady, nil)
|
|
}
|
|
if err != nil {
|
|
return stacktrace.Propagate(err, "")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *Controller) StopRecovery(ctx *gin.Context,
|
|
userID int64,
|
|
req ente.RecoveryIdentifier) error {
|
|
if req.EmergencyContactID == req.UserID {
|
|
return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "")
|
|
}
|
|
if req.EmergencyContactID != userID {
|
|
return stacktrace.Propagate(ente.ErrPermissionDenied, "only the emergency contact can stop recovery")
|
|
}
|
|
hasUpdate, err := c.Repo.UpdateRecoveryStatusForID(ctx, req.ID, ente.RecoveryStatusStopped)
|
|
if err != nil {
|
|
return stacktrace.Propagate(err, "")
|
|
}
|
|
if !hasUpdate {
|
|
log.WithField("userID", userID).WithField("req", req).
|
|
Warn("no row updated while stopping recovery")
|
|
} else {
|
|
go c.sendRecoveryNotification(ctx, req.UserID, req.EmergencyContactID, ente.RecoveryStatusStopped, nil)
|
|
}
|
|
return stacktrace.Propagate(err, "")
|
|
}
|