47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/gocql/gocql"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// Delete deletes a user from all tables using batched writes
|
|
func (r *repository) Delete(ctx context.Context, tenantID string, id string) error {
|
|
r.logger.Info("deleting user",
|
|
zap.String("tenant_id", tenantID),
|
|
zap.String("id", id))
|
|
|
|
// First, get the user to retrieve email and created_date for deleting from other tables
|
|
user, err := r.GetByID(ctx, tenantID, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
createdDate := user.CreatedAt.Format("2006-01-02")
|
|
|
|
// Use batched writes to maintain consistency across all tables
|
|
batch := r.session.NewBatch(gocql.LoggedBatch)
|
|
|
|
// Delete from users_by_id table
|
|
batch.Query(`DELETE FROM users_by_id WHERE tenant_id = ? AND id = ?`,
|
|
tenantID, id)
|
|
|
|
// Delete from users_by_email table
|
|
batch.Query(`DELETE FROM users_by_email WHERE tenant_id = ? AND email = ?`,
|
|
tenantID, user.Email)
|
|
|
|
// Delete from users_by_date table
|
|
batch.Query(`DELETE FROM users_by_date WHERE tenant_id = ? AND created_date = ? AND id = ?`,
|
|
tenantID, createdDate, id)
|
|
|
|
// Execute batch atomically
|
|
if err := r.session.ExecuteBatch(batch); err != nil {
|
|
r.logger.Error("failed to delete user", zap.Error(err))
|
|
return err
|
|
}
|
|
|
|
r.logger.Info("user deleted successfully", zap.String("user_id", id))
|
|
return nil
|
|
}
|