Fix resubscription of servers with failed payments (#3696)

* Fix resubscription of servers with failed payments

Resolves MOD-55

* run fix
This commit is contained in:
Emma Alexia
2025-05-25 15:36:14 -04:00
committed by GitHub
parent dc0d923cee
commit 84adf79564
2 changed files with 34 additions and 6 deletions

View File

@@ -361,7 +361,14 @@
"
color="green"
>
<button @click="resubscribePyro(subscription.id)">
<button
@click="
resubscribePyro(
subscription.id,
$dayjs(getPyroCharge(subscription).due).isBefore($dayjs()),
)
"
>
Resubscribe <RightArrowIcon />
</button>
</ButtonStyled>
@@ -1098,7 +1105,7 @@ async function fetchCapacityStatuses(serverId, product) {
}
}
const resubscribePyro = async (subscriptionId) => {
const resubscribePyro = async (subscriptionId, wasSuspended) => {
try {
await useBaseFetch(`billing/subscription/${subscriptionId}`, {
internal: true,
@@ -1108,6 +1115,21 @@ const resubscribePyro = async (subscriptionId) => {
},
});
await refresh();
if (wasSuspended) {
data.$notify({
group: "main",
title: "Resubscription request submitted",
text: "If the server is currently suspended, it may take up to 10 minutes for another charge attempt to be made.",
type: "success",
});
} else {
data.$notify({
group: "main",
title: "Success",
text: "Server subscription resubscribed successfully",
type: "success",
});
}
} catch {
data.$notify({
group: "main",

View File

@@ -16,7 +16,7 @@ use crate::queue::session::AuthQueue;
use crate::routes::ApiError;
use actix_web::{HttpRequest, HttpResponse, delete, get, patch, post, web};
use ariadne::ids::base62_impl::{parse_base62, to_base62};
use chrono::Utc;
use chrono::{Duration, Utc};
use rust_decimal::Decimal;
use rust_decimal::prelude::ToPrimitive;
use serde::Serialize;
@@ -366,9 +366,12 @@ pub async fn edit_subscription(
})?;
if let Some(cancelled) = &edit_subscription.cancelled {
if open_charge.status != ChargeStatus::Open
&& open_charge.status != ChargeStatus::Cancelled
{
if !matches!(
open_charge.status,
ChargeStatus::Open
| ChargeStatus::Cancelled
| ChargeStatus::Failed
) {
return Err(ApiError::InvalidInput(
"You may not change the status of this subscription!"
.to_string(),
@@ -377,6 +380,9 @@ pub async fn edit_subscription(
if *cancelled {
open_charge.status = ChargeStatus::Cancelled;
} else if open_charge.status == ChargeStatus::Failed {
// Force another resubscription attempt
open_charge.last_attempt = Some(Utc::now() - Duration::days(2));
} else {
open_charge.status = ChargeStatus::Open;
}