diff --git a/.env.example b/.env.example index eec3f283f7..c5354bfd7d 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,6 @@ API_KEY_PREFIX=cal_ DATABASE_URL="postgresql://postgres:@localhost:5450/calendso" -NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000 \ No newline at end of file +NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000 + +# Get it in console.cal.com +CALCOM_LICENSE_KEY="" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..fa89efec90 --- /dev/null +++ b/LICENSE @@ -0,0 +1,42 @@ +The Cal.com Enterprise Edition (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 Enterprise Edition 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. \ No newline at end of file diff --git a/README.md b/README.md index c806ecc3e4..dd278617f0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,19 @@ -# Cal.com Public API (Enterprise Only) + +
+ + Logo + + + Get Started with Enterprise +
+ +# Cal.com Public API - Enterprise Edition + +Welcome to the Public API Enterprise Edition ("/apps/api") of the Cal.com Public API. + +The [/apps/api](https://github.com/calcom/cal.com/tree/main/apps/api) subfolder is the place for our Public API, which we serve at api.cal.com, and enterprise customers can also run [enterprise-grade](https://cal.com/enterprise) + +> _❗ WARNING: This repository is copyrighted (unlike our [main repo](https://github.com/calcom/cal.com)). You are not allowed to use this code to host your own version of app.cal.com without obtaining a proper [license](https://cal.com/pricing?infra) first❗_ This is the public REST api for cal.com. It exposes CRUD Endpoints of all our most important resources. @@ -30,7 +45,7 @@ And it makes it easy for anyone to integrate with Cal.com at the application pro ```sh cp apps/api/.env.example apps/api/.env - cp packages/prisma/.env.example packages/prisma/.env + cp .env.example .env ``` 1. Install packages with yarn @@ -84,7 +99,7 @@ We're calling several packages from monorepo, this need to be transpiled before "@calcom/app-store", "@calcom/prisma", "@calcom/lib", - "@calcom/ee", + "@calcom/features", ``` ## API Endpoint Validation @@ -186,18 +201,21 @@ Add a deployment or go to an existing one. Activate API or Admin addon Provide your `DATABASE_URL` Now you can call api.cal.com?key=CALCOM_LICENSE_KEY, which will connect to your own databaseUrl. + ## How to deploy We recommend deploying API in vercel. There's some settings that you'll need to setup. -Under Vercel > Your API Deployment > Settings +Under Vercel > Your API Deployment > Settings In General > Build & Development Settings BUILD COMMAND: `yarn turbo run build --scope=@calcom/api --include-dependencies --no-deps` OUTPUT DIRECTORY: `apps/api/.next` See `scripts/vercel-deploy.sh` for more info on how the deployment is done. + ## Environment variables -Lastly API requires an env var for `DATABASE_URL` + +Lastly API requires an env var for `DATABASE_URL` and `CALCOM_LICENSE_KEY` diff --git a/lib/helpers/verifyApiKey.ts b/lib/helpers/verifyApiKey.ts index e5cf0332a3..408cc55356 100644 --- a/lib/helpers/verifyApiKey.ts +++ b/lib/helpers/verifyApiKey.ts @@ -1,6 +1,7 @@ import { NextMiddleware } from "next-api-middleware"; -import { hashAPIKey } from "@calcom/ee/lib/api/apiKeys"; +import { hashAPIKey } from "@calcom/features/ee/api-keys/lib/apiKeys"; +import checkLicense from "@calcom/features/ee/common/server/checkLicense"; import { isAdminGuard } from "@lib/utils/isAdmin"; @@ -14,6 +15,9 @@ export const dateNotInPast = function (date: Date) { // This verifies the apiKey and sets the user if it is valid. export const verifyApiKey: NextMiddleware = async (req, res, next) => { + const hasValidLicense = await checkLicense(process.env.CALCOM_LICENSE_KEY || ""); + if (!hasValidLicense) + return res.status(401).json({ error: "Invalid or missing CALCOM_LICENSE_KEY environment variable" }); const { prisma, userId, isAdmin } = req; // If the user is an admin and using a license key (from customPrisma), skip the apiKey check. if (userId === 0 && isAdmin) { diff --git a/next.config.js b/next.config.js index 683d8c516b..1031c0a949 100644 --- a/next.config.js +++ b/next.config.js @@ -3,17 +3,15 @@ const withTM = require("next-transpile-modules")([ "@calcom/app-store", "@calcom/core", - "@calcom/ee", - "@calcom/lib", - "@calcom/prisma", - "@calcom/stripe", - "@calcom/ui", "@calcom/dayjs", "@calcom/emails", - "@calcom/dayjs", "@calcom/embed-core", - "@calcom/dayjs", "@calcom/embed-snippet", + "@calcom/features", + "@calcom/lib", + "@calcom/prisma", + "@calcom/trpc", + "@calcom/ui", ]); const { withAxiom } = require("next-axiom"); diff --git a/package.json b/package.json index 0b4f085b37..0d6430d98c 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "build": "next build", "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf .next", "dev": "PORT=3002 next dev", - "lint": "next lint", + "lint": "eslint . --ignore-path .gitignore", "lint:report": "eslint . --format json --output-file ../../lint-results/api.json", "lint:fix": "eslint . --ext .ts,.js,.tsx,.jsx --fix", "start": "PORT=3002 next start", @@ -25,21 +25,21 @@ "node-mocks-http": "^1.11.0" }, "dependencies": { - "@calcom/app-store-cli": "*", "@calcom/prisma": "*", + "@calcom/trpc": "*", "@sentry/nextjs": "^6.19.7", "bcryptjs": "^2.4.3", "memory-cache": "^0.2.0", "modify-response-middleware": "^1.1.0", - "next": "^12.2.0", + "next": "^12.2.5", "next-api-middleware": "^1.0.1", "next-axiom": "^0.10.0", "next-swagger-doc": "^0.3.4", "next-transpile-modules": "^9.0.0", "next-validations": "^0.2.0", - "typescript": "^4.6.4", + "typescript": "^4.7.4", "tzdata": "^1.0.30", "uuid": "^8.3.2", - "zod": "^3.16.0" + "zod": "^3.18.0" } } diff --git a/pages/api/me/_get.ts b/pages/api/me/_get.ts new file mode 100644 index 0000000000..7fe25139a8 --- /dev/null +++ b/pages/api/me/_get.ts @@ -0,0 +1,21 @@ +import type { NextApiRequest } from "next"; + +import { defaultHandler, defaultResponder } from "@calcom/lib/server"; + +import { schemaUserReadPublic } from "@lib/validations/user"; + +import { User } from ".prisma/client"; + +async function handler(req: NextApiRequest): Promise<{ error?: string; user?: Partial }> { + if (!prisma) return { error: "Cant connect to database" }; + console.log(req); + if (!req.userId) return { error: "No user id found" }; + const data = await prisma.user.findUniqueOrThrow({ where: { id: req.userId } }); + if (!data) return { error: "You need to pass apiKey" }; + const user = schemaUserReadPublic.parse(data); + return { user }; +} + +export default defaultHandler({ + GET: Promise.resolve({ default: defaultResponder(handler) }), +}); diff --git a/pages/api/me/index.ts b/pages/api/me/index.ts new file mode 100644 index 0000000000..fe6357f6bc --- /dev/null +++ b/pages/api/me/index.ts @@ -0,0 +1,9 @@ +import { defaultHandler } from "@calcom/lib/server"; + +import { withMiddleware } from "@lib/helpers/withMiddleware"; + +export default withMiddleware("HTTP_GET")( + defaultHandler({ + GET: import("./_get"), + }) +); diff --git a/tsconfig.json b/tsconfig.json index 2714b86c1c..c230406ae4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,6 @@ "@/*": ["*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "../../packages/types/next-auth.d.ts"], "exclude": ["node_modules", "templates", "auth"] }