diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/OneTimeDonationController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/OneTimeDonationController.java index 3e59fba89..1a1c52f24 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/OneTimeDonationController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/OneTimeDonationController.java @@ -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) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/OneTimeDonationsGrpcService.java b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/OneTimeDonationsGrpcService.java index fc1d77a6c..e67fd275f 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/OneTimeDonationsGrpcService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/OneTimeDonationsGrpcService.java @@ -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) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/OneTimeDonationsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/OneTimeDonationsManager.java index afbaa4022..95e97b0bf 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/OneTimeDonationsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/OneTimeDonationsManager.java @@ -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; } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/OnetimeDonationsManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/OnetimeDonationsManagerTest.java index f73dec637..60abf6626 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/OnetimeDonationsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/OnetimeDonationsManagerTest.java @@ -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); } }