diff --git a/apps/api/v2/src/ee/schedules/schedules_2024_06_11/schedules.repository.ts b/apps/api/v2/src/ee/schedules/schedules_2024_06_11/schedules.repository.ts index 92d05bc871..763be8695a 100644 --- a/apps/api/v2/src/ee/schedules/schedules_2024_06_11/schedules.repository.ts +++ b/apps/api/v2/src/ee/schedules/schedules_2024_06_11/schedules.repository.ts @@ -229,4 +229,19 @@ export class SchedulesRepository_2024_06_11 { }, }); } + + async getSchedulesByUserIds(userIds: number[], skip: number, take: number) { + return this.dbRead.prisma.schedule.findMany({ + where: { + userId: { + in: userIds, + }, + }, + include: { + availability: true, + }, + skip, + take, + }); + } } diff --git a/apps/api/v2/src/modules/endpoints.module.ts b/apps/api/v2/src/modules/endpoints.module.ts index 1083aee87e..c1c259b66c 100644 --- a/apps/api/v2/src/modules/endpoints.module.ts +++ b/apps/api/v2/src/modules/endpoints.module.ts @@ -11,6 +11,7 @@ import { OrganizationsTeamsBookingsModule } from "@/modules/organizations/teams/ import { OrganizationsUsersBookingsModule } from "@/modules/organizations/users/bookings/organizations-users-bookings.module"; import { RouterModule } from "@/modules/router/router.module"; import { StripeModule } from "@/modules/stripe/stripe.module"; +import { TeamsSchedulesModule } from "@/modules/teams/schedules/teams-schedules.module"; import { TimezoneModule } from "@/modules/timezones/timezones.module"; import { VerifiedResourcesModule } from "@/modules/verified-resources/verified-resources.module"; import type { MiddlewareConsumer, NestModule } from "@nestjs/common"; @@ -38,6 +39,7 @@ import { WebhooksModule } from "./webhooks/webhooks.module"; OrganizationsRoutingFormsModule, VerifiedResourcesModule, RouterModule, + TeamsSchedulesModule, ], }) export class EndpointsModule implements NestModule { diff --git a/apps/api/v2/src/modules/organizations/organizations.module.ts b/apps/api/v2/src/modules/organizations/organizations.module.ts index 9739679670..a9dad4f97d 100644 --- a/apps/api/v2/src/modules/organizations/organizations.module.ts +++ b/apps/api/v2/src/modules/organizations/organizations.module.ts @@ -1,5 +1,9 @@ +import { OrganizationsEventTypesPrivateLinksController } from "@/ee/event-types-private-links/controllers/organizations-event-types-private-links.controller"; +import { EventTypesPrivateLinksModule } from "@/ee/event-types-private-links/event-types-private-links.module"; import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module"; import { SchedulesModule_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/schedules.module"; +import { InputSchedulesService_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/services/input-schedules.service"; +import { SchedulesService_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/services/schedules.service"; import { AppsRepository } from "@/modules/apps/apps.repository"; import { ConferencingRepository } from "@/modules/conferencing/repositories/conferencing.repository"; import { ConferencingService } from "@/modules/conferencing/services/conferencing.service"; @@ -18,13 +22,10 @@ import { OrganizationAttributesService } from "@/modules/organizations/attribute import { OrganizationAttributeOptionRepository } from "@/modules/organizations/attributes/options/organization-attribute-options.repository"; import { OrganizationsAttributesOptionsController } from "@/modules/organizations/attributes/options/organizations-attributes-options.controller"; import { OrganizationAttributeOptionService } from "@/modules/organizations/attributes/options/services/organization-attributes-option.service"; -import { OrganizationsConferencingController } from "@/modules/organizations/conferencing/organizations-conferencing.controller"; import { OrganizationsConferencingModule } from "@/modules/organizations/conferencing/organizations-conferencing.module"; import { OrganizationsConferencingService } from "@/modules/organizations/conferencing/services/organizations-conferencing.service"; import { OrganizationsDelegationCredentialModule } from "@/modules/organizations/delegation-credentials/organizations-delegation-credential.module"; import { OrganizationsEventTypesController } from "@/modules/organizations/event-types/organizations-event-types.controller"; -import { EventTypesPrivateLinksModule } from "@/ee/event-types-private-links/event-types-private-links.module"; -import { OrganizationsEventTypesPrivateLinksController } from "@/ee/event-types-private-links/controllers/organizations-event-types-private-links.controller"; import { OrganizationsEventTypesRepository } from "@/modules/organizations/event-types/organizations-event-types.repository"; import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/event-types/pipes/team-event-types-response.transformer"; import { InputOrganizationsEventTypesService } from "@/modules/organizations/event-types/services/input.service"; @@ -38,7 +39,6 @@ import { OrganizationsMembershipOutputService } from "@/modules/organizations/me import { OrganizationsMembershipService } from "@/modules/organizations/memberships/services/organizations-membership.service"; import { OrganizationsOrganizationsModule } from "@/modules/organizations/organizations/organizations-organizations.module"; import { OrganizationsSchedulesController } from "@/modules/organizations/schedules/organizations-schedules.controller"; -import { OrganizationSchedulesRepository } from "@/modules/organizations/schedules/organizations-schedules.repository"; import { OrganizationsSchedulesService } from "@/modules/organizations/schedules/services/organizations-schedules.service"; import { OrganizationsStripeModule } from "@/modules/organizations/stripe/organizations-stripe.module"; import { OrganizationsStripeService } from "@/modules/organizations/stripe/services/organizations-stripe.service"; @@ -65,6 +65,7 @@ import { RedisModule } from "@/modules/redis/redis.module"; import { RedisService } from "@/modules/redis/redis.service"; import { StripeModule } from "@/modules/stripe/stripe.module"; import { TeamsEventTypesModule } from "@/modules/teams/event-types/teams-event-types.module"; +import { TeamsSchedulesService } from "@/modules/teams/schedules/services/teams-schedules.service"; import { TeamsModule } from "@/modules/teams/teams/teams.module"; import { TokensRepository } from "@/modules/tokens/tokens.repository"; import { UsersModule } from "@/modules/users/users.module"; @@ -102,7 +103,6 @@ import { Module } from "@nestjs/common"; OrganizationsTeamsService, MembershipsRepository, OrganizationsSchedulesService, - OrganizationSchedulesRepository, OrganizationsUsersRepository, OrganizationsUsersService, EmailService, @@ -144,6 +144,9 @@ import { Module } from "@nestjs/common"; TeamWorkflowsService, WorkflowsInputService, WorkflowsOutputService, + TeamsSchedulesService, + SchedulesService_2024_06_11, + InputSchedulesService_2024_06_11, ], exports: [ OrganizationsService, diff --git a/apps/api/v2/src/modules/organizations/schedules/services/organizations-schedules.service.ts b/apps/api/v2/src/modules/organizations/schedules/services/organizations-schedules.service.ts index 4d5ddb9255..a30d4d0870 100644 --- a/apps/api/v2/src/modules/organizations/schedules/services/organizations-schedules.service.ts +++ b/apps/api/v2/src/modules/organizations/schedules/services/organizations-schedules.service.ts @@ -1,5 +1,5 @@ +import { SchedulesRepository_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/schedules.repository"; import { OutputSchedulesService_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/services/output-schedules.service"; -import { OrganizationSchedulesRepository } from "@/modules/organizations/schedules/organizations-schedules.repository"; import { UsersRepository } from "@/modules/users/users.repository"; import { Injectable } from "@nestjs/common"; @@ -8,8 +8,8 @@ import { ScheduleOutput_2024_06_11 } from "@calcom/platform-types"; @Injectable() export class OrganizationsSchedulesService { constructor( - private readonly organizationSchedulesService: OrganizationSchedulesRepository, private readonly outputSchedulesService: OutputSchedulesService_2024_06_11, + private readonly schedulesRepository: SchedulesRepository_2024_06_11, private readonly usersRepository: UsersRepository ) {} @@ -17,7 +17,7 @@ export class OrganizationsSchedulesService { const users = await this.usersRepository.getOrganizationUsers(organizationId); const usersIds = users.map((user) => user.id); - const schedules = await this.organizationSchedulesService.getSchedulesByUserIds(usersIds, skip, take); + const schedules = await this.schedulesRepository.getSchedulesByUserIds(usersIds, skip, take); const responseSchedules: ScheduleOutput_2024_06_11[] = []; diff --git a/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.controller.ts b/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.controller.ts index db5914b1d4..87e078e775 100644 --- a/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.controller.ts +++ b/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.controller.ts @@ -14,11 +14,12 @@ import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; import { IsTeamInOrg } from "@/modules/auth/guards/teams/is-team-in-org.guard"; import { IsUserInOrgTeam } from "@/modules/auth/guards/users/is-user-in-org-team.guard"; -import { Controller, UseGuards, Get, Param, ParseIntPipe } from "@nestjs/common"; +import { TeamsSchedulesService } from "@/modules/teams/schedules/services/teams-schedules.service"; +import { Controller, UseGuards, Get, Param, ParseIntPipe, Query } from "@nestjs/common"; import { ApiHeader, ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger"; import { SUCCESS_STATUS } from "@calcom/platform-constants"; -import { GetSchedulesOutput_2024_06_11 } from "@calcom/platform-types"; +import { GetSchedulesOutput_2024_06_11, SkipTakePagination } from "@calcom/platform-types"; @Controller({ path: "/v2/organizations/:orgId/teams/:teamId", @@ -29,7 +30,31 @@ import { GetSchedulesOutput_2024_06_11 } from "@calcom/platform-types"; @ApiHeader(OPTIONAL_X_CAL_SECRET_KEY_HEADER) @ApiHeader(OPTIONAL_API_KEY_HEADER) export class OrganizationsTeamsSchedulesController { - constructor(private schedulesService: SchedulesService_2024_06_11) {} + constructor( + private schedulesService: SchedulesService_2024_06_11, + + private teamsSchedulesService: TeamsSchedulesService + ) {} + + @UseGuards(IsTeamInOrg) + @Roles("TEAM_ADMIN") + @PlatformPlan("ESSENTIALS") + @Get("/schedules") + @DocsTags("Orgs / Teams / Schedules") + @ApiOperation({ summary: "Get all team member schedules" }) + async getTeamSchedules( + @Param("teamId", ParseIntPipe) teamId: number, + @Query() queryParams: SkipTakePagination + ): Promise { + const { skip, take } = queryParams; + + const schedules = await this.teamsSchedulesService.getTeamSchedules(teamId, skip, take); + + return { + status: SUCCESS_STATUS, + data: schedules, + }; + } @Roles("TEAM_ADMIN") @PlatformPlan("ESSENTIALS") diff --git a/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.e2e-spec.ts b/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.e2e-spec.ts index 4a42315247..179f36c1bc 100644 --- a/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.e2e-spec.ts @@ -18,6 +18,7 @@ import { randomString } from "test/utils/randomString"; import { withApiAuth } from "test/utils/withApiAuth"; import { SUCCESS_STATUS } from "@calcom/platform-constants"; +import { GetSchedulesOutput_2024_06_11 } from "@calcom/platform-types"; import { ApiSuccessResponse, ScheduleOutput_2024_06_11 } from "@calcom/platform-types"; import { Team, Schedule } from "@calcom/prisma/client"; @@ -36,6 +37,8 @@ describe("Organizations Teams Schedules Endpoints", () => { let org: Team; let orgTeam: Team; let nonOrgTeam: Team; + + let userSchedule: Schedule; let user2Schedule: Schedule; const userEmail = `organizations-teams-schedules-admin-${randomString()}@api.com`; @@ -73,6 +76,16 @@ describe("Organizations Teams Schedules Endpoints", () => { username: userEmail2, }); + userSchedule = await scheduleRepositoryFixture.create({ + user: { + connect: { + id: user.id, + }, + }, + name: `organizations-teams-schedules-user-schedule-${randomString()}`, + timeZone: "America/New_York", + }); + user2Schedule = await scheduleRepositoryFixture.create({ user: { connect: { @@ -214,6 +227,32 @@ describe("Organizations Teams Schedules Endpoints", () => { }); }); + it("should get all the schedules of members in a team", async () => { + return request(app.getHttpServer()) + .get(`/v2/organizations/${org.id}/teams/${orgTeam.id}/schedules`) + .expect(200) + .then((response) => { + const responseBody: GetSchedulesOutput_2024_06_11 = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + expect(Array.isArray(responseBody.data)).toBe(true); + expect(responseBody.data.length).toEqual(2); + + const userOneSchedule = responseBody.data.find((schedule) => schedule.id === userSchedule.id); + const userTwoSchedule = responseBody.data.find((schedule) => schedule.id === user2Schedule.id); + + expect(userOneSchedule).toBeDefined(); + expect(userTwoSchedule).toBeDefined(); + + expect(userOneSchedule?.id).toEqual(userSchedule.id); + expect(userOneSchedule?.name).toEqual(userSchedule.name); + expect(userOneSchedule?.timeZone).toEqual(userSchedule.timeZone); + + expect(userTwoSchedule?.id).toEqual(user2Schedule.id); + expect(userTwoSchedule?.name).toEqual(user2Schedule.name); + expect(userOneSchedule?.timeZone).toEqual(user2Schedule.timeZone); + }); + }); + afterAll(async () => { await userRepositoryFixture.deleteByEmail(user.email); await userRepositoryFixture.deleteByEmail(userToInviteViaApi.email); diff --git a/apps/api/v2/src/modules/teams/schedules/controllers/teams-schedules.controller.ts b/apps/api/v2/src/modules/teams/schedules/controllers/teams-schedules.controller.ts new file mode 100644 index 0000000000..f25a24c9b5 --- /dev/null +++ b/apps/api/v2/src/modules/teams/schedules/controllers/teams-schedules.controller.ts @@ -0,0 +1,41 @@ +import { API_VERSIONS_VALUES } from "@/lib/api-versions"; +import { API_KEY_OR_ACCESS_TOKEN_HEADER } from "@/lib/docs/headers"; +import { Roles } from "@/modules/auth/decorators/roles/roles.decorator"; +import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; +import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; +import { TeamsSchedulesService } from "@/modules/teams/schedules/services/teams-schedules.service"; +import { Controller, UseGuards, Get, Param, ParseIntPipe, Query } from "@nestjs/common"; +import { ApiHeader, ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger"; + +import { SUCCESS_STATUS } from "@calcom/platform-constants"; +import { GetSchedulesOutput_2024_06_11, SkipTakePagination } from "@calcom/platform-types"; + +@Controller({ + path: "/v2/teams/:teamId/schedules", + version: API_VERSIONS_VALUES, +}) +@UseGuards(ApiAuthGuard, RolesGuard) +@DocsTags("Teams / Schedules") +@ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) +export class TeamsSchedulesController { + constructor(private teamsSchedulesService: TeamsSchedulesService) {} + + @Roles("TEAM_ADMIN") + @Get("/") + @ApiOperation({ + summary: "Get all team member schedules", + }) + async getTeamSchedules( + @Param("teamId", ParseIntPipe) teamId: number, + @Query() queryParams: SkipTakePagination + ): Promise { + const { skip, take } = queryParams; + + const schedules = await this.teamsSchedulesService.getTeamSchedules(teamId, skip, take); + + return { + status: SUCCESS_STATUS, + data: schedules, + }; + } +} diff --git a/apps/api/v2/src/modules/teams/schedules/controllers/teams-schedules.e2e-spec.ts b/apps/api/v2/src/modules/teams/schedules/controllers/teams-schedules.e2e-spec.ts new file mode 100644 index 0000000000..1306352382 --- /dev/null +++ b/apps/api/v2/src/modules/teams/schedules/controllers/teams-schedules.e2e-spec.ts @@ -0,0 +1,143 @@ +import { bootstrap } from "@/app"; +import { AppModule } from "@/app.module"; +import { PrismaModule } from "@/modules/prisma/prisma.module"; +import { TokensModule } from "@/modules/tokens/tokens.module"; +import { UsersModule } from "@/modules/users/users.module"; +import { INestApplication } from "@nestjs/common"; +import { NestExpressApplication } from "@nestjs/platform-express"; +import { Test } from "@nestjs/testing"; +import { User } from "@prisma/client"; +import * as request from "supertest"; +import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.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"; +import { randomString } from "test/utils/randomString"; +import { withApiAuth } from "test/utils/withApiAuth"; + +import { SUCCESS_STATUS } from "@calcom/platform-constants"; +import { GetSchedulesOutput_2024_06_11 } from "@calcom/platform-types"; +import { Team, Schedule } from "@calcom/prisma/client"; + +describe("Teams Schedules Endpoints", () => { + describe("User Authentication - User is Team Admin", () => { + let app: INestApplication; + + let userRepositoryFixture: UserRepositoryFixture; + + let teamsRepositoryFixture: TeamRepositoryFixture; + let scheduleRepositoryFixture: SchedulesRepositoryFixture; + + let membershipsRepositoryFixture: MembershipRepositoryFixture; + + let nonOrgTeam: Team; + + let userSchedule: Schedule; + let user2Schedule: Schedule; + + const userEmail = `teams-schedules-admin-${randomString()}@api.com`; + const userEmail2 = `teams-schedules-member-${randomString()}@api.com`; + + let user: User; + let user2: User; + + beforeAll(async () => { + const moduleRef = await withApiAuth( + userEmail, + Test.createTestingModule({ + imports: [AppModule, PrismaModule, UsersModule, TokensModule], + }) + ).compile(); + + userRepositoryFixture = new UserRepositoryFixture(moduleRef); + teamsRepositoryFixture = new TeamRepositoryFixture(moduleRef); + + scheduleRepositoryFixture = new SchedulesRepositoryFixture(moduleRef); + membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef); + + user = await userRepositoryFixture.create({ + email: userEmail, + username: userEmail, + }); + user2 = await userRepositoryFixture.create({ + email: userEmail2, + username: userEmail2, + }); + + userSchedule = await scheduleRepositoryFixture.create({ + user: { + connect: { + id: user.id, + }, + }, + name: `teams-schedules-user-schedule-${randomString()}`, + timeZone: "America/New_York", + }); + + user2Schedule = await scheduleRepositoryFixture.create({ + user: { + connect: { + id: user2.id, + }, + }, + name: `teams-schedules-user2-schedule-${randomString()}`, + timeZone: "America/New_York", + }); + + nonOrgTeam = await teamsRepositoryFixture.create({ + name: `teams-schedules-non-org-team-${randomString()}`, + isOrganization: false, + }); + + await membershipsRepositoryFixture.create({ + role: "ADMIN", + user: { connect: { id: user.id } }, + team: { connect: { id: nonOrgTeam.id } }, + }); + + await membershipsRepositoryFixture.create({ + role: "MEMBER", + user: { connect: { id: user2.id } }, + team: { connect: { id: nonOrgTeam.id } }, + }); + + app = moduleRef.createNestApplication(); + bootstrap(app as NestExpressApplication); + + await app.init(); + }); + + it("should get all the schedules of members in a team", async () => { + return request(app.getHttpServer()) + .get(`/v2/teams/${nonOrgTeam.id}/schedules`) + .expect(200) + .then((response) => { + const responseBody: GetSchedulesOutput_2024_06_11 = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + expect(Array.isArray(responseBody.data)).toBe(true); + expect(responseBody.data.length).toEqual(2); + + const userOneSchedule = responseBody.data.find((schedule) => schedule.id === userSchedule.id); + const userTwoSchedule = responseBody.data.find((schedule) => schedule.id === user2Schedule.id); + + expect(userOneSchedule).toBeDefined(); + expect(userTwoSchedule).toBeDefined(); + + expect(userOneSchedule?.id).toEqual(userSchedule.id); + expect(userOneSchedule?.name).toEqual(userSchedule.name); + expect(userOneSchedule?.timeZone).toEqual(userSchedule.timeZone); + + expect(userTwoSchedule?.id).toEqual(user2Schedule.id); + expect(userTwoSchedule?.name).toEqual(user2Schedule.name); + expect(userOneSchedule?.timeZone).toEqual(user2Schedule.timeZone); + }); + }); + + afterAll(async () => { + await userRepositoryFixture.deleteByEmail(user.email); + await userRepositoryFixture.deleteByEmail(user2.email); + await teamsRepositoryFixture.delete(nonOrgTeam.id); + await app.close(); + }); + }); +}); diff --git a/apps/api/v2/src/modules/teams/schedules/services/teams-schedules.service.ts b/apps/api/v2/src/modules/teams/schedules/services/teams-schedules.service.ts new file mode 100644 index 0000000000..e34d6d6484 --- /dev/null +++ b/apps/api/v2/src/modules/teams/schedules/services/teams-schedules.service.ts @@ -0,0 +1,28 @@ +import { SchedulesRepository_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/schedules.repository"; +import { OutputSchedulesService_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/services/output-schedules.service"; +import { TeamsRepository } from "@/modules/teams/teams/teams.repository"; +import { Injectable } from "@nestjs/common"; + +import { ScheduleOutput_2024_06_11 } from "@calcom/platform-types"; + +@Injectable() +export class TeamsSchedulesService { + constructor( + private readonly teamsRepository: TeamsRepository, + private readonly schedulesRepository: SchedulesRepository_2024_06_11, + private readonly outputSchedulesService: OutputSchedulesService_2024_06_11 + ) {} + + async getTeamSchedules(teamId: number, skip = 0, take = 250) { + const userIds = await this.teamsRepository.getTeamUsersIds(teamId); + const schedules = await this.schedulesRepository.getSchedulesByUserIds(userIds, skip, take); + + const responseSchedules: ScheduleOutput_2024_06_11[] = []; + + for (const schedule of schedules) { + responseSchedules.push(await this.outputSchedulesService.getResponseSchedule(schedule)); + } + + return responseSchedules; + } +} diff --git a/apps/api/v2/src/modules/teams/schedules/teams-schedules.module.ts b/apps/api/v2/src/modules/teams/schedules/teams-schedules.module.ts new file mode 100644 index 0000000000..89d34c13cd --- /dev/null +++ b/apps/api/v2/src/modules/teams/schedules/teams-schedules.module.ts @@ -0,0 +1,43 @@ +import { SchedulesRepository_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/schedules.repository"; +import { OutputSchedulesService_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/services/output-schedules.service"; +import { AppsRepository } from "@/modules/apps/apps.repository"; +import { CredentialsRepository } from "@/modules/credentials/credentials.repository"; +import { MembershipsModule } from "@/modules/memberships/memberships.module"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { OrganizationSchedulesRepository } from "@/modules/organizations/schedules/organizations-schedules.repository"; +import { OrganizationsTeamsRepository } from "@/modules/organizations/teams/index/organizations-teams.repository"; +import { PrismaModule } from "@/modules/prisma/prisma.module"; +import { RedisModule } from "@/modules/redis/redis.module"; +import { StripeService } from "@/modules/stripe/stripe.service"; +import { TeamsMembershipsService } from "@/modules/teams/memberships/services/teams-memberships.service"; +import { TeamsMembershipsRepository } from "@/modules/teams/memberships/teams-memberships.repository"; +import { TeamsSchedulesController } from "@/modules/teams/schedules/controllers/teams-schedules.controller"; +import { TeamsSchedulesService } from "@/modules/teams/schedules/services/teams-schedules.service"; +import { TeamsController } from "@/modules/teams/teams/controllers/teams.controller"; +import { TeamsService } from "@/modules/teams/teams/services/teams.service"; +import { TeamsRepository } from "@/modules/teams/teams/teams.repository"; +import { UsersRepository } from "@/modules/users/users.repository"; +import { Module } from "@nestjs/common"; + +@Module({ + imports: [PrismaModule, MembershipsModule, RedisModule], + providers: [ + TeamsRepository, + TeamsService, + TeamsMembershipsRepository, + TeamsMembershipsService, + OutputSchedulesService_2024_06_11, + OrganizationSchedulesRepository, + StripeService, + UsersRepository, + AppsRepository, + CredentialsRepository, + OrganizationsRepository, + TeamsSchedulesService, + OrganizationsTeamsRepository, + SchedulesRepository_2024_06_11, + ], + controllers: [TeamsController, TeamsSchedulesController], + exports: [TeamsRepository], +}) +export class TeamsSchedulesModule {}