Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: create board and board user repository #1178

Merged
merged 21 commits into from
Mar 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
c4ebfb6
feat: start of board user repository
CatiaAntunes96 Feb 28, 2023
6eb9251
feat: add get mainboard functions to repository
CatiaAntunes96 Feb 28, 2023
ebdfa87
feat: add getBoard queries to board repository
CatiaAntunes96 Mar 1, 2023
091c7b4
feat: add delete queries to board repository
CatiaAntunes96 Mar 1, 2023
1b2fb0a
fix: fix tests
CatiaAntunes96 Mar 2, 2023
edd62e0
feat: add delete queries to board repositories
CatiaAntunes96 Mar 2, 2023
a04a39e
feat: add update queries to board repositories
CatiaAntunes96 Mar 2, 2023
5a496c2
feat: add update queries to board repositories
CatiaAntunes96 Mar 2, 2023
044aaa7
feat: add create board queries to board repository
CatiaAntunes96 Mar 2, 2023
4fdc2c0
fix: add generic to create method of baseMongo
CatiaAntunes96 Mar 3, 2023
22b6be9
Merge branch 'main' into refactor/create-repository-fix
CatiaAntunes96 Mar 3, 2023
c912093
feat: added socket when creating board user
patricia-mdias Mar 3, 2023
33e64a8
fix: remove unused imports
CatiaAntunes96 Mar 3, 2023
f6500cd
fix: added imports to tests
patricia-mdias Mar 3, 2023
b0ca4b7
fix: esslint error
patricia-mdias Mar 3, 2023
cf958f7
Merge branch 'main' into refactor/create-repository-fix
patricia-mdias Mar 3, 2023
4eb4254
fix: sAdmin access to board when he is a boarduser
patricia-mdias Mar 3, 2023
89e8635
fix: access get board service instead of boards repositories on guard
CatiaAntunes96 Mar 3, 2023
b463493
fix: applied pr suggestions
patricia-mdias Mar 6, 2023
6b3600b
fix: selectDividedBoards is defined locally
patricia-mdias Mar 6, 2023
2a614e8
Merge branch 'main' into refactor/create-repository-fix
CatiaAntunes96 Mar 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions backend/src/libs/guards/getBoardPermissions.guard.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { GetBoardServiceInterface } from 'src/modules/boards/interfaces/services/get.board.service.interface';
import {
CanActivate,
ExecutionContext,
Expand All @@ -11,6 +10,7 @@ import TeamUser from 'src/modules/teams/entities/team.user.schema';
import Team from 'src/modules/teams/entities/teams.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';

@Injectable()
export class GetBoardGuard implements CanActivate {
Expand All @@ -31,16 +31,16 @@ export class GetBoardGuard implements CanActivate {
const { isPublic, team } = await this.getBoardService.getBoardData(boardId);
const boardUserFound = await this.getBoardService.getBoardUsers(boardId, userId);

if (isPublic || boardUserFound.length) {
if (isPublic || boardUserFound.length || isSAdmin) {
return true;
}

if (!boardUserFound) {
if (!boardUserFound.length) {
const { role: teamRole } = (team as Team).users.find(
(teamUser: TeamUser) => (teamUser.user as User)._id.toString() === userId.toString()
);

return !isAnonymous && (isSAdmin || permissions.includes(teamRole));
return !isAnonymous && permissions.includes(teamRole);
}
} catch (error) {
throw new ForbiddenException();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import { FilterQuery, PopulateOptions, QueryOptions, SortOrder, UpdateQuery } from 'mongoose';
import {
FilterQuery,
PopulateOptions,
ProjectionType,
QueryOptions,
SortOrder,
UpdateQuery
} from 'mongoose';
import { ModelProps, SelectedValues } from '../types';

export type PopulateType = PopulateOptions | (PopulateOptions | string)[];
Expand All @@ -12,13 +19,20 @@ export interface BaseInterfaceRepository<T> {

findAllWithQuery(
query: any,
projection?: ProjectionType<T>,
selectedValues?: SelectedValues<T>,
populate?: PopulateType
): Promise<T[]>;

findOneByField(fields: ModelProps<T>): Promise<T>;

create(item: T): Promise<T>;
findOneByFieldWithQuery(
value: FilterQuery<T>,
selectedValues?: SelectedValues<T>,
populate?: PopulateType
): Promise<T>;

create<Q>(item: Q): Promise<T>;

insertMany(listOfItems: T[]): Promise<T[]>;

Expand All @@ -28,6 +42,8 @@ export interface BaseInterfaceRepository<T> {

countDocuments(): Promise<number>;

countDocumentsWithQuery(filter: FilterQuery<T>, options?: QueryOptions<T>): Promise<number>;

findOneByFieldAndUpdate(
value: FilterQuery<T>,
query: UpdateQuery<T>,
Expand Down
38 changes: 32 additions & 6 deletions backend/src/libs/repositories/mongo/mongo-generic.repository.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import { ClientSession, FilterQuery, Model, QueryOptions, UpdateQuery } from 'mongoose';
import {
ClientSession,
FilterQuery,
Model,
ProjectionType,
QueryOptions,
UpdateQuery
} from 'mongoose';
import {
BaseInterfaceRepository,
PopulateType,
Expand All @@ -18,6 +25,10 @@ export class MongoGenericRepository<T> implements BaseInterfaceRepository<T> {
return this._repository.countDocuments().lean().exec();
}

countDocumentsWithQuery(filter: FilterQuery<T>, options?: QueryOptions<T>): Promise<number> {
return this._repository.countDocuments(filter, options).lean().exec();
}

findAll(
selectedValues?: SelectedValues<T>,
sort?: SortType,
Expand All @@ -31,31 +42,46 @@ export class MongoGenericRepository<T> implements BaseInterfaceRepository<T> {
.findById(id)
.select(selectedValues)
.populate(populate)
.lean({ virtuals: true })
.exec() as Promise<T>;
}

findOneByField(value: ModelProps<T>): Promise<T> {
return this._repository.findOne(value).exec();
}

findOneByFieldWithQuery(
value: FilterQuery<T>,
selectedValues?: SelectedValues<T>,
populate?: PopulateType
): Promise<T> {
return this._repository
.findOne(value)
.select(selectedValues)
.populate(populate)
.exec() as Promise<T>;
}

findAllWithQuery(
query: FilterQuery<T>,
projection?: ProjectionType<T>,
selectedValues?: SelectedValues<T>,
populate?: PopulateType
populate?: PopulateType,
virtuals = true
): Promise<T[]> {
return this._repository
.find(query)
.find(query, projection)
.select(selectedValues)
.populate(populate)
.lean({ virtuals: true })
.lean({ virtuals: virtuals })
.exec() as unknown as Promise<T[]>;
}

create(item: T): Promise<T> {
create<Q>(item: Q): Promise<T> {
return this._repository.create(item);
}

insertMany(listOfItems: T[]): Promise<T[]> {
insertMany<Q>(listOfItems: Q[]): Promise<T[]> {
return this._repository.insertMany(listOfItems);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ const mockBoardData = (countColumns = 2, countCards = 1, params?: Partial<Board>
addCards: faker.datatype.boolean(),
responsibles: ['1'],
createdBy: userId,
addcards: faker.datatype.boolean(),
postAnonymously: faker.datatype.boolean(),
...params
};
};
Expand Down
2 changes: 1 addition & 1 deletion backend/src/libs/utils/generateBoardData.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import BoardDto from 'src/modules/boards/dto/board.dto';
import BoardUserDto from 'src/modules/boards/dto/board.user.dto';
import { CreateBoardDto } from 'src/modules/boards/services/create.board.service';
import { CreateBoardDto } from 'src/modules/boards/dto/createBoard.dto';

export const generateSubBoardDtoData = (index: number, users: BoardUserDto[] = []): BoardDto => {
return {
Expand Down
3 changes: 2 additions & 1 deletion backend/src/modules/auth/controller/auth.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createBoardUserService } from './../../boards/boards.providers';
import { boardUserRepository, createBoardUserService } from './../../boards/boards.providers';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { INestApplication, ValidationPipe } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
Expand Down Expand Up @@ -91,6 +91,7 @@ describe('AuthController', () => {
SocketGateway,
SchedulerRegistry,
ConfigService,
boardUserRepository,
{
provide: CommunicationsType.TYPES.services.SlackCommunicationService,
useValue: {
Expand Down
55 changes: 2 additions & 53 deletions backend/src/modules/auth/services/register.auth.service.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,21 @@
import { CreateBoardService } from './../../boards/interfaces/services/create.board.service.interface';
import { UserRepositoryInterface } from './../../users/repository/user.repository.interface';
import { GetTokenAuthService } from 'src/modules/auth/interfaces/services/get-token.auth.service.interface';
import { BOARD_USER_NOT_FOUND, INSERT_FAILED } from 'src/libs/exceptions/messages';
import { INSERT_FAILED } from 'src/libs/exceptions/messages';
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
import { encrypt } from 'src/libs/utils/bcrypt';
import CreateUserDto from 'src/modules/users/dto/create.user.dto';
import { CreateUserService } from 'src/modules/users/interfaces/services/create.user.service.interface';
import { TYPES } from 'src/modules/users/interfaces/types';
import * as AUTH_TYPES from 'src/modules/auth/interfaces/types';
import * as USER_TYPES from 'src/modules/users/interfaces/types';
import * as BOARD_TYPES from 'src/modules/boards/interfaces/types';
import { RegisterAuthService } from '../interfaces/services/register.auth.service.interface';
import CreateGuestUserDto from 'src/modules/users/dto/create.guest.user.dto';
import { InjectModel } from '@nestjs/mongoose';
import BoardUser, { BoardUserDocument } from 'src/modules/boards/entities/board.user.schema';
import { Model } from 'mongoose';
import SocketGateway from 'src/modules/socket/gateway/socket.gateway';
import BoardGuestUserDto from 'src/modules/boards/dto/board.guest.user.dto';
import User from 'src/modules/users/entities/user.schema';

@Injectable()
export default class RegisterAuthServiceImpl implements RegisterAuthService {
constructor(
@Inject(TYPES.services.CreateUserService)
private createUserService: CreateUserService,
@InjectModel(BoardUser.name)
private boardUserModel: Model<BoardUserDocument>,
private socketService: SocketGateway,
@Inject(AUTH_TYPES.TYPES.services.GetTokenAuthService)
private getTokenAuthService: GetTokenAuthService,
@Inject(USER_TYPES.TYPES.repository)
private userRepository: UserRepositoryInterface,
@Inject(BOARD_TYPES.TYPES.services.CreateBoardService)
private createBoardService: CreateBoardService
private getTokenAuthService: GetTokenAuthService
) {}

public async register(registrationData: CreateUserDto) {
Expand All @@ -44,40 +27,6 @@ export default class RegisterAuthServiceImpl implements RegisterAuthService {
});
}

private async getGuestBoardUser(board: string, user: string): Promise<BoardGuestUserDto> {
const userFound = await this.boardUserModel
.findOne({ board, user })
.populate({
path: 'user',
select: '_id firstName lastName '
})
.exec();

if (!userFound) {
throw new BadRequestException(BOARD_USER_NOT_FOUND);
}

const { _id, firstName, lastName, isAnonymous } = userFound.user as User;

return {
role: userFound.role,
board: String(userFound.board),
votesCount: userFound.votesCount,
user: {
_id: String(_id),
firstName,
lastName,
isAnonymous
}
};
}

private async sendGuestBoardUser(board: string, user: string) {
const boardUser = await this.getGuestBoardUser(board, user);

this.socketService.sendUpdateBoardUsers(boardUser);
}

public async createGuest(guestUserData: CreateGuestUserDto) {
const guestUserCreated = await this.createUserService.createGuest(guestUserData);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import BoardDto from '../dto/board.dto';
import { CreateBoardApplicationInterface } from '../interfaces/applications/create.board.application.interface';
import { CreateBoardService } from '../interfaces/services/create.board.service.interface';
import { TYPES } from '../interfaces/types';
import { BoardDocument } from '../entities/board.schema';
import Board from '../entities/board.schema';

@Injectable()
export class CreateBoardApplication implements CreateBoardApplicationInterface {
Expand All @@ -12,7 +12,7 @@ export class CreateBoardApplication implements CreateBoardApplicationInterface {
private createBoardService: CreateBoardService
) {}

create(board: BoardDto, userId: string): Promise<BoardDocument> {
create(board: BoardDto, userId: string): Promise<Board> {
return this.createBoardService.create(board, userId);
}
}
2 changes: 2 additions & 0 deletions backend/src/modules/boards/boards.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
afterUserUpdatedDurationSubscriber,
boardRepository,
boardTimerRepository,
boardUserRepository,
createBoardApplication,
createBoardService,
createBoardUserService,
Expand Down Expand Up @@ -74,6 +75,7 @@ import { JwtRegister } from 'src/infrastructure/config/jwt.register';
afterUserUpdatedDurationSubscriber,
afterUserRequestedTimerStateSubscriber,
boardRepository,
boardUserRepository,
userRepository
],
controllers: [BoardsController],
Expand Down
6 changes: 6 additions & 0 deletions backend/src/modules/boards/boards.providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { DeleteBoardApplication } from './applications/delete.board.application'
import { GetBoardApplication } from './applications/get.board.application';
import { UpdateBoardApplication } from './applications/update.board.application';
import { TYPES } from './interfaces/types';
import { BoardUserRepository } from './repositories/board-user.repository';
import { BoardRepository } from './repositories/board.repository';
import CreateBoardServiceImpl from './services/create.board.service';
import DeleteBoardServiceImpl from './services/delete.board.service';
Expand Down Expand Up @@ -131,3 +132,8 @@ export const boardRepository = {
provide: TYPES.repositories.BoardRepository,
useClass: BoardRepository
};

export const boardUserRepository = {
provide: TYPES.repositories.BoardUserRepository,
useClass: BoardUserRepository
};
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { SchedulerRegistry } from '@nestjs/schedule';
import { Test } from '@nestjs/testing';
import {
boardRepository,
boardUserRepository,
createBoardApplication,
createBoardService,
deleteBoardApplication,
Expand Down Expand Up @@ -62,6 +63,7 @@ describe('BoardsController', () => {
createSchedulesService,
deleteSchedulesService,
teamRepository,
boardUserRepository,
teamUserRepository,
updateTeamService,
getCardService,
Expand Down
8 changes: 6 additions & 2 deletions backend/src/modules/boards/dto/board.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ export default class BoardDto {
@Transform(({ value }: TransformFnParams) => value.trim())
title!: string;

@ApiPropertyOptional({ type: String })
@IsOptional()
@IsString()
createdBy?: string;

@ApiProperty({ type: ColumnDto, isArray: true })
@ArrayNotEmpty()
@ArrayMinSize(1)
Expand All @@ -44,7 +49,6 @@ export default class BoardDto {
isPublic!: boolean;

@ApiPropertyOptional({ type: String })
@IsNotEmpty()
@IsNumber()
@IsOptional()
maxVotes?: number | null;
Expand Down Expand Up @@ -75,7 +79,7 @@ export default class BoardDto {
@ValidateNested({ each: true })
@Type(() => BoardDto)
@IsOptional()
dividedBoards!: BoardDto[];
dividedBoards!: BoardDto[] | string[];

@ApiPropertyOptional({ type: String })
@IsOptional()
Expand Down
3 changes: 1 addition & 2 deletions backend/src/modules/boards/dto/board.user.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,8 @@ export default class BoardUserDto {
board?: string;

@ApiPropertyOptional({ default: 0 })
@IsOptional()
@IsNumber()
votesCount?: number;
votesCount: number;

@ApiPropertyOptional()
@IsOptional()
Expand Down
10 changes: 10 additions & 0 deletions backend/src/modules/boards/dto/createBoard.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import BoardDto from 'src/modules/boards/dto/board.dto';
import BoardUserDto from 'src/modules/boards/dto/board.user.dto';
import { TeamDto } from '../../communication/dto/team.dto';

export interface CreateBoardDto {
maxUsers: number;
board: BoardDto;
team: TeamDto | null;
users: BoardUserDto[];
}
Loading