Paypal integration improvements

This commit is contained in:
Joao Ramos
2024-03-07 11:18:48 +00:00
parent 0cff310354
commit 330c177ff9
4 changed files with 125 additions and 85 deletions

View File

@@ -49,79 +49,89 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
"PayPal-Client-Metadata-Id": trackingId,
},
};
const request = await axios.post(url, {}, headers);
axios
.post(url, {}, headers)
.then(async (request) => {
if (request.data.status === "COMPLETED") {
const user = req.session.user;
const subscriptionExpirationDate =
user!.subscriptionExpirationDate;
const today = moment(new Date());
const dateToBeAddedTo = !subscriptionExpirationDate
? today
: moment(subscriptionExpirationDate).isAfter(today)
? moment(subscriptionExpirationDate)
: today;
if (request.data.status === "COMPLETED") {
const user = req.session.user;
const subscriptionExpirationDate =
req.session.user.subscriptionExpirationDate;
const today = moment(new Date());
const dateToBeAddedTo = !subscriptionExpirationDate
? today
: moment(subscriptionExpirationDate).isAfter(today)
? moment(subscriptionExpirationDate)
: today;
const updatedExpirationDate = dateToBeAddedTo.add(
duration,
duration_unit
);
await setDoc(
doc(db, "users", req.session.user!.id),
{
subscriptionExpirationDate: updatedExpirationDate.toISOString(),
status: "active",
},
{ merge: true }
);
const updatedExpirationDate = dateToBeAddedTo.add(duration, duration_unit);
await setDoc(
doc(db, "users", req.session.user.id),
{
subscriptionExpirationDate: updatedExpirationDate.toISOString(),
status: "active",
},
{ merge: true }
);
try {
await setDoc(doc(db, "paypalpayments", v4()), {
orderId: id,
userId: req.session.user!.id,
status: request.data.status,
createdAt: new Date().toISOString(),
value:
request.data.purchase_units[0].payments.captures[0].amount.value,
currency:
request.data.purchase_units[0].payments.captures[0].amount
.currency_code,
subscriptionDuration: duration,
subscriptionDurationUnit: duration_unit,
subscriptionExpirationDate: updatedExpirationDate.toISOString(),
});
} catch (err) {
console.error("Failed to insert paypal payment!", err);
}
try {
await setDoc(doc(db, "paypalpayments", v4()), {
orderId: id,
userId: req.session.user.id,
status: request.data.status,
createdAt: new Date().toISOString(),
value: request.data.purchase_units[0].payments.captures[0].amount.value,
currency:
request.data.purchase_units[0].payments.captures[0].amount
.currency_code,
subscriptionDuration: duration,
subscriptionDurationUnit: duration_unit,
subscriptionExpirationDate: updatedExpirationDate.toISOString(),
});
} catch (err) {
console.error("Failed to insert paypal payment!", err);
}
if (user!.type === "corporate") {
const snapshot = await getDocs(collection(db, "groups"));
const groups: Group[] = (
snapshot.docs.map((doc) => ({
id: doc.id,
...doc.data(),
})) as Group[]
).filter((x) => x.admin === user!.id);
if (user.type === "corporate") {
const snapshot = await getDocs(collection(db, "groups"));
const groups: Group[] = (
snapshot.docs.map((doc) => ({
id: doc.id,
...doc.data(),
})) as Group[]
).filter((x) => x.admin === user.id);
await Promise.all(
groups
.flatMap((x) => x.participants)
.map(
async (x) =>
await setDoc(
doc(db, "users", x),
{
subscriptionExpirationDate:
updatedExpirationDate.toISOString(),
status: "active",
},
{ merge: true }
await Promise.all(
groups
.flatMap((x) => x.participants)
.map(
async (x) =>
await setDoc(
doc(db, "users", x),
{
subscriptionExpirationDate:
updatedExpirationDate.toISOString(),
status: "active",
},
{ merge: true }
)
)
)
);
}
);
}
return res.status(200).json({ ok: true });
}
return res.status(200).json({ ok: true });
}
res.status(404).json({
ok: false,
reason: "Order ID not found or purchase was not approved!",
});
res.status(404).json({
ok: false,
reason: "Order ID not found or purchase was not approved!",
});
})
.catch((err) => {
console.error(err.response.status, err.response.data);
res.status(err.response.status).json(err.response.data);
});
}

View File

@@ -32,16 +32,29 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
return res.status(401).json({ ok: false, reason: "Missing tracking id!" });
const url = `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders`;
const amount = {
currency_code: currencyCode,
value: price.toString(),
};
const data = {
purchase_units: [
{
invoice_id: `INV-${v4()}`,
amount: {
currency_code: currencyCode,
value: price.toString(),
...amount,
breakdown: {
item_total: amount,
},
},
reference_id: v4(),
items: [
{
name: "Encoach Subscription",
quantity: "1",
category: "DIGITAL_GOODS",
unit_amount: amount,
},
],
},
],
payment_source: {
@@ -74,7 +87,13 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
})
);
const request = await axios.post<OrderResponseBody>(url, data, headers);
res.status(request.status).json(request.data);
axios
.post<OrderResponseBody>(url, data, headers)
.then((request) => {
res.status(request.status).json(request.data);
})
.catch((err) => {
console.error(err.response.status, err.response.data);
res.status(err.response.status).json(err.response.data);
});
}