Skip to content

Commit

Permalink
Merge branch 'calcom:main' into fix/missing-id
Browse files Browse the repository at this point in the history
  • Loading branch information
vikaspatil0021 committed Apr 26, 2024
2 parents a85be4c + c28870e commit d533e7b
Show file tree
Hide file tree
Showing 77 changed files with 5,000 additions and 851 deletions.
1 change: 1 addition & 0 deletions .env.example
Expand Up @@ -299,6 +299,7 @@ E2E_TEST_CALCOM_GCAL_KEYS=
CALCOM_CREDENTIAL_SYNC_SECRET=""
# This is the header name that will be used to verify the webhook secret. Should be in lowercase
CALCOM_CREDENTIAL_SYNC_HEADER_NAME="calcom-credential-sync-secret"
# This the endpoint from which the token is fetched
CALCOM_CREDENTIAL_SYNC_ENDPOINT=""
# Key should match on Cal.com and your application
# must be 24 bytes for AES256 encryption algorithm
Expand Down
4 changes: 2 additions & 2 deletions apps/api/v1/pages/api/credential-sync/_patch.ts
@@ -1,6 +1,6 @@
import type { NextApiRequest } from "next";

import { minimumTokenResponseSchema } from "@calcom/app-store/_utils/oauth/parseRefreshTokenResponse";
import { OAuth2UniversalSchema } from "@calcom/app-store/_utils/oauth/universalSchema";
import { symmetricDecrypt } from "@calcom/lib/crypto";
import { defaultResponder } from "@calcom/lib/server";
import prisma from "@calcom/prisma";
Expand Down Expand Up @@ -63,7 +63,7 @@ async function handler(req: NextApiRequest) {
symmetricDecrypt(encryptedKey, process.env.CALCOM_APP_CREDENTIAL_ENCRYPTION_KEY || "")
);

const key = minimumTokenResponseSchema.parse(decryptedKey);
const key = OAuth2UniversalSchema.parse(decryptedKey);

const credential = await prisma.credential.update({
where: {
Expand Down
4 changes: 2 additions & 2 deletions apps/api/v1/pages/api/credential-sync/_post.ts
@@ -1,7 +1,7 @@
import type { NextApiRequest } from "next";

import { getCalendar } from "@calcom/app-store/_utils/getCalendar";
import { minimumTokenResponseSchema } from "@calcom/app-store/_utils/oauth/parseRefreshTokenResponse";
import { OAuth2UniversalSchema } from "@calcom/app-store/_utils/oauth/universalSchema";
import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData";
import { symmetricDecrypt } from "@calcom/lib/crypto";
import { HttpError } from "@calcom/lib/http-error";
Expand Down Expand Up @@ -70,7 +70,7 @@ async function handler(req: NextApiRequest) {
symmetricDecrypt(encryptedKey, process.env.CALCOM_APP_CREDENTIAL_ENCRYPTION_KEY || "")
);

const key = minimumTokenResponseSchema.parse(decryptedKey);
const key = OAuth2UniversalSchema.parse(decryptedKey);

// Need to get app type
const app = await prisma.app.findUnique({
Expand Down
10 changes: 10 additions & 0 deletions apps/api/v2/src/ee/schedules/services/schedules.service.ts
Expand Up @@ -24,6 +24,16 @@ export class SchedulesService {
private readonly usersRepository: UsersRepository
) {}

async createUserDefaultSchedule(userId: number, timeZone: string) {
const schedule = {
isDefault: true,
name: "Default schedule",
timeZone,
};

return this.createUserSchedule(userId, schedule);
}

async createUserSchedule(userId: number, schedule: CreateScheduleInput) {
const availabilities = schedule.availabilities?.length
? schedule.availabilities
Expand Down
Expand Up @@ -17,6 +17,7 @@ import { PlatformOAuthClient, Team, User } from "@prisma/client";
import * as request from "supertest";
import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture";
import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture";
import { SchedulesRepositoryFixture } from "test/fixtures/repository/schedules.repository.fixture";
import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture";
import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture";

Expand Down Expand Up @@ -75,10 +76,12 @@ describe("OAuth Client Users Endpoints", () => {
let oauthClientRepositoryFixture: OAuthClientRepositoryFixture;
let teamRepositoryFixture: TeamRepositoryFixture;
let eventTypesRepositoryFixture: EventTypesRepositoryFixture;
let schedulesRepositoryFixture: SchedulesRepositoryFixture;

let postResponseData: CreateUserResponse;

const userEmail = "oauth-client-user@gmail.com";
const userTimeZone = "Europe/Rome";

beforeAll(async () => {
const moduleRef = await Test.createTestingModule({
Expand All @@ -93,6 +96,7 @@ describe("OAuth Client Users Endpoints", () => {
userRepositoryFixture = new UserRepositoryFixture(moduleRef);
teamRepositoryFixture = new TeamRepositoryFixture(moduleRef);
eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef);
schedulesRepositoryFixture = new SchedulesRepositoryFixture(moduleRef);
organization = await teamRepositoryFixture.create({ name: "organization" });
oAuthClient = await createOAuthClient(organization.id);

Expand Down Expand Up @@ -134,6 +138,7 @@ describe("OAuth Client Users Endpoints", () => {
it(`/POST`, async () => {
const requestBody: CreateManagedUserInput = {
email: userEmail,
timeZone: userTimeZone,
};

const response = await request(app.getHttpServer())
Expand All @@ -158,6 +163,7 @@ describe("OAuth Client Users Endpoints", () => {

await userConnectedToOAuth(responseBody.data.user.email);
await userHasDefaultEventTypes(responseBody.data.user.id);
await userHasDefaultSchedule(responseBody.data.user.id, responseBody.data.user.defaultScheduleId);
});

async function userConnectedToOAuth(userEmail: string) {
Expand All @@ -181,6 +187,17 @@ describe("OAuth Client Users Endpoints", () => {
).toBeTruthy();
}

async function userHasDefaultSchedule(userId: number, scheduleId: number | null) {
expect(scheduleId).toBeDefined();
expect(scheduleId).not.toBeNull();

const user = await userRepositoryFixture.get(userId);
expect(user?.defaultScheduleId).toEqual(scheduleId);

const schedule = scheduleId ? await schedulesRepositoryFixture.getById(scheduleId) : null;
expect(schedule?.userId).toEqual(userId);
}

it(`/GET: return list of managed users`, async () => {
const response = await request(app.getHttpServer())
.get(`/api/v2/oauth-clients/${oAuthClient.id}/users?limit=10&offset=0`)
Expand Down
2 changes: 2 additions & 0 deletions apps/api/v2/src/modules/oauth-clients/oauth-client.module.ts
@@ -1,4 +1,5 @@
import { EventTypesModule } from "@/ee/event-types/event-types.module";
import { SchedulesModule } from "@/ee/schedules/schedules.module";
import { AuthModule } from "@/modules/auth/auth.module";
import { MembershipsModule } from "@/modules/memberships/memberships.module";
import { OAuthClientUsersController } from "@/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller";
Expand All @@ -25,6 +26,7 @@ import { Global, Module } from "@nestjs/common";
MembershipsModule,
EventTypesModule,
OrganizationsModule,
SchedulesModule,
],
providers: [
OAuthClientRepository,
Expand Down
@@ -1,4 +1,5 @@
import { EventTypesService } from "@/ee/event-types/services/event-types.service";
import { SchedulesService } from "@/ee/schedules/services/schedules.service";
import { TokensRepository } from "@/modules/tokens/tokens.repository";
import { CreateManagedUserInput } from "@/modules/users/inputs/create-managed-user.input";
import { UpdateManagedUserInput } from "@/modules/users/inputs/update-managed-user.input";
Expand All @@ -14,7 +15,8 @@ export class OAuthClientUsersService {
constructor(
private readonly userRepository: UsersRepository,
private readonly tokensRepository: TokensRepository,
private readonly eventTypesService: EventTypesService
private readonly eventTypesService: EventTypesService,
private readonly schedulesService: SchedulesService
) {}

async createOauthClientUser(
Expand Down Expand Up @@ -62,8 +64,14 @@ export class OAuthClientUsersService {
oAuthClientId,
user.id
);

await this.eventTypesService.createUserDefaultEventTypes(user.id);

if (body.timeZone) {
const defaultSchedule = await this.schedulesService.createUserDefaultSchedule(user.id, body.timeZone);
user.defaultScheduleId = defaultSchedule.id;
}

return {
user,
tokens: {
Expand Down

0 comments on commit d533e7b

Please sign in to comment.