Files
ncd-fe/packages/pl-api/lib/client/subscriptions.ts
nicole mikołajczyk a4dd5e0358 pl-api: reimport TypeObject, need to eep
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2026-02-27 02:32:38 +01:00

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 };