From 5d1ac326eae6071098f6936d7bfb210e5fad42f4 Mon Sep 17 00:00:00 2001 From: Johan Siebens Date: Tue, 6 Feb 2024 21:39:30 +0100 Subject: [PATCH] fix: check if tailnet with name already exists --- internal/domain/repository.go | 1 + internal/domain/tailnet.go | 15 +++++++++++++++ internal/service/tailnet.go | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/internal/domain/repository.go b/internal/domain/repository.go index b8a8ec9..5e618e9 100644 --- a/internal/domain/repository.go +++ b/internal/domain/repository.go @@ -27,6 +27,7 @@ type Repository interface { SaveTailnet(ctx context.Context, tailnet *Tailnet) error GetTailnet(ctx context.Context, id uint64) (*Tailnet, error) + GetTailnetByName(ctx context.Context, name string) (*Tailnet, error) ListTailnets(ctx context.Context) ([]Tailnet, error) DeleteTailnet(ctx context.Context, id uint64) error diff --git a/internal/domain/tailnet.go b/internal/domain/tailnet.go index b04cc8a..2fdcc11 100644 --- a/internal/domain/tailnet.go +++ b/internal/domain/tailnet.go @@ -72,6 +72,21 @@ func (r *repository) GetTailnet(ctx context.Context, id uint64) (*Tailnet, error return &t, nil } +func (r *repository) GetTailnetByName(ctx context.Context, name string) (*Tailnet, error) { + var t Tailnet + tx := r.withContext(ctx).Take(&t, "name = ?", name) + + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { + return nil, nil + } + + if tx.Error != nil { + return nil, tx.Error + } + + return &t, nil +} + func (r *repository) ListTailnets(ctx context.Context) ([]Tailnet, error) { var tailnets = []Tailnet{} tx := r.withContext(ctx).Find(&tailnets) diff --git a/internal/service/tailnet.go b/internal/service/tailnet.go index 295d717..f6d81f1 100644 --- a/internal/service/tailnet.go +++ b/internal/service/tailnet.go @@ -43,6 +43,14 @@ func (s *Service) CreateTailnet(ctx context.Context, req *connect.Request[api.Cr return nil, connect.NewError(connect.CodePermissionDenied, fmt.Errorf("permission denied")) } + check, err := s.repository.GetTailnetByName(ctx, req.Msg.Name) + if err != nil { + return nil, logError(err) + } + if check != nil { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("tailnet with name '%s' already exists", req.Msg.Name)) + } + if req.Msg.IamPolicy == nil { req.Msg.IamPolicy = defaults.DefaultIAMPolicy() }