130 lines
3.7 KiB
TypeScript
130 lines
3.7 KiB
TypeScript
import * as v from 'valibot';
|
|
|
|
import {
|
|
accountSchema,
|
|
subscriptionDetailsSchema,
|
|
subscriptionInvoiceSchema,
|
|
subscriptionOptionSchema,
|
|
} from '@/entities';
|
|
import { filteredArray } from '@/entities/utils';
|
|
|
|
import type { PlApiBaseClient } from '@/client-base';
|
|
|
|
const subscriptions = (client: PlApiBaseClient) => ({
|
|
/**
|
|
* Add subscriber or extend existing subscription. Can be used if blockchain integration is not enabled.
|
|
*
|
|
* Requires features{@link Features.subscriptions}.
|
|
* @param subscriberId - The subscriber ID.
|
|
* @param duration - The subscription duration (in seconds).
|
|
*/
|
|
createSubscription: async (subscriberId: string, duration: number) => {
|
|
const response = await client.request('/api/v1/subscriptions', {
|
|
method: 'POST',
|
|
body: { subscriber_id: subscriberId, duration },
|
|
});
|
|
|
|
return v.parse(subscriptionDetailsSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* Get list of subscription options
|
|
*
|
|
* Requires features{@link Features.subscriptions}.
|
|
*/
|
|
getSubscriptionOptions: async () => {
|
|
const response = await client.request('/api/v1/subscriptions/options');
|
|
|
|
return v.parse(filteredArray(subscriptionOptionSchema), response.json);
|
|
},
|
|
|
|
/**
|
|
* Enable subscriptions or update subscription settings
|
|
*
|
|
* Requires features{@link Features.subscriptions}.
|
|
* @param type - Subscription type
|
|
* @param chainId - CAIP-2 chain ID.
|
|
* @param price - Subscription price (only for Monero)
|
|
* @param payoutAddress - Payout address (only for Monero)
|
|
*/
|
|
updateSubscription: async (
|
|
type: 'monero',
|
|
chainId?: string,
|
|
price?: number,
|
|
payoutAddress?: string,
|
|
) => {
|
|
const response = await client.request('/api/v1/subscriptions/options', {
|
|
method: 'POST',
|
|
body: { type, chain_id: chainId, price, payout_address: payoutAddress },
|
|
});
|
|
|
|
return v.parse(accountSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* Find subscription by sender and recipient
|
|
*
|
|
* Requires features{@link Features.subscriptions}.
|
|
* @param senderId - Sender ID.
|
|
* @param recipientId - Recipient ID.
|
|
*/
|
|
findSubscription: async (senderId: string, recipientId: string) => {
|
|
const response = await client.request('/api/v1/subscriptions/find', {
|
|
params: { sender_id: senderId, recipient_id: recipientId },
|
|
});
|
|
|
|
return v.parse(subscriptionDetailsSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* Create invoice
|
|
*
|
|
* Requires features{@link Features.subscriptions}.
|
|
* @param senderId - Sender ID.
|
|
* @param recipientId - Recipient ID.
|
|
* @param chainId - CAIP-2 chain ID.
|
|
* @param amount - Requested payment amount (in atomic units).
|
|
*/
|
|
createInvoice: async (senderId: string, recipientId: string, chainId: string, amount: number) => {
|
|
const response = await client.request('/api/v1/subscriptions/invoices', {
|
|
method: 'POST',
|
|
body: {
|
|
sender_id: senderId,
|
|
recipient_id: recipientId,
|
|
chain_id: chainId,
|
|
amount,
|
|
},
|
|
});
|
|
|
|
return v.parse(subscriptionInvoiceSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* View information about an invoice.
|
|
*
|
|
* Requires features{@link Features.invoices}.
|
|
* @param invoiceId - Invoice ID
|
|
*/
|
|
getInvoice: async (invoiceId: string) => {
|
|
const response = await client.request(`/api/v1/subscriptions/invoices/${invoiceId}`);
|
|
|
|
return v.parse(subscriptionInvoiceSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* Cancel invoice.
|
|
*
|
|
* Requires features{@link Features.invoices}.
|
|
* @param invoiceId - Invoice ID
|
|
*/
|
|
cancelInvoice: async (invoiceId: string) => {
|
|
const response = await client.request(`/api/v1/subscriptions/invoices/${invoiceId}`, {
|
|
method: 'DELETE',
|
|
});
|
|
|
|
return v.parse(subscriptionInvoiceSchema, response.json);
|
|
},
|
|
});
|
|
|
|
export { subscriptions };
|