prettier fix
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
# Billing / Montonio - @kit/montonio
|
||||
|
||||
This package is responsible for handling all billing related operations using Montonio.
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const MontonioClientEnvSchema = z
|
||||
.object({
|
||||
accessKey: z.string().min(1),
|
||||
});
|
||||
export const MontonioClientEnvSchema = z.object({
|
||||
accessKey: z.string().min(1),
|
||||
});
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const MontonioServerEnvSchema = z
|
||||
.object({
|
||||
secretKey: z
|
||||
.string({
|
||||
error: `Please provide the variable MONTONIO_SECRET_KEY`,
|
||||
})
|
||||
.min(1),
|
||||
apiUrl: z
|
||||
.string({
|
||||
error: `Please provide the variable MONTONIO_API_URL`,
|
||||
})
|
||||
.min(1),
|
||||
});
|
||||
export const MontonioServerEnvSchema = z.object({
|
||||
secretKey: z
|
||||
.string({
|
||||
error: `Please provide the variable MONTONIO_SECRET_KEY`,
|
||||
})
|
||||
.min(1),
|
||||
apiUrl: z
|
||||
.string({
|
||||
error: `Please provide the variable MONTONIO_API_URL`,
|
||||
})
|
||||
.min(1),
|
||||
});
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
import jwt from 'jsonwebtoken';
|
||||
import axios, { AxiosError } from 'axios';
|
||||
import jwt from 'jsonwebtoken';
|
||||
|
||||
import { MontonioClientEnvSchema } from '../schema/montonio-client-env.schema';
|
||||
import { MontonioServerEnvSchema } from '../schema/montonio-server-env.schema';
|
||||
|
||||
const clientEnv = () => MontonioClientEnvSchema.parse({
|
||||
accessKey: process.env.NEXT_PUBLIC_MONTONIO_ACCESS_KEY,
|
||||
});
|
||||
const clientEnv = () =>
|
||||
MontonioClientEnvSchema.parse({
|
||||
accessKey: process.env.NEXT_PUBLIC_MONTONIO_ACCESS_KEY,
|
||||
});
|
||||
|
||||
const serverEnv = () => MontonioServerEnvSchema.parse({
|
||||
apiUrl: process.env.MONTONIO_API_URL,
|
||||
secretKey: process.env.MONTONIO_SECRET_KEY,
|
||||
});
|
||||
const serverEnv = () =>
|
||||
MontonioServerEnvSchema.parse({
|
||||
apiUrl: process.env.MONTONIO_API_URL,
|
||||
secretKey: process.env.MONTONIO_SECRET_KEY,
|
||||
});
|
||||
|
||||
export class MontonioOrderHandlerService {
|
||||
public async getMontonioPaymentLink({
|
||||
@@ -45,23 +48,27 @@ export class MontonioOrderHandlerService {
|
||||
returnUrl,
|
||||
askAdditionalInfo: false,
|
||||
merchantReference,
|
||||
type: "one_time",
|
||||
type: 'one_time',
|
||||
};
|
||||
const token = jwt.sign(params, secretKey, {
|
||||
algorithm: "HS256",
|
||||
expiresIn: "10m",
|
||||
algorithm: 'HS256',
|
||||
expiresIn: '10m',
|
||||
});
|
||||
|
||||
try {
|
||||
const { data } = await axios.post(`${apiUrl}/api/payment-links`, { data: token });
|
||||
const { data } = await axios.post(`${apiUrl}/api/payment-links`, {
|
||||
data: token,
|
||||
});
|
||||
return data.url;
|
||||
} catch (error) {
|
||||
if (error instanceof AxiosError) {
|
||||
console.error(error.response?.data);
|
||||
}
|
||||
console.error(`Failed to create payment link, params=${JSON.stringify(params)}`, error);
|
||||
throw new Error("Failed to create payment link");
|
||||
console.error(
|
||||
`Failed to create payment link, params=${JSON.stringify(params)}`,
|
||||
error,
|
||||
);
|
||||
throw new Error('Failed to create payment link');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
import type { BillingWebhookHandlerService, IHandleWebhookEventParams } from '@kit/billing';
|
||||
import jwt from 'jsonwebtoken';
|
||||
|
||||
import type {
|
||||
BillingWebhookHandlerService,
|
||||
IHandleWebhookEventParams,
|
||||
} from '@kit/billing';
|
||||
import { getLogger } from '@kit/shared/logger';
|
||||
import { Database, Enums } from '@kit/supabase/database';
|
||||
import jwt from 'jsonwebtoken';
|
||||
|
||||
import { MontonioServerEnvSchema } from '../schema/montonio-server-env.schema';
|
||||
|
||||
type UpsertOrderParams =
|
||||
@@ -10,20 +15,26 @@ type UpsertOrderParams =
|
||||
type BillingProvider = Enums<{ schema: 'medreport' }, 'billing_provider'>;
|
||||
|
||||
interface MontonioOrderToken {
|
||||
uuid: string;
|
||||
accessKey: string;
|
||||
merchantReference: string;
|
||||
merchantReferenceDisplay: string;
|
||||
paymentStatus: 'PAID' | 'FAILED' | 'CANCELLED' | 'PENDING' | 'EXPIRED' | 'REFUNDED';
|
||||
paymentMethod: string;
|
||||
grandTotal: number;
|
||||
currency: string;
|
||||
senderIban?: string;
|
||||
senderName?: string;
|
||||
paymentProviderName?: string;
|
||||
paymentLinkUuid: string;
|
||||
iat: number;
|
||||
exp: number;
|
||||
uuid: string;
|
||||
accessKey: string;
|
||||
merchantReference: string;
|
||||
merchantReferenceDisplay: string;
|
||||
paymentStatus:
|
||||
| 'PAID'
|
||||
| 'FAILED'
|
||||
| 'CANCELLED'
|
||||
| 'PENDING'
|
||||
| 'EXPIRED'
|
||||
| 'REFUNDED';
|
||||
paymentMethod: string;
|
||||
grandTotal: number;
|
||||
currency: string;
|
||||
senderIban?: string;
|
||||
senderName?: string;
|
||||
paymentProviderName?: string;
|
||||
paymentLinkUuid: string;
|
||||
iat: number;
|
||||
exp: number;
|
||||
}
|
||||
|
||||
const { secretKey } = MontonioServerEnvSchema.parse({
|
||||
@@ -39,22 +50,25 @@ export class MontonioWebhookHandlerService
|
||||
|
||||
async verifyWebhookSignature(request: Request) {
|
||||
const logger = await getLogger();
|
||||
|
||||
|
||||
let token: string;
|
||||
try {
|
||||
const url = new URL(request.url);
|
||||
const searchParams = url.searchParams;
|
||||
console.info("searchParams", searchParams, url);
|
||||
console.info('searchParams', searchParams, url);
|
||||
const tokenParam = searchParams.get('order-token') as string | null;
|
||||
if (!tokenParam) {
|
||||
throw new Error('Missing order-token');
|
||||
}
|
||||
token = tokenParam;
|
||||
} catch (error) {
|
||||
logger.error({
|
||||
error,
|
||||
name: this.namespace,
|
||||
}, `Failed to parse Montonio webhook request`);
|
||||
logger.error(
|
||||
{
|
||||
error,
|
||||
name: this.namespace,
|
||||
},
|
||||
`Failed to parse Montonio webhook request`,
|
||||
);
|
||||
throw new Error('Invalid request');
|
||||
}
|
||||
|
||||
@@ -64,24 +78,30 @@ export class MontonioWebhookHandlerService
|
||||
});
|
||||
return decoded as MontonioOrderToken;
|
||||
} catch (error) {
|
||||
logger.error({
|
||||
error,
|
||||
name: this.namespace,
|
||||
}, `Failed to verify Montonio webhook signature`);
|
||||
logger.error(
|
||||
{
|
||||
error,
|
||||
name: this.namespace,
|
||||
},
|
||||
`Failed to verify Montonio webhook signature`,
|
||||
);
|
||||
throw new Error('Invalid signature');
|
||||
}
|
||||
}
|
||||
|
||||
async handleWebhookEvent(
|
||||
event: MontonioOrderToken,
|
||||
params: IHandleWebhookEventParams
|
||||
params: IHandleWebhookEventParams,
|
||||
) {
|
||||
const logger = await getLogger();
|
||||
|
||||
logger.info({
|
||||
name: this.namespace,
|
||||
event,
|
||||
}, `Received Montonio webhook event`);
|
||||
logger.info(
|
||||
{
|
||||
name: this.namespace,
|
||||
event,
|
||||
},
|
||||
`Received Montonio webhook event`,
|
||||
);
|
||||
|
||||
if (event.paymentStatus === 'PAID') {
|
||||
const [accountId] = event.merchantReferenceDisplay.split(':');
|
||||
@@ -101,11 +121,13 @@ export class MontonioWebhookHandlerService
|
||||
return params.onCheckoutSessionCompleted(order);
|
||||
}
|
||||
|
||||
if (event.paymentStatus === 'FAILED' || event.paymentStatus === 'CANCELLED') {
|
||||
if (
|
||||
event.paymentStatus === 'FAILED' ||
|
||||
event.paymentStatus === 'CANCELLED'
|
||||
) {
|
||||
return params.onPaymentFailed(event.uuid);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user