Files
creator-hub/cmd/control-plane/account_deletion.go
T

116 lines
3.8 KiB
Go

package main
import (
"context"
"errors"
"net/http"
"time"
"github.com/gofiber/fiber/v3"
"git.ipao.vip/rogee/creator-hub/internal/creator"
"git.ipao.vip/rogee/creator-hub/internal/hub"
"git.ipao.vip/rogee/creator-hub/internal/phasea"
)
func registerAccountDeletion(app *fiber.App, phaseAStore *phasea.Store, hubStore *hub.Store, creatorStore *creator.Store, credentials phasea.CredentialBridge) {
app.Delete("/api/phase-a/accounts/:id", func(c fiber.Ctx) error {
accountID := c.Params("id")
if err := phaseAStore.CheckAccountDeletion(c.Context(), accountID); err != nil {
return phaseAError(c, err)
}
if err := creatorStore.CheckOwnedAccountDeletion(c.Context(), accountID); err != nil {
return creatorError(c, err)
}
environment, hasEnvironment, err := accountEnvironment(c.Context(), hubStore, accountID)
if err != nil {
return hubError(c, err)
}
unlock := func() {}
if hasEnvironment {
aliases := []string{environment.Alias}
exitIDs := []string{}
if environment.Exit.ID != "" {
exitIDs = append(exitIDs, environment.Exit.ID)
}
browserVersions := []string{}
if environment.BrowserVersion != "" {
browserVersions = append(browserVersions, environment.BrowserVersion)
}
unlock, err = hubStore.LockResources(c.Context(), aliases, exitIDs, browserVersions)
if err != nil {
return hubError(c, err)
}
defer unlock()
gateway, gatewayErr := hubStore.GetGateway(c.Context(), environment.Gateway)
if gatewayErr != nil {
return hubError(c, gatewayErr)
}
if err := creatorStore.InvalidateListener(c.Context(), accountID, "账号删除"); err != nil {
return creatorError(c, err)
}
if _, err := removeGatewayRuntime(c.Context(), hubStore, gateway, environment); err != nil {
return hubError(c, err)
}
if err := purgeAccountProfile(c.Context(), gateway, environment); err != nil {
return hubError(c, err)
}
}
if err := phaseAStore.DeleteAccountData(c.Context(), accountID); err != nil {
return phaseAError(c, err)
}
if err := creatorStore.DeleteOwnedAccountData(c.Context(), accountID); err != nil {
return creatorError(c, err)
}
if hasEnvironment {
if err := hubStore.DeleteAccountEnvironment(c.Context(), accountID); err != nil {
return hubError(c, err)
}
}
if err := phaseAStore.DeleteAccount(c.Context(), accountID, credentials); err != nil {
return phaseAError(c, err)
}
return c.SendStatus(fiber.StatusNoContent)
})
app.Delete("/api/creator/competitors/:id", func(c fiber.Ctx) error {
if err := creatorStore.DeleteCompetitor(c.Context(), c.Params("id")); err != nil {
return creatorError(c, err)
}
return c.SendStatus(fiber.StatusNoContent)
})
}
type environmentContextStore interface {
GetEnvironmentContextForAccount(context.Context, string) (hub.EnvironmentContext, error)
}
func accountEnvironment(ctx context.Context, store environmentContextStore, accountID string) (hub.EnvironmentContext, bool, error) {
if store == nil {
return hub.EnvironmentContext{}, false, creator.ErrUnavailable
}
environment, err := store.GetEnvironmentContextForAccount(ctx, accountID)
if errors.Is(err, hub.ErrNotFound) {
return hub.EnvironmentContext{}, false, nil
}
if err != nil {
return hub.EnvironmentContext{}, false, err
}
return environment, true, nil
}
func purgeAccountProfile(ctx context.Context, gateway hub.Gateway, environment hub.EnvironmentContext) error {
payload := gatewayCleanupGenerationPayload(environment)
payload["purge_profile"] = true
status, body, err := gatewayCall(ctx, gateway, http.MethodDelete, "/v1/browsers/"+environment.Alias, payload, 30*time.Second)
if err != nil {
return gatewayUnreachable(err)
}
if status == http.StatusNoContent || status == http.StatusNotFound {
return nil
}
return gatewayRejected(status, body)
}