Skip to content

Commit

Permalink
add testing endpoints for invitation
Browse files Browse the repository at this point in the history
  • Loading branch information
Bricks666 committed Jan 28, 2024
1 parent e174bb4 commit c18ec06
Show file tree
Hide file tree
Showing 14 changed files with 222 additions and 29 deletions.
1 change: 1 addition & 0 deletions src/room-invitations/repositories/configs/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './select';
15 changes: 15 additions & 0 deletions src/room-invitations/repositories/configs/select.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Prisma } from '@prisma/client';

import { SECURITY_USER_SELECT } from '@/users';

export const invitationSelect = {
id: true,
inviter: {
select: SECURITY_USER_SELECT,
},
room: true,
user: {
select: SECURITY_USER_SELECT,
},
status: true,
} satisfies Prisma.RoomInvitationSelect;
1 change: 1 addition & 0 deletions src/room-invitations/repositories/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './room-invitations';
export * from './configs';
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { Injectable } from '@nestjs/common';
import { Prisma } from '@prisma/client';
import { DatabaseService } from '@/database/database.service';
import { SECURITY_USER_SELECT } from '@/users/repositories';
import { RoomInvitationDto } from '../../dto';
import { invitationSelect } from '../configs';
import {
AnswerRoomInvitationParams,
CreateRoomInvitationParams,
Expand All @@ -13,18 +12,6 @@ import {
RemoveRoomInvitationParams
} from './types';

const select = {
id: true,
inviter: {
select: SECURITY_USER_SELECT,
},
room: true,
user: {
select: SECURITY_USER_SELECT,
},
status: true,
} satisfies Prisma.RoomInvitationSelect;

@Injectable()
export class RoomInvitationsRepository {
constructor(private readonly databaseService: DatabaseService) {}
Expand All @@ -42,7 +29,7 @@ export class RoomInvitationsRepository {
isNot: null,
},
},
select,
select: invitationSelect,
});
}

Expand All @@ -55,7 +42,7 @@ export class RoomInvitationsRepository {
where: {
id,
},
select,
select: invitationSelect,
});
}

Expand All @@ -70,7 +57,7 @@ export class RoomInvitationsRepository {
userId,
status: 'sended',
},
select,
select: invitationSelect,
});
}

Expand All @@ -85,7 +72,7 @@ export class RoomInvitationsRepository {
roomId,
status: 'sended',
},
select,
select: invitationSelect,
})
.then((value) => value ?? null);
}
Expand All @@ -99,7 +86,7 @@ export class RoomInvitationsRepository {
userId,
inviterId,
},
select,
select: invitationSelect,
});
}

Expand Down
7 changes: 7 additions & 0 deletions src/testing/configs/defaults.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
TestingInvitationDto,
TestingMemberDto,
TestingRoomDto,
TestingTagDto,
Expand Down Expand Up @@ -38,3 +39,9 @@ export const DEFAULT_TASK: TestingTaskDto = {
createdAt: new Date('2022-07-07'),
updatedAt: new Date('2022-07-10'),
};

export const DEFAULT_INVITATION: TestingInvitationDto = {
inviter: DEFAULT_USER,
room: DEFAULT_ROOM,
status: 'sended',
};
2 changes: 1 addition & 1 deletion src/testing/dto/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export * from './invitation.dto';
export * from './testing-invitation.dto';
export * from './testing-member.dto';
export * from './testing-room.dto';
export * from './testing-tag.dto';
Expand Down
4 changes: 0 additions & 4 deletions src/testing/dto/invitation.dto.ts

This file was deleted.

52 changes: 52 additions & 0 deletions src/testing/dto/testing-invitation.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsEnum, IsNumber, IsObject, IsOptional } from 'class-validator';
import { RoomInvitationStatus } from '@prisma/client';
import { TestingRoomDto } from './testing-room.dto';
import { TestingUserDto } from './testing-user.dto';

export class TestingInvitationDto {
@ApiProperty({
description: 'Invitation id',
type: Number,
required: false,
})
@IsNumber()
@IsOptional()
declare id?: number;

@ApiProperty({
description: 'What room user was invited in',
type: TestingRoomDto,
required: false,
})
@IsObject()
@IsOptional()
declare room?: TestingRoomDto;

@ApiProperty({
description: 'Who invite user into room',
type: TestingUserDto,
required: false,
})
@IsObject()
@IsOptional()
declare inviter?: TestingUserDto;

@ApiProperty({
description: 'Who was invited into room',
type: TestingUserDto,
required: false,
})
@IsObject()
@IsOptional()
declare user?: TestingUserDto;

@ApiProperty({
description: 'In which status invitation now',
enum: RoomInvitationStatus,
required: false,
})
@IsEnum(RoomInvitationStatus)
@IsOptional()
declare status?: RoomInvitationStatus;
}
23 changes: 23 additions & 0 deletions src/testing/lib/convertTestingInvitationDtoToInvitationData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { Prisma } from '@prisma/client';
import { TestingInvitationDto } from '../dto';
import { DEFAULT_INVITATION } from '../configs';

export const convertTestingInvitationDtoToInvitationData = (
data: TestingInvitationDto
): Prisma.RoomInvitationUncheckedCreateInput => {
const {
id,
user,
status = DEFAULT_INVITATION.status,
inviter = DEFAULT_INVITATION.inviter,
room = DEFAULT_INVITATION.room,
} = data;

return {
id,
status,
userId: user?.id,
inviterId: inviter.id,
roomId: room.id,
};
};
16 changes: 16 additions & 0 deletions src/testing/lib/convertTestingInvitationDtoToInvitationFilter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Prisma } from '@prisma/client';
import { TestingInvitationDto } from '../dto';

export const convertTestingInvitationDtoToInvitationFilter = (
data: TestingInvitationDto
): Prisma.RoomInvitationWhereInput => {
const { id, user, status, inviter, room, } = data;

return {
id,
status,
userId: user?.id,
inviterId: inviter.id,
roomId: room.id,
};
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Prisma } from '@prisma/client';
import { TestingInvitationDto } from '../dto';

export const convertTestingInvitationDtoToInvitationUniqueFilter = (
data: TestingInvitationDto
): Prisma.RoomInvitationWhereUniqueInput => {
const { id, } = data;

return {
id,
};
};
4 changes: 4 additions & 0 deletions src/testing/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,7 @@ export * from './convertTestingTagDtoToTagData';
export * from './convertTestingTaskDtoToTaskFilter';
export * from './convertTestingTaskDtoToTaskUniqueFilter';
export * from './convertTestingTaskDtoToTaskData';

export * from './convertTestingInvitationDtoToInvitationFilter';
export * from './convertTestingInvitationDtoToInvitationUniqueFilter';
export * from './convertTestingInvitationDtoToInvitationData';
35 changes: 33 additions & 2 deletions src/testing/testing.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -264,12 +264,43 @@ export class TestingController {
})
@HttpCode(HttpStatus.OK)
@Put('/member')
removeMember(@Body() params: TestingMemberDto): Promise<MemberDto> {
return this.testingService.member(params);
removeMember(@Body() params: TestingMemberDto): Promise<boolean> {
return this.testingService.removeMember(params);
}

@ApiOperation({
summary: 'Remove members via params',
})
@ApiBody({
type: TestingInvitationDto,
description: 'Filter to remove',
required: false,
})
@ApiOkResponse({
type: RoomInvitationDto,
description: 'There was any member removed',
})
@HttpCode(HttpStatus.OK)
@Post('/invitation')
invitation(@Body() params: TestingInvitationDto): Promise<RoomInvitationDto> {
return this.testingService.invitation(params);
}

@ApiOperation({
summary: 'Remove invitations via params',
})
@ApiBody({
type: TestingInvitationDto,
description: 'Filter to remove',
required: false,
})
@ApiOkResponse({
type: Boolean,
description: 'There was any invitation removed',
})
@HttpCode(HttpStatus.OK)
@Put('/invitation')
removeInvitation(@Body() params: TestingInvitationDto): Promise<boolean> {
return this.testingService.removeInvitation(params);
}
}
54 changes: 51 additions & 3 deletions src/testing/testing.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { UserDto } from '@/users';
import { AuthenticationResultDto, TokensDto } from '@/auth';
import { TokensService } from '@/tokens/tokens.service';
import { taskSelect } from '@/tasks/repositories';
import { invitationSelect } from '@/room-invitations/repositories';
import {
TestingUserDto,
TestingRoomDto,
Expand All @@ -36,7 +37,10 @@ import {
convertTestingTagDtoToTagFilter,
convertTestingTaskDtoToTaskUniqueFilter,
convertTestingTaskDtoToTaskData,
convertTestingTaskDtoToTaskFilter
convertTestingTaskDtoToTaskFilter,
convertTestingInvitationDtoToInvitationUniqueFilter,
convertTestingInvitationDtoToInvitationData,
convertTestingInvitationDtoToInvitationFilter
} from './lib';

@Injectable()
Expand Down Expand Up @@ -260,8 +264,52 @@ export class TestingService {
.then(({ count, }) => !!count);
}

invitation(params: TestingInvitationDto = {}): Promise<RoomInvitationDto> {
return params as any;
async invitation(
params: TestingInvitationDto = {}
): Promise<RoomInvitationDto> {
const inviter = await this.user(params.inviter);
const user = await this.user(params.user);
const room = await this.room(params.room);

const where = convertTestingInvitationDtoToInvitationUniqueFilter({
...params,
inviter,
user,
room,
});
const data = convertTestingInvitationDtoToInvitationData({
...params,
inviter,
user,
room,
});

const existing = await this.databaseService.roomInvitation.findFirst({
where,
});

if (existing) {
return this.databaseService.roomInvitation.update({
where: convertTestingInvitationDtoToInvitationUniqueFilter(existing),
data,
select: invitationSelect,
});
}

return this.databaseService.roomInvitation.create({
data,
select: invitationSelect,
});
}

removeInvitation(params: TestingInvitationDto = {}): Promise<boolean> {
const where = convertTestingInvitationDtoToInvitationFilter(params);

return this.databaseService.roomInvitation
.deleteMany({
where,
})
.then(({ count, }) => !!count);
}

async #generateTokens(user: UserDto): Promise<TokensDto> {
Expand Down

0 comments on commit c18ec06

Please sign in to comment.