public IActionResult RetrievePayment([FromBody] String parameters)
        {
            var traceId    = Guid.NewGuid().ToString();
            var customerId = "0815"; // TODO: get somehow from retrievePaymentPayload
            var amount     = 15;     // TODO get somehow from retrievePaymentPayload

            SemaphoreSlim semaphore = new SemaphoreSlim(1);

            semaphore.Wait(); // aqcuire and release later if everything is done
            semaphors.Add(traceId, semaphore);
            ChargeCreditCard(traceId, customerId, amount);
            ExternalTaskWorker semaphoreWorker = startSempahoreWorker(traceId);

            var result = new Dictionary <String, String>();

            result.Add("traceId", traceId);
            if (semaphore.Wait(TimeSpan.FromMilliseconds(500)))
            {
                semaphoreWorker.StopWork();
                result.Add("status", "completed");
                return(Ok(result)); // HTTP 200
            }
            else
            {
                semaphoreWorker.StopWork();
                result.Add("status", "pending");
                return(Accepted(result)); // HTTP 202
            }
        }