forked from calcom/cal.com
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding hitpay functions to hitpay app Added all features except refund
- Loading branch information
1 parent
55e1e0f
commit 3671c85
Showing
38 changed files
with
1,270 additions
and
5,671 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
--- | ||
items: | ||
- 1.jpeg | ||
- 2.jpeg | ||
- 3.jpeg | ||
--- | ||
|
||
{DESCRIPTION} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
The Cal.com Commercial License (EE) license (the “EE License”) | ||
Copyright (c) 2020-present Cal.com, Inc | ||
|
||
With regard to the Cal.com Software: | ||
|
||
This software and associated documentation files (the "Software") may only be | ||
used in production, if you (and any entity that you represent) have agreed to, | ||
and are in compliance with, the Cal.com Subscription Terms available | ||
at https://cal.com/terms (the “EE Terms”), or other agreements governing | ||
the use of the Software, as mutually agreed by you and Cal.com, Inc ("Cal.com"), | ||
and otherwise have a valid Cal.com Commercial License subscription ("EE Subscription") | ||
for the correct number of hosts as defined in the EE Terms ("Hosts"). Subject to the foregoing sentence, | ||
you are free to modify this Software and publish patches to the Software. You agree | ||
that Cal.com and/or its licensors (as applicable) retain all right, title and interest in | ||
and to all such modifications and/or patches, and all such modifications and/or | ||
patches may only be used, copied, modified, displayed, distributed, or otherwise | ||
exploited with a valid EE Subscription for the correct number of hosts. | ||
Notwithstanding the foregoing, you may copy and modify the Software for development | ||
and testing purposes, without requiring a subscription. You agree that Cal.com and/or | ||
its licensors (as applicable) retain all right, title and interest in and to all such | ||
modifications. You are not granted any other rights beyond what is expressly stated herein. | ||
Subject to the foregoing, it is forbidden to copy, merge, publish, distribute, sublicense, | ||
and/or sell the Software. | ||
|
||
This EE License applies only to the part of this Software that is not distributed under | ||
the AGPLv3 license. Any part of this Software distributed under the MIT license or which | ||
is served client-side as an image, font, cascading stylesheet (CSS), file which produces | ||
or is compiled, arranged, augmented, or combined into client-side JavaScript, in whole or | ||
in part, is copyrighted under the AGPLv3 license. The full text of this EE License shall | ||
be included in all copies or substantial portions of the Software. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
SOFTWARE. | ||
|
||
For all third party components incorporated into the Cal.com Software, those | ||
components are licensed under the original license provided by the owner of the | ||
applicable component. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
import type { NextApiRequest, NextApiResponse } from "next"; | ||
|
||
import prisma from "@calcom/prisma"; | ||
|
||
import config from "../config.json"; | ||
|
||
export default async function handler(req: NextApiRequest, res: NextApiResponse) { | ||
if (!req.session?.user?.id) { | ||
return res.status(401).json({ message: "You must be logged in to do this" }); | ||
} | ||
const appType = config.type; | ||
try { | ||
const alreadyInstalled = await prisma.credential.findFirst({ | ||
where: { | ||
type: appType, | ||
userId: req.session.user.id, | ||
}, | ||
}); | ||
if (alreadyInstalled) { | ||
throw new Error("Already installed"); | ||
} | ||
const installation = await prisma.credential.create({ | ||
data: { | ||
type: appType, | ||
key: {}, | ||
userId: req.session.user.id, | ||
appId: "hitpay", | ||
}, | ||
}); | ||
|
||
if (!installation) { | ||
throw new Error("Unable to create user credential for Alby"); | ||
} | ||
} catch (error: unknown) { | ||
if (error instanceof Error) { | ||
return res.status(500).json({ message: error.message }); | ||
} | ||
return res.status(500); | ||
} | ||
|
||
return res.status(200).json({ url: "/apps/hitpay/setup" }); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
import type { NextApiRequest, NextApiResponse } from "next"; | ||
import qs from "qs"; | ||
|
||
import prisma from "@calcom/prisma"; | ||
|
||
export default async function handler(req: NextApiRequest, res: NextApiResponse) { | ||
const { reference, status } = req.query; | ||
let payment; | ||
if (reference) { | ||
payment = await prisma.payment.findFirst({ | ||
where: { | ||
externalId: reference, | ||
}, | ||
select: { | ||
id: true, | ||
amount: true, | ||
bookingId: true, | ||
booking: { | ||
select: { | ||
uid: true, | ||
user: { | ||
select: { | ||
email: true, | ||
username: true, | ||
credentials: { | ||
where: { | ||
type: "hitpay_payment", | ||
}, | ||
}, | ||
}, | ||
}, | ||
responses: true, | ||
eventType: { | ||
select: { | ||
slug: true, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}); | ||
|
||
if (!payment) { | ||
return res.redirect("/apps/installed/payment"); | ||
} | ||
const key = payment.booking?.user?.credentials?.[0].key; | ||
if (!key) { | ||
return res.redirect("/apps/installed/payment"); | ||
} | ||
} | ||
if (status !== "completed") { | ||
const url = `/${payment.booking.user.username}/${payment.booking.eventType.slug}`; | ||
return res.redirect(url); | ||
} | ||
|
||
const queryParams = { | ||
"flag.coep": false, | ||
isSuccessBookingPage: true, | ||
email: payment.booking.responses.email, | ||
eventTypeSlug: payment.booking.eventType.slug, | ||
}; | ||
|
||
const query = qs.stringify(queryParams); | ||
const url = `/booking/${payment.booking.uid}?${query}`; | ||
|
||
return res.redirect(url); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export { default as add } from "./add"; | ||
export { default as callback } from "./callback"; | ||
export { default as webhook } from "./webhook"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
import { createHmac } from "crypto"; | ||
import type { NextApiRequest, NextApiResponse } from "next"; | ||
|
||
import { IS_PRODUCTION } from "@calcom/lib/constants"; | ||
import { getErrorFromUnknown } from "@calcom/lib/errors"; | ||
import { HttpError as HttpCode } from "@calcom/lib/http-error"; | ||
import { handlePaymentSuccess } from "@calcom/lib/payment/handlePaymentSuccess"; | ||
import prisma from "@calcom/prisma"; | ||
|
||
export const config = { | ||
api: { | ||
bodyParser: false, | ||
}, | ||
}; | ||
|
||
interface WebhookReturn { | ||
payment_id: string; | ||
payment_request_id: string; | ||
phone: string; | ||
amount: string; | ||
currency: string; | ||
status: string; | ||
reference_number: string; | ||
hmac: string; | ||
} | ||
|
||
type ExcludedWebhookReturn = Omit<WebhookReturn, "hmac">; | ||
|
||
function generateSignatureArray<ExcludedWebhookReturn>(secret: string, vals: ExcludedWebhookReturn) { | ||
const source = []; | ||
Object.keys(vals) | ||
.sort() | ||
.forEach((key) => { | ||
source.push(`${key}${vals[key]}`); | ||
}); | ||
const payload = source.join(""); | ||
const hmac = createHmac("sha256", secret); | ||
const signed = hmac.update(Buffer.from(payload, "utf-8")).digest("hex"); | ||
return signed; | ||
} | ||
|
||
export default async function handler(req: NextApiRequest, res: NextApiResponse) { | ||
try { | ||
if (req.method !== "POST") { | ||
throw new HttpCode({ statusCode: 405, message: "Method Not Allowed" }); | ||
} | ||
const obj: WebhookReturn = req.body as WebhookReturn; | ||
const excluded: ExcludedWebhookReturn = { ...obj }; | ||
delete (excluded as WebhookReturn).hmac; | ||
|
||
const payment = await prisma.payment.findFirst({ | ||
where: { | ||
externalId: obj.payment_request_id, | ||
}, | ||
select: { | ||
id: true, | ||
amount: true, | ||
bookingId: true, | ||
booking: { | ||
select: { | ||
user: { | ||
select: { | ||
credentials: { | ||
where: { | ||
type: "hitpay_payment", | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}); | ||
|
||
if (!payment) throw new HttpCode({ statusCode: 204, message: "Payment not found" }); | ||
const key = payment.booking?.user?.credentials?.[0].key; | ||
if (!key) throw new HttpCode({ statusCode: 204, message: "Credentials not found" }); | ||
const { salt_key } = key; | ||
const signed = generateSignatureArray(salt_key, excluded); | ||
if (signed !== obj.hmac) { | ||
throw new HttpCode({ statusCode: 400, message: "Bad Request" }); | ||
} | ||
|
||
return await handlePaymentSuccess(payment.id, payment.bookingId); | ||
} catch (_err) { | ||
const err = getErrorFromUnknown(_err); | ||
console.error(`Webhook Error: ${err.message}`); | ||
return res.status(200).send({ | ||
message: err.message, | ||
stack: IS_PRODUCTION ? undefined : err.stack, | ||
}); | ||
} | ||
} |
Empty file.
Oops, something went wrong.