Tag OneTimeDonationsManager metric with provider

This commit is contained in:
Ravi Khadiwala
2026-08-05 13:19:46 -05:00
committed by ravi-signal
parent 8c86e2e5ef
commit cbc89f541c
4 changed files with 10 additions and 6 deletions
@@ -389,7 +389,7 @@ public class OneTimeDonationController {
} catch (WriteConflictException _) {
throw new WebApplicationException(Response.Status.CONFLICT);
}
final Instant paidAt = oneTimeDonationsManager.getPaidAt(paymentDetails.id(), paymentDetails.created());
final Instant paidAt = oneTimeDonationsManager.getPaidAt(request.processor, paymentDetails.id(), paymentDetails.created());
final Instant expiration = paidAt
.plus(levelDetails.levelExpiration())
.truncatedTo(ChronoUnit.DAYS)
@@ -311,7 +311,7 @@ public class OneTimeDonationsGrpcService extends SimpleOneTimeDonationsGrpc.OneT
.setReceiptAlreadyIssued(FailedPrecondition.getDefaultInstance()).build();
}
final Instant paidAt = oneTimeDonationsManager.getPaidAt(paymentDetails.id(), paymentDetails.created());
final Instant paidAt = oneTimeDonationsManager.getPaidAt(processor, paymentDetails.id(), paymentDetails.created());
final Instant expiration = paidAt
.plus(levelDetails.levelExpiration())
.truncatedTo(ChronoUnit.DAYS)
@@ -13,12 +13,15 @@ import java.time.Instant;
import java.util.Map;
import java.util.Objects;
import javax.annotation.Nonnull;
import io.micrometer.core.instrument.Tags;
import org.whispersystems.textsecuregcm.subscriptions.PaymentProvider;
import org.whispersystems.textsecuregcm.util.AttributeValues;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
import software.amazon.awssdk.services.dynamodb.model.GetItemResponse;
import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;
/// Tracks when a payment intent actually becomes paid. May be updated externally by a webhook from the payment provider.
public class OneTimeDonationsManager {
public static final String KEY_PAYMENT_ID = "P"; // S
public static final String ATTR_PAID_AT = "A"; // N
@@ -38,7 +41,7 @@ public class OneTimeDonationsManager {
this.dynamoDbClient = Objects.requireNonNull(dynamoDbClient);
}
public Instant getPaidAt(final String paymentId, final Instant fallbackTimestamp) {
public Instant getPaidAt(final PaymentProvider paymentProvider, final String paymentId, final Instant fallbackTimestamp) {
final GetItemRequest getItemRequest = GetItemRequest.builder()
.consistentRead(Boolean.TRUE)
.tableName(table)
@@ -48,7 +51,7 @@ public class OneTimeDonationsManager {
final GetItemResponse getItemResponse = dynamoDbClient.getItem(getItemRequest);
if (!getItemResponse.hasItem()) {
Metrics.counter(ONETIME_DONATION_NOT_FOUND_COUNTER_NAME).increment();
Metrics.counter(ONETIME_DONATION_NOT_FOUND_COUNTER_NAME, Tags.of("processor", paymentProvider.name())).increment();
return fallbackTimestamp;
}
@@ -12,6 +12,7 @@ import java.time.Instant;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.whispersystems.textsecuregcm.subscriptions.PaymentProvider;
public class OnetimeDonationsManagerTest {
@RegisterExtension
@@ -33,7 +34,7 @@ public class OnetimeDonationsManagerTest {
final Instant fallBackTimestamp = Instant.ofEpochSecond(2_000_000);
oneTimeDonationsManager.putPaidAt(validPaymentIntentId, paidAt);
assertThat(oneTimeDonationsManager.getPaidAt(validPaymentIntentId, fallBackTimestamp)).isEqualTo(paidAt);
assertThat(oneTimeDonationsManager.getPaidAt("invalidPaymentId", fallBackTimestamp)).isEqualTo(fallBackTimestamp);
assertThat(oneTimeDonationsManager.getPaidAt(PaymentProvider.STRIPE, validPaymentIntentId, fallBackTimestamp)).isEqualTo(paidAt);
assertThat(oneTimeDonationsManager.getPaidAt(PaymentProvider.STRIPE, "invalidPaymentId", fallBackTimestamp)).isEqualTo(fallBackTimestamp);
}
}