package routers import ( "net/http" tasks "queues-go/app/storage/mongo/collections" "sync" ) type TaskResponse struct { Id string `json:"id"` Attempt int `json:"attempt"` Payload interface{} `json:"payload"` } type TakeResponse struct { Task *TaskResponse `json:"task"` } var MutexMap map[string]*sync.Mutex func Take(r *http.Request) (interface{}, int) { queue := r.Header.Get("queue") mutex, ok := MutexMap[queue] if !ok { mutex = &sync.Mutex{} MutexMap[queue] = mutex } mutex.Lock() task, err := tasks.Take(queue) mutex.Unlock() if err != nil { return nil, http.StatusInternalServerError } var response TakeResponse if task == nil { response.Task = nil } else { response.Task = &TaskResponse{ Id: task.Id.Hex(), Attempt: task.Attempts, Payload: task.Payload, } } return response, http.StatusOK }