Skip to content

Commit 9a473d5

Browse files
chore: auth on api-v2 with api-key (#15455)
* chore: enable apiv2 auth with api keys * chore: enable apiv2 auth with api keys * chore: enable apiv2 auth with api keys * chore: enable apiv2 auth with api keys * chore: enable apiv2 auth with api keys * fixup! chore: enable apiv2 auth with api keys * fixup! Merge branch 'chore-apiv2-auth-api-key' of github.com:calcom/cal.com into chore-apiv2-auth-api-key * fixup! fixup! Merge branch 'chore-apiv2-auth-api-key' of github.com:calcom/cal.com into chore-apiv2-auth-api-key * fixup! fixup! fixup! Merge branch 'chore-apiv2-auth-api-key' of github.com:calcom/cal.com into chore-apiv2-auth-api-key
1 parent c5a83f4 commit 9a473d5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+583
-430
lines changed

apps/api/v2/.env.example

+4
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,7 @@ STRIPE_API_KEY=
2020
STRIPE_WEBHOOK_SECRET=
2121

2222
WEB_APP_URL=http://localhost:3000/
23+
CALCOM_LICENSE_KEY=
24+
API_KEY_PREFIX=cal_
25+
GET_LICENSE_KEY_URL="https://console.cal.com/api/license"
26+
IS_E2E=false

apps/api/v2/README.md

+10
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ $ yarn prisma generate
4242

4343
Copy `.env.example` to `.env` and fill values.
4444

45+
## Add license Key to deployments table in DB
46+
47+
id, logo theme licenseKey agreedLicenseAt
48+
1, null, null, 'c4234812-12ab-42s6-a1e3-55bedd4a5bb7', '2023-05-15 21:39:47.611'
49+
50+
your CALCOM_LICENSE_KEY env var need to contain the same value
51+
52+
.env
53+
CALCOM_LICENSE_KEY=c4234812-12ab-42s6-a1e3-55bedd4a5bb
54+
4555
## Running the app
4656

4757
```bash

apps/api/v2/src/app.ts

-2
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ export const bootstrap = (app: NestExpressApplication): NestExpressApplication =
3030
type: VersioningType.CUSTOM,
3131
extractor: (request: unknown) => {
3232
const headerVersion = (request as Request)?.headers[CAL_API_VERSION_HEADER] as string | undefined;
33-
console.log("asap header headerVersion", headerVersion);
3433
if (headerVersion && API_VERSIONS.includes(headerVersion as API_VERSIONS_ENUM)) {
35-
console.log("asap return header headerVersion", headerVersion);
3634
return headerVersion;
3735
}
3836
return VERSION_2024_04_15;

apps/api/v2/src/config/app.ts

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ const loadConfig = (): AppConfig => {
1515
? `:${Number(getEnv("API_PORT", "5555"))}`
1616
: ""
1717
}/v2`,
18+
keyPrefix: getEnv("API_KEY_PREFIX", "cal_"),
19+
licenseKey: getEnv("CALCOM_LICENSE_KEY", ""),
20+
licenceKeyUrl: getEnv("GET_LICENSE_KEY_URL", "https://console.cal.com/api/license"),
1821
},
1922
db: {
2023
readUrl: getEnv("DATABASE_READ_URL"),
@@ -31,6 +34,7 @@ const loadConfig = (): AppConfig => {
3134
app: {
3235
baseUrl: getEnv("WEB_APP_URL", "https://app.cal.com"),
3336
},
37+
e2e: getEnv("IS_E2E", false),
3438
};
3539
};
3640

apps/api/v2/src/config/type.ts

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ export type AppConfig = {
66
port: number;
77
path: string;
88
url: string;
9+
keyPrefix: string;
10+
licenseKey: string;
11+
licenceKeyUrl: string;
912
};
1013
db: {
1114
readUrl: string;
@@ -22,4 +25,5 @@ export type AppConfig = {
2225
app: {
2326
baseUrl: string;
2427
};
28+
e2e: boolean;
2529
};

apps/api/v2/src/ee/bookings/controllers/bookings.controller.e2e-spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import * as request from "supertest";
1616
import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.repository.fixture";
1717
import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture";
1818
import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture";
19-
import { withAccessTokenAuth } from "test/utils/withAccessTokenAuth";
19+
import { withApiAuth } from "test/utils/withApiAuth";
2020

2121
import { SUCCESS_STATUS, ERROR_STATUS } from "@calcom/platform-constants";
2222
import { handleNewBooking } from "@calcom/platform-libraries-0.0.2";
@@ -39,7 +39,7 @@ describe("Bookings Endpoints", () => {
3939
let createdBooking: Awaited<ReturnType<typeof handleNewBooking>>;
4040

4141
beforeAll(async () => {
42-
const moduleRef = await withAccessTokenAuth(
42+
const moduleRef = await withApiAuth(
4343
userEmail,
4444
Test.createTestingModule({
4545
imports: [AppModule, PrismaModule, UsersModule, SchedulesModule_2024_04_15],

apps/api/v2/src/ee/bookings/controllers/bookings.controller.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { GetBookingsOutput } from "@/ee/bookings/outputs/get-bookings.output";
55
import { API_VERSIONS_VALUES } from "@/lib/api-versions";
66
import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator";
77
import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator";
8-
import { AccessTokenGuard } from "@/modules/auth/guards/access-token/access-token.guard";
8+
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
99
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
1010
import { BillingService } from "@/modules/billing/services/billing.service";
1111
import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository";
@@ -89,7 +89,7 @@ export class BookingsController {
8989
) {}
9090

9191
@Get("/")
92-
@UseGuards(AccessTokenGuard)
92+
@UseGuards(ApiAuthGuard)
9393
@Permissions([BOOKING_READ])
9494
@ApiQuery({ name: "filters[status]", enum: Status, required: true })
9595
@ApiQuery({ name: "limit", type: "number", required: false })

apps/api/v2/src/ee/calendars/controllers/calendars.controller.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { OutlookService } from "@/ee/calendars/services/outlook.service";
66
import { API_VERSIONS_VALUES } from "@/lib/api-versions";
77
import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator";
88
import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator";
9-
import { AccessTokenGuard } from "@/modules/auth/guards/access-token/access-token.guard";
9+
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
1010
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
1111
import { UserWithProfile } from "@/modules/users/users.repository";
1212
import {
@@ -42,7 +42,7 @@ export class CalendarsController {
4242
private readonly googleCalendarService: GoogleCalendarService
4343
) {}
4444

45-
@UseGuards(AccessTokenGuard)
45+
@UseGuards(ApiAuthGuard)
4646
@Get("/busy-times")
4747
async getBusyTimes(
4848
@Query() queryParams: CalendarBusyTimesInput,
@@ -71,7 +71,7 @@ export class CalendarsController {
7171
}
7272

7373
@Get("/")
74-
@UseGuards(AccessTokenGuard)
74+
@UseGuards(ApiAuthGuard)
7575
async getCalendars(@GetUser("id") userId: number): Promise<ConnectedCalendarsOutput> {
7676
const calendars = await this.calendarsService.getCalendars(userId);
7777

@@ -81,7 +81,7 @@ export class CalendarsController {
8181
};
8282
}
8383

84-
@UseGuards(AccessTokenGuard)
84+
@UseGuards(ApiAuthGuard)
8585
@Get("/:calendar/connect")
8686
@HttpCode(HttpStatus.OK)
8787
async redirect(
@@ -135,7 +135,7 @@ export class CalendarsController {
135135

136136
@Get("/:calendar/check")
137137
@HttpCode(HttpStatus.OK)
138-
@UseGuards(AccessTokenGuard, PermissionsGuard)
138+
@UseGuards(ApiAuthGuard, PermissionsGuard)
139139
@Permissions([APPS_READ])
140140
async check(@GetUser("id") userId: number, @Param("calendar") calendar: string): Promise<ApiResponse> {
141141
switch (calendar) {

apps/api/v2/src/ee/event-types/controllers/event-types.controller.e2e-spec.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-type
2222
import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture";
2323
import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture";
2424
import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture";
25-
import { withAccessTokenAuth } from "test/utils/withAccessTokenAuth";
25+
import { withApiAuth } from "test/utils/withApiAuth";
2626

2727
import { SUCCESS_STATUS } from "@calcom/platform-constants";
2828
import {
@@ -79,7 +79,7 @@ describe("Event types Endpoints", () => {
7979
let user: User;
8080

8181
beforeAll(async () => {
82-
const moduleRef = await withAccessTokenAuth(
82+
const moduleRef = await withApiAuth(
8383
userEmail,
8484
Test.createTestingModule({
8585
providers: [PrismaExceptionFilter, HttpExceptionFilter],
@@ -288,7 +288,7 @@ describe("Event types Endpoints", () => {
288288
it(`/GET/:id`, async () => {
289289
const response = await request(app.getHttpServer())
290290
.get(`/api/v2/event-types/${eventType.id}`)
291-
// note: bearer token value mocked using "withAccessTokenAuth" for user which id is used when creating event type above
291+
// note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above
292292
.set("Authorization", `Bearer whatever`)
293293
.expect(200);
294294

@@ -305,7 +305,7 @@ describe("Event types Endpoints", () => {
305305
it(`/GET/:username/public`, async () => {
306306
const response = await request(app.getHttpServer())
307307
.get(`/api/v2/event-types/${username}/public`)
308-
// note: bearer token value mocked using "withAccessTokenAuth" for user which id is used when creating event type above
308+
// note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above
309309
.set("Authorization", `Bearer whatever`)
310310
.expect(200);
311311

@@ -323,7 +323,7 @@ describe("Event types Endpoints", () => {
323323
it(`/GET/:username/:eventSlug/public`, async () => {
324324
const response = await request(app.getHttpServer())
325325
.get(`/api/v2/event-types/${username}/${eventType.slug}/public`)
326-
// note: bearer token value mocked using "withAccessTokenAuth" for user which id is used when creating event type above
326+
// note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above
327327
.set("Authorization", `Bearer whatever`)
328328
.expect(200);
329329

@@ -340,7 +340,7 @@ describe("Event types Endpoints", () => {
340340
it(`/GET/`, async () => {
341341
const response = await request(app.getHttpServer())
342342
.get(`/api/v2/event-types`)
343-
// note: bearer token value mocked using "withAccessTokenAuth" for user which id is used when creating event type above
343+
// note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above
344344
.set("Authorization", `Bearer whatever`)
345345
.expect(200);
346346

@@ -359,7 +359,7 @@ describe("Event types Endpoints", () => {
359359
it(`/GET/public/:username/`, async () => {
360360
const response = await request(app.getHttpServer())
361361
.get(`/api/v2/event-types/${username}/public`)
362-
// note: bearer token value mocked using "withAccessTokenAuth" for user which id is used when creating event type above
362+
// note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above
363363
.set("Authorization", `Bearer whatever`)
364364
.expect(200);
365365

@@ -375,7 +375,7 @@ describe("Event types Endpoints", () => {
375375
it(`/GET/:id not existing`, async () => {
376376
await request(app.getHttpServer())
377377
.get(`/api/v2/event-types/1000`)
378-
// note: bearer token value mocked using "withAccessTokenAuth" for user which id is used when creating event type above
378+
// note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above
379379
.set("Authorization", `Bearer whatever`)
380380
.expect(404);
381381
});

apps/api/v2/src/ee/event-types/controllers/event-types.controller.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { EventTypesService } from "@/ee/event-types/services/event-types.service
1313
import { API_VERSIONS_VALUES } from "@/lib/api-versions";
1414
import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator";
1515
import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator";
16-
import { AccessTokenGuard } from "@/modules/auth/guards/access-token/access-token.guard";
16+
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
1717
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
1818
import { PrismaReadService } from "@/modules/prisma/prisma-read.service";
1919
import { UserWithProfile } from "@/modules/users/users.repository";
@@ -54,7 +54,7 @@ export class EventTypesController {
5454

5555
@Post("/")
5656
@Permissions([EVENT_TYPE_WRITE])
57-
@UseGuards(AccessTokenGuard)
57+
@UseGuards(ApiAuthGuard)
5858
async createEventType(
5959
@Body() body: CreateEventTypeInput,
6060
@GetUser() user: UserWithProfile
@@ -69,7 +69,7 @@ export class EventTypesController {
6969

7070
@Get("/:eventTypeId")
7171
@Permissions([EVENT_TYPE_READ])
72-
@UseGuards(AccessTokenGuard)
72+
@UseGuards(ApiAuthGuard)
7373
async getEventType(
7474
@Param() params: EventTypeIdParams,
7575
@Param("eventTypeId", ParseIntPipe) eventTypeId: number,
@@ -90,7 +90,7 @@ export class EventTypesController {
9090

9191
@Get("/")
9292
@Permissions([EVENT_TYPE_READ])
93-
@UseGuards(AccessTokenGuard)
93+
@UseGuards(ApiAuthGuard)
9494
async getEventTypes(@GetUser() user: UserWithProfile): Promise<GetEventTypesOutput> {
9595
const eventTypes = await getEventTypesByViewer({
9696
id: user.id,
@@ -146,7 +146,7 @@ export class EventTypesController {
146146

147147
@Patch("/:eventTypeId")
148148
@Permissions([EVENT_TYPE_WRITE])
149-
@UseGuards(AccessTokenGuard)
149+
@UseGuards(ApiAuthGuard)
150150
@HttpCode(HttpStatus.OK)
151151
async updateEventType(
152152
@Param() params: EventTypeIdParams,
@@ -164,7 +164,7 @@ export class EventTypesController {
164164

165165
@Delete("/:eventTypeId")
166166
@Permissions([EVENT_TYPE_WRITE])
167-
@UseGuards(AccessTokenGuard)
167+
@UseGuards(ApiAuthGuard)
168168
async deleteEventType(
169169
@Param() params: EventTypeIdParams,
170170
@Param("eventTypeId", ParseIntPipe) eventTypeId: number,

apps/api/v2/src/ee/gcal/gcal.controller.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { API_VERSIONS_VALUES } from "@/lib/api-versions";
66
import { GCalService } from "@/modules/apps/services/gcal.service";
77
import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator";
88
import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator";
9-
import { AccessTokenGuard } from "@/modules/auth/guards/access-token/access-token.guard";
9+
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
1010
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
1111
import { CredentialsRepository } from "@/modules/credentials/credentials.repository";
1212
import { SelectedCalendarsRepository } from "@/modules/selected-calendars/selected-calendars.repository";
@@ -61,7 +61,7 @@ export class GcalController {
6161

6262
@Get("/oauth/auth-url")
6363
@HttpCode(HttpStatus.OK)
64-
@UseGuards(AccessTokenGuard)
64+
@UseGuards(ApiAuthGuard)
6565
async redirect(
6666
@Headers("Authorization") authorization: string,
6767
@Req() req: Request
@@ -90,7 +90,7 @@ export class GcalController {
9090

9191
@Get("/check")
9292
@HttpCode(HttpStatus.OK)
93-
@UseGuards(AccessTokenGuard, PermissionsGuard)
93+
@UseGuards(ApiAuthGuard, PermissionsGuard)
9494
@Permissions([APPS_READ])
9595
async check(@GetUser("id") userId: number): Promise<GcalCheckOutput> {
9696
const gcalCredentials = await this.credentialRepository.getByTypeAndUserId("google_calendar", userId);

apps/api/v2/src/ee/me/me.controller.e2e-spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { User } from "@prisma/client";
1313
import * as request from "supertest";
1414
import { SchedulesRepositoryFixture } from "test/fixtures/repository/schedules.repository.fixture";
1515
import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture";
16-
import { withAccessTokenAuth } from "test/utils/withAccessTokenAuth";
16+
import { withApiAuth } from "test/utils/withApiAuth";
1717

1818
import { SUCCESS_STATUS } from "@calcom/platform-constants";
1919
import { UserResponse } from "@calcom/platform-types";
@@ -30,7 +30,7 @@ describe("Me Endpoints", () => {
3030
let user: User;
3131

3232
beforeAll(async () => {
33-
const moduleRef = await withAccessTokenAuth(
33+
const moduleRef = await withApiAuth(
3434
userEmail,
3535
Test.createTestingModule({
3636
imports: [AppModule, PrismaModule, UsersModule, TokensModule, SchedulesModule_2024_04_15],

apps/api/v2/src/ee/me/me.controller.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { SchedulesService_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15
44
import { API_VERSIONS_VALUES } from "@/lib/api-versions";
55
import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator";
66
import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator";
7-
import { AccessTokenGuard } from "@/modules/auth/guards/access-token/access-token.guard";
7+
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
88
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
99
import { UpdateManagedUserInput } from "@/modules/users/inputs/update-managed-user.input";
1010
import { UserWithProfile, UsersRepository } from "@/modules/users/users.repository";
@@ -18,7 +18,7 @@ import { userSchemaResponse } from "@calcom/platform-types";
1818
path: "/v2/me",
1919
version: API_VERSIONS_VALUES,
2020
})
21-
@UseGuards(AccessTokenGuard, PermissionsGuard)
21+
@UseGuards(ApiAuthGuard, PermissionsGuard)
2222
@DocsTags("Me")
2323
export class MeController {
2424
constructor(

apps/api/v2/src/ee/provider/provider.controller.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ProviderVerifyAccessTokenOutput } from "@/ee/provider/outputs/verify-ac
22
import { ProviderVerifyClientOutput } from "@/ee/provider/outputs/verify-client.output";
33
import { API_VERSIONS_VALUES } from "@/lib/api-versions";
44
import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator";
5-
import { AccessTokenGuard } from "@/modules/auth/guards/access-token/access-token.guard";
5+
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
66
import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository";
77
import { UserWithProfile } from "@/modules/users/users.repository";
88
import {
@@ -45,7 +45,7 @@ export class CalProviderController {
4545

4646
@Get("/:clientId/access-token")
4747
@HttpCode(HttpStatus.OK)
48-
@UseGuards(AccessTokenGuard)
48+
@UseGuards(ApiAuthGuard)
4949
async verifyAccessToken(
5050
@Param("clientId") clientId: string,
5151
@GetUser() user: UserWithProfile

apps/api/v2/src/ee/schedules/schedules_2024_04_15/controllers/schedules.controller.e2e-spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { User } from "@prisma/client";
1616
import * as request from "supertest";
1717
import { SchedulesRepositoryFixture } from "test/fixtures/repository/schedules.repository.fixture";
1818
import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture";
19-
import { withAccessTokenAuth } from "test/utils/withAccessTokenAuth";
19+
import { withApiAuth } from "test/utils/withApiAuth";
2020

2121
import { CAL_API_VERSION_HEADER, SUCCESS_STATUS, VERSION_2024_04_15 } from "@calcom/platform-constants";
2222
import { UpdateScheduleInput_2024_04_15 } from "@calcom/platform-types";
@@ -37,7 +37,7 @@ describe("Schedules Endpoints", () => {
3737
const defaultAvailabilityEndTime = "1970-01-01T17:00:00.000Z";
3838

3939
beforeAll(async () => {
40-
const moduleRef = await withAccessTokenAuth(
40+
const moduleRef = await withApiAuth(
4141
userEmail,
4242
Test.createTestingModule({
4343
imports: [AppModule, PrismaModule, UsersModule, TokensModule, SchedulesModule_2024_04_15],

apps/api/v2/src/ee/schedules/schedules_2024_04_15/controllers/schedules.controller.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { SchedulesService_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15
88
import { VERSION_2024_04_15_VALUE } from "@/lib/api-versions";
99
import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator";
1010
import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator";
11-
import { AccessTokenGuard } from "@/modules/auth/guards/access-token/access-token.guard";
11+
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
1212
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
1313
import { UserWithProfile } from "@/modules/users/users.repository";
1414
import {
@@ -35,7 +35,7 @@ import { CreateScheduleInput_2024_04_15 } from "../inputs/create-schedule.input"
3535
path: "/v2/schedules",
3636
version: VERSION_2024_04_15_VALUE,
3737
})
38-
@UseGuards(AccessTokenGuard, PermissionsGuard)
38+
@UseGuards(ApiAuthGuard, PermissionsGuard)
3939
@DocsTags("Schedules")
4040
export class SchedulesController_2024_04_15 {
4141
constructor(private readonly schedulesService: SchedulesService_2024_04_15) {}

0 commit comments

Comments
 (0)