From 37dc6c7db9ce40f7bae0b7bb2bf12aae99f37749 Mon Sep 17 00:00:00 2001 From: Benedikt Kulmann Date: Wed, 14 Oct 2020 15:50:19 +0200 Subject: [PATCH] Rollback account creation on error --- accounts/pkg/service/v0/accounts.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/accounts/pkg/service/v0/accounts.go b/accounts/pkg/service/v0/accounts.go index e8076365e..1012a1551 100644 --- a/accounts/pkg/service/v0/accounts.go +++ b/accounts/pkg/service/v0/accounts.go @@ -321,7 +321,7 @@ func (s Service) CreateAccount(ctx context.Context, in *proto.CreateAccountReque } indexResults, err := s.index.Add(acc) if err != nil { - // TODO: delete account when failed to add to indices + s.rollbackCreateAccount(ctx, acc) return merrors.InternalServerError(s.id, "could not index new account: %v", err.Error()) } s.log.Debug().Interface("account", acc).Msg("account after indexing") @@ -367,6 +367,18 @@ func (s Service) CreateAccount(ctx context.Context, in *proto.CreateAccountReque return } +// rollbackCreateAccount tries to rollback changes made by `CreateAccount` if parts of it failed. +func (s Service) rollbackCreateAccount(ctx context.Context, acc *proto.Account) { + err := s.index.Delete(acc) + if err != nil { + s.log.Err(err).Msg("failed to rollback account from indices") + } + err = s.repo.DeleteAccount(ctx, acc.Id) + if err != nil { + s.log.Err(err).Msg("failed to rollback account from repo") + } +} + // UpdateAccount implements the AccountsServiceHandler interface // read only fields are ignored // TODO how can we unset specific values? using the update mask