From 1611f9ede79bc3e4a69e5b1ad72aea0a4b91e89e Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Thu, 22 Aug 2019 00:44:57 +0200 Subject: [PATCH] Add module-name uniqueness check --- api/messaging/spec.json | 2 +- compose/internal/repository/module.go | 31 ++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/api/messaging/spec.json b/api/messaging/spec.json index 0e909e3c5..9592e0538 100644 --- a/api/messaging/spec.json +++ b/api/messaging/spec.json @@ -418,7 +418,7 @@ } ] }, - { + {i "title": "Messages", "path": "/channels/{channelID}/messages", "parameters": { diff --git a/compose/internal/repository/module.go b/compose/internal/repository/module.go index 35fa0ee1a..856243737 100644 --- a/compose/internal/repository/module.go +++ b/compose/internal/repository/module.go @@ -3,6 +3,7 @@ package repository import ( "context" "fmt" + "strings" "time" "github.com/jmoiron/sqlx" @@ -31,7 +32,8 @@ type ( ) const ( - ErrModuleNotFound = repositoryError("ModuleNotFound") + ErrModuleNotFound = repositoryError("ModuleNotFound") + ErrModuleNameNotUnique = repositoryError("ModuleNameNotUnique") ) func Module(ctx context.Context, db *factory.DB) ModuleRepository { @@ -116,6 +118,10 @@ func (r module) Find(filter types.ModuleFilter) (set types.ModuleSet, f types.Mo func (r module) Create(mod *types.Module) (*types.Module, error) { var err error + if err = r.checkName(mod.NamespaceID, 0, mod.Name); err != nil { + return nil, err + } + mod.ID = factory.Sonyflake.NextID() mod.CreatedAt = time.Now().Truncate(time.Second) @@ -131,6 +137,10 @@ func (r module) Create(mod *types.Module) (*types.Module, error) { } func (r module) Update(mod *types.Module) (*types.Module, error) { + if err := r.checkName(mod.NamespaceID, 0, mod.Name); err != nil { + return nil, err + } + now := time.Now().Truncate(time.Second) mod.UpdatedAt = &now @@ -235,3 +245,22 @@ func (r module) FindFields(moduleIDs ...uint64) (ff types.ModuleFieldSet, err er return ff, r.db().Select(&ff, sql, args...) } } + +// Checks if there is another module in the namespace with the same name +func (r module) checkName(namespaceID, moduleID uint64, name string) error { + mm, f, err := r.Find(types.ModuleFilter{ + NamespaceID: namespaceID, + Name: name, + PerPage: 1, + }) + + if err != nil { + return err + } + + if f.Count == 0 || mm.FindByID(moduleID) == nil { + return nil + } + + return ErrModuleNameNotUnique +}