From 6e5e0fc8055c5f4cb3d9a9b899621914643faa35 Mon Sep 17 00:00:00 2001 From: Nikolai Rodionov Date: Wed, 10 Jun 2026 13:58:02 +0200 Subject: [PATCH] Add a method to validate email Signed-off-by: Nikolai Rodionov --- go.mod | 2 +- go.sum | 4 ++-- internal/api/v1/public_accounts.go | 9 +++++++++ internal/repository/accounts.go | 8 ++++---- internal/services/accounts.go | 12 ++++++++++++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index e44ad03..5d7a209 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( ) require ( - gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260609122010-15a8c9529644 + gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260610114950-df5bcd10e457 github.com/golang/protobuf v1.5.4 golang.org/x/net v0.51.0 // indirect golang.org/x/sys v0.42.0 // indirect diff --git a/go.sum b/go.sum index fbc3fbd..406e561 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260609122010-15a8c9529644 h1:PSLGU8NVSfAi7EZwIbrLZO0AYrx5N8aMAAW3B7kkhRc= -gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260609122010-15a8c9529644/go.mod h1:EcQEZ3NN06b3UmKxiRnQnXDDjQ9kmJgoQQBAS+fpRQw= +gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260610114950-df5bcd10e457 h1:eHSzKHcFTyJUVB3z640DgFcFUwAzui17ooAoStBAqlA= +gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260610114950-df5bcd10e457/go.mod h1:EcQEZ3NN06b3UmKxiRnQnXDDjQ9kmJgoQQBAS+fpRQw= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= diff --git a/internal/api/v1/public_accounts.go b/internal/api/v1/public_accounts.go index a59c669..a043a0a 100644 --- a/internal/api/v1/public_accounts.go +++ b/internal/api/v1/public_accounts.go @@ -105,3 +105,12 @@ func (a *PublicAccountService) SignUp(ctx context.Context, in *accounts.SignUpRe }, }, nil } + +// Check if an email is already used by an account +func (a *PublicAccountService) IsEmailAvailable(ctx context.Context, in *accounts.IsEmailUsedRequest) (*accounts.IsEmailUsedResponse, error) { + exists, err := a.accountsCtrl.IsExist(ctx, in.GetEmail()) + if err != nil { + return nil, status.Error(codes.Aborted, "Couldn't check email availability") + } + return &accounts.IsEmailUsedResponse{Used: exists}, nil +} diff --git a/internal/repository/accounts.go b/internal/repository/accounts.go index 77e85e5..5ad66a1 100644 --- a/internal/repository/accounts.go +++ b/internal/repository/accounts.go @@ -64,15 +64,15 @@ func GetUUIDForEmail(ctx context.Context, db *sql.DB, email string) (uuid string return } -// IsAccountExist checks if an account with a UUID exists in the db -func IsAccountExist(ctx context.Context, db *sql.DB, uuid string) (bool, error) { +// IsAccountExist checks if an account with an email exists in the db +func IsAccountExist(ctx context.Context, db *sql.DB, email string) (bool, error) { exists := false err := db.QueryRowContext( ctx, `SELECT EXISTS( - SELECT 1 FROM accounts WHERE uuid = $1 + SELECT 1 FROM accounts WHERE email = $1 )`, - uuid, + email, ).Scan(&exists) return exists, err } diff --git a/internal/services/accounts.go b/internal/services/accounts.go index fc814c2..821d5f8 100644 --- a/internal/services/accounts.go +++ b/internal/services/accounts.go @@ -105,3 +105,15 @@ func (c *AccountController) Login(ctx context.Context, email, password string) ( return uuid, nil } + +func (c *AccountController) IsExist(ctx context.Context, email string) (bool, error) { + log := logger.FromContext(ctx) + log.V(2).Info("Checking if an account with email exists") + + exists, err := repository.IsAccountExist(ctx, c.DB, email) + if err != nil { + return false, ErrServerError + } + + return exists, nil +}