nrss/lib/vipps/vipps.ts

98 lines
3.0 KiB
TypeScript

import "jsr:@std/dotenv/load";
import { getHostName } from "../utils.ts";
import { STATUS_CODE } from "$fresh/server.ts";
const config = {
clientId: Deno.env.get("VIPPS_CLIENT_ID"),
clientSecret: Deno.env.get("VIPPS_CLIENT_SECRET"),
ocpApimSubscriptionKeyPrimary: Deno.env.get("VIPPS_OCP_APIM_SUBSCRIPTION_KEY_PRIMARY"),
ocpApimSubscriptionKeySecondary: Deno.env.get("VIPPS_OCM_APIM_SUBSCRIPTION_KEY_SECONDARY"),
testMobileNumber: Deno.env.get("VIPPS_TEST_MOBILE_NUMBER"),
msn: Deno.env.get("VIPPS_MSN"),
baseUrl: Deno.env.get("VIPPS_API_BASE_URL"),
};
// ensure all environment variables are set
for (const [key, value] of Object.entries(config)) {
if (!value) {
throw new Error(`Missing environment variable: ${key}`);
}
}
const standardVippsHeaders = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": config.ocpApimSubscriptionKeyPrimary,
"Merchant-Serial-Number": config.msn,
"Vipps-System-Name": "Krets AS",
} as const;
const getAccessToken = async function () {
console.log(`Fetching ${`${config.baseUrl}/accesstoken/get`}`);
const response = await fetch(`${config.baseUrl}/accesstoken/get`, {
method: "POST",
headers: {
"client_id": config.clientId,
"client_secret": config.clientSecret,
...standardVippsHeaders,
},
});
const data = await response.json();
return data.access_token as string;
};
export const createAgreement = async function (email: string) {
const token = await getAccessToken();
const response = await fetch(`${config.baseUrl}/recurring/v3/agreements/`, {
method: "POST",
headers: {
authorization: `Bearer ${token}`,
"Idempotency-Key": email,
...standardVippsHeaders,
},
body: JSON.stringify({
"interval": {
"unit": "MONTH",
"count": 1,
},
"pricing": {
"suggestedMaxAmount": 5000, // 50,- NOK
"currency": "NOK",
"type": "VARIABLE",
},
"merchantRedirectUrl": `${getHostName()}/donations-success`,
"merchantAgreementUrl": `${getHostName()}/donations`,
"productName": "Månedlig støtte til NRSS",
}),
});
if (response.status === STATUS_CODE.Created) {
const body = response.json();
return body as unknown as {
vippsConfirmationUrl: string;
};
} else {
const errorMessage = `Failed to create Vipps agreement ${response.status} ${await response.text()}`;
console.error(errorMessage);
return new Error(errorMessage);
}
};
export const getAgreement = async function (agreementId: string) {
const token = await getAccessToken();
const response = await fetch(`${config.baseUrl}/recurring/v3/agreements/${agreementId}`, {
headers: {
authorization: `Bearer ${token}`,
...standardVippsHeaders,
},
});
if (response.status === STATUS_CODE.OK) {
return response.json();
} else {
const errorMessage = `Failed to get Vipps agreement ${response.status} ${await response.text()}`;
console.error(errorMessage);
return new Error(errorMessage);
}
};