Updated part of the payment
This commit is contained in:
@@ -68,6 +68,11 @@ async function patch(req: NextApiRequest, res: NextApiResponse) {
|
||||
return res.status(200).json({ ok: entity.acknowledged });
|
||||
}
|
||||
|
||||
if (req.body.payment) {
|
||||
const entity = await db.collection<Entity>("entities").updateOne({ id }, { $set: { payment: req.body.payment } });
|
||||
return res.status(200).json({ ok: entity.acknowledged });
|
||||
}
|
||||
|
||||
if (req.body.expiryDate !== undefined) {
|
||||
const entity = await getEntity(id)
|
||||
const result = await db.collection<Entity>("entities").updateOne({ id }, { $set: { expiryDate: req.body.expiryDate } });
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
|
||||
import type {NextApiRequest, NextApiResponse} from "next";
|
||||
import {withIronSessionApiRoute} from "iron-session/next";
|
||||
import {sessionOptions} from "@/lib/session";
|
||||
import {Group, User} from "@/interfaces/user";
|
||||
import {DurationUnit, Package, Payment} from "@/interfaces/paypal";
|
||||
import {v4} from "uuid";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { withIronSessionApiRoute } from "iron-session/next";
|
||||
import { sessionOptions } from "@/lib/session";
|
||||
import { Group, User } from "@/interfaces/user";
|
||||
import { DurationUnit, Package, Payment } from "@/interfaces/paypal";
|
||||
import { v4 } from "uuid";
|
||||
import ShortUniqueId from "short-unique-id";
|
||||
import axios from "axios";
|
||||
import {IntentionResult, PaymentIntention, TransactionResult} from "@/interfaces/paymob";
|
||||
import { IntentionResult, PaymentIntention, TransactionResult } from "@/interfaces/paymob";
|
||||
import moment from "moment";
|
||||
import client from "@/lib/mongodb";
|
||||
import { getEntity } from "@/utils/entities.be";
|
||||
import { Entity } from "@/interfaces/entity";
|
||||
import { getEntityUsers } from "@/utils/users.be";
|
||||
import { mapBy } from "@/utils";
|
||||
|
||||
const db = client.db(process.env.MONGODB_DB);
|
||||
|
||||
@@ -22,21 +26,22 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
|
||||
const authToken = await authenticatePaymob();
|
||||
|
||||
console.log("WEBHOOK: ", transactionResult);
|
||||
if (!checkTransaction(authToken, transactionResult.transaction.order.id)) return res.status(404).json({ok: false});
|
||||
if (!transactionResult.transaction.success) return res.status(400).json({ok: false});
|
||||
if (!checkTransaction(authToken, transactionResult.transaction.order.id)) return res.status(404).json({ ok: false });
|
||||
if (!transactionResult.transaction.success) return res.status(400).json({ ok: false });
|
||||
|
||||
const {userID, duration, duration_unit} = transactionResult.intention.extras.creation_extras as {
|
||||
const { userID, duration, duration_unit, entity: entityID } = transactionResult.intention.extras.creation_extras as {
|
||||
userID: string;
|
||||
duration: number;
|
||||
duration_unit: DurationUnit;
|
||||
entity: string
|
||||
};
|
||||
|
||||
const user = await db.collection("users").findOne<User>({ id: userID as string });
|
||||
|
||||
if (!user || !duration || !duration_unit) return res.status(404).json({ok: false});
|
||||
if (!user || !duration || !duration_unit) return res.status(404).json({ ok: false });
|
||||
|
||||
const subscriptionExpirationDate = user.subscriptionExpirationDate;
|
||||
if (!subscriptionExpirationDate) return res.status(200).json({ok: false});
|
||||
if (!subscriptionExpirationDate) return res.status(200).json({ ok: false });
|
||||
|
||||
const initialDate = moment(subscriptionExpirationDate).isAfter(moment()) ? moment(subscriptionExpirationDate) : moment();
|
||||
|
||||
@@ -44,8 +49,8 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
|
||||
|
||||
await db.collection("users").updateOne(
|
||||
{ id: userID as string },
|
||||
{ $set: {subscriptionExpirationDate: updatedSubscriptionExpirationDate, status: "active"} }
|
||||
);
|
||||
{ $set: { subscriptionExpirationDate: updatedSubscriptionExpirationDate, status: "active" } }
|
||||
);
|
||||
|
||||
await db.collection("paypalpayments").insertOne({
|
||||
id: v4(),
|
||||
@@ -60,22 +65,19 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
|
||||
value: transactionResult.transaction.amount_cents / 1000,
|
||||
});
|
||||
|
||||
if (user.type === "corporate") {
|
||||
const groups = await db.collection("groups").find<Group>({ admin: user.id }).toArray();
|
||||
if (entityID) {
|
||||
const entity = await getEntity(entityID)
|
||||
await db.collection<Entity>("entities").updateOne({ id: entityID }, { $set: { expiryDate: req.body.expiryDate } });
|
||||
|
||||
const participants = (await Promise.all(
|
||||
groups.flatMap((x) => x.participants).map(async (x) => ({...(await db.collection("users").findOne({ id: x}))})),
|
||||
)) as User[];
|
||||
const sameExpiryDateParticipants = participants.filter(
|
||||
(x) => x.subscriptionExpirationDate === subscriptionExpirationDate && x.status !== "disabled",
|
||||
);
|
||||
const users = await getEntityUsers(entityID, 0, {
|
||||
subscriptionExpirationDate: entity?.expiryDate,
|
||||
$and: [
|
||||
{ type: { $ne: "admin" } },
|
||||
{ type: { $ne: "developer" } },
|
||||
]
|
||||
})
|
||||
|
||||
for (const participant of sameExpiryDateParticipants) {
|
||||
await db.collection("users").updateOne(
|
||||
{ id: participant.id },
|
||||
{ $set: {subscriptionExpirationDate: updatedSubscriptionExpirationDate, status: "active"} }
|
||||
);
|
||||
}
|
||||
await db.collection<User>("users").updateMany({ id: { $in: mapBy(users, 'id') } }, { $set: { subscriptionExpirationDate: req.body.expiryDate } })
|
||||
}
|
||||
|
||||
res.status(200).json({
|
||||
@@ -84,19 +86,19 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
|
||||
}
|
||||
|
||||
const authenticatePaymob = async () => {
|
||||
const response = await axios.post<{token: string}>(
|
||||
const response = await axios.post<{ token: string }>(
|
||||
"https://oman.paymob.com/api/auth/tokens",
|
||||
{
|
||||
api_key: process.env.PAYMOB_API_KEY,
|
||||
},
|
||||
{headers: {Authorization: `Bearer ${process.env.PAYMOB_SECRET_KEY}`}},
|
||||
{ headers: { Authorization: `Bearer ${process.env.PAYMOB_SECRET_KEY}` } },
|
||||
);
|
||||
|
||||
return response.data.token;
|
||||
};
|
||||
|
||||
const checkTransaction = async (token: string, orderID: number) => {
|
||||
const response = await axios.post("https://oman.paymob.com/api/ecommerce/orders/transaction_inquiry", {auth_token: token, order_id: orderID});
|
||||
const response = await axios.post("https://oman.paymob.com/api/ecommerce/orders/transaction_inquiry", { auth_token: token, order_id: orderID });
|
||||
|
||||
return response.status === 200;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user