diff --git a/pkg/application/evaluation_project/project_service.go b/pkg/application/evaluation_project/project_service.go index 20c11d0..10076c0 100644 --- a/pkg/application/evaluation_project/project_service.go +++ b/pkg/application/evaluation_project/project_service.go @@ -2,6 +2,7 @@ package service import ( "fmt" + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/xredis" "strconv" "strings" "time" @@ -501,6 +502,15 @@ func (rs *EvaluationProjectService) List(in *command.QueryProjectCommand) (inter } func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand) (interface{}, error) { + lock := xredis.NewLockProjectId(int(in.Id)) + err := lock.Lock() + if err != nil { + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) + } + defer func() { + lock.UnLock() + }() + transactionContext, err := factory.ValidateStartTransaction(in) if err != nil { return nil, err diff --git a/pkg/infrastructure/xredis/redis_lock_project.go b/pkg/infrastructure/xredis/redis_lock_project.go new file mode 100644 index 0000000..fe7bb0b --- /dev/null +++ b/pkg/infrastructure/xredis/redis_lock_project.go @@ -0,0 +1,26 @@ +package xredis + +import ( + "fmt" + + "github.com/go-redsync/redsync/v4" +) + +type LockProjectId struct { + m *redsync.Mutex +} + +func NewLockProjectId(id int) *LockProjectId { + key := fmt.Sprintf("performance:project_id:%d", id) + return &LockProjectId{ + m: rsync.NewMutex(key), + } +} + +func (lk *LockProjectId) Lock() error { + return lk.m.Lock() +} + +func (lk *LockProjectId) UnLock() (bool, error) { + return lk.m.Unlock() +}