mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 14:34:23 +01:00
(Feat) : Allowed updating payment requests as settled
Signed-off-by: Abhijay jain <Abhijay007j@gmail.com>
This commit is contained in:
@@ -465,6 +465,48 @@ namespace BTCPayServer.Controllers
|
|||||||
return NotFound();
|
return NotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpPost("{payReqId}/changestate/{newState}")]
|
||||||
|
[Authorize(AuthenticationSchemes = AuthenticationSchemes.Cookie, Policy = Policies.CanModifyPaymentRequests)]
|
||||||
|
public async Task<IActionResult> ChangePaymentRequestState(string payReqId, string newState)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(payReqId) || string.IsNullOrWhiteSpace(newState))
|
||||||
|
{
|
||||||
|
return BadRequest("Invalid parameters");
|
||||||
|
}
|
||||||
|
|
||||||
|
var paymentRequest = await _PaymentRequestRepository.FindPaymentRequest(payReqId, GetUserId());
|
||||||
|
var model = new PaymentRequestStateChangeModel();
|
||||||
|
if (paymentRequest == null)
|
||||||
|
{
|
||||||
|
model.NotFound = true;
|
||||||
|
return NotFound(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newState == "completed")
|
||||||
|
{
|
||||||
|
await _PaymentRequestRepository.UpdatePaymentRequestStatus(payReqId, PaymentRequestStatus.Completed);
|
||||||
|
model.StatusString = "Settled";
|
||||||
|
}
|
||||||
|
else if (newState == "expired")
|
||||||
|
{
|
||||||
|
await _PaymentRequestRepository.UpdatePaymentRequestStatus(payReqId, PaymentRequestStatus.Expired);
|
||||||
|
model.StatusString = "Expired";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return BadRequest($"Invalid state: {newState}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Json(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PaymentRequestStateChangeModel
|
||||||
|
{
|
||||||
|
public bool NotFound { get; set; }
|
||||||
|
public string? StatusString { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private string GetUserId() => _UserManager.GetUserId(User);
|
private string GetUserId() => _UserManager.GetUserId(User);
|
||||||
|
|
||||||
private StoreData GetCurrentStore() => HttpContext.GetStoreData();
|
private StoreData GetCurrentStore() => HttpContext.GetStoreData();
|
||||||
|
|||||||
@@ -114,7 +114,21 @@
|
|||||||
@item.ReferenceId
|
@item.ReferenceId
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span class="badge badge-@item.Status.ToLower() status-badge">@item.Status</span>
|
@if (item.IsPending)
|
||||||
|
{
|
||||||
|
<div class="badge badge-@item.Status.ToLower() status-badge" data-payment-request-state-badge="@item.Id">
|
||||||
|
<span class="dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" style="cursor:pointer;">
|
||||||
|
@item.Status
|
||||||
|
</span>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<button type="button" class="dropdown-item lh-base" data-payment-request-id="@item.Id" data-new-state="completed">Mark as settled</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<span class="badge badge-@item.Status.ToLower() status-badge">@item.Status</span>
|
||||||
|
}
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end">
|
<td class="text-end">
|
||||||
<span data-sensitive>@item.AmountFormatted</span>
|
<span data-sensitive>@item.AmountFormatted</span>
|
||||||
@@ -154,3 +168,7 @@ else
|
|||||||
There are no payment requests matching your criteria.
|
There are no payment requests matching your criteria.
|
||||||
</p>
|
</p>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
window.storeId = '@storeId';
|
||||||
|
</script>
|
||||||
@@ -277,6 +277,23 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Payment Request Status
|
||||||
|
delegate('click', '[data-payment-request-state-badge] [data-payment-request-id][data-new-state]', async e => {
|
||||||
|
const $button = e.target
|
||||||
|
const $badge = $button.closest('[data-payment-request-state-badge]')
|
||||||
|
const { paymentRequestId, newState } = $button.dataset
|
||||||
|
|
||||||
|
$badge.classList.add('pe-none'); // disable further interaction
|
||||||
|
const response = await fetch(`${baseUrl}/payment-requests/${paymentRequestId}/changestate/${newState}`, { method: 'POST' })
|
||||||
|
if (response.ok) {
|
||||||
|
const { statusString } = await response.json()
|
||||||
|
$badge.outerHTML = `<div class="badge badge-${newState}" data-payment-request-state-badge="${paymentRequestId}">${statusString}</div>`
|
||||||
|
} else {
|
||||||
|
$badge.classList.remove('pe-none');
|
||||||
|
alert("Payment request state update failed");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Time Format
|
// Time Format
|
||||||
delegate('click', '.switch-time-format', switchTimeFormat);
|
delegate('click', '.switch-time-format', switchTimeFormat);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user