diff --git a/backend/src/infrastructure/database/mongoose.module.ts b/backend/src/infrastructure/database/mongoose.module.ts index 2ba46040f..4b097dbba 100644 --- a/backend/src/infrastructure/database/mongoose.module.ts +++ b/backend/src/infrastructure/database/mongoose.module.ts @@ -3,10 +3,10 @@ import ResetPassword, { ResetPasswordSchema } from 'src/modules/auth/entities/reset-password.schema'; import Board, { BoardSchema } from 'src/modules/boards/entities/board.schema'; -import BoardUser, { BoardUserSchema } from 'src/modules/boards/entities/board.user.schema'; +import BoardUser, { BoardUserSchema } from 'src/modules/boardUsers/entities/board.user.schema'; import Schedules, { SchedulesSchema } from 'src/modules/schedules/entities/schedules.schema'; -import TeamUser, { TeamUserSchema } from 'src/modules/teams/entities/team.user.schema'; -import Team, { TeamSchema } from 'src/modules/teams/entities/teams.schema'; +import TeamUser, { TeamUserSchema } from 'src/modules/teamUsers/entities/team.user.schema'; +import Team, { TeamSchema } from 'src/modules/teams/entities/team.schema'; import User, { UserSchema } from 'src/modules/users/entities/user.schema'; export const mongooseBoardModule = MongooseModule.forFeature([ diff --git a/backend/src/libs/guards/boardRoles.guard.ts b/backend/src/libs/guards/boardRoles.guard.ts index 8d0be0daa..b12c5b18b 100644 --- a/backend/src/libs/guards/boardRoles.guard.ts +++ b/backend/src/libs/guards/boardRoles.guard.ts @@ -1,25 +1,24 @@ -import { GetBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/get.board.user.service.interface'; +import { GetTeamUserServiceInterface } from '../../modules/teamUsers/interfaces/services/get.team.user.service.interface'; +import { GetBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/get.board.user.service.interface'; import { GetBoardServiceInterface } from 'src/modules/boards/interfaces/services/get.board.service.interface'; -import { GetTeamServiceInterface } from 'src/modules/teams/interfaces/services/get.team.service.interface'; import { CanActivate, ExecutionContext, ForbiddenException, Inject, - Injectable, - forwardRef + Injectable } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; -import * as Teams from 'src/modules/teams/interfaces/types'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; import * as Boards from 'src/modules/boards/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; -import TeamUser from 'src/modules/teams/entities/team.user.schema'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; @Injectable() export class BoardUserGuard implements CanActivate { constructor( - @Inject(forwardRef(() => Teams.TYPES.services.GetTeamService)) - private getTeamService: GetTeamServiceInterface, + @Inject(TeamUsers.TYPES.services.GetTeamUserService) + private getTeamUserService: GetTeamUserServiceInterface, private readonly reflector: Reflector, @Inject(Boards.TYPES.services.GetBoardService) private getBoardService: GetBoardServiceInterface, @@ -41,7 +40,7 @@ export class BoardUserGuard implements CanActivate { // If board has team, get Team User to check if it is Admin or Stakeholder if (board.team) - teamUser = await this.getTeamService.getTeamUser(user._id, String(board.team)); + teamUser = await this.getTeamUserService.getTeamUser(user._id, String(board.team)); const boardUserFound = await this.getBoardUserService.getBoardUser(boardId, user._id); diff --git a/backend/src/libs/guards/getBoardPermissions.guard.ts b/backend/src/libs/guards/getBoardPermissions.guard.ts index 4811f8415..7618b387d 100644 --- a/backend/src/libs/guards/getBoardPermissions.guard.ts +++ b/backend/src/libs/guards/getBoardPermissions.guard.ts @@ -6,13 +6,13 @@ import { Injectable } from '@nestjs/common'; import * as Boards from 'src/modules/boards/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; -import TeamUser from 'src/modules/teams/entities/team.user.schema'; -import Team from 'src/modules/teams/entities/teams.schema'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; +import Team from 'src/modules/teams/entities/team.schema'; import User from 'src/modules/users/entities/user.schema'; import { Reflector } from '@nestjs/core'; import { GetBoardServiceInterface } from 'src/modules/boards/interfaces/services/get.board.service.interface'; -import { GetBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/get.board.user.service.interface'; +import { GetBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/get.board.user.service.interface'; @Injectable() export class GetBoardGuard implements CanActivate { diff --git a/backend/src/libs/guards/teamRoles.guard.ts b/backend/src/libs/guards/teamRoles.guard.ts index ab190df02..09bc2941c 100644 --- a/backend/src/libs/guards/teamRoles.guard.ts +++ b/backend/src/libs/guards/teamRoles.guard.ts @@ -1,14 +1,20 @@ -import { CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; +import { GetTeamUserServiceInterface } from 'src/modules/teamUsers/interfaces/services/get.team.user.service.interface'; +import { + CanActivate, + ExecutionContext, + ForbiddenException, + Inject, + Injectable +} from '@nestjs/common'; import { Reflector } from '@nestjs/core'; -import { InjectModel } from '@nestjs/mongoose'; -import { Model } from 'mongoose'; -import TeamUser, { TeamUserDocument } from '../../modules/teams/entities/team.user.schema'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; @Injectable() export class TeamUserGuard implements CanActivate { constructor( private readonly reflector: Reflector, - @InjectModel(TeamUser.name) private teamUserModel: Model + @Inject(TeamUsers.TYPES.services.GetTeamUserService) + private getTeamUserService: GetTeamUserServiceInterface ) {} async canActivate(context: ExecutionContext) { @@ -18,7 +24,7 @@ export class TeamUserGuard implements CanActivate { const user = request.user; const teamId: string = request.params.teamId; try { - const userFound = await this.teamUserModel.findOne({ user: user._id, team: teamId }).exec(); + const userFound = await this.getTeamUserService.getTeamUser(user._id, teamId); const hasPermissions = permissions.includes(userFound?.role) || user.isSAdmin; return hasPermissions; diff --git a/backend/src/libs/test-utils/mocks/factories/boardUser-factory.mock.ts b/backend/src/libs/test-utils/mocks/factories/boardUser-factory.mock.ts index 64c18969e..fdced7b62 100644 --- a/backend/src/libs/test-utils/mocks/factories/boardUser-factory.mock.ts +++ b/backend/src/libs/test-utils/mocks/factories/boardUser-factory.mock.ts @@ -1,6 +1,6 @@ import faker from '@faker-js/faker'; import { buildTestFactory } from './generic-factory.mock'; -import BoardUser from 'src/modules/boards/entities/board.user.schema'; +import BoardUser from 'src/modules/boardUsers/entities/board.user.schema'; import { BoardRoles } from 'src/libs/enum/board.roles'; const mockBoardUserData = () => { diff --git a/backend/src/libs/test-utils/mocks/factories/dto/boardUserDto-factory.mock.ts b/backend/src/libs/test-utils/mocks/factories/dto/boardUserDto-factory.mock.ts index 530da0621..09e10629f 100644 --- a/backend/src/libs/test-utils/mocks/factories/dto/boardUserDto-factory.mock.ts +++ b/backend/src/libs/test-utils/mocks/factories/dto/boardUserDto-factory.mock.ts @@ -1,6 +1,6 @@ import faker from '@faker-js/faker'; import { BoardRoles } from 'src/libs/enum/board.roles'; -import BoardUserDto from 'src/modules/boards/dto/board.user.dto'; +import BoardUserDto from 'src/modules/boardUsers/dto/board.user.dto'; import { buildTestFactory } from '../generic-factory.mock'; import { UserFactory } from '../user-factory'; diff --git a/backend/src/libs/test-utils/mocks/factories/team-factory.mock.ts b/backend/src/libs/test-utils/mocks/factories/team-factory.mock.ts index 6cd40527a..e0fbfa601 100644 --- a/backend/src/libs/test-utils/mocks/factories/team-factory.mock.ts +++ b/backend/src/libs/test-utils/mocks/factories/team-factory.mock.ts @@ -1,6 +1,6 @@ import faker from '@faker-js/faker'; import { buildTestFactory } from './generic-factory.mock'; -import Team from 'src/modules/teams/entities/teams.schema'; +import Team from 'src/modules/teams/entities/team.schema'; const dateCreatedAt = faker.date.past(1); diff --git a/backend/src/libs/test-utils/mocks/factories/teamUser-factory.mock.ts b/backend/src/libs/test-utils/mocks/factories/teamUser-factory.mock.ts index 6b03d2da4..3850210ba 100644 --- a/backend/src/libs/test-utils/mocks/factories/teamUser-factory.mock.ts +++ b/backend/src/libs/test-utils/mocks/factories/teamUser-factory.mock.ts @@ -1,7 +1,7 @@ import faker from '@faker-js/faker'; import { buildTestFactory } from './generic-factory.mock'; import { TeamRoles } from 'src/libs/enum/team.roles'; -import TeamUser from 'src/modules/teams/entities/team.user.schema'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; const mockTeamUserData = () => { const isNewJoiner = faker.datatype.boolean(); diff --git a/backend/src/libs/utils/generateBoardData.ts b/backend/src/libs/utils/generateBoardData.ts index 933f92c5b..51170d32c 100644 --- a/backend/src/libs/utils/generateBoardData.ts +++ b/backend/src/libs/utils/generateBoardData.ts @@ -1,5 +1,5 @@ import BoardDto from 'src/modules/boards/dto/board.dto'; -import BoardUserDto from 'src/modules/boards/dto/board.user.dto'; +import BoardUserDto from 'src/modules/boardUsers/dto/board.user.dto'; import { CreateBoardDto } from 'src/modules/boards/dto/createBoard.dto'; export const generateSubBoardDtoData = (index: number, users: BoardUserDto[] = []): BoardDto => { diff --git a/backend/src/libs/validators/check-unique-users.ts b/backend/src/libs/validators/check-unique-users.ts index bb6ef1230..b5a125604 100644 --- a/backend/src/libs/validators/check-unique-users.ts +++ b/backend/src/libs/validators/check-unique-users.ts @@ -1,6 +1,6 @@ import { ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator'; -import BoardUserDto from 'src/modules/boards/dto/board.user.dto'; -import TeamUserDto from 'src/modules/teams/dto/team.user.dto'; +import BoardUserDto from 'src/modules/boardUsers/dto/board.user.dto'; +import TeamUserDto from 'src/modules/teamUsers/dto/team.user.dto'; @ValidatorConstraint({ name: 'checkUniqueUsers', async: false }) export class CheckUniqueUsers implements ValidatorConstraintInterface { diff --git a/backend/src/modules/auth/applications/statistics.auth.use-case.ts b/backend/src/modules/auth/applications/statistics.auth.use-case.ts index d5d6e0632..5cd564838 100644 --- a/backend/src/modules/auth/applications/statistics.auth.use-case.ts +++ b/backend/src/modules/auth/applications/statistics.auth.use-case.ts @@ -1,19 +1,19 @@ import { Inject, Injectable } from '@nestjs/common'; import * as User from 'src/modules/users/interfaces/types'; -import * as Teams from 'src/modules/teams/interfaces/types'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; import * as Boards from 'src/modules/boards/interfaces/types'; import { GetBoardApplicationInterface } from 'src/modules/boards/interfaces/applications/get.board.application.interface'; -import { GetTeamApplicationInterface } from 'src/modules/teams/interfaces/applications/get.team.application.interface'; import { GetUserServiceInterface } from 'src/modules/users/interfaces/services/get.user.service.interface'; import { StatisticsAuthUserUseCaseInterface } from '../interfaces/applications/statistics.auth.use-case.interface'; +import { GetTeamUserServiceInterface } from 'src/modules/teamUsers/interfaces/services/get.team.user.service.interface'; @Injectable() export default class StatisticsAuthUserUseCase implements StatisticsAuthUserUseCaseInterface { constructor( @Inject(User.TYPES.services.GetUserService) private getUserService: GetUserServiceInterface, - @Inject(Teams.TYPES.applications.GetTeamApplication) - private getTeamsService: GetTeamApplicationInterface, + @Inject(TeamUsers.TYPES.services.GetTeamUserService) + private getTeamUserService: GetTeamUserServiceInterface, @Inject(Boards.TYPES.applications.GetBoardApplication) private getBoardService: GetBoardApplicationInterface ) {} @@ -21,7 +21,7 @@ export default class StatisticsAuthUserUseCase implements StatisticsAuthUserUseC public async execute(userId: string) { const [usersCount, teamsCount, boardsCount] = await Promise.all([ this.getUserService.countUsers(), - this.getTeamsService.countTeams(userId), + this.getTeamUserService.countTeamsOfUser(userId), this.getBoardService.countBoards(userId) ]); diff --git a/backend/src/modules/auth/auth.module.ts b/backend/src/modules/auth/auth.module.ts index 193bbb9f8..b26064eaf 100644 --- a/backend/src/modules/auth/auth.module.ts +++ b/backend/src/modules/auth/auth.module.ts @@ -28,11 +28,13 @@ import AuthController from './controller/auth.controller'; import JwtStrategy from './strategy/jwt.strategy'; import LocalStrategy from './strategy/local.strategy'; import JwtRefreshTokenStrategy from './strategy/refresh.strategy'; +import TeamUsersModule from 'src/modules/teamUsers/teamusers.module'; @Module({ imports: [ UsersModule, TeamsModule, + TeamUsersModule, JwtRegister, BoardsModule, PassportModule, diff --git a/backend/src/modules/auth/services/validate-user.auth.service.spec.ts b/backend/src/modules/auth/services/validate-user.auth.service.spec.ts index 73e98bc0b..27d46cf18 100644 --- a/backend/src/modules/auth/services/validate-user.auth.service.spec.ts +++ b/backend/src/modules/auth/services/validate-user.auth.service.spec.ts @@ -1,3 +1,4 @@ +import { getTeamUserService, teamUserRepository } from '../../teamUsers/teamusers.providers'; import { ConfigService } from '@nestjs/config'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { JwtService } from '@nestjs/jwt'; @@ -13,14 +14,9 @@ import { boardUserRepository, createBoardUserService, getBoardUserService -} from 'src/modules/boardusers/boardusers.providers'; +} from 'src/modules/boardUsers/boardusers.providers'; import SocketGateway from 'src/modules/socket/gateway/socket.gateway'; -import { - getTeamService, - teamRepository, - teamUserRepository, - updateTeamService -} from 'src/modules/teams/providers'; +import { getTeamService, teamRepository } from 'src/modules/teams/providers'; import { TYPES } from 'src/modules/users/interfaces/types'; import GetUserService from 'src/modules/users/services/get.user.service'; import { @@ -59,8 +55,6 @@ describe('The AuthenticationService', () => { getTeamService, userRepository, teamRepository, - teamUserRepository, - updateTeamService, getBoardService, createBoardUserService, getTokenAuthService, @@ -68,6 +62,8 @@ describe('The AuthenticationService', () => { boardRepository, updateUserService, getBoardUserService, + getTeamUserService, + teamUserRepository, resetPasswordRepository, { provide: ConfigService, diff --git a/backend/src/modules/boardusers/boardusers.module.ts b/backend/src/modules/boardUsers/boardusers.module.ts similarity index 100% rename from backend/src/modules/boardusers/boardusers.module.ts rename to backend/src/modules/boardUsers/boardusers.module.ts diff --git a/backend/src/modules/boardusers/boardusers.providers.ts b/backend/src/modules/boardUsers/boardusers.providers.ts similarity index 83% rename from backend/src/modules/boardusers/boardusers.providers.ts rename to backend/src/modules/boardUsers/boardusers.providers.ts index 187aa13a2..9cddb40cf 100644 --- a/backend/src/modules/boardusers/boardusers.providers.ts +++ b/backend/src/modules/boardUsers/boardusers.providers.ts @@ -1,5 +1,5 @@ -import { BoardUserRepository } from '../boardusers/repositories/board-user.repository'; -import CreateBoardUserService from '../boardusers/services/create.board.user.service'; +import { BoardUserRepository } from './repositories/board-user.repository'; +import CreateBoardUserService from './services/create.board.user.service'; import { TYPES } from './interfaces/types'; import DeleteBoardUserService from './services/delete.board.user.service'; import GetBoardUserService from './services/get.board.user.service'; diff --git a/backend/src/modules/boards/dto/board.guest.user.dto.ts b/backend/src/modules/boardUsers/dto/board.guest.user.dto.ts similarity index 100% rename from backend/src/modules/boards/dto/board.guest.user.dto.ts rename to backend/src/modules/boardUsers/dto/board.guest.user.dto.ts diff --git a/backend/src/modules/boards/dto/board.user.dto.ts b/backend/src/modules/boardUsers/dto/board.user.dto.ts similarity index 100% rename from backend/src/modules/boards/dto/board.user.dto.ts rename to backend/src/modules/boardUsers/dto/board.user.dto.ts diff --git a/backend/src/modules/boards/dto/update-board-user.dto.ts b/backend/src/modules/boardUsers/dto/update-board-user.dto.ts similarity index 87% rename from backend/src/modules/boards/dto/update-board-user.dto.ts rename to backend/src/modules/boardUsers/dto/update-board-user.dto.ts index ada2f613c..4908b268f 100644 --- a/backend/src/modules/boards/dto/update-board-user.dto.ts +++ b/backend/src/modules/boardUsers/dto/update-board-user.dto.ts @@ -1,6 +1,6 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsArray, IsOptional } from 'class-validator'; -import BoardUserDto from 'src/modules/boards/dto/board.user.dto'; +import BoardUserDto from 'src/modules/boardUsers/dto/board.user.dto'; export default class UpdateBoardUserDto { @ApiProperty({ description: 'List of users to add on board' }) diff --git a/backend/src/modules/boards/entities/board.user.schema.ts b/backend/src/modules/boardUsers/entities/board.user.schema.ts similarity index 100% rename from backend/src/modules/boards/entities/board.user.schema.ts rename to backend/src/modules/boardUsers/entities/board.user.schema.ts diff --git a/backend/src/modules/boardusers/interfaces/repositories/board-user.repository.interface.ts b/backend/src/modules/boardUsers/interfaces/repositories/board-user.repository.interface.ts similarity index 89% rename from backend/src/modules/boardusers/interfaces/repositories/board-user.repository.interface.ts rename to backend/src/modules/boardUsers/interfaces/repositories/board-user.repository.interface.ts index aca2d0777..7935890b6 100644 --- a/backend/src/modules/boardusers/interfaces/repositories/board-user.repository.interface.ts +++ b/backend/src/modules/boardUsers/interfaces/repositories/board-user.repository.interface.ts @@ -1,8 +1,8 @@ import { ObjectId } from 'mongoose'; import { BaseInterfaceRepository } from 'src/libs/repositories/interfaces/base.repository.interface'; -import BoardUserDto from 'src/modules/boards/dto/board.user.dto'; +import BoardUserDto from 'src/modules/boardUsers/dto/board.user.dto'; import Board from 'src/modules/boards/entities/board.schema'; -import BoardUser from 'src/modules/boards/entities/board.user.schema'; +import BoardUser from 'src/modules/boardUsers/entities/board.user.schema'; export interface BoardUserRepositoryInterface extends BaseInterfaceRepository { getAllBoardsIdsOfUser(userId: string): Promise; diff --git a/backend/src/modules/boardusers/interfaces/services/create.board.user.service.interface.ts b/backend/src/modules/boardUsers/interfaces/services/create.board.user.service.interface.ts similarity index 60% rename from backend/src/modules/boardusers/interfaces/services/create.board.user.service.interface.ts rename to backend/src/modules/boardUsers/interfaces/services/create.board.user.service.interface.ts index a05d40104..d171606dc 100644 --- a/backend/src/modules/boardusers/interfaces/services/create.board.user.service.interface.ts +++ b/backend/src/modules/boardUsers/interfaces/services/create.board.user.service.interface.ts @@ -1,5 +1,5 @@ -import BoardUser from 'src/modules/boards/entities/board.user.schema'; -import BoardUserDto from '../../../boards/dto/board.user.dto'; +import BoardUser from 'src/modules/boardUsers/entities/board.user.schema'; +import BoardUserDto from '../../dto/board.user.dto'; export interface CreateBoardUserServiceInterface { saveBoardUsers(newUsers: BoardUserDto[], newBoardId?: string): Promise; diff --git a/backend/src/modules/boardusers/interfaces/services/delete.board.user.service.interface.ts b/backend/src/modules/boardUsers/interfaces/services/delete.board.user.service.interface.ts similarity index 84% rename from backend/src/modules/boardusers/interfaces/services/delete.board.user.service.interface.ts rename to backend/src/modules/boardUsers/interfaces/services/delete.board.user.service.interface.ts index 51e290273..ab264cc9b 100644 --- a/backend/src/modules/boardusers/interfaces/services/delete.board.user.service.interface.ts +++ b/backend/src/modules/boardUsers/interfaces/services/delete.board.user.service.interface.ts @@ -1,4 +1,4 @@ -import { SessionInterface } from './../../../../libs/transactions/session.interface'; +import { SessionInterface } from '../../../../libs/transactions/session.interface'; import { ObjectId } from 'mongoose'; import Board from 'src/modules/boards/entities/board.schema'; diff --git a/backend/src/modules/boardusers/interfaces/services/get.board.user.service.interface.ts b/backend/src/modules/boardUsers/interfaces/services/get.board.user.service.interface.ts similarity index 82% rename from backend/src/modules/boardusers/interfaces/services/get.board.user.service.interface.ts rename to backend/src/modules/boardUsers/interfaces/services/get.board.user.service.interface.ts index 64ef61632..869ebbef2 100644 --- a/backend/src/modules/boardusers/interfaces/services/get.board.user.service.interface.ts +++ b/backend/src/modules/boardUsers/interfaces/services/get.board.user.service.interface.ts @@ -1,4 +1,4 @@ -import BoardUser from 'src/modules/boards/entities/board.user.schema'; +import BoardUser from 'src/modules/boardUsers/entities/board.user.schema'; export interface GetBoardUserServiceInterface { getAllBoardsOfUser(userId: string): Promise; diff --git a/backend/src/modules/boardusers/interfaces/services/update.board.user.service.interface.ts b/backend/src/modules/boardUsers/interfaces/services/update.board.user.service.interface.ts similarity index 83% rename from backend/src/modules/boardusers/interfaces/services/update.board.user.service.interface.ts rename to backend/src/modules/boardUsers/interfaces/services/update.board.user.service.interface.ts index df5c31842..f1bc1db67 100644 --- a/backend/src/modules/boardusers/interfaces/services/update.board.user.service.interface.ts +++ b/backend/src/modules/boardUsers/interfaces/services/update.board.user.service.interface.ts @@ -1,5 +1,5 @@ import { SessionInterface } from 'src/libs/transactions/session.interface'; -import BoardUser from 'src/modules/boards/entities/board.user.schema'; +import BoardUser from 'src/modules/boardUsers/entities/board.user.schema'; export interface UpdateBoardUserServiceInterface extends SessionInterface { updateBoardUserRole(boardId: string, userId: string, role: string): Promise; diff --git a/backend/src/modules/boardusers/interfaces/types.ts b/backend/src/modules/boardUsers/interfaces/types.ts similarity index 100% rename from backend/src/modules/boardusers/interfaces/types.ts rename to backend/src/modules/boardUsers/interfaces/types.ts diff --git a/backend/src/modules/boardusers/repositories/board-user.repository.ts b/backend/src/modules/boardUsers/repositories/board-user.repository.ts similarity index 93% rename from backend/src/modules/boardusers/repositories/board-user.repository.ts rename to backend/src/modules/boardUsers/repositories/board-user.repository.ts index e4d1324f7..e265f8d75 100644 --- a/backend/src/modules/boardusers/repositories/board-user.repository.ts +++ b/backend/src/modules/boardUsers/repositories/board-user.repository.ts @@ -3,9 +3,9 @@ import { InjectModel } from '@nestjs/mongoose'; import { Model, ObjectId } from 'mongoose'; import { BoardRoles } from 'src/libs/enum/board.roles'; import { MongoGenericRepository } from 'src/libs/repositories/mongo/mongo-generic.repository'; -import BoardUserDto from 'src/modules/boards/dto/board.user.dto'; +import BoardUserDto from 'src/modules/boardUsers/dto/board.user.dto'; import Board from 'src/modules/boards/entities/board.schema'; -import BoardUser, { BoardUserDocument } from 'src/modules/boards/entities/board.user.schema'; +import BoardUser, { BoardUserDocument } from 'src/modules/boardUsers/entities/board.user.schema'; import { BoardUserRepositoryInterface } from '../interfaces/repositories/board-user.repository.interface'; @Injectable() diff --git a/backend/src/modules/boardusers/services/create.board.user.service.ts b/backend/src/modules/boardUsers/services/create.board.user.service.ts similarity index 96% rename from backend/src/modules/boardusers/services/create.board.user.service.ts rename to backend/src/modules/boardUsers/services/create.board.user.service.ts index b5fd630f9..ceec6aa5a 100644 --- a/backend/src/modules/boardusers/services/create.board.user.service.ts +++ b/backend/src/modules/boardUsers/services/create.board.user.service.ts @@ -2,7 +2,7 @@ import { BadRequestException, Inject, Injectable } from '@nestjs/common'; import { BoardRoles } from 'src/libs/enum/board.roles'; import { BOARD_USER_EXISTS, INSERT_FAILED } from 'src/libs/exceptions/messages'; import { CreateBoardUserServiceInterface } from '../interfaces/services/create.board.user.service.interface'; -import BoardUserDto from '../../boards/dto/board.user.dto'; +import BoardUserDto from '../dto/board.user.dto'; import { BoardUserRepositoryInterface } from '../interfaces/repositories/board-user.repository.interface'; import { TYPES } from '../interfaces/types'; diff --git a/backend/src/modules/boardusers/services/delete.board.user.service.ts b/backend/src/modules/boardUsers/services/delete.board.user.service.ts similarity index 93% rename from backend/src/modules/boardusers/services/delete.board.user.service.ts rename to backend/src/modules/boardUsers/services/delete.board.user.service.ts index 13b6fe624..88a8670c5 100644 --- a/backend/src/modules/boardusers/services/delete.board.user.service.ts +++ b/backend/src/modules/boardUsers/services/delete.board.user.service.ts @@ -1,4 +1,4 @@ -import { DeleteBoardUserServiceInterface } from './../interfaces/services/delete.board.user.service.interface'; +import { DeleteBoardUserServiceInterface } from '../interfaces/services/delete.board.user.service.interface'; import { Inject, Injectable } from '@nestjs/common'; import { BoardUserRepositoryInterface } from '../interfaces/repositories/board-user.repository.interface'; import { TYPES } from '../interfaces/types'; diff --git a/backend/src/modules/boardusers/services/get.board.user.service.ts b/backend/src/modules/boardUsers/services/get.board.user.service.ts similarity index 81% rename from backend/src/modules/boardusers/services/get.board.user.service.ts rename to backend/src/modules/boardUsers/services/get.board.user.service.ts index 687b7b8a5..695057043 100644 --- a/backend/src/modules/boardusers/services/get.board.user.service.ts +++ b/backend/src/modules/boardUsers/services/get.board.user.service.ts @@ -1,8 +1,8 @@ -import { BoardUserRepositoryInterface } from 'src/modules/boardusers/interfaces/repositories/board-user.repository.interface'; -import { GetBoardUserServiceInterface } from './../interfaces/services/get.board.user.service.interface'; +import { BoardUserRepositoryInterface } from 'src/modules/boardUsers/interfaces/repositories/board-user.repository.interface'; +import { GetBoardUserServiceInterface } from '../interfaces/services/get.board.user.service.interface'; import { Inject, Injectable } from '@nestjs/common'; import { TYPES } from '../interfaces/types'; -import BoardUser from 'src/modules/boards/entities/board.user.schema'; +import BoardUser from 'src/modules/boardUsers/entities/board.user.schema'; @Injectable() export default class GetBoardUserService implements GetBoardUserServiceInterface { diff --git a/backend/src/modules/boardusers/services/update.board.user.service.ts b/backend/src/modules/boardUsers/services/update.board.user.service.ts similarity index 94% rename from backend/src/modules/boardusers/services/update.board.user.service.ts rename to backend/src/modules/boardUsers/services/update.board.user.service.ts index bf2173cdf..6c3782462 100644 --- a/backend/src/modules/boardusers/services/update.board.user.service.ts +++ b/backend/src/modules/boardUsers/services/update.board.user.service.ts @@ -2,7 +2,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { BoardUserRepositoryInterface } from '../interfaces/repositories/board-user.repository.interface'; import { TYPES } from '../interfaces/types'; import { UpdateBoardUserServiceInterface } from '../interfaces/services/update.board.user.service.interface'; -import BoardUser from 'src/modules/boards/entities/board.user.schema'; +import BoardUser from 'src/modules/boardUsers/entities/board.user.schema'; @Injectable() export default class UpdateBoardUserService implements UpdateBoardUserServiceInterface { diff --git a/backend/src/modules/boards/applications/update.board.application.ts b/backend/src/modules/boards/applications/update.board.application.ts index 9efdab036..c90ac591d 100644 --- a/backend/src/modules/boards/applications/update.board.application.ts +++ b/backend/src/modules/boards/applications/update.board.application.ts @@ -3,7 +3,7 @@ import { UpdateBoardDto } from '../dto/update-board.dto'; import { UpdateBoardApplicationInterface } from '../interfaces/applications/update.board.application.interface'; import { UpdateBoardServiceInterface } from '../interfaces/services/update.board.service.interface'; import { TYPES } from '../interfaces/types'; -import UpdateBoardUserDto from '../dto/update-board-user.dto'; +import UpdateBoardUserDto from '../../boardUsers/dto/update-board-user.dto'; import { BoardPhaseDto } from 'src/libs/dto/board-phase.dto'; @Injectable() diff --git a/backend/src/modules/boards/boards.module.ts b/backend/src/modules/boards/boards.module.ts index ce84f8676..08b3bdddf 100644 --- a/backend/src/modules/boards/boards.module.ts +++ b/backend/src/modules/boards/boards.module.ts @@ -34,12 +34,14 @@ import { } from './boards.providers'; import BoardsController from './controller/boards.controller'; import { JwtRegister } from 'src/infrastructure/config/jwt.register'; -import BoardUsersModule from '../boardusers/boardusers.module'; +import BoardUsersModule from '../boardUsers/boardusers.module'; +import TeamUsersModule from 'src/modules/teamUsers/teamusers.module'; @Module({ imports: [ UsersModule, forwardRef(() => TeamsModule), + TeamUsersModule, SchedulesModule, CommunicationModule, CardsModule, diff --git a/backend/src/modules/boards/controller/boards.controller.ts b/backend/src/modules/boards/controller/boards.controller.ts index c271bfdff..dc8006a54 100644 --- a/backend/src/modules/boards/controller/boards.controller.ts +++ b/backend/src/modules/boards/controller/boards.controller.ts @@ -51,7 +51,7 @@ import BoardDto from '../dto/board.dto'; import { UpdateBoardDto } from '../dto/update-board.dto'; import { TYPES } from '../interfaces/types'; import { BoardUserGuard } from 'src/libs/guards/boardRoles.guard'; -import UpdateBoardUserDto from '../dto/update-board-user.dto'; +import UpdateBoardUserDto from '../../boardUsers/dto/update-board-user.dto'; import { BoardPhaseDto } from 'src/libs/dto/board-phase.dto'; import { BoardPhases } from 'src/libs/enum/board.phases'; import { GetBoardApplicationInterface } from '../interfaces/applications/get.board.application.interface'; diff --git a/backend/src/modules/boards/dto/board.dto.ts b/backend/src/modules/boards/dto/board.dto.ts index 92993ad8e..d3630eb53 100644 --- a/backend/src/modules/boards/dto/board.dto.ts +++ b/backend/src/modules/boards/dto/board.dto.ts @@ -14,7 +14,7 @@ import { ValidateNested } from 'class-validator'; import { CheckUniqueUsers } from 'src/libs/validators/check-unique-users'; -import BoardUserDto from './board.user.dto'; +import BoardUserDto from '../../boardUsers/dto/board.user.dto'; import ColumnDto from '../../columns/dto/column.dto'; import { BoardPhases } from 'src/libs/enum/board.phases'; diff --git a/backend/src/modules/boards/dto/createBoard.dto.ts b/backend/src/modules/boards/dto/createBoard.dto.ts index 5735a4ff2..360912fc3 100644 --- a/backend/src/modules/boards/dto/createBoard.dto.ts +++ b/backend/src/modules/boards/dto/createBoard.dto.ts @@ -1,5 +1,5 @@ import BoardDto from 'src/modules/boards/dto/board.dto'; -import BoardUserDto from 'src/modules/boards/dto/board.user.dto'; +import BoardUserDto from 'src/modules/boardUsers/dto/board.user.dto'; import { TeamDto } from '../../communication/dto/team.dto'; export interface CreateBoardDto { diff --git a/backend/src/modules/boards/dto/update-board.dto.ts b/backend/src/modules/boards/dto/update-board.dto.ts index 2b42282b8..37e0b96b0 100644 --- a/backend/src/modules/boards/dto/update-board.dto.ts +++ b/backend/src/modules/boards/dto/update-board.dto.ts @@ -2,7 +2,7 @@ import { PartialType } from '@nestjs/mapped-types'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Type } from 'class-transformer'; import { IsOptional } from 'class-validator'; -import BoardUser from '../entities/board.user.schema'; +import BoardUser from '../../boardUsers/entities/board.user.schema'; import BoardDto from './board.dto'; export class UpdateBoardDto extends PartialType(BoardDto) { diff --git a/backend/src/modules/boards/entities/board.schema.ts b/backend/src/modules/boards/entities/board.schema.ts index 659f45cc9..b1189bd74 100644 --- a/backend/src/modules/boards/entities/board.schema.ts +++ b/backend/src/modules/boards/entities/board.schema.ts @@ -3,7 +3,7 @@ import { Document, ObjectId, SchemaTypes } from 'mongoose'; import * as leanVirtualsPlugin from 'mongoose-lean-virtuals'; import { BoardPhases } from 'src/libs/enum/board.phases'; import BaseModel from 'src/libs/models/base.model'; -import Team from 'src/modules/teams/entities/teams.schema'; +import Team from 'src/modules/teams/entities/team.schema'; import User from 'src/modules/users/entities/user.schema'; import Column, { ColumnSchema } from '../../columns/entities/column.schema'; diff --git a/backend/src/modules/boards/interfaces/applications/update.board.application.interface.ts b/backend/src/modules/boards/interfaces/applications/update.board.application.interface.ts index 52b49490b..3d0dd348d 100644 --- a/backend/src/modules/boards/interfaces/applications/update.board.application.interface.ts +++ b/backend/src/modules/boards/interfaces/applications/update.board.application.interface.ts @@ -1,9 +1,9 @@ import { LeanDocument } from 'mongoose'; import { UpdateBoardDto } from '../../dto/update-board.dto'; import Board, { BoardDocument } from '../../entities/board.schema'; -import BoardUser from '../../entities/board.user.schema'; -import UpdateBoardUserDto from 'src/modules/boards/dto/update-board-user.dto'; import { BoardPhaseDto } from 'src/libs/dto/board-phase.dto'; +import UpdateBoardUserDto from 'src/modules/boardUsers/dto/update-board-user.dto'; +import BoardUser from 'src/modules/boardUsers/entities/board.user.schema'; export interface UpdateBoardApplicationInterface { update(boardId: string, boardData: UpdateBoardDto): Promise; diff --git a/backend/src/modules/boards/interfaces/findQuery.ts b/backend/src/modules/boards/interfaces/findQuery.ts index ffa20eed3..8a14783ea 100644 --- a/backend/src/modules/boards/interfaces/findQuery.ts +++ b/backend/src/modules/boards/interfaces/findQuery.ts @@ -1,5 +1,5 @@ import { LeanDocument } from 'mongoose'; -import Team from 'src/modules/teams/entities/teams.schema'; +import Team from 'src/modules/teams/entities/team.schema'; export type QueryType = { $and: ( diff --git a/backend/src/modules/boards/interfaces/services/get.board.service.interface.ts b/backend/src/modules/boards/interfaces/services/get.board.service.interface.ts index 20f0af87b..c997dbd1b 100644 --- a/backend/src/modules/boards/interfaces/services/get.board.service.interface.ts +++ b/backend/src/modules/boards/interfaces/services/get.board.service.interface.ts @@ -3,7 +3,7 @@ import { LoginGuestUserResponse } from './../../../../libs/dto/response/login-gu import Board, { BoardDocument } from '../../entities/board.schema'; import { BoardsAndPage } from '../boards-page.interface'; import UserDto from 'src/modules/users/dto/user.dto'; -import BoardUser from '../../entities/board.user.schema'; +import BoardUser from '../../../boardUsers/entities/board.user.schema'; export interface GetBoardServiceInterface { getUserBoardsOfLast3Months( diff --git a/backend/src/modules/boards/interfaces/services/update.board.service.interface.ts b/backend/src/modules/boards/interfaces/services/update.board.service.interface.ts index 6d59b44b3..2ba57260a 100644 --- a/backend/src/modules/boards/interfaces/services/update.board.service.interface.ts +++ b/backend/src/modules/boards/interfaces/services/update.board.service.interface.ts @@ -1,9 +1,9 @@ -import BoardUserDto from 'src/modules/boards/dto/board.user.dto'; +import BoardUserDto from 'src/modules/boardUsers/dto/board.user.dto'; import { LeanDocument } from 'mongoose'; import { TeamDto } from 'src/modules/communication/dto/team.dto'; import { UpdateBoardDto } from '../../dto/update-board.dto'; import Board, { BoardDocument } from '../../entities/board.schema'; -import BoardUser from '../../entities/board.user.schema'; +import BoardUser from '../../../boardUsers/entities/board.user.schema'; import { BoardPhaseDto } from 'src/libs/dto/board-phase.dto'; export interface UpdateBoardServiceInterface { diff --git a/backend/src/modules/boards/services/create.board.service.ts b/backend/src/modules/boards/services/create.board.service.ts index 9fb47f4f1..c622eb68c 100644 --- a/backend/src/modules/boards/services/create.board.service.ts +++ b/backend/src/modules/boards/services/create.board.service.ts @@ -1,4 +1,6 @@ -import { CreateBoardUserServiceInterface } from '../../boardusers/interfaces/services/create.board.user.service.interface'; +import { UpdateTeamUserServiceInterface } from '../../teamUsers/interfaces/services/update.team.user.service.interface'; +import { GetTeamUserServiceInterface } from '../../teamUsers/interfaces/services/get.team.user.service.interface'; +import { CreateBoardUserServiceInterface } from '../../boardUsers/interfaces/services/create.board.user.service.interface'; import { BoardRoles } from 'src/libs/enum/board.roles'; import { TeamRoles } from 'src/libs/enum/team.roles'; import { @@ -14,16 +16,16 @@ import { AddCronJobDto } from 'src/modules/schedules/dto/add.cronjob.dto'; import { CreateSchedulesServiceInterface } from 'src/modules/schedules/interfaces/services/create.schedules.service.interface'; import * as SchedulesType from 'src/modules/schedules/interfaces/types'; import * as Boards from 'src/modules/boards/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; import { GetTeamServiceInterface } from 'src/modules/teams/interfaces/services/get.team.service.interface'; import { TYPES as TeamType } from 'src/modules/teams/interfaces/types'; -import TeamUser from 'src/modules/teams/entities/team.user.schema'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; import User from 'src/modules/users/entities/user.schema'; import BoardDto from '../dto/board.dto'; -import BoardUserDto from '../dto/board.user.dto'; +import BoardUserDto from '../../boardUsers/dto/board.user.dto'; import { CreateBoardServiceInterface } from '../interfaces/services/create.board.service.interface'; import Board from '../entities/board.schema'; -import { UpdateTeamServiceInterface } from 'src/modules/teams/interfaces/services/update.team.service.interface'; import { addDays, addMonths, isAfter } from 'date-fns'; import { BoardRepositoryInterface } from '../repositories/board.repository.interface'; import { Inject, Injectable, Logger, forwardRef } from '@nestjs/common'; @@ -36,8 +38,10 @@ export default class CreateBoardService implements CreateBoardServiceInterface { constructor( @Inject(forwardRef(() => TeamType.services.GetTeamService)) private getTeamService: GetTeamServiceInterface, - @Inject(forwardRef(() => TeamType.services.UpdateTeamService)) - private updateTeamService: UpdateTeamServiceInterface, + @Inject(TeamUsers.TYPES.services.GetTeamUserService) + private getTeamUserService: GetTeamUserServiceInterface, + @Inject(TeamUsers.TYPES.services.UpdateTeamUserService) + private updateTeamUserService: UpdateTeamUserServiceInterface, @Inject(SchedulesType.TYPES.services.CreateSchedulesService) private createSchedulesService: CreateSchedulesServiceInterface, @Inject(CommunicationsType.TYPES.services.SlackCommunicationService) @@ -112,7 +116,7 @@ export default class CreateBoardService implements CreateBoardServiceInterface { ): Promise { const { maxUsersPerTeam } = configs; - let teamUsers = await this.getTeamService.getUsersOfTeam(teamId); + let teamUsers = await this.getTeamUserService.getUsersOfTeam(teamId); teamUsers = teamUsers.map((teamUser: TeamUser) => { const user = teamUser.user as User; @@ -121,7 +125,7 @@ export default class CreateBoardService implements CreateBoardServiceInterface { teamUser.isNewJoiner && !this.verifyIfIsNewJoiner(user.joinedAt, user.providerAccountCreatedAt) ) { - this.updateTeamService.updateTeamUser({ + this.updateTeamUserService.updateTeamUser({ team: teamId, user: `${user._id}`, role: teamUser.role, @@ -240,7 +244,7 @@ export default class CreateBoardService implements CreateBoardServiceInterface { responsibles: string[] ) { const usersIds: string[] = []; - const teamUsers = await this.getTeamService.getUsersOfTeam(team); + const teamUsers = await this.getTeamUserService.getUsersOfTeam(team); teamUsers.forEach((teamUser) => { const user = teamUser.user as User; diff --git a/backend/src/modules/boards/services/delete.board.service.spec.ts b/backend/src/modules/boards/services/delete.board.service.spec.ts index 5d6af45fb..48e101727 100644 --- a/backend/src/modules/boards/services/delete.board.service.spec.ts +++ b/backend/src/modules/boards/services/delete.board.service.spec.ts @@ -3,13 +3,13 @@ import { DeleteBoardServiceInterface } from '../interfaces/services/delete.board import * as Boards from 'src/modules/boards/interfaces/types'; import * as CommunicationTypes from 'src/modules/communication/interfaces/types'; import * as Schedules from 'src/modules/schedules/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; import { DeepMocked, createMock } from '@golevelup/ts-jest'; import { BoardRepositoryInterface } from '../repositories/board.repository.interface'; import { BadRequestException, NotFoundException } from '@nestjs/common'; import { deleteBoardService } from '../boards.providers'; import { BoardFactory } from 'src/libs/test-utils/mocks/factories/board-factory.mock'; -import { DeleteBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/delete.board.user.service.interface'; +import { DeleteBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/delete.board.user.service.interface'; import { DeleteSchedulesServiceInterface } from 'src/modules/schedules/interfaces/services/delete.schedules.service.interface'; import { ArchiveChannelServiceInterface } from 'src/modules/communication/interfaces/archive-channel.service.interface'; diff --git a/backend/src/modules/boards/services/delete.board.service.ts b/backend/src/modules/boards/services/delete.board.service.ts index c96cb107f..e386786cf 100644 --- a/backend/src/modules/boards/services/delete.board.service.ts +++ b/backend/src/modules/boards/services/delete.board.service.ts @@ -1,4 +1,4 @@ -import { DeleteBoardUserServiceInterface } from './../../boardusers/interfaces/services/delete.board.user.service.interface'; +import { DeleteBoardUserServiceInterface } from '../../boardUsers/interfaces/services/delete.board.user.service.interface'; import { BadRequestException, Inject, Injectable, NotFoundException } from '@nestjs/common'; import { ObjectId } from 'mongoose'; import { DELETE_FAILED } from 'src/libs/exceptions/messages'; @@ -8,7 +8,7 @@ import * as Schedules from 'src/modules/schedules/interfaces/types'; import { DeleteBoardServiceInterface } from '../interfaces/services/delete.board.service.interface'; import Board from '../entities/board.schema'; import * as Boards from 'src/modules/boards/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; import * as CommunicationTypes from 'src/modules/communication/interfaces/types'; import { ArchiveChannelServiceInterface } from 'src/modules/communication/interfaces/archive-channel.service.interface'; import { ArchiveChannelDataOptions } from 'src/modules/communication/dto/types'; diff --git a/backend/src/modules/boards/services/get.board.service.spec.ts b/backend/src/modules/boards/services/get.board.service.spec.ts index c2ac896d1..06d12c9c6 100644 --- a/backend/src/modules/boards/services/get.board.service.spec.ts +++ b/backend/src/modules/boards/services/get.board.service.spec.ts @@ -1,5 +1,5 @@ -import { GetBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/get.board.user.service.interface'; -import { getBoardUserService } from './../../boardusers/boardusers.providers'; +import { GetBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/get.board.user.service.interface'; +import { getBoardUserService } from '../../boardUsers/boardusers.providers'; import { getBoardService } from './../boards.providers'; import { getTokenAuthService } from './../../auth/auth.providers'; import { Test, TestingModule } from '@nestjs/testing'; @@ -10,7 +10,7 @@ import { boardRepository } from '../boards.providers'; import SocketGateway from 'src/modules/socket/gateway/socket.gateway'; import { DeepMocked, createMock } from '@golevelup/ts-jest'; import * as Boards from 'src/modules/boards/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; import * as Teams from 'src/modules/teams/interfaces/types'; import * as Auth from 'src/modules/auth/interfaces/types'; import faker from '@faker-js/faker'; @@ -22,10 +22,10 @@ import { Tokens } from 'src/libs/interfaces/jwt/tokens.interface'; import { UpdateUserServiceInterface } from 'src/modules/users/interfaces/services/update.user.service.interface'; import { BoardRepositoryInterface } from '../repositories/board.repository.interface'; import { GetBoardServiceInterface } from '../interfaces/services/get.board.service.interface'; +import { CreateBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/create.board.user.service.interface'; +import { createBoardUserService } from 'src/modules/boardUsers/boardusers.providers'; import { hideVotes } from '../utils/clean-boards.spec'; import Column from 'src/modules/columns/entities/column.schema'; -import { CreateBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/create.board.user.service.interface'; -import { createBoardUserService } from 'src/modules/boardusers/boardusers.providers'; import { UserDtoFactory } from 'src/libs/test-utils/mocks/factories/dto/userDto-factory.mock'; import { BadRequestException, NotFoundException } from '@nestjs/common'; diff --git a/backend/src/modules/boards/services/get.board.service.ts b/backend/src/modules/boards/services/get.board.service.ts index 8d6a22f2b..644478618 100644 --- a/backend/src/modules/boards/services/get.board.service.ts +++ b/backend/src/modules/boards/services/get.board.service.ts @@ -1,5 +1,5 @@ -import { GetBoardUserServiceInterface } from './../../boardusers/interfaces/services/get.board.user.service.interface'; -import { CreateBoardUserServiceInterface } from '../../boardusers/interfaces/services/create.board.user.service.interface'; +import { GetBoardUserServiceInterface } from '../../boardUsers/interfaces/services/get.board.user.service.interface'; +import { CreateBoardUserServiceInterface } from '../../boardUsers/interfaces/services/create.board.user.service.interface'; import { BadRequestException, Inject, @@ -11,7 +11,7 @@ import { BOARD_USER_NOT_FOUND, NOT_FOUND } from 'src/libs/exceptions/messages'; import { GetTeamServiceInterface } from 'src/modules/teams/interfaces/services/get.team.service.interface'; import * as Teams from 'src/modules/teams/interfaces/types'; import * as Users from 'src/modules/users/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; import * as Auth from 'src/modules/auth/interfaces/types'; import { QueryType } from '../interfaces/findQuery'; import { GetBoardServiceInterface } from '../interfaces/services/get.board.service.interface'; @@ -20,7 +20,7 @@ import { TYPES } from '../interfaces/types'; import { BoardRepositoryInterface } from '../repositories/board.repository.interface'; import Board from '../entities/board.schema'; import User from 'src/modules/users/entities/user.schema'; -import BoardGuestUserDto from '../dto/board.guest.user.dto'; +import BoardGuestUserDto from '../../boardUsers/dto/board.guest.user.dto'; import SocketGateway from 'src/modules/socket/gateway/socket.gateway'; import { GetTokenAuthServiceInterface } from 'src/modules/auth/interfaces/services/get-token.auth.service.interface'; import { LoginGuestUserResponse } from 'src/libs/dto/response/login-guest-user.response'; diff --git a/backend/src/modules/boards/services/update.board.service.spec.ts b/backend/src/modules/boards/services/update.board.service.spec.ts index d64456dcf..7db76cf2f 100644 --- a/backend/src/modules/boards/services/update.board.service.spec.ts +++ b/backend/src/modules/boards/services/update.board.service.spec.ts @@ -1,36 +1,35 @@ -import { updateBoardService } from './../boards.providers'; import { Test, TestingModule } from '@nestjs/testing'; -import { boardRepository } from '../boards.providers'; +import { ConfigService } from '@nestjs/config'; import SocketGateway from 'src/modules/socket/gateway/socket.gateway'; -import { DeepMocked, createMock } from '@golevelup/ts-jest'; +import { EventEmitter2 } from '@nestjs/event-emitter'; +import * as CommunicationsType from 'src/modules/communication/interfaces/types'; +import * as Cards from 'src/modules/cards/interfaces/types'; +import * as Boards from 'src/modules/boards/interfaces/types'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; +import { updateBoardService } from './../boards.providers'; +import { boardRepository } from '../boards.providers'; import { UpdateBoardServiceInterface } from '../interfaces/services/update.board.service.interface'; import { BoardRepositoryInterface } from '../repositories/board.repository.interface'; import { DeleteCardServiceInterface } from 'src/modules/cards/interfaces/services/delete.card.service.interface'; import { deleteCardService } from 'src/modules/cards/cards.providers'; -import * as CommunicationsType from 'src/modules/communication/interfaces/types'; -import * as Boards from 'src/modules/boards/interfaces/types'; -import * as Cards from 'src/modules/cards/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; import { CommunicationServiceInterface } from 'src/modules/communication/interfaces/slack-communication.service.interface'; import { SendMessageServiceInterface } from 'src/modules/communication/interfaces/send-message.service.interface'; -import { EventEmitter2 } from '@nestjs/event-emitter'; -import { ConfigService } from '@nestjs/config'; import { BoardFactory } from 'src/libs/test-utils/mocks/factories/board-factory.mock'; import { UpdateBoardDtoFactory } from 'src/libs/test-utils/mocks/factories/dto/updateBoardDto-factory.mock'; import { BoardUserFactory } from 'src/libs/test-utils/mocks/factories/boardUser-factory.mock'; import { NotFoundException } from '@nestjs/common'; -import { BoardUserRepositoryInterface } from 'src/modules/boardusers/interfaces/repositories/board-user.repository.interface'; +import { BoardUserRepositoryInterface } from 'src/modules/boardUsers/interfaces/repositories/board-user.repository.interface'; import { boardUserRepository, createBoardUserService, deleteBoardUserService, getBoardUserService, updateBoardUserService -} from 'src/modules/boardusers/boardusers.providers'; -import { UpdateBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/update.board.user.service.interface'; -import { GetBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/get.board.user.service.interface'; -import { CreateBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/create.board.user.service.interface'; -import { DeleteBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/delete.board.user.service.interface'; +} from 'src/modules/boardUsers/boardusers.providers'; +import { UpdateBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/update.board.user.service.interface'; +import { GetBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/get.board.user.service.interface'; +import { CreateBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/create.board.user.service.interface'; +import { DeleteBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/delete.board.user.service.interface'; import { BoardPhases } from 'src/libs/enum/board.phases'; import { TeamFactory } from 'src/libs/test-utils/mocks/factories/team-factory.mock'; import { SLACK_ENABLE, SLACK_MASTER_CHANNEL_ID } from 'src/libs/constants/slack'; @@ -45,6 +44,7 @@ import { generateNewSubColumns } from '../utils/generate-subcolumns'; import { mergeCardsFromSubBoardColumnsIntoMainBoard } from '../utils/merge-cards-from-subboard'; import { TeamCommunicationDtoFactory } from 'src/libs/test-utils/mocks/factories/dto/teamDto-factory'; import { UpdateFailedException } from 'src/libs/exceptions/updateFailedBadRequestException'; +import { DeepMocked, createMock } from '@golevelup/ts-jest'; describe('GetUpdateBoardService', () => { let boardService: UpdateBoardServiceInterface; diff --git a/backend/src/modules/boards/services/update.board.service.ts b/backend/src/modules/boards/services/update.board.service.ts index 73d34d5ef..f5d583595 100644 --- a/backend/src/modules/boards/services/update.board.service.ts +++ b/backend/src/modules/boards/services/update.board.service.ts @@ -1,5 +1,6 @@ -import { UpdateBoardUserServiceInterface } from './../../boardusers/interfaces/services/update.board.user.service.interface'; -import BoardUserDto from 'src/modules/boards/dto/board.user.dto'; +import Team from 'src/modules/teams/entities/team.schema'; +import { UpdateBoardUserServiceInterface } from '../../boardUsers/interfaces/services/update.board.user.service.interface'; +import BoardUserDto from 'src/modules/boardUsers/dto/board.user.dto'; import { Inject, Injectable, Logger, NotFoundException } from '@nestjs/common'; import { getIdFromObjectId } from 'src/libs/utils/getIdFromObjectId'; import isEmpty from 'src/libs/utils/isEmpty'; @@ -8,13 +9,13 @@ import { CommunicationServiceInterface } from 'src/modules/communication/interfa import * as CommunicationsType from 'src/modules/communication/interfaces/types'; import * as Cards from 'src/modules/cards/interfaces/types'; import * as Boards from 'src/modules/boards/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; import User from 'src/modules/users/entities/user.schema'; import { UpdateBoardDto } from '../dto/update-board.dto'; import { ResponsibleType } from '../interfaces/responsible.interface'; import { UpdateBoardServiceInterface } from '../interfaces/services/update.board.service.interface'; import Board from '../entities/board.schema'; -import BoardUser from '../entities/board.user.schema'; +import BoardUser from '../../boardUsers/entities/board.user.schema'; import SocketGateway from 'src/modules/socket/gateway/socket.gateway'; import Column from '../../columns/entities/column.schema'; import ColumnDto from '../../columns/dto/column.dto'; @@ -30,10 +31,9 @@ import { SlackMessageDto } from 'src/modules/communication/dto/slack.message.dto import { SLACK_ENABLE, SLACK_MASTER_CHANNEL_ID } from 'src/libs/constants/slack'; import { ConfigService } from '@nestjs/config'; import { BoardPhases } from 'src/libs/enum/board.phases'; -import Team from 'src/modules/teams/entities/teams.schema'; -import { GetBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/get.board.user.service.interface'; -import { CreateBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/create.board.user.service.interface'; -import { DeleteBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/delete.board.user.service.interface'; +import { GetBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/get.board.user.service.interface'; +import { CreateBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/create.board.user.service.interface'; +import { DeleteBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/delete.board.user.service.interface'; import { generateNewSubColumns } from '../utils/generate-subcolumns'; import { mergeCardsFromSubBoardColumnsIntoMainBoard } from '../utils/merge-cards-from-subboard'; import { UpdateFailedException } from 'src/libs/exceptions/updateFailedBadRequestException'; diff --git a/backend/src/modules/columns/columns.module.ts b/backend/src/modules/columns/columns.module.ts index 902461c0d..86fb7229e 100644 --- a/backend/src/modules/columns/columns.module.ts +++ b/backend/src/modules/columns/columns.module.ts @@ -13,7 +13,8 @@ import { updateColumnService } from './columns.providers'; import ColumnsController from './controller/columns.controller'; -import BoardUsersModule from '../boardusers/boardusers.module'; +import BoardUsersModule from '../boardUsers/boardusers.module'; +import TeamUsersModule from 'src/modules/teamUsers/teamusers.module'; @Module({ imports: [ @@ -23,6 +24,7 @@ import BoardUsersModule from '../boardusers/boardusers.module'; BoardsModule, BoardUsersModule, TeamsModule, + TeamUsersModule, forwardRef(() => SocketModule) ], controllers: [ColumnsController], diff --git a/backend/src/modules/socket/gateway/socket.gateway.ts b/backend/src/modules/socket/gateway/socket.gateway.ts index 627c0d9fa..56529dae5 100644 --- a/backend/src/modules/socket/gateway/socket.gateway.ts +++ b/backend/src/modules/socket/gateway/socket.gateway.ts @@ -19,7 +19,7 @@ import { import BoardTimerDurationDto from 'src/libs/dto/board-timer-duration.dto'; import BoardTimerTimeLeftDto from 'src/libs/dto/board-timer-time-left.dto'; import { hideText } from 'src/libs/utils/hideText'; -import BoardGuestUserDto from 'src/modules/boards/dto/board.guest.user.dto'; +import BoardGuestUserDto from 'src/modules/boardUsers/dto/board.guest.user.dto'; import Board from 'src/modules/boards/entities/board.schema'; import { CreateCardDto } from 'src/modules/cards/dto/create.card.dto'; import DeleteCardDto from 'src/modules/cards/dto/delete.card.dto'; diff --git a/backend/src/modules/teamUsers/applications/add-and-remove-team-users.use-case.ts b/backend/src/modules/teamUsers/applications/add-and-remove-team-users.use-case.ts new file mode 100644 index 000000000..88ed15d6f --- /dev/null +++ b/backend/src/modules/teamUsers/applications/add-and-remove-team-users.use-case.ts @@ -0,0 +1,35 @@ +import { BadRequestException, Inject, Injectable } from '@nestjs/common'; +import { TYPES } from '../interfaces/types'; +import { UPDATE_FAILED } from 'src/libs/exceptions/messages'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; +import { CreateTeamUserServiceInterface } from '../interfaces/services/create.team.user.service.interface'; +import { DeleteTeamUserServiceInterface } from '../interfaces/services/delete.team.user.service.interface'; +import UpdateTeamUserDto from '../dto/update.team.user.dto'; +import { UseCase } from 'src/libs/interfaces/use-case.interface'; + +@Injectable() +export class AddAndRemoveTeamUsersUseCase + implements UseCase +{ + constructor( + @Inject(TYPES.services.CreateTeamUserService) + private createTeamUserService: CreateTeamUserServiceInterface, + @Inject(TYPES.services.DeleteTeamUserService) + private deleteTeamUserService: DeleteTeamUserServiceInterface + ) {} + async execute({ addUsers, removeUsers }: UpdateTeamUserDto): Promise { + try { + let createdTeamUsers: TeamUser[] = []; + + if (addUsers.length > 0) + createdTeamUsers = await this.createTeamUserService.createTeamUsers(addUsers); + + if (removeUsers.length > 0) + await this.deleteTeamUserService.deleteTeamUsers(removeUsers, false); + + return createdTeamUsers; + } catch (error) { + throw new BadRequestException(UPDATE_FAILED); + } + } +} diff --git a/backend/src/modules/teamUsers/applications/create-team-user.use-case.ts b/backend/src/modules/teamUsers/applications/create-team-user.use-case.ts new file mode 100644 index 000000000..0b3f73170 --- /dev/null +++ b/backend/src/modules/teamUsers/applications/create-team-user.use-case.ts @@ -0,0 +1,23 @@ +import TeamUserDto from 'src/modules/teamUsers/dto/team.user.dto'; +import { TeamUserRepositoryInterface } from '../interfaces/repositories/team-user.repository.interface'; +import { BadRequestException, Inject, Injectable } from '@nestjs/common'; +import { TYPES } from '../interfaces/types'; +import { INSERT_FAILED } from 'src/libs/exceptions/messages'; +import { UseCase } from 'src/libs/interfaces/use-case.interface'; +import TeamUser from '../entities/team.user.schema'; + +@Injectable() +export class CreateTeamUserUseCase implements UseCase { + constructor( + @Inject(TYPES.repositories.TeamUserRepository) + private readonly teamUserRepository: TeamUserRepositoryInterface + ) {} + + async execute(teamUserData: TeamUserDto) { + const teamUserSaved = await this.teamUserRepository.create({ ...teamUserData }); + + if (!teamUserSaved) throw new BadRequestException(INSERT_FAILED); + + return teamUserSaved; + } +} diff --git a/backend/src/modules/teamUsers/applications/create-team-users.use-case.ts b/backend/src/modules/teamUsers/applications/create-team-users.use-case.ts new file mode 100644 index 000000000..2f9943c06 --- /dev/null +++ b/backend/src/modules/teamUsers/applications/create-team-users.use-case.ts @@ -0,0 +1,23 @@ +import TeamUserDto from 'src/modules/teamUsers/dto/team.user.dto'; +import { TeamUserRepositoryInterface } from '../interfaces/repositories/team-user.repository.interface'; +import { BadRequestException, Inject, Injectable } from '@nestjs/common'; +import { TYPES } from '../interfaces/types'; +import { INSERT_FAILED } from 'src/libs/exceptions/messages'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; +import { UseCase } from 'src/libs/interfaces/use-case.interface'; + +@Injectable() +export class CreateTeamUsersUseCase implements UseCase { + constructor( + @Inject(TYPES.repositories.TeamUserRepository) + private readonly teamUserRepository: TeamUserRepositoryInterface + ) {} + + async execute(teamUsers: TeamUserDto[]): Promise { + const teamUsersSaved = await this.teamUserRepository.insertMany(teamUsers); + + if (teamUsersSaved.length < 1) throw new BadRequestException(INSERT_FAILED); + + return teamUsersSaved; + } +} diff --git a/backend/src/modules/teamUsers/applications/delete-team-user.use-case.ts b/backend/src/modules/teamUsers/applications/delete-team-user.use-case.ts new file mode 100644 index 000000000..549d5f65a --- /dev/null +++ b/backend/src/modules/teamUsers/applications/delete-team-user.use-case.ts @@ -0,0 +1,22 @@ +import { TeamUserRepositoryInterface } from '../interfaces/repositories/team-user.repository.interface'; +import { BadRequestException, Inject, Injectable } from '@nestjs/common'; +import { TYPES } from '../interfaces/types'; +import { DELETE_FAILED } from 'src/libs/exceptions/messages'; +import { UseCase } from 'src/libs/interfaces/use-case.interface'; +import TeamUser from '../entities/team.user.schema'; + +@Injectable() +export class DeleteTeamUserUseCase implements UseCase { + constructor( + @Inject(TYPES.repositories.TeamUserRepository) + private readonly teamUserRepository: TeamUserRepositoryInterface + ) {} + + async execute(teamUserId: string) { + const deletedTeamUser = await this.teamUserRepository.deleteTeamUser(teamUserId, false); + + if (!deletedTeamUser) throw new BadRequestException(DELETE_FAILED); + + return deletedTeamUser; + } +} diff --git a/backend/src/modules/teamUsers/applications/update-team-user.use-case.ts b/backend/src/modules/teamUsers/applications/update-team-user.use-case.ts new file mode 100644 index 000000000..8090cfa20 --- /dev/null +++ b/backend/src/modules/teamUsers/applications/update-team-user.use-case.ts @@ -0,0 +1,23 @@ +import TeamUserDto from 'src/modules/teamUsers/dto/team.user.dto'; +import { TeamUserRepositoryInterface } from '../interfaces/repositories/team-user.repository.interface'; +import { BadRequestException, Inject, Injectable } from '@nestjs/common'; +import { TYPES } from '../interfaces/types'; +import { UPDATE_FAILED } from 'src/libs/exceptions/messages'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; +import { UseCase } from 'src/libs/interfaces/use-case.interface'; + +@Injectable() +export class UpdateTeamUserUseCase implements UseCase { + constructor( + @Inject(TYPES.repositories.TeamUserRepository) + private readonly teamUserRepository: TeamUserRepositoryInterface + ) {} + + async execute(teamUserData: TeamUserDto): Promise { + const teamUserSaved = await this.teamUserRepository.updateTeamUser(teamUserData); + + if (!teamUserSaved) throw new BadRequestException(UPDATE_FAILED); + + return teamUserSaved; + } +} diff --git a/backend/src/modules/teamUsers/controller/teamUser.controller.ts b/backend/src/modules/teamUsers/controller/teamUser.controller.ts new file mode 100644 index 000000000..39d8571c9 --- /dev/null +++ b/backend/src/modules/teamUsers/controller/teamUser.controller.ts @@ -0,0 +1,202 @@ +import { UseCase } from 'src/libs/interfaces/use-case.interface';import { + Body, + Controller, + Delete, + Inject, + Param, + Put, + SetMetadata, + UseGuards +} from '@nestjs/common'; +import { + ApiBadRequestResponse, + ApiBearerAuth, + ApiBody, + ApiForbiddenResponse, + ApiInternalServerErrorResponse, + ApiNotFoundResponse, + ApiOkResponse, + ApiOperation, + ApiParam, + ApiTags, + ApiUnauthorizedResponse +} from '@nestjs/swagger'; +import { UserTeamsParams } from 'src/libs/dto/param/user.teams.param'; +import { TeamRoles } from 'src/libs/enum/team.roles'; +import JwtAuthenticationGuard from 'src/libs/guards/jwtAuth.guard'; +import { BadRequestResponse } from 'src/libs/swagger/errors/bad-request.swagger'; +import { InternalServerErrorResponse } from 'src/libs/swagger/errors/internal-server-error.swagger'; +import { UnauthorizedResponse } from 'src/libs/swagger/errors/unauthorized.swagger'; +import { TeamUserGuard } from '../../../libs/guards/teamRoles.guard'; +import { ForbiddenResponse } from '../../../libs/swagger/errors/forbidden.swagger'; +import { NotFoundResponse } from '../../../libs/swagger/errors/not-found.swagger'; +import TeamUserDto from '../dto/team.user.dto'; +import UpdateTeamUserDto from '../dto/update.team.user.dto'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; +import { SuperAdminGuard } from 'src/libs/guards/superAdmin.guard'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; + +const TeamUserPermission = (permissions: string[]) => SetMetadata('permissions', permissions); + +@ApiBearerAuth('access-token') +@ApiTags('Teams') +@UseGuards(JwtAuthenticationGuard) +@Controller('teams') +export default class TeamUsersController { + constructor( + @Inject(TeamUsers.TYPES.applications.CreateTeamUserUseCase) + private createTeamUserUseCase: UseCase, + @Inject(TeamUsers.TYPES.applications.CreateTeamUsersUseCase) + private createTeamUsersUseCase: UseCase, + @Inject(TeamUsers.TYPES.applications.UpdateTeamUserUseCase) + private updateTeamUserUseCase: UseCase, + @Inject(TeamUsers.TYPES.applications.AddAndRemoveTeamUsersUseCase) + private addAndRemoveTeamUsersUseCase: UseCase, + @Inject(TeamUsers.TYPES.applications.DeleteTeamUserUseCase) + private deleteTeamUserUseCase: UseCase + ) {} + + @ApiOperation({ summary: 'Add a user to an existing team' }) + @ApiOkResponse({ description: 'User successfully added to the team!', type: TeamUserDto }) + @ApiUnauthorizedResponse({ + description: 'Unauthorized', + type: UnauthorizedResponse + }) + @ApiBadRequestResponse({ + description: 'Bad Request', + type: BadRequestResponse + }) + @ApiInternalServerErrorResponse({ + description: 'Internal Server Error', + type: InternalServerErrorResponse + }) + @Put() + createTeamUser(@Body() teamUserData: TeamUserDto) { + return this.createTeamUserUseCase.execute(teamUserData); + } + + @ApiOperation({ summary: 'Update a specific team member' }) + @ApiParam({ type: String, name: 'teamId', required: true }) + @ApiBody({ type: TeamUserDto }) + @ApiOkResponse({ + type: TeamUserDto, + description: 'Team member updated successfully!' + }) + @ApiBadRequestResponse({ + description: 'Bad Request', + type: BadRequestResponse + }) + @ApiUnauthorizedResponse({ + description: 'Unauthorized', + type: UnauthorizedResponse + }) + @ApiNotFoundResponse({ + type: NotFoundResponse, + description: 'Not found!' + }) + @ApiForbiddenResponse({ + description: 'Forbidden', + type: ForbiddenResponse + }) + @ApiInternalServerErrorResponse({ + description: 'Internal Server Error', + type: InternalServerErrorResponse + }) + @TeamUserPermission([TeamRoles.ADMIN, TeamRoles.STAKEHOLDER]) + @UseGuards(TeamUserGuard) + @Put(':teamId') + updateTeamUser(@Body() teamUserData: TeamUserDto) { + return this.updateTeamUserUseCase.execute(teamUserData); + } + + @ApiOperation({ summary: 'Add and remove team members' }) + @ApiParam({ type: String, name: 'teamId', required: true }) + @ApiBody({ type: UpdateTeamUserDto }) + @ApiOkResponse({ + type: TeamUserDto, + description: 'Team member updated successfully!' + }) + @ApiBadRequestResponse({ + description: 'Bad Request', + type: BadRequestResponse + }) + @ApiUnauthorizedResponse({ + description: 'Unauthorized', + type: UnauthorizedResponse + }) + @ApiNotFoundResponse({ + type: NotFoundResponse, + description: 'Not found!' + }) + @ApiForbiddenResponse({ + description: 'Forbidden', + type: ForbiddenResponse + }) + @ApiInternalServerErrorResponse({ + description: 'Internal Server Error', + type: InternalServerErrorResponse + }) + @TeamUserPermission([TeamRoles.ADMIN, TeamRoles.STAKEHOLDER]) + @UseGuards(TeamUserGuard) + @Put('/:teamId/addAndRemove') + addAndRemoveTeamUsers(@Body() users: UpdateTeamUserDto) { + return this.addAndRemoveTeamUsersUseCase.execute(users); + } + + @ApiOperation({ summary: 'Add team members' }) + @ApiBody({ type: TeamUserDto }) + @ApiOkResponse({ + type: TeamUserDto, + description: 'Team member updated successfully!' + }) + @ApiBadRequestResponse({ + description: 'Bad Request', + type: BadRequestResponse + }) + @ApiUnauthorizedResponse({ + description: 'Unauthorized', + type: UnauthorizedResponse + }) + @ApiNotFoundResponse({ + type: NotFoundResponse, + description: 'Not found!' + }) + @ApiForbiddenResponse({ + description: 'Forbidden', + type: ForbiddenResponse + }) + @ApiInternalServerErrorResponse({ + description: 'Internal Server Error', + type: InternalServerErrorResponse + }) + @UseGuards(SuperAdminGuard) + @Put('add/user') + addTeamUsers(@Body() teamUsers: TeamUserDto[]) { + return this.createTeamUsersUseCase.execute(teamUsers); + } + + @ApiOperation({ summary: 'Delete a specific team of a user' }) + @ApiParam({ type: String, name: 'userId', required: true }) + @ApiOkResponse({ type: Boolean, description: 'Team of user successfully deleted!' }) + @ApiBadRequestResponse({ + description: 'Bad Request', + type: BadRequestResponse + }) + @ApiUnauthorizedResponse({ + description: 'Unauthorized', + type: UnauthorizedResponse + }) + @ApiInternalServerErrorResponse({ + description: 'Internal Server Error', + type: InternalServerErrorResponse + }) + @ApiForbiddenResponse({ + description: 'Forbidden', + type: ForbiddenResponse + }) + @UseGuards(SuperAdminGuard) + @Delete('/user/:teamUserId') + deleteTeamUser(@Param() { teamUserId }: UserTeamsParams) { + return this.deleteTeamUserUseCase.execute(teamUserId); + } +} diff --git a/backend/src/modules/teams/dto/team.user.dto.ts b/backend/src/modules/teamUsers/dto/team.user.dto.ts similarity index 100% rename from backend/src/modules/teams/dto/team.user.dto.ts rename to backend/src/modules/teamUsers/dto/team.user.dto.ts diff --git a/backend/src/modules/teams/dto/update.team.user.dto.ts b/backend/src/modules/teamUsers/dto/update.team.user.dto.ts similarity index 83% rename from backend/src/modules/teams/dto/update.team.user.dto.ts rename to backend/src/modules/teamUsers/dto/update.team.user.dto.ts index 95560b75b..b26ae0b4c 100644 --- a/backend/src/modules/teams/dto/update.team.user.dto.ts +++ b/backend/src/modules/teamUsers/dto/update.team.user.dto.ts @@ -1,4 +1,4 @@ -import TeamUserDto from 'src/modules/teams/dto/team.user.dto'; +import TeamUserDto from 'src/modules/teamUsers/dto/team.user.dto'; import { ApiProperty } from '@nestjs/swagger'; import { IsArray } from 'class-validator'; diff --git a/backend/src/modules/teams/entities/team.user.schema.ts b/backend/src/modules/teamUsers/entities/team.user.schema.ts similarity index 95% rename from backend/src/modules/teams/entities/team.user.schema.ts rename to backend/src/modules/teamUsers/entities/team.user.schema.ts index a536b17cf..d12f9d789 100644 --- a/backend/src/modules/teams/entities/team.user.schema.ts +++ b/backend/src/modules/teamUsers/entities/team.user.schema.ts @@ -4,7 +4,7 @@ import * as leanVirtualsPlugin from 'mongoose-lean-virtuals'; import { TeamRoles } from 'src/libs/enum/team.roles'; import BaseModel from 'src/libs/models/base.model'; import User from 'src/modules/users/entities/user.schema'; -import Team from './teams.schema'; +import Team from 'src/modules/teams/entities/team.schema'; export type TeamUserDocument = TeamUser & Document; diff --git a/backend/src/modules/teamUsers/interfaces/repositories/team-user.repository.interface.ts b/backend/src/modules/teamUsers/interfaces/repositories/team-user.repository.interface.ts new file mode 100644 index 000000000..531ec0541 --- /dev/null +++ b/backend/src/modules/teamUsers/interfaces/repositories/team-user.repository.interface.ts @@ -0,0 +1,21 @@ +import { BaseInterfaceRepository } from 'src/libs/repositories/interfaces/base.repository.interface'; +import User from 'src/modules/users/entities/user.schema'; +import { UserWithTeams } from 'src/modules/users/interfaces/type-user-with-teams'; +import TeamUserDto from '../../dto/team.user.dto'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; + +export interface TeamUserRepositoryInterface extends BaseInterfaceRepository { + // GET + countTeamsOfUser(userId: string): Promise; + getAllTeamsOfUser(userId: string): Promise; + getUsersOnlyWithTeams(users: User[]): Promise; + getUsersOfTeam(teamId: string): Promise; + getTeamUser(userId: string, teamId: string): Promise; + // UPDATE + updateTeamUser(teamData: TeamUserDto): Promise; + // DELETE + deleteTeamUser(teamUserId: string, withSession: boolean): Promise; + deleteTeamUsers(teamUsers: string[], withSession: boolean): Promise; + deleteTeamUsersOfTeam(teamId: string, withSession: boolean): Promise; + deleteTeamUsersOfUser(userId: string, withSession: boolean): Promise; +} diff --git a/backend/src/modules/teamUsers/interfaces/services/create.team.user.service.interface.ts b/backend/src/modules/teamUsers/interfaces/services/create.team.user.service.interface.ts new file mode 100644 index 000000000..becc1d897 --- /dev/null +++ b/backend/src/modules/teamUsers/interfaces/services/create.team.user.service.interface.ts @@ -0,0 +1,8 @@ +import { SessionInterface } from 'src/libs/transactions/session.interface'; +import TeamUserDto from '../../dto/team.user.dto'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; + +export interface CreateTeamUserServiceInterface extends SessionInterface { + createTeamUsers(teamUsers: TeamUserDto[], teamId?: string): Promise; + createTeamUser(teamUser: TeamUserDto): Promise; +} diff --git a/backend/src/modules/teamUsers/interfaces/services/delete.team.user.service.interface.ts b/backend/src/modules/teamUsers/interfaces/services/delete.team.user.service.interface.ts new file mode 100644 index 000000000..f9e6c8a30 --- /dev/null +++ b/backend/src/modules/teamUsers/interfaces/services/delete.team.user.service.interface.ts @@ -0,0 +1,9 @@ +import { SessionInterface } from 'src/libs/transactions/session.interface'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; + +export interface DeleteTeamUserServiceInterface extends SessionInterface { + deleteTeamUser(teamUserId: string, withSession: boolean): Promise; + deleteTeamUsersOfUser(userId: string, withSession: boolean): Promise; + deleteTeamUsers(teamUsers: string[], withSession: boolean): Promise; + deleteTeamUsersOfTeam(teamId: string, withSession: boolean): Promise; +} diff --git a/backend/src/modules/teamUsers/interfaces/services/get.team.user.service.interface.ts b/backend/src/modules/teamUsers/interfaces/services/get.team.user.service.interface.ts new file mode 100644 index 000000000..ee5ca2ae5 --- /dev/null +++ b/backend/src/modules/teamUsers/interfaces/services/get.team.user.service.interface.ts @@ -0,0 +1,11 @@ +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; +import { UserWithTeams } from '../../../users/interfaces/type-user-with-teams'; +import User from 'src/modules/users/entities/user.schema'; + +export interface GetTeamUserServiceInterface { + countTeamsOfUser(userId: string): Promise; + getAllTeamsOfUser(userId: string): Promise; + getUsersOnlyWithTeams(users: User[]): Promise; + getTeamUser(userId: string, teamId: string): Promise; + getUsersOfTeam(teamId: string): Promise; +} diff --git a/backend/src/modules/teamUsers/interfaces/services/update.team.user.service.interface.ts b/backend/src/modules/teamUsers/interfaces/services/update.team.user.service.interface.ts new file mode 100644 index 000000000..6978ef3f9 --- /dev/null +++ b/backend/src/modules/teamUsers/interfaces/services/update.team.user.service.interface.ts @@ -0,0 +1,7 @@ +import TeamUserDto from '../../dto/team.user.dto'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; + +export interface UpdateTeamUserServiceInterface { + updateTeamUser(teamUserData: TeamUserDto): Promise; + addAndRemoveTeamUsers(addUsers: TeamUserDto[], removeUsers: string[]): Promise; +} diff --git a/backend/src/modules/teamUsers/interfaces/types.ts b/backend/src/modules/teamUsers/interfaces/types.ts new file mode 100644 index 000000000..260f697e7 --- /dev/null +++ b/backend/src/modules/teamUsers/interfaces/types.ts @@ -0,0 +1,18 @@ +export const TYPES = { + applications: { + CreateTeamUsersUseCase: 'CreateTeamUsersUseCase', + CreateTeamUserUseCase: 'CreateTeamUserUseCase', + UpdateTeamUserUseCase: 'UpdateTeamUserUseCase', + AddAndRemoveTeamUsersUseCase: 'AddAndRemoveTeamUsersUseCase', + DeleteTeamUserUseCase: 'DeleteTeamUserUseCase' + }, + services: { + CreateTeamUserService: 'CreateTeamUserService', + GetTeamUserService: 'GetTeamUserService', + UpdateTeamUserService: 'UpdateTeamUserService', + DeleteTeamUserService: 'DeleteTeamUserService' + }, + repositories: { + TeamUserRepository: 'TeamUserRepository' + } +}; diff --git a/backend/src/modules/teams/repositories/team-user.repository.ts b/backend/src/modules/teamUsers/repositories/team-user.repository.ts similarity index 76% rename from backend/src/modules/teams/repositories/team-user.repository.ts rename to backend/src/modules/teamUsers/repositories/team-user.repository.ts index 1a3f55507..e45bc39ac 100644 --- a/backend/src/modules/teams/repositories/team-user.repository.ts +++ b/backend/src/modules/teamUsers/repositories/team-user.repository.ts @@ -5,9 +5,9 @@ import { Model } from 'mongoose'; import { MongoGenericRepository } from 'src/libs/repositories/mongo/mongo-generic.repository'; import User from 'src/modules/users/entities/user.schema'; import { UserWithTeams } from 'src/modules/users/interfaces/type-user-with-teams'; -import TeamUserDto from '../dto/team.user.dto'; import TeamUser, { TeamUserDocument } from '../entities/team.user.schema'; -import { TeamUserRepositoryInterface } from './team-user.repository.interface'; +import { TeamUserRepositoryInterface } from '../interfaces/repositories/team-user.repository.interface'; +import TeamUserDto from '../dto/team.user.dto'; @Injectable() export class TeamUserRepository @@ -18,21 +18,12 @@ export class TeamUserRepository super(model); } - countTeamsOfUser(userId: string) { - return this._repository.find({ user: userId }).distinct('team').count().exec(); - } + // CREATE - updateTeamUser(teamData: TeamUserDto): Promise { - return this.findOneByFieldAndUpdate( - { user: teamData.user, team: teamData.team }, - { - $set: { - role: teamData.role, - isNewJoiner: teamData.isNewJoiner, - canBeResponsible: teamData.canBeResponsible - } - } - ); + // GET + + countTeamsOfUser(userId: string): Promise { + return this._repository.find({ user: userId }).distinct('team').count().exec(); } getAllTeamsOfUser(userId: string): Promise { @@ -109,11 +100,50 @@ export class TeamUserRepository .exec(); } - deleteManyTeamUser(userId: string, withSession: boolean): Promise { - return this.deleteMany({ user: userId }, withSession); + getTeamUser(userId: string, teamId: string): Promise { + return this.findOneByField({ user: userId, team: teamId }); + } + + // UPDATE + + updateTeamUser(teamData: TeamUserDto): Promise { + return this.findOneByFieldAndUpdate( + { user: teamData.user, team: teamData.team }, + { + $set: { + role: teamData.role, + isNewJoiner: teamData.isNewJoiner, + canBeResponsible: teamData.canBeResponsible + } + } + ); } - deleteTeamOfUserOnly(teamUserId: string, withSession: boolean): Promise { + // DELETE + + deleteTeamUser(teamUserId: string, withSession: boolean): Promise { return this.findByIdAndDelete(teamUserId, withSession); } + + deleteTeamUsers(teamUsers: string[], withSession: boolean): Promise { + return this.deleteMany( + { + _id: { $in: teamUsers } + }, + withSession + ); + } + + deleteTeamUsersOfTeam(teamId: string, withSession: boolean): Promise { + return this.deleteMany( + { + team: teamId + }, + withSession + ); + } + + deleteTeamUsersOfUser(userId: string, withSession: boolean): Promise { + return this.deleteMany({ user: userId }, withSession); + } } diff --git a/backend/src/modules/teamUsers/services/create.team.user.service.ts b/backend/src/modules/teamUsers/services/create.team.user.service.ts new file mode 100644 index 000000000..aa6ee24c7 --- /dev/null +++ b/backend/src/modules/teamUsers/services/create.team.user.service.ts @@ -0,0 +1,51 @@ +import { CreateTeamUserServiceInterface } from '../interfaces/services/create.team.user.service.interface'; +import { TYPES } from '../interfaces/types'; +import { TeamUserRepositoryInterface } from '../interfaces/repositories/team-user.repository.interface'; +import { BadRequestException, Inject, Injectable } from '@nestjs/common'; +import TeamUserDto from '../dto/team.user.dto'; +import { INSERT_FAILED } from 'src/libs/exceptions/messages'; +import TeamUser from '../entities/team.user.schema'; + +@Injectable() +export default class CreateTeamUserService implements CreateTeamUserServiceInterface { + constructor( + @Inject(TYPES.repositories.TeamUserRepository) + private readonly teamUserRepository: TeamUserRepositoryInterface + ) {} + + async createTeamUsers(teamUsers: TeamUserDto[], teamId?: string): Promise { + const teamUsersToSave = teamId + ? teamUsers.map((teamUser) => ({ ...teamUser, team: teamId })) + : teamUsers; + + const teamUsersSaved = await this.teamUserRepository.insertMany(teamUsersToSave); + + if (teamUsersSaved.length < 1) throw new BadRequestException(INSERT_FAILED); + + return teamUsersSaved; + } + + async createTeamUser(teamUser: TeamUserDto): Promise { + const teamUserSaved = await this.teamUserRepository.create({ ...teamUser }); + + if (!teamUserSaved) throw new BadRequestException(INSERT_FAILED); + + return teamUserSaved; + } + + startTransaction(): Promise { + return this.teamUserRepository.startTransaction(); + } + + commitTransaction(): Promise { + return this.teamUserRepository.commitTransaction(); + } + + abortTransaction(): Promise { + return this.teamUserRepository.abortTransaction(); + } + + endSession(): Promise { + return this.teamUserRepository.endSession(); + } +} diff --git a/backend/src/modules/teamUsers/services/delete.team.user.service.ts b/backend/src/modules/teamUsers/services/delete.team.user.service.ts new file mode 100644 index 000000000..f6e688aba --- /dev/null +++ b/backend/src/modules/teamUsers/services/delete.team.user.service.ts @@ -0,0 +1,59 @@ +import { BadRequestException, Inject, Injectable } from '@nestjs/common'; +import { DELETE_FAILED } from 'src/libs/exceptions/messages'; +import { DeleteTeamUserServiceInterface } from '../interfaces/services/delete.team.user.service.interface'; +import { TYPES } from '../interfaces/types'; +import { TeamUserRepositoryInterface } from '../interfaces/repositories/team-user.repository.interface'; +import TeamUser from '../entities/team.user.schema'; + +@Injectable() +export default class DeleteTeamUserService implements DeleteTeamUserServiceInterface { + constructor( + @Inject(TYPES.repositories.TeamUserRepository) + private readonly teamUserRepository: TeamUserRepositoryInterface + ) {} + + async deleteTeamUser(teamUserId: string, withSession: boolean): Promise { + const deletedTeamUser = await this.teamUserRepository.deleteTeamUser(teamUserId, withSession); + + if (!deletedTeamUser) throw new BadRequestException(DELETE_FAILED); + + return deletedTeamUser; + } + + async deleteTeamUsersOfUser(userId: string, withSession: boolean): Promise { + const deletedCount = await this.teamUserRepository.deleteTeamUsersOfUser(userId, withSession); + + if (deletedCount <= 0) throw new BadRequestException(DELETE_FAILED); + + return deletedCount; + } + + async deleteTeamUsers(teamUsers: string[], withSession: boolean): Promise { + const deletedCount = await this.teamUserRepository.deleteTeamUsers(teamUsers, withSession); + + if (deletedCount <= 0) throw new BadRequestException(DELETE_FAILED); + + return deletedCount; + } + + async deleteTeamUsersOfTeam(teamId: string, withSession: boolean): Promise { + const deletedCount = await this.teamUserRepository.deleteTeamUsersOfTeam(teamId, withSession); + + if (deletedCount <= 0) throw new BadRequestException(DELETE_FAILED); + + return deletedCount; + } + + startTransaction(): Promise { + return this.teamUserRepository.startTransaction(); + } + commitTransaction(): Promise { + return this.teamUserRepository.commitTransaction(); + } + abortTransaction(): Promise { + return this.teamUserRepository.abortTransaction(); + } + endSession(): Promise { + return this.teamUserRepository.endSession(); + } +} diff --git a/backend/src/modules/teamUsers/services/get.team.user.service.ts b/backend/src/modules/teamUsers/services/get.team.user.service.ts new file mode 100644 index 000000000..fe13065ea --- /dev/null +++ b/backend/src/modules/teamUsers/services/get.team.user.service.ts @@ -0,0 +1,35 @@ +import { GetTeamUserServiceInterface } from '../interfaces/services/get.team.user.service.interface'; +import { TYPES } from '../interfaces/types'; +import { TeamUserRepositoryInterface } from '../interfaces/repositories/team-user.repository.interface'; +import { Inject, Injectable } from '@nestjs/common'; +import User from 'src/modules/users/entities/user.schema'; +import TeamUser from '../entities/team.user.schema'; +import { UserWithTeams } from 'src/modules/users/interfaces/type-user-with-teams'; + +@Injectable() +export default class GetTeamUserService implements GetTeamUserServiceInterface { + constructor( + @Inject(TYPES.repositories.TeamUserRepository) + private readonly teamUserRepository: TeamUserRepositoryInterface + ) {} + + countTeamsOfUser(userId: string): Promise { + return this.teamUserRepository.countTeamsOfUser(userId); + } + + getAllTeamsOfUser(userId: string): Promise { + return this.teamUserRepository.getAllTeamsOfUser(userId); + } + + getUsersOnlyWithTeams(users: User[]): Promise { + return this.teamUserRepository.getUsersOnlyWithTeams(users); + } + + getTeamUser(userId: string, teamId: string): Promise { + return this.teamUserRepository.getTeamUser(userId, teamId); + } + + getUsersOfTeam(teamId: string): Promise { + return this.teamUserRepository.getUsersOfTeam(teamId); + } +} diff --git a/backend/src/modules/teamUsers/services/update.team.user.service.ts b/backend/src/modules/teamUsers/services/update.team.user.service.ts new file mode 100644 index 000000000..11bef1ed0 --- /dev/null +++ b/backend/src/modules/teamUsers/services/update.team.user.service.ts @@ -0,0 +1,45 @@ +import { CreateTeamUserServiceInterface } from '../interfaces/services/create.team.user.service.interface'; +import { UpdateTeamUserServiceInterface } from '../interfaces/services/update.team.user.service.interface'; +import { BadRequestException, Inject, Injectable } from '@nestjs/common'; +import { UPDATE_FAILED } from 'src/libs/exceptions/messages'; +import TeamUserDto from '../dto/team.user.dto'; +import TeamUser from '../entities/team.user.schema'; +import { TYPES } from '../interfaces/types'; +import { TeamUserRepositoryInterface } from '../interfaces/repositories/team-user.repository.interface'; +import { DeleteTeamUserServiceInterface } from '../interfaces/services/delete.team.user.service.interface'; + +@Injectable() +export default class UpdateTeamUserService implements UpdateTeamUserServiceInterface { + constructor( + @Inject(TYPES.repositories.TeamUserRepository) + private readonly teamUserRepository: TeamUserRepositoryInterface, + @Inject(TYPES.services.CreateTeamUserService) + private createTeamUserService: CreateTeamUserServiceInterface, + @Inject(TYPES.services.DeleteTeamUserService) + private deleteTeamUserService: DeleteTeamUserServiceInterface + ) {} + + async updateTeamUser(teamUserData: TeamUserDto): Promise { + const teamUserSaved = await this.teamUserRepository.updateTeamUser(teamUserData); + + if (!teamUserSaved) throw new BadRequestException(UPDATE_FAILED); + + return teamUserSaved; + } + + async addAndRemoveTeamUsers(addUsers: TeamUserDto[], removeUsers: string[]): Promise { + try { + let createdTeamUsers: TeamUser[] = []; + + if (addUsers.length > 0) + createdTeamUsers = await this.createTeamUserService.createTeamUsers(addUsers); + + if (removeUsers.length > 0) + await this.deleteTeamUserService.deleteTeamUsers(removeUsers, false); + + return createdTeamUsers; + } catch (error) { + throw new BadRequestException(UPDATE_FAILED); + } + } +} diff --git a/backend/src/modules/teamUsers/teamusers.module.ts b/backend/src/modules/teamUsers/teamusers.module.ts new file mode 100644 index 000000000..1f8c1e708 --- /dev/null +++ b/backend/src/modules/teamUsers/teamusers.module.ts @@ -0,0 +1,44 @@ +import { + addAndRemoveTeamUsersUseCase, + createTeamUserService, + createTeamUserUseCase, + createTeamUsersUseCase, + deleteTeamUserService, + deleteTeamUserUseCase, + getTeamUserService, + teamUserRepository, + updateTeamUserService, + updateTeamUserUseCase +} from './teamusers.providers'; +import { Module } from '@nestjs/common'; +import { mongooseTeamUserModule } from 'src/infrastructure/database/mongoose.module'; +import TeamUsersController from './controller/teamUser.controller'; + +@Module({ + imports: [mongooseTeamUserModule], + providers: [ + teamUserRepository, + createTeamUserService, + getTeamUserService, + updateTeamUserService, + deleteTeamUserService, + createTeamUserUseCase, + createTeamUsersUseCase, + updateTeamUserUseCase, + addAndRemoveTeamUsersUseCase, + deleteTeamUserUseCase + ], + controllers: [TeamUsersController], + exports: [ + createTeamUserService, + getTeamUserService, + updateTeamUserService, + deleteTeamUserService, + createTeamUserUseCase, + createTeamUsersUseCase, + updateTeamUserUseCase, + addAndRemoveTeamUsersUseCase, + deleteTeamUserUseCase + ] +}) +export default class TeamUsersModule {} diff --git a/backend/src/modules/teamUsers/teamusers.providers.ts b/backend/src/modules/teamUsers/teamusers.providers.ts new file mode 100644 index 000000000..69e56fa5a --- /dev/null +++ b/backend/src/modules/teamUsers/teamusers.providers.ts @@ -0,0 +1,61 @@ +import { AddAndRemoveTeamUsersUseCase } from './applications/add-and-remove-team-users.use-case'; +import { UpdateTeamUserUseCase } from './applications/update-team-user.use-case'; +import { CreateTeamUsersUseCase } from './applications/create-team-users.use-case'; +import { CreateTeamUserUseCase } from './applications/create-team-user.use-case'; +import { TeamUserRepository } from './repositories/team-user.repository'; +import { TYPES } from './interfaces/types'; +import CreateTeamUserService from './services/create.team.user.service'; +import DeleteTeamUserService from './services/delete.team.user.service'; +import GetTeamUserService from './services/get.team.user.service'; +import UpdateTeamUserService from './services/update.team.user.service'; +import { DeleteTeamUserUseCase } from './applications/delete-team-user.use-case'; + +export const teamUserRepository = { + provide: TYPES.repositories.TeamUserRepository, + useClass: TeamUserRepository +}; + +export const createTeamUserService = { + provide: TYPES.services.CreateTeamUserService, + useClass: CreateTeamUserService +}; + +export const getTeamUserService = { + provide: TYPES.services.GetTeamUserService, + useClass: GetTeamUserService +}; + +export const updateTeamUserService = { + provide: TYPES.services.UpdateTeamUserService, + useClass: UpdateTeamUserService +}; + +export const deleteTeamUserService = { + provide: TYPES.services.DeleteTeamUserService, + useClass: DeleteTeamUserService +}; + +export const createTeamUserUseCase = { + provide: TYPES.applications.CreateTeamUserUseCase, + useClass: CreateTeamUserUseCase +}; + +export const createTeamUsersUseCase = { + provide: TYPES.applications.CreateTeamUsersUseCase, + useClass: CreateTeamUsersUseCase +}; + +export const updateTeamUserUseCase = { + provide: TYPES.applications.UpdateTeamUserUseCase, + useClass: UpdateTeamUserUseCase +}; + +export const addAndRemoveTeamUsersUseCase = { + provide: TYPES.applications.AddAndRemoveTeamUsersUseCase, + useClass: AddAndRemoveTeamUsersUseCase +}; + +export const deleteTeamUserUseCase = { + provide: TYPES.applications.DeleteTeamUserUseCase, + useClass: DeleteTeamUserUseCase +}; diff --git a/backend/src/modules/teams/applications/create.team.application.ts b/backend/src/modules/teams/applications/create.team.application.ts index 8edafb787..07ef76b3b 100644 --- a/backend/src/modules/teams/applications/create.team.application.ts +++ b/backend/src/modules/teams/applications/create.team.application.ts @@ -1,19 +1,23 @@ +import { CreateTeamUserServiceInterface } from '../../teamUsers/interfaces/services/create.team.user.service.interface'; import { Inject, Injectable } from '@nestjs/common'; import TeamDto from '../dto/team.dto'; -import teamUserDto from '../dto/team.user.dto'; +import teamUserDto from '../../teamUsers/dto/team.user.dto'; import { CreateTeamApplicationInterface } from '../interfaces/applications/create.team.application.interface'; import { CreateTeamServiceInterface } from '../interfaces/services/create.team.service.interface'; import { TYPES } from '../interfaces/types'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; @Injectable() export class CreateTeamApplication implements CreateTeamApplicationInterface { constructor( @Inject(TYPES.services.CreateTeamService) - private createTeamService: CreateTeamServiceInterface + private createTeamService: CreateTeamServiceInterface, + @Inject(TeamUsers.TYPES.services.CreateTeamUserService) + private createTeamUserService: CreateTeamUserServiceInterface ) {} createTeamUser(teamUser: teamUserDto) { - return this.createTeamService.createTeamUser(teamUser); + return this.createTeamUserService.createTeamUser(teamUser); } create(teamData: TeamDto) { diff --git a/backend/src/modules/teams/applications/delete.team.user.application.ts b/backend/src/modules/teams/applications/delete.team.user.application.ts deleted file mode 100644 index 22c4f8c80..000000000 --- a/backend/src/modules/teams/applications/delete.team.user.application.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Inject, Injectable } from '@nestjs/common'; -import { DeleteTeamUserApplicationInterface } from '../interfaces/applications/delete.team.user.application.interface'; -import { DeleteTeamUserServiceInterface } from '../interfaces/services/delete.team.user.service.interface'; -import { TYPES } from '../interfaces/types'; - -@Injectable() -export class DeleteTeamUserApplication implements DeleteTeamUserApplicationInterface { - constructor( - @Inject(TYPES.services.DeleteTeamUserService) - private deleteTeamUserServices: DeleteTeamUserServiceInterface - ) {} - - deleteTeamUser(teamUserId: string, withSession: boolean) { - return this.deleteTeamUserServices.deleteTeamUser(teamUserId, withSession); - } -} diff --git a/backend/src/modules/teams/applications/get.team.application.ts b/backend/src/modules/teams/applications/get.team.application.ts index be75398af..69a344b23 100644 --- a/backend/src/modules/teams/applications/get.team.application.ts +++ b/backend/src/modules/teams/applications/get.team.application.ts @@ -12,10 +12,6 @@ export class GetTeamApplication implements GetTeamApplicationInterface { private getTeamService: GetTeamServiceInterface ) {} - countTeams(userId: string) { - return this.getTeamService.countTeams(userId); - } - getAllTeams(user: UserDto) { return this.getTeamService.getAllTeams(user); } diff --git a/backend/src/modules/teams/applications/update.team.application.ts b/backend/src/modules/teams/applications/update.team.application.ts deleted file mode 100644 index cf1125728..000000000 --- a/backend/src/modules/teams/applications/update.team.application.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Inject, Injectable } from '@nestjs/common'; -import TeamUserDto from '../dto/team.user.dto'; -import { UpdateTeamApplicationInterface } from '../interfaces/applications/update.team.application.interface'; -import { UpdateTeamServiceInterface } from '../interfaces/services/update.team.service.interface'; -import { TYPES } from '../interfaces/types'; - -@Injectable() -export class UpdateTeamApplication implements UpdateTeamApplicationInterface { - constructor( - @Inject(TYPES.services.UpdateTeamService) - private updateTeamService: UpdateTeamServiceInterface - ) {} - - updateTeamUser(teamData: TeamUserDto) { - return this.updateTeamService.updateTeamUser(teamData); - } - addAndRemoveTeamUsers(addUsers: TeamUserDto[], removeUsers: string[]) { - return this.updateTeamService.addAndRemoveTeamUsers(addUsers, removeUsers); - } - - addTeamUsers(teamUsers: TeamUserDto[]) { - return this.updateTeamService.addTeamUsers(teamUsers); - } -} diff --git a/backend/src/modules/teams/controller/team.controller.ts b/backend/src/modules/teams/controller/team.controller.ts index 7d25d0fe4..6edbbc982 100644 --- a/backend/src/modules/teams/controller/team.controller.ts +++ b/backend/src/modules/teams/controller/team.controller.ts @@ -1,5 +1,4 @@ import { - BadRequestException, Body, Controller, Delete, @@ -7,7 +6,6 @@ import { Inject, Param, Post, - Put, Query, Req, SetMetadata, @@ -18,11 +16,9 @@ import { import { ApiBadRequestResponse, ApiBearerAuth, - ApiBody, ApiCreatedResponse, ApiForbiddenResponse, ApiInternalServerErrorResponse, - ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiParam, @@ -34,7 +30,6 @@ import { TeamParams } from 'src/libs/dto/param/team.params'; import { TeamQueryParams } from 'src/libs/dto/param/team.query.params'; import { UserTeamsParams } from 'src/libs/dto/param/user.teams.param'; import { TeamRoles } from 'src/libs/enum/team.roles'; -import { INSERT_FAILED, UPDATE_FAILED } from 'src/libs/exceptions/messages'; import JwtAuthenticationGuard from 'src/libs/guards/jwtAuth.guard'; import RequestWithUser from 'src/libs/interfaces/requestWithUser.interface'; import { BadRequestResponse } from 'src/libs/swagger/errors/bad-request.swagger'; @@ -42,20 +37,15 @@ import { InternalServerErrorResponse } from 'src/libs/swagger/errors/internal-se import { UnauthorizedResponse } from 'src/libs/swagger/errors/unauthorized.swagger'; import { TeamUserGuard } from '../../../libs/guards/teamRoles.guard'; import { ForbiddenResponse } from '../../../libs/swagger/errors/forbidden.swagger'; -import { NotFoundResponse } from '../../../libs/swagger/errors/not-found.swagger'; import { CreateTeamDto } from '../dto/crate-team.dto'; import TeamDto from '../dto/team.dto'; -import TeamUserDto from '../dto/team.user.dto'; -import UpdateTeamUserDto from '../dto/update.team.user.dto'; import { TYPES } from '../interfaces/types'; import { SuperAdminGuard } from 'src/libs/guards/superAdmin.guard'; import { CreateTeamApplicationInterface } from '../interfaces/applications/create.team.application.interface'; import { GetTeamApplicationInterface } from '../interfaces/applications/get.team.application.interface'; -import { UpdateTeamApplicationInterface } from '../interfaces/applications/update.team.application.interface'; import { DeleteTeamApplicationInterface } from '../interfaces/applications/delete.team.application.interface'; -import { DeleteTeamUserApplicationInterface } from '../interfaces/applications/delete.team.user.application.interface'; -const TeamUser = (permissions: string[]) => SetMetadata('permissions', permissions); +const TeamUserPermission = (permissions: string[]) => SetMetadata('permissions', permissions); @ApiBearerAuth('access-token') @ApiTags('Teams') @@ -67,12 +57,8 @@ export default class TeamsController { private createTeamApp: CreateTeamApplicationInterface, @Inject(TYPES.applications.GetTeamApplication) private getTeamApp: GetTeamApplicationInterface, - @Inject(TYPES.applications.UpdateTeamApplication) - private updateTeamApp: UpdateTeamApplicationInterface, @Inject(TYPES.applications.DeleteTeamApplication) - private deleteTeamApp: DeleteTeamApplicationInterface, - @Inject(TYPES.applications.DeleteTeamUserApplication) - private deleteTeamUserApp: DeleteTeamUserApplicationInterface + private deleteTeamApp: DeleteTeamApplicationInterface ) {} @ApiOperation({ summary: 'Create a new team' }) @@ -90,37 +76,8 @@ export default class TeamsController { type: InternalServerErrorResponse }) @Post() - async create(@Body() teamData: CreateTeamDto) { - const team = await this.createTeamApp.create(teamData); - - if (!team) throw new BadRequestException(INSERT_FAILED); - - return team; - } - - @ApiOperation({ summary: 'Add a user to an existing team' }) - @ApiOkResponse({ description: 'User successfully added to the team!', type: TeamUserDto }) - @ApiUnauthorizedResponse({ - description: 'Unauthorized', - type: UnauthorizedResponse - }) - @ApiBadRequestResponse({ - description: 'Bad Request', - type: BadRequestResponse - }) - @ApiInternalServerErrorResponse({ - description: 'Internal Server Error', - type: InternalServerErrorResponse - }) - @Put() - async createTeamUser(@Body() teamData: TeamUserDto) { - const team = await this.createTeamApp.createTeamUser(teamData); - - if (!team) { - throw new BadRequestException(INSERT_FAILED); - } - - return team; + create(@Body() teamData: CreateTeamDto) { + return this.createTeamApp.create(teamData); } @ApiOperation({ summary: 'Retrieve a list of existing teams' }) @@ -157,12 +114,8 @@ export default class TeamsController { type: InternalServerErrorResponse }) @Get('user') - getTeamsOfUser(@Req() request: RequestWithUser, @Query() { userId }: UserTeamsParams) { - if (userId) { - return this.getTeamApp.getTeamsOfUser(userId); - } - - return this.getTeamApp.getTeamsOfUser(request.user._id); + async getTeamsOfUser(@Req() request: RequestWithUser, @Query() { userId }: UserTeamsParams) { + return this.getTeamApp.getTeamsOfUser(userId ?? request.user._id); } @ApiOperation({ summary: 'Get a specific team' }) @@ -217,110 +170,6 @@ export default class TeamsController { return this.getTeamApp.getTeamsUserIsNotMember(userId); } - @ApiOperation({ summary: 'Update a specific team member' }) - @ApiParam({ type: String, name: 'teamId', required: true }) - @ApiBody({ type: TeamUserDto }) - @ApiOkResponse({ - type: TeamUserDto, - description: 'Team member updated successfully!' - }) - @ApiBadRequestResponse({ - description: 'Bad Request', - type: BadRequestResponse - }) - @ApiUnauthorizedResponse({ - description: 'Unauthorized', - type: UnauthorizedResponse - }) - @ApiNotFoundResponse({ - type: NotFoundResponse, - description: 'Not found!' - }) - @ApiForbiddenResponse({ - description: 'Forbidden', - type: ForbiddenResponse - }) - @ApiInternalServerErrorResponse({ - description: 'Internal Server Error', - type: InternalServerErrorResponse - }) - @TeamUser([TeamRoles.ADMIN, TeamRoles.STAKEHOLDER]) - @UseGuards(TeamUserGuard) - @Put(':teamId') - async updateTeamUser(@Body() teamData: TeamUserDto) { - const teamUser = await this.updateTeamApp.updateTeamUser(teamData); - - if (!teamUser) throw new BadRequestException(UPDATE_FAILED); - - return teamUser; - } - - @ApiOperation({ summary: 'Add and remove team members' }) - @ApiParam({ type: String, name: 'teamId', required: true }) - @ApiBody({ type: UpdateTeamUserDto }) - @ApiOkResponse({ - type: TeamUserDto, - description: 'Team member updated successfully!' - }) - @ApiBadRequestResponse({ - description: 'Bad Request', - type: BadRequestResponse - }) - @ApiUnauthorizedResponse({ - description: 'Unauthorized', - type: UnauthorizedResponse - }) - @ApiNotFoundResponse({ - type: NotFoundResponse, - description: 'Not found!' - }) - @ApiForbiddenResponse({ - description: 'Forbidden', - type: ForbiddenResponse - }) - @ApiInternalServerErrorResponse({ - description: 'Internal Server Error', - type: InternalServerErrorResponse - }) - @TeamUser([TeamRoles.ADMIN, TeamRoles.STAKEHOLDER]) - @UseGuards(TeamUserGuard) - @Put('/:teamId/addAndRemove') - addAndRemoveTeamUsers(@Body() users: UpdateTeamUserDto) { - return this.updateTeamApp.addAndRemoveTeamUsers(users.addUsers, users.removeUsers); - } - - @ApiOperation({ summary: 'Add team members' }) - @ApiBody({ type: TeamUserDto }) - @ApiOkResponse({ - type: TeamUserDto, - description: 'Team member updated successfully!' - }) - @ApiBadRequestResponse({ - description: 'Bad Request', - type: BadRequestResponse - }) - @ApiUnauthorizedResponse({ - description: 'Unauthorized', - type: UnauthorizedResponse - }) - @ApiNotFoundResponse({ - type: NotFoundResponse, - description: 'Not found!' - }) - @ApiForbiddenResponse({ - description: 'Forbidden', - type: ForbiddenResponse - }) - @ApiInternalServerErrorResponse({ - description: 'Internal Server Error', - type: InternalServerErrorResponse - }) - @UseGuards(SuperAdminGuard) - @Put('add/user') - addTeamUsers(@Body() teamUsers: TeamUserDto[]) { - return this.updateTeamApp.addTeamUsers(teamUsers); - } - @ApiOperation({ summary: 'Delete a specific team' }) @ApiParam({ type: String, name: 'teamId', required: true }) @ApiOkResponse({ type: Boolean, description: 'Team successfully deleted!' }) @@ -340,35 +189,10 @@ export default class TeamsController { description: 'Forbidden', type: ForbiddenResponse }) - @TeamUser([TeamRoles.ADMIN, TeamRoles.STAKEHOLDER]) + @TeamUserPermission([TeamRoles.ADMIN, TeamRoles.STAKEHOLDER]) @UseGuards(TeamUserGuard) @Delete(':teamId') deleteTeam(@Param() { teamId }: TeamParams) { return this.deleteTeamApp.delete(teamId); } - - @ApiOperation({ summary: 'Delete a specific team of a user' }) - @ApiParam({ type: String, name: 'userId', required: true }) - @ApiOkResponse({ type: Boolean, description: 'Team of user successfully deleted!' }) - @ApiBadRequestResponse({ - description: 'Bad Request', - type: BadRequestResponse - }) - @ApiUnauthorizedResponse({ - description: 'Unauthorized', - type: UnauthorizedResponse - }) - @ApiInternalServerErrorResponse({ - description: 'Internal Server Error', - type: InternalServerErrorResponse - }) - @ApiForbiddenResponse({ - description: 'Forbidden', - type: ForbiddenResponse - }) - @UseGuards(SuperAdminGuard) - @Delete('/user/:teamUserId') - deleteTeamUsers(@Param() { teamUserId }: UserTeamsParams) { - return this.deleteTeamUserApp.deleteTeamUser(teamUserId, true); - } } diff --git a/backend/src/modules/teams/dto/crate-team.dto.ts b/backend/src/modules/teams/dto/crate-team.dto.ts index d30aa403b..efd139f41 100644 --- a/backend/src/modules/teams/dto/crate-team.dto.ts +++ b/backend/src/modules/teams/dto/crate-team.dto.ts @@ -1,7 +1,7 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString, Validate } from 'class-validator'; import { CheckUniqueUsers } from 'src/libs/validators/check-unique-users'; -import TeamUserDto from './team.user.dto'; +import TeamUserDto from '../../teamUsers/dto/team.user.dto'; export class CreateTeamDto { @ApiProperty() diff --git a/backend/src/modules/teams/entities/teams.schema.ts b/backend/src/modules/teams/entities/team.schema.ts similarity index 90% rename from backend/src/modules/teams/entities/teams.schema.ts rename to backend/src/modules/teams/entities/team.schema.ts index c51c33cd3..46db568c6 100644 --- a/backend/src/modules/teams/entities/teams.schema.ts +++ b/backend/src/modules/teams/entities/team.schema.ts @@ -2,7 +2,7 @@ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { Document } from 'mongoose'; import * as leanVirtualsPlugin from 'mongoose-lean-virtuals'; import BaseModel from 'src/libs/models/base.model'; -import TeamUser from './team.user.schema'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; export type TeamDocument = Team & Document; diff --git a/backend/src/modules/teams/interfaces/applications/create.team.application.interface.ts b/backend/src/modules/teams/interfaces/applications/create.team.application.interface.ts index 81915fc58..6eaabd2e7 100644 --- a/backend/src/modules/teams/interfaces/applications/create.team.application.interface.ts +++ b/backend/src/modules/teams/interfaces/applications/create.team.application.interface.ts @@ -1,7 +1,7 @@ import { CreateTeamDto } from '../../dto/crate-team.dto'; -import TeamUserDto from '../../dto/team.user.dto'; -import TeamUser from '../../entities/team.user.schema'; -import Team from '../../entities/teams.schema'; +import TeamUserDto from '../../../teamUsers/dto/team.user.dto'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; +import Team from '../../entities/team.schema'; export interface CreateTeamApplicationInterface { createTeamUser(teamUser: TeamUserDto): Promise; diff --git a/backend/src/modules/teams/interfaces/applications/delete.team.user.application.interface.ts b/backend/src/modules/teams/interfaces/applications/delete.team.user.application.interface.ts deleted file mode 100644 index a9a688f65..000000000 --- a/backend/src/modules/teams/interfaces/applications/delete.team.user.application.interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import TeamUser from '../../entities/team.user.schema'; - -export interface DeleteTeamUserApplicationInterface { - deleteTeamUser(teamUserId: string, withSession: boolean): Promise; -} diff --git a/backend/src/modules/teams/interfaces/applications/get.team.application.interface.ts b/backend/src/modules/teams/interfaces/applications/get.team.application.interface.ts index 0e9108fba..d2113c850 100644 --- a/backend/src/modules/teams/interfaces/applications/get.team.application.interface.ts +++ b/backend/src/modules/teams/interfaces/applications/get.team.application.interface.ts @@ -1,11 +1,9 @@ import { LeanDocument } from 'mongoose'; import { TeamQueryParams } from 'src/libs/dto/param/team.query.params'; import UserDto from 'src/modules/users/dto/user.dto'; -import { TeamDocument } from '../../entities/teams.schema'; +import { TeamDocument } from '../../entities/team.schema'; export interface GetTeamApplicationInterface { - countTeams(userId: string): Promise; - getAllTeams(user: UserDto): Promise[]>; getTeam( diff --git a/backend/src/modules/teams/interfaces/applications/update.team.application.interface.ts b/backend/src/modules/teams/interfaces/applications/update.team.application.interface.ts deleted file mode 100644 index 8488bfa2c..000000000 --- a/backend/src/modules/teams/interfaces/applications/update.team.application.interface.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { LeanDocument } from 'mongoose'; -import TeamUserDto from '../../dto/team.user.dto'; -import { TeamUserDocument } from '../../entities/team.user.schema'; - -export interface UpdateTeamApplicationInterface { - updateTeamUser(teamData: TeamUserDto): Promise | null>; - addAndRemoveTeamUsers( - addUsers: TeamUserDto[], - removeUsers: string[] - ): Promise>; - addTeamUsers(teamUsers: TeamUserDto[]): Promise[]>; -} diff --git a/backend/src/modules/teams/repositories/team.repository.interface.ts b/backend/src/modules/teams/interfaces/repositories/team.repository.interface.ts similarity index 87% rename from backend/src/modules/teams/repositories/team.repository.interface.ts rename to backend/src/modules/teams/interfaces/repositories/team.repository.interface.ts index dad37bdb2..fe4323ae7 100644 --- a/backend/src/modules/teams/repositories/team.repository.interface.ts +++ b/backend/src/modules/teams/interfaces/repositories/team.repository.interface.ts @@ -1,5 +1,5 @@ import { BaseInterfaceRepository } from 'src/libs/repositories/interfaces/base.repository.interface'; -import Team from '../entities/teams.schema'; +import Team from '../../entities/team.schema'; export interface TeamRepositoryInterface extends BaseInterfaceRepository { getTeam(teamId: string): Promise; diff --git a/backend/src/modules/teams/interfaces/services/create.team.service.interface.ts b/backend/src/modules/teams/interfaces/services/create.team.service.interface.ts index 27cdcc268..0e5709679 100644 --- a/backend/src/modules/teams/interfaces/services/create.team.service.interface.ts +++ b/backend/src/modules/teams/interfaces/services/create.team.service.interface.ts @@ -1,12 +1,8 @@ import TeamDto from '../../dto/team.dto'; -import TeamUserDto from '../../dto/team.user.dto'; -import TeamUser from '../../entities/team.user.schema'; -import Team from '../../entities/teams.schema'; +import Team from '../../entities/team.schema'; export interface CreateTeamServiceInterface { create(teamData: TeamDto): Promise; createTeam(name: string): Promise; - - createTeamUser(teamUser: TeamUserDto): Promise; } diff --git a/backend/src/modules/teams/interfaces/services/delete.team.user.service.interface.ts b/backend/src/modules/teams/interfaces/services/delete.team.user.service.interface.ts deleted file mode 100644 index 69bf86ac3..000000000 --- a/backend/src/modules/teams/interfaces/services/delete.team.user.service.interface.ts +++ /dev/null @@ -1,6 +0,0 @@ -import TeamUser from '../../entities/team.user.schema'; - -export interface DeleteTeamUserServiceInterface { - delete(userId: string): Promise; - deleteTeamUser(teamUserId: string, withSession: boolean): Promise; -} diff --git a/backend/src/modules/teams/interfaces/services/get.team.service.interface.ts b/backend/src/modules/teams/interfaces/services/get.team.service.interface.ts index 4f0119cac..13a427681 100644 --- a/backend/src/modules/teams/interfaces/services/get.team.service.interface.ts +++ b/backend/src/modules/teams/interfaces/services/get.team.service.interface.ts @@ -1,27 +1,12 @@ import { LeanDocument } from 'mongoose'; import { TeamQueryParams } from 'src/libs/dto/param/team.query.params'; -import TeamUser from '../../entities/team.user.schema'; -import Team from '../../entities/teams.schema'; -import { UserWithTeams } from '../../../users/interfaces/type-user-with-teams'; -import User from 'src/modules/users/entities/user.schema'; +import Team from '../../entities/team.schema'; import UserDto from 'src/modules/users/dto/user.dto'; export interface GetTeamServiceInterface { - countTeams(userId: string): Promise; - - countAllTeams(): Promise; - - getTeamsOfUser(userId: string): Promise; - - getTeam(teamId: string, teamQueryParams?: TeamQueryParams): Promise; - - getUsersOfTeam(teamId: string): Promise; - - getTeamUser(userId: string, teamId: string): Promise; - getAllTeams(user: UserDto): Promise[]>; - - getUsersOnlyWithTeams(users: User[]): Promise[]>; - + getTeam(teamId: string, teamQueryParams?: TeamQueryParams): Promise; + getTeamsOfUser(userId: string): Promise; getTeamsUserIsNotMember(userId: string): Promise[]>; + countAllTeams(): Promise; } diff --git a/backend/src/modules/teams/interfaces/services/update.team.service.interface.ts b/backend/src/modules/teams/interfaces/services/update.team.service.interface.ts deleted file mode 100644 index 94fb41d56..000000000 --- a/backend/src/modules/teams/interfaces/services/update.team.service.interface.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { LeanDocument } from 'mongoose'; -import TeamUserDto from '../../dto/team.user.dto'; -import { TeamUserDocument } from '../../entities/team.user.schema'; - -export interface UpdateTeamServiceInterface { - updateTeamUser(teamData: TeamUserDto): Promise | null>; - addAndRemoveTeamUsers( - addUsers: TeamUserDto[], - removeUsers: string[] - ): Promise>; - addTeamUsers(teamUsers: TeamUserDto[]): Promise[]>; -} diff --git a/backend/src/modules/teams/interfaces/types.ts b/backend/src/modules/teams/interfaces/types.ts index 119e4bf9e..4bed984f0 100644 --- a/backend/src/modules/teams/interfaces/types.ts +++ b/backend/src/modules/teams/interfaces/types.ts @@ -3,18 +3,15 @@ export const TYPES = { CreateTeamService: 'CreateTeamService', GetTeamService: 'GetTeamService', UpdateTeamService: 'UpdateTeamService', - DeleteTeamService: 'DeleteTeamService', - DeleteTeamUserService: 'DeleteTeamUserService' + DeleteTeamService: 'DeleteTeamService' }, applications: { CreateTeamApplication: 'CreateTeamApplication', GetTeamApplication: 'GetTeamApplication', UpdateTeamApplication: 'UpdateTeamApplication', - DeleteTeamApplication: 'DeleteTeamApplication', - DeleteTeamUserApplication: 'DeleteTeamUserApplication' + DeleteTeamApplication: 'DeleteTeamApplication' }, repositories: { - TeamRepository: 'TeamRepository', - TeamUserRepository: 'TeamUserRepository' + TeamRepository: 'TeamRepository' } }; diff --git a/backend/src/modules/teams/providers.ts b/backend/src/modules/teams/providers.ts index 4a376b2fa..2d7fcce25 100644 --- a/backend/src/modules/teams/providers.ts +++ b/backend/src/modules/teams/providers.ts @@ -1,16 +1,11 @@ import { CreateTeamApplication } from './applications/create.team.application'; import { DeleteTeamApplication } from './applications/delete.team.application'; import { GetTeamApplication } from './applications/get.team.application'; -import { UpdateTeamApplication } from './applications/update.team.application'; import { TYPES } from './interfaces/types'; -import { TeamUserRepository } from './repositories/team-user.repository'; import { TeamRepository } from './repositories/team.repository'; import CreateTeamService from './services/create.team.service'; import DeleteTeamService from './services/delete.team.service'; import GetTeamService from './services/get.team.service'; -import UpdateTeamService from './services/update.team.service'; -import DeleteTeamUserService from './services/delete.team.user.service'; -import { DeleteTeamUserApplication } from './applications/delete.team.user.application'; export const createTeamService = { provide: TYPES.services.CreateTeamService, @@ -32,16 +27,6 @@ export const getTeamApplication = { useClass: GetTeamApplication }; -export const updateTeamService = { - provide: TYPES.services.UpdateTeamService, - useClass: UpdateTeamService -}; - -export const updateTeamApplication = { - provide: TYPES.applications.UpdateTeamApplication, - useClass: UpdateTeamApplication -}; - export const deleteTeamService = { provide: TYPES.services.DeleteTeamService, useClass: DeleteTeamService @@ -56,18 +41,3 @@ export const teamRepository = { provide: TYPES.repositories.TeamRepository, useClass: TeamRepository }; - -export const teamUserRepository = { - provide: TYPES.repositories.TeamUserRepository, - useClass: TeamUserRepository -}; - -export const deleteTeamUserService = { - provide: TYPES.services.DeleteTeamUserService, - useClass: DeleteTeamUserService -}; - -export const deleteTeamUserApplication = { - provide: TYPES.applications.DeleteTeamUserApplication, - useClass: DeleteTeamUserApplication -}; diff --git a/backend/src/modules/teams/repositories/team-user.repository.interface.ts b/backend/src/modules/teams/repositories/team-user.repository.interface.ts deleted file mode 100644 index 32206de77..000000000 --- a/backend/src/modules/teams/repositories/team-user.repository.interface.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { BaseInterfaceRepository } from 'src/libs/repositories/interfaces/base.repository.interface'; -import User from 'src/modules/users/entities/user.schema'; -import { UserWithTeams } from 'src/modules/users/interfaces/type-user-with-teams'; -import TeamUserDto from '../dto/team.user.dto'; -import TeamUser from '../entities/team.user.schema'; - -export interface TeamUserRepositoryInterface extends BaseInterfaceRepository { - countTeamsOfUser(userId: string): Promise; - getAllTeamsOfUser(userId: string): Promise; - getUsersOnlyWithTeams(users: User[]): Promise; - getUsersOfTeam(teamId: string); - updateTeamUser(teamData: TeamUserDto): Promise; - deleteManyTeamUser(userId: string, withSession: boolean): Promise; - deleteTeamOfUserOnly(teamUserId: string, withSession: boolean): Promise; -} diff --git a/backend/src/modules/teams/repositories/team.repository.ts b/backend/src/modules/teams/repositories/team.repository.ts index 9bf2f06de..81b27ecb0 100644 --- a/backend/src/modules/teams/repositories/team.repository.ts +++ b/backend/src/modules/teams/repositories/team.repository.ts @@ -2,8 +2,8 @@ import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; import { MongoGenericRepository } from 'src/libs/repositories/mongo/mongo-generic.repository'; -import Team, { TeamDocument } from '../entities/teams.schema'; -import { TeamRepositoryInterface } from './team.repository.interface'; +import Team, { TeamDocument } from '../entities/team.schema'; +import { TeamRepositoryInterface } from '../interfaces/repositories/team.repository.interface'; @Injectable() export class TeamRepository diff --git a/backend/src/modules/teams/services/create.team.service.ts b/backend/src/modules/teams/services/create.team.service.ts index 830e0366a..1b3061f86 100644 --- a/backend/src/modules/teams/services/create.team.service.ts +++ b/backend/src/modules/teams/services/create.team.service.ts @@ -1,33 +1,24 @@ -import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { INSERT_FAILED } from 'src/libs/exceptions/messages'; +import { CreateTeamUserServiceInterface } from 'src/modules/teamUsers/interfaces/services/create.team.user.service.interface'; +import { BadRequestException, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import isEmpty from 'src/libs/utils/isEmpty'; import { CreateTeamDto } from '../dto/crate-team.dto'; -import TeamUserDto from '../dto/team.user.dto'; import { CreateTeamServiceInterface } from '../interfaces/services/create.team.service.interface'; -import TeamUser from '../entities/team.user.schema'; -import { TeamRepositoryInterface } from '../repositories/team.repository.interface'; -import { TeamUserRepositoryInterface } from '../repositories/team-user.repository.interface'; +import { TeamRepositoryInterface } from '../interfaces/repositories/team.repository.interface'; import { TYPES } from '../interfaces/types'; import { TEAM_ALREADY_EXISTS } from 'src/libs/constants/team'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; +import TeamUser from 'src/modules/teamUsers/entities/team.user.schema'; @Injectable() export default class CreateTeamService implements CreateTeamServiceInterface { constructor( @Inject(TYPES.repositories.TeamRepository) private readonly teamRepository: TeamRepositoryInterface, - @Inject(TYPES.repositories.TeamUserRepository) - private readonly teamUserRepository: TeamUserRepositoryInterface + @Inject(TeamUsers.TYPES.services.CreateTeamUserService) + private readonly createTeamUserService: CreateTeamUserServiceInterface ) {} - createTeamUsers(teamUsers: TeamUserDto[], teamId: string) { - return Promise.all( - teamUsers.map((user) => this.teamUserRepository.create({ ...user, team: teamId })) - ); - } - - createTeamUser(teamUser: TeamUserDto) { - return this.teamUserRepository.create({ ...teamUser }); - } - createTeam(name: string) { return this.teamRepository.create({ name }); } @@ -41,16 +32,31 @@ export default class CreateTeamService implements CreateTeamServiceInterface { throw new HttpException(TEAM_ALREADY_EXISTS, HttpStatus.CONFLICT); } - const newTeam = await this.teamRepository.create({ - name - }); + await this.teamRepository.startTransaction(); + await this.createTeamUserService.startTransaction(); - let teamUsers: TeamUser[] = []; + try { + const newTeam = await this.teamRepository.create({ + name + }); - if (!isEmpty(users)) { - teamUsers = await this.createTeamUsers(users, newTeam._id); - } + let teamUsers: TeamUser[] = []; + + if (!isEmpty(users)) { + teamUsers = await this.createTeamUserService.createTeamUsers(users, newTeam._id); + } - return { ...newTeam, users: teamUsers }; + await this.teamRepository.commitTransaction(); + await this.createTeamUserService.commitTransaction(); + + return { ...newTeam, users: teamUsers }; + } catch (error) { + await this.teamRepository.abortTransaction(); + await this.createTeamUserService.abortTransaction(); + } finally { + await this.teamRepository.endSession(); + await this.createTeamUserService.endSession(); + } + throw new BadRequestException(INSERT_FAILED); } } diff --git a/backend/src/modules/teams/services/delete.team.service.ts b/backend/src/modules/teams/services/delete.team.service.ts index abd6b0fb4..49d9fe34e 100644 --- a/backend/src/modules/teams/services/delete.team.service.ts +++ b/backend/src/modules/teams/services/delete.team.service.ts @@ -2,42 +2,43 @@ import { BadRequestException, Inject, Injectable, NotFoundException } from '@nes import { DELETE_FAILED } from 'src/libs/exceptions/messages'; import { DeleteTeamServiceInterface } from '../interfaces/services/delete.team.service.interface'; import { TYPES } from '../interfaces/types'; -import { TeamRepositoryInterface } from '../repositories/team.repository.interface'; -import { TeamUserRepositoryInterface } from '../repositories/team-user.repository.interface'; +import { TeamRepositoryInterface } from '../interfaces/repositories/team.repository.interface'; import * as Boards from '../../boards/interfaces/types'; +import * as TeamUsers from '../../teamUsers/interfaces/types'; import { DeleteBoardServiceInterface } from 'src/modules/boards/interfaces/services/delete.board.service.interface'; +import { DeleteTeamUserServiceInterface } from 'src/modules/teamUsers/interfaces/services/delete.team.user.service.interface'; @Injectable() export default class DeleteTeamService implements DeleteTeamServiceInterface { constructor( @Inject(TYPES.repositories.TeamRepository) private readonly teamRepository: TeamRepositoryInterface, - @Inject(TYPES.repositories.TeamUserRepository) - private readonly teamUserRepository: TeamUserRepositoryInterface, @Inject(Boards.TYPES.services.DeleteBoardService) - private deleteBoardService: DeleteBoardServiceInterface + private deleteBoardService: DeleteBoardServiceInterface, + @Inject(TeamUsers.TYPES.services.DeleteTeamUserService) + private deleteTeamUserService: DeleteTeamUserServiceInterface ) {} async delete(teamId: string): Promise { await this.teamRepository.startTransaction(); - await this.teamUserRepository.startTransaction(); + await this.deleteTeamUserService.startTransaction(); try { await this.deleteTeam(teamId, true); - await this.deleteTeamUsers(teamId, true); + await this.deleteTeamUserService.deleteTeamUsersOfTeam(teamId, true); await this.deleteBoardService.deleteBoardsByTeamId(teamId); await this.teamRepository.commitTransaction(); - await this.teamUserRepository.commitTransaction(); + await this.deleteTeamUserService.commitTransaction(); return true; } catch (e) { await this.teamRepository.abortTransaction(); - await this.teamUserRepository.abortTransaction(); + await this.deleteTeamUserService.abortTransaction(); } finally { await this.teamRepository.endSession(); - await this.teamUserRepository.endSession(); + await this.deleteTeamUserService.endSession(); } throw new BadRequestException(DELETE_FAILED); } @@ -52,15 +53,4 @@ export default class DeleteTeamService implements DeleteTeamServiceInterface { if (!result) throw new NotFoundException(DELETE_FAILED); } - - private async deleteTeamUsers(teamId: string, withSession: boolean) { - const deletedCount = await this.teamUserRepository.deleteMany( - { - team: teamId - }, - withSession - ); - - if (deletedCount <= 0) throw new Error(DELETE_FAILED); - } } diff --git a/backend/src/modules/teams/services/delete.team.user.service.ts b/backend/src/modules/teams/services/delete.team.user.service.ts deleted file mode 100644 index b90565b23..000000000 --- a/backend/src/modules/teams/services/delete.team.user.service.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { BadRequestException, Inject, Injectable } from '@nestjs/common'; -import { DELETE_FAILED } from 'src/libs/exceptions/messages'; -import { DeleteTeamUserServiceInterface } from '../interfaces/services/delete.team.user.service.interface'; -import { TYPES } from '../interfaces/types'; -import { TeamUserRepositoryInterface } from '../repositories/team-user.repository.interface'; - -@Injectable() -export default class DeleteTeamUserService implements DeleteTeamUserServiceInterface { - constructor( - @Inject(TYPES.repositories.TeamUserRepository) - private readonly teamUserRepository: TeamUserRepositoryInterface - ) {} - - async delete(userId: string): Promise { - await this.teamUserRepository.startTransaction(); - - try { - await this.deleteTeamUsers(userId, true); - await this.teamUserRepository.commitTransaction(); - - return true; - } catch (e) { - await this.teamUserRepository.abortTransaction(); - } finally { - await this.teamUserRepository.endSession(); - } - throw new BadRequestException(DELETE_FAILED); - } - - private async deleteTeamUsers(userId: string, withSession: boolean) { - const deletedCount = await this.teamUserRepository.deleteManyTeamUser(userId, withSession); - - if (deletedCount <= 0) throw new Error(DELETE_FAILED); - } - - async deleteTeamUser(teamUserId: string, withSession: boolean) { - const deletedCount = await this.teamUserRepository.deleteTeamOfUserOnly( - teamUserId, - withSession - ); - - if (!deletedCount) throw new Error(DELETE_FAILED); - - return deletedCount; - } -} diff --git a/backend/src/modules/teams/services/get.team.service.ts b/backend/src/modules/teams/services/get.team.service.ts index aac832721..33f97c22a 100644 --- a/backend/src/modules/teams/services/get.team.service.ts +++ b/backend/src/modules/teams/services/get.team.service.ts @@ -1,29 +1,26 @@ import { ForbiddenException, Inject, Injectable } from '@nestjs/common'; import { GetTeamServiceInterface } from '../interfaces/services/get.team.service.interface'; -import Team from '../entities/teams.schema'; +import Team from '../entities/team.schema'; import { TYPES } from '../interfaces/types'; import * as Boards from 'src/modules/boards/interfaces/types'; -import { TeamRepositoryInterface } from '../repositories/team.repository.interface'; -import { TeamUserRepositoryInterface } from '../repositories/team-user.repository.interface'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; +import { TeamRepositoryInterface } from '../interfaces/repositories/team.repository.interface'; import User from 'src/modules/users/entities/user.schema'; import UserDto from 'src/modules/users/dto/user.dto'; import { GetBoardServiceInterface } from 'src/modules/boards/interfaces/services/get.board.service.interface'; +import { GetTeamUserServiceInterface } from 'src/modules/teamUsers/interfaces/services/get.team.user.service.interface'; @Injectable() export default class GetTeamService implements GetTeamServiceInterface { constructor( @Inject(TYPES.repositories.TeamRepository) private readonly teamRepository: TeamRepositoryInterface, - @Inject(TYPES.repositories.TeamUserRepository) - private readonly teamUserRepository: TeamUserRepositoryInterface, + @Inject(TeamUsers.TYPES.services.GetTeamUserService) + private getTeamUserService: GetTeamUserServiceInterface, @Inject(Boards.TYPES.services.GetBoardService) private getBoardService: GetBoardServiceInterface ) {} - countTeams(userId: string) { - return this.teamUserRepository.countTeamsOfUser(userId); - } - countAllTeams() { return this.teamRepository.countDocuments(); } @@ -45,7 +42,7 @@ export default class GetTeamService implements GetTeamServiceInterface { } async getTeamsOfUser(userId: string) { - const teamsUser = await this.teamUserRepository.getAllTeamsOfUser(userId); + const teamsUser = await this.getTeamUserService.getAllTeamsOfUser(userId); const teams: Team[] = await this.teamRepository.getTeamsWithUsers( teamsUser.map((teamUser) => teamUser._id) @@ -64,14 +61,6 @@ export default class GetTeamService implements GetTeamServiceInterface { return teamsResult; } - getUsersOnlyWithTeams(users: User[]) { - return this.teamUserRepository.getUsersOnlyWithTeams(users); - } - - getTeamUser(userId: string, teamId: string) { - return this.teamUserRepository.findOneByField({ user: userId, team: teamId }); - } - async getAllTeams(user: UserDto) { if (!user.isSAdmin) throw new ForbiddenException(); @@ -88,13 +77,9 @@ export default class GetTeamService implements GetTeamServiceInterface { }); } - getUsersOfTeam(teamId: string) { - return this.teamUserRepository.getUsersOfTeam(teamId); - } - async getTeamsUserIsNotMember(userId: string) { const allTeams = await this.teamRepository.getAllTeams(); - const teamUsers = await this.teamUserRepository.getAllTeamsOfUser(userId); + const teamUsers = await this.getTeamUserService.getAllTeamsOfUser(userId); if (teamUsers.length === 0) return allTeams; diff --git a/backend/src/modules/teams/services/update.team.service.ts b/backend/src/modules/teams/services/update.team.service.ts deleted file mode 100644 index 0f5a14277..000000000 --- a/backend/src/modules/teams/services/update.team.service.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { BadRequestException, Inject, Injectable } from '@nestjs/common'; -import { DELETE_FAILED, INSERT_FAILED, UPDATE_FAILED } from 'src/libs/exceptions/messages'; -import TeamUserDto from '../dto/team.user.dto'; -import TeamUser from '../entities/team.user.schema'; -import { UpdateTeamServiceInterface } from '../interfaces/services/update.team.service.interface'; -import { TYPES } from '../interfaces/types'; -import { TeamUserRepositoryInterface } from '../repositories/team-user.repository.interface'; - -@Injectable() -export default class UpdateTeamService implements UpdateTeamServiceInterface { - constructor( - @Inject(TYPES.repositories.TeamUserRepository) - private readonly teamUserRepository: TeamUserRepositoryInterface - ) {} - - updateTeamUser(teamData: TeamUserDto): Promise { - return this.teamUserRepository.updateTeamUser(teamData); - } - - async addAndRemoveTeamUsers(addUsers: TeamUserDto[], removeUsers: string[]) { - try { - let createdTeamUsers: TeamUser[] = []; - - if (addUsers.length > 0) createdTeamUsers = await this.addTeamUsers(addUsers); - - if (removeUsers.length > 0) await this.deleteTeamUsers(removeUsers, false); - - return createdTeamUsers; - } catch (error) { - throw new BadRequestException(UPDATE_FAILED); - } - } - - async addTeamUsers(teamUsers: TeamUserDto[]) { - const createdTeamUsers = await this.teamUserRepository.insertMany(teamUsers); - - if (createdTeamUsers.length < 1) throw new Error(INSERT_FAILED); - - return createdTeamUsers; - } - - async deleteTeamUsers(teamUsers: string[], withSession: boolean) { - const deletedCount = await this.teamUserRepository.deleteMany( - { - _id: { $in: teamUsers } - }, - withSession - ); - - if (deletedCount <= 0) throw new Error(DELETE_FAILED); - } -} diff --git a/backend/src/modules/teams/teams.module.ts b/backend/src/modules/teams/teams.module.ts index bb885f642..ab69491e5 100644 --- a/backend/src/modules/teams/teams.module.ts +++ b/backend/src/modules/teams/teams.module.ts @@ -1,48 +1,30 @@ import BoardsModule from 'src/modules/boards/boards.module'; import { Module, forwardRef } from '@nestjs/common'; -import { - mongooseTeamModule, - mongooseTeamUserModule -} from 'src/infrastructure/database/mongoose.module'; +import { mongooseTeamModule } from 'src/infrastructure/database/mongoose.module'; import TeamsController from './controller/team.controller'; import { createTeamApplication, createTeamService, deleteTeamApplication, deleteTeamService, - deleteTeamUserApplication, - deleteTeamUserService, getTeamApplication, getTeamService, - teamRepository, - teamUserRepository, - updateTeamApplication, - updateTeamService + teamRepository } from './providers'; +import TeamUsersModule from 'src/modules/teamUsers/teamusers.module'; @Module({ - imports: [mongooseTeamModule, mongooseTeamUserModule, forwardRef(() => BoardsModule)], + imports: [mongooseTeamModule, forwardRef(() => BoardsModule), TeamUsersModule], providers: [ createTeamService, createTeamApplication, getTeamService, getTeamApplication, - updateTeamService, - updateTeamApplication, deleteTeamApplication, deleteTeamService, - teamUserRepository, - teamRepository, - deleteTeamUserService, - deleteTeamUserApplication + teamRepository ], controllers: [TeamsController], - exports: [ - getTeamApplication, - getTeamService, - createTeamService, - updateTeamService, - deleteTeamUserService - ] + exports: [getTeamApplication, getTeamService, createTeamService] }) export default class TeamsModule {} diff --git a/backend/src/modules/users/applications/delete-user.use-case.ts b/backend/src/modules/users/applications/delete-user.use-case.ts index 215fbb2fb..60d8111ca 100644 --- a/backend/src/modules/users/applications/delete-user.use-case.ts +++ b/backend/src/modules/users/applications/delete-user.use-case.ts @@ -1,9 +1,9 @@ import { DeleteUserUseCaseInterface } from '../interfaces/applications/delete-user.use-case.interface'; import { Inject, Injectable } from '@nestjs/common'; import { TYPES } from '../interfaces/types'; -import * as TeamUser from 'src/modules/teams/interfaces/types'; +import { DeleteTeamUserServiceInterface } from 'src/modules/teamUsers/interfaces/services/delete.team.user.service.interface'; +import * as TeamUser from 'src/modules/teamUsers/interfaces/types'; import UserDto from '../dto/user.dto'; -import { DeleteTeamUserServiceInterface } from 'src/modules/teams/interfaces/services/delete.team.user.service.interface'; import { GetTeamServiceInterface } from 'src/modules/teams/interfaces/services/get.team.service.interface'; import { UserRepositoryInterface } from '../repository/user.repository.interface'; import { DeleteFailedException } from 'src/libs/exceptions/deleteFailedBadRequestException'; @@ -12,10 +12,10 @@ import { DeleteFailedException } from 'src/libs/exceptions/deleteFailedBadReques export class DeleteUserUseCase implements DeleteUserUseCaseInterface { constructor( @Inject(TYPES.repository) private readonly userRepository: UserRepositoryInterface, - @Inject(TeamUser.TYPES.services.GetTeamService) - private getTeamUserService: GetTeamServiceInterface, @Inject(TeamUser.TYPES.services.DeleteTeamUserService) - private teamUserService: DeleteTeamUserServiceInterface + private deleteTeamUserService: DeleteTeamUserServiceInterface, + @Inject(TeamUser.TYPES.services.GetTeamUserService) + private getTeamUserService: GetTeamServiceInterface ) {} async execute(user: UserDto, userId: string) { @@ -24,21 +24,26 @@ export class DeleteUserUseCase implements DeleteUserUseCaseInterface { } await this.userRepository.startTransaction(); + await this.deleteTeamUserService.startTransaction(); try { await this.deleteUser(userId, true); const teamsOfUser = await this.getTeamUserService.getTeamsOfUser(userId); if (teamsOfUser.length > 0) { - await this.teamUserService.delete(userId); + // here + await this.deleteTeamUserService.deleteTeamUsersOfUser(userId, false); } await this.userRepository.commitTransaction(); + await this.deleteTeamUserService.commitTransaction(); return true; } catch (e) { await this.userRepository.abortTransaction(); + await this.deleteTeamUserService.abortTransaction(); } finally { await this.userRepository.endSession(); + await this.deleteTeamUserService.endSession(); } throw new DeleteFailedException(); } diff --git a/backend/src/modules/users/applications/get-all-users-with-teams.use-case.ts b/backend/src/modules/users/applications/get-all-users-with-teams.use-case.ts index d592f1b0e..1ca91bc1c 100644 --- a/backend/src/modules/users/applications/get-all-users-with-teams.use-case.ts +++ b/backend/src/modules/users/applications/get-all-users-with-teams.use-case.ts @@ -1,9 +1,9 @@ +import { GetTeamUserServiceInterface } from 'src/modules/teamUsers/interfaces/services/get.team.user.service.interface'; import { Inject, Injectable } from '@nestjs/common'; -import { GetTeamServiceInterface } from 'src/modules/teams/interfaces/services/get.team.service.interface'; import { GetAllUsersWithTeamsUseCaseInterface } from '../interfaces/applications/get-all-users-with-teams.use-case.interface'; import { UserWithTeams } from '../interfaces/type-user-with-teams'; import { TYPES } from '../interfaces/types'; -import * as Team from 'src/modules/teams/interfaces/types'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; import { UserRepositoryInterface } from '../repository/user.repository.interface'; import { sortAlphabetically } from '../utils/sortings'; import { GetUserServiceInterface } from '../interfaces/services/get.user.service.interface'; @@ -15,8 +15,8 @@ export default class GetAllUsersWithTeamsUseCase implements GetAllUsersWithTeams private readonly userRepository: UserRepositoryInterface, @Inject(TYPES.services.GetUserService) private readonly getUserService: GetUserServiceInterface, - @Inject(Team.TYPES.services.GetTeamService) - private getTeamService: GetTeamServiceInterface + @Inject(TeamUsers.TYPES.services.GetTeamUserService) + private getTeamUserService: GetTeamUserServiceInterface ) {} async execute(page = 0, size = 15, searchUser?: string) { @@ -33,7 +33,7 @@ export default class GetAllUsersWithTeamsUseCase implements GetAllUsersWithTeams teamsNames: [] }; }); - const usersOnlyWithTeams = await this.getTeamService.getUsersOnlyWithTeams(users); + const usersOnlyWithTeams = await this.getTeamUserService.getUsersOnlyWithTeams(users); const ids = new Set(usersOnlyWithTeams.map((userWithTeams) => String(userWithTeams.user._id))); diff --git a/backend/src/modules/users/services/create.user.service.ts b/backend/src/modules/users/services/create.user.service.ts index 4c6fe31ab..3ce8a587a 100644 --- a/backend/src/modules/users/services/create.user.service.ts +++ b/backend/src/modules/users/services/create.user.service.ts @@ -1,11 +1,11 @@ import { Inject, Injectable } from '@nestjs/common'; import CreateUserDto from '../dto/create.user.dto'; import User from '../entities/user.schema'; -import { CreateUserServiceInterface } from '../interfaces/services/create.user.service.interface'; import { TYPES } from '../interfaces/types'; import { UserRepositoryInterface } from '../repository/user.repository.interface'; import CreateGuestUserDto from '../dto/create.guest.user.dto'; import faker from '@faker-js/faker'; +import { CreateUserServiceInterface } from '../interfaces/services/create.user.service.interface'; @Injectable() export default class CreateUserService implements CreateUserServiceInterface { diff --git a/backend/src/modules/users/services/get.user.service.ts b/backend/src/modules/users/services/get.user.service.ts index 5b5868c37..06cab34e4 100644 --- a/backend/src/modules/users/services/get.user.service.ts +++ b/backend/src/modules/users/services/get.user.service.ts @@ -1,5 +1,8 @@ +import { GetTeamUserServiceInterface } from '../../teamUsers/interfaces/services/get.team.user.service.interface'; import { Inject, Injectable } from '@nestjs/common'; import { compare } from 'src/libs/utils/bcrypt'; +import { GetTeamServiceInterface } from 'src/modules/teams/interfaces/services/get.team.service.interface'; +import * as TeamUsers from 'src/modules/teamUsers/interfaces/types'; import { GetUserServiceInterface } from '../interfaces/services/get.user.service.interface'; import { TYPES } from '../interfaces/types'; import { UserRepositoryInterface } from '../repository/user.repository.interface'; @@ -8,7 +11,9 @@ import { UserRepositoryInterface } from '../repository/user.repository.interface export default class GetUserService implements GetUserServiceInterface { constructor( @Inject(TYPES.repository) - private readonly userRepository: UserRepositoryInterface + private readonly userRepository: UserRepositoryInterface, + @Inject(TeamUsers.TYPES.services.GetTeamUserService) + private getTeamUserService: GetTeamUserServiceInterface ) {} getByEmail(email: string) { diff --git a/backend/src/modules/users/users.module.ts b/backend/src/modules/users/users.module.ts index 066b762ce..a176406d8 100644 --- a/backend/src/modules/users/users.module.ts +++ b/backend/src/modules/users/users.module.ts @@ -18,11 +18,13 @@ import { updateUserService, userRepository } from './users.providers'; +import TeamUsersModule from '../teamUsers/teamusers.module'; @Module({ imports: [ mongooseUserModule, TeamsModule, + TeamUsersModule, mongooseResetModule, mongooseTeamUserModule, forwardRef(() => AuthModule) diff --git a/backend/src/modules/votes/services/create.vote.service.ts b/backend/src/modules/votes/services/create.vote.service.ts index 9048252cd..e6864f46b 100644 --- a/backend/src/modules/votes/services/create.vote.service.ts +++ b/backend/src/modules/votes/services/create.vote.service.ts @@ -1,12 +1,12 @@ -import { GetBoardUserServiceInterface } from './../../boardusers/interfaces/services/get.board.user.service.interface'; +import { GetBoardUserServiceInterface } from '../../boardUsers/interfaces/services/get.board.user.service.interface'; import { BadRequestException, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common'; import { WRITE_LOCK_ERROR } from 'src/libs/constants/database'; import { BOARD_NOT_FOUND, INSERT_VOTE_FAILED, UPDATE_FAILED } from 'src/libs/exceptions/messages'; import { CreateVoteServiceInterface } from '../interfaces/services/create.vote.service.interface'; import { TYPES } from 'src/modules/votes/interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; import { VoteRepositoryInterface } from '../interfaces/repositories/vote.repository.interface'; -import { UpdateBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/update.board.user.service.interface'; +import { UpdateBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/update.board.user.service.interface'; @Injectable() export default class CreateVoteService implements CreateVoteServiceInterface { diff --git a/backend/src/modules/votes/services/delete.vote.service.ts b/backend/src/modules/votes/services/delete.vote.service.ts index 1dda6589d..b9db42e29 100644 --- a/backend/src/modules/votes/services/delete.vote.service.ts +++ b/backend/src/modules/votes/services/delete.vote.service.ts @@ -7,10 +7,10 @@ import { GetCardServiceInterface } from 'src/modules/cards/interfaces/services/g import * as Cards from 'src/modules/cards/interfaces/types'; import { DeleteVoteServiceInterface } from '../interfaces/services/delete.vote.service.interface'; import { TYPES } from '../interfaces/types'; -import * as BoardUsers from 'src/modules/boardusers/interfaces/types'; +import * as BoardUsers from 'src/modules/boardUsers/interfaces/types'; import { VoteRepositoryInterface } from '../interfaces/repositories/vote.repository.interface'; -import { UpdateBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/update.board.user.service.interface'; -import { GetBoardUserServiceInterface } from 'src/modules/boardusers/interfaces/services/get.board.user.service.interface'; +import { UpdateBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/update.board.user.service.interface'; +import { GetBoardUserServiceInterface } from 'src/modules/boardUsers/interfaces/services/get.board.user.service.interface'; @Injectable() export default class DeleteVoteService implements DeleteVoteServiceInterface { diff --git a/backend/src/modules/votes/votes.module.ts b/backend/src/modules/votes/votes.module.ts index 2845407b1..a3ecd1cf7 100644 --- a/backend/src/modules/votes/votes.module.ts +++ b/backend/src/modules/votes/votes.module.ts @@ -14,7 +14,7 @@ import { deleteVoteService, voteRepository } from './votes.providers'; -import BoardUsersModule from '../boardusers/boardusers.module'; +import BoardUsersModule from '../boardUsers/boardusers.module'; @Module({ imports: [