diff --git a/lightspark-sdk/src/commonJvmAndroidMain/kotlin/com/lightspark/sdk/LightsparkFuturesClient.kt b/lightspark-sdk/src/commonJvmAndroidMain/kotlin/com/lightspark/sdk/LightsparkFuturesClient.kt index 6349e90e..81e51d48 100644 --- a/lightspark-sdk/src/commonJvmAndroidMain/kotlin/com/lightspark/sdk/LightsparkFuturesClient.kt +++ b/lightspark-sdk/src/commonJvmAndroidMain/kotlin/com/lightspark/sdk/LightsparkFuturesClient.kt @@ -827,6 +827,25 @@ class LightsparkFuturesClient(config: ClientConfig) { fun setBitcoinNetwork(network: BitcoinNetwork) { defaultBitcoinNetwork = network } + + /** + * Creates an UMA invitation with payment. + * + * @param inviterUma The UMA of the inviter. + * @param paymentAmount The payment amount. + * @param paymentCurrency The payment currency input. + * @param expiresAt The expiration date/time (ISO8601 string). + * @return The invitation that was created. + */ + fun createUmaInvitationWithPayment( + inviterUma: String, + paymentAmount: Long, + paymentCurrency: PaymentCurrencyInput, + expiresAt: String, + ): CompletableFuture = + coroutineScope.future { + coroutinesClient.createUmaInvitationWithPayment(inviterUma, paymentAmount, paymentCurrency, expiresAt) + } } fun Query.execute(client: LightsparkFuturesClient): CompletableFuture = client.executeQuery(this) diff --git a/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/LightsparkCoroutinesClient.kt b/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/LightsparkCoroutinesClient.kt index 68b9fbba..df6ea6da 100644 --- a/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/LightsparkCoroutinesClient.kt +++ b/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/LightsparkCoroutinesClient.kt @@ -1272,6 +1272,41 @@ class LightsparkCoroutinesClient private constructor( ) } + /** + * Creates an UMA invitation with payment. + * + * @param inviterUma The UMA of the inviter. + * @param paymentAmount The payment amount. + * @param paymentCurrency The payment currency input. + * @param expiresAt The expiration date/time (ISO8601 string). + * @return The invitation that was created. + */ + suspend fun createUmaInvitationWithPayment( + inviterUma: String, + paymentAmount: Long, + paymentCurrency: PaymentCurrencyInput, + expiresAt: String, + ): UmaInvitation { + requireValidAuth() + return executeQuery( + Query( + CreateUmaInvitationWithPayment, + { + add("inviter_uma", inviterUma) + add("payment_amount", paymentAmount) + add("payment_currency", serializerFormat.encodeToJsonElement(paymentCurrency)) + add("expires_at", expiresAt) + }, + ) { + val outputJson = + requireNotNull(it["create_uma_invitation_with_payment"]) { "No invitation output found in response" } + val invitationJson = + requireNotNull(outputJson.jsonObject["invitation"]) { "No invitation found in response" } + serializerFormat.decodeFromJsonElement(invitationJson) + }, + ) + } + /** * Claims an UMA invitation. If you are part of the incentive program, you should use * [claimUmaInvitationWithIncentives]. diff --git a/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/LightsparkSyncClient.kt b/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/LightsparkSyncClient.kt index 99b0b624..4cb5c7db 100644 --- a/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/LightsparkSyncClient.kt +++ b/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/LightsparkSyncClient.kt @@ -720,6 +720,25 @@ class LightsparkSyncClient constructor(config: ClientConfig) { asyncClient.createUmaInvitationWithIncentives(inviterUma, inviterPhoneNumberE164, inviterRegionCode) } + /** + * Creates an UMA invitation with payment. + * + * @param inviterUma The UMA of the inviter. + * @param paymentAmount The payment amount. + * @param paymentCurrency The payment currency input. + * @param expiresAt The expiration date/time (ISO8601 string). + * @return The invitation that was created. + */ + @Throws(LightsparkException::class, LightsparkAuthenticationException::class, CancellationException::class) + fun createUmaInvitationWithPayment( + inviterUma: String, + paymentAmount: Long, + paymentCurrency: PaymentCurrencyInput, + expiresAt: String, + ): UmaInvitation = runBlocking { + asyncClient.createUmaInvitationWithPayment(inviterUma, paymentAmount, paymentCurrency, expiresAt) + } + /** * Claims an UMA invitation. If you are part of the incentive program, you should use * [claimUmaInvitationWithIncentives]. diff --git a/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/graphql/CreateUmaInvitationWithPayment.kt b/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/graphql/CreateUmaInvitationWithPayment.kt new file mode 100644 index 00000000..b2b55fee --- /dev/null +++ b/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/graphql/CreateUmaInvitationWithPayment.kt @@ -0,0 +1,25 @@ +package com.lightspark.sdk.graphql + +import com.lightspark.sdk.model.UmaInvitation + +const val CreateUmaInvitationWithPayment = """ + mutation CreateUmaInvitationWithPayment( + ${'$'}inviter_uma: String! + ${'$'}payment_amount: Long! + ${'$'}payment_currency: PaymentCurrencyInput! + ${'$'}expires_at: DateTime! + ) { + create_uma_invitation_with_payment(input: { + inviter_uma: ${'$'}inviter_uma + payment_amount: ${'$'}payment_amount + payment_currency: ${'$'}payment_currency + expires_at: ${'$'}expires_at + }) { + invitation { + ...UmaInvitationFragment + } + } + } + +${UmaInvitation.FRAGMENT} +""" \ No newline at end of file diff --git a/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/model/PaymentCurrencyInput.kt b/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/model/PaymentCurrencyInput.kt new file mode 100644 index 00000000..b88921c6 --- /dev/null +++ b/lightspark-sdk/src/commonMain/kotlin/com/lightspark/sdk/model/PaymentCurrencyInput.kt @@ -0,0 +1,19 @@ +package com.lightspark.sdk.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * @param code The currency code (e.g., "USD", "BTC"). + * @param symbol The currency symbol (e.g., "$", "₿"). + * @param name The full name of the currency (e.g., "US Dollar"). + * @param decimals The number of decimal places for the currency. + */ +@Serializable +@SerialName("PaymentCurrencyInput") +data class PaymentCurrencyInput( + val code: String, + val symbol: String, + val name: String, + val decimals: Int +) \ No newline at end of file