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

Features/testing routes #21

Merged
merged 14 commits into from
Jan 28, 2024
4,486 changes: 0 additions & 4,486 deletions pnpm-lock.yaml

This file was deleted.

59 changes: 34 additions & 25 deletions src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,33 +17,42 @@ import { MailModule } from '@/mail/mail.module';
import { TokensModule } from '@/tokens/tokens.module';
import { MembersModule } from '@/members/members.module';
import { InvitationsModule } from '@/room-invitations/invitations.module';
import { __TESTING__ } from '@/shared';
import { TestingModule } from '@/testing/testing.module';

const modules = [
CacheModule.register<RedisClientOptions>({
store: redisStore as unknown as CacheStore,
isGlobal: true,
max: 50,
ttl: 10,
url: process.env.REDIS_URL,
}),
ConfigModule.forRoot({
envFilePath: '.env',
}),
DatabaseModule.forRoot({}),
AuthModule,
UsersModule,
RoomsModule,
TasksModule,
ActivitiesModule,
MembersModule,
ProgressModule,
CommentsModule,
MailModule,
TagsModule,
TokensModule,
InvitationsModule,
TestingModule
];

if (__TESTING__) {
modules.push(TestingModule);
}

@Module({
imports: [
CacheModule.register<RedisClientOptions>({
store: redisStore as unknown as CacheStore,
isGlobal: true,
max: 50,
ttl: 10,
url: process.env.REDIS_URL,
}),
ConfigModule.forRoot({
envFilePath: '.env',
}),
DatabaseModule.forRoot({}),
AuthModule,
UsersModule,
RoomsModule,
TasksModule,
ActivitiesModule,
MembersModule,
ProgressModule,
CommentsModule,
MailModule,
TagsModule,
TokensModule,
InvitationsModule
],
imports: modules,
providers: [
{
provide: APP_GUARD,
Expand Down
8 changes: 4 additions & 4 deletions src/auth/lib/auth/auth.guard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ export class AuthGuard implements CanActivate {
) {}

async canActivate(context: ExecutionContext) {
const noCheck = this.reflector.get(
DISABLE_AUTH_CHECK_FLAG,
context.getHandler()
);
const noCheck = this.reflector.getAllAndOverride(DISABLE_AUTH_CHECK_FLAG, [
context.getHandler(),
context.getClass()
]);

const req: Request = context.switchToHttp().getRequest();

Expand Down
6 changes: 4 additions & 2 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { NestFactory } from '@nestjs/core';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import * as cookieParser from 'cookie-parser';
import { AppModule } from '@/app.module';
import { StandardResponseInterceptor } from '@/shared';
import { StandardResponseInterceptor, __PROD__ } from '@/shared';
import { ORIGIN } from '@/const';
import { DatabaseService } from '@/database';

Expand All @@ -32,13 +32,15 @@ async function bootstrap() {
app.useGlobalInterceptors(new StandardResponseInterceptor());
app.setGlobalPrefix('api');

const server = __PROD__ ? 'https://abctasks.ru' : `http://localhost:${PORT}`;

const config = new DocumentBuilder()
.setTitle('Документация по API сервера "Task manager"')
.setDescription('Документация по API приложения дел')
.setVersion('1.0.0')
.addCookieAuth(process.env.COOKIE_NAME)
.addBearerAuth()
.addServer(`http://localhost:${PORT}`)
.addServer(server)
.build();

const document = SwaggerModule.createDocument(app, config);
Expand Down
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
4 changes: 4 additions & 0 deletions src/shared/configs/env.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/* eslint-disable no-underscore-dangle */
export const __TESTING__ = !!process.env.TESTING;
export const __DEV__ = process.env.NODE_ENV === 'development';
export const __PROD__ = process.env.NODE_ENV === 'production';
1 change: 1 addition & 0 deletions src/shared/configs/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './env';
1 change: 1 addition & 0 deletions src/shared/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './lib';
export * from './dto';
export * from './types';
export * from './configs';
8 changes: 3 additions & 5 deletions src/tasks/dto/task.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,12 @@ export class TaskDto implements Omit<TaskModel, 'tagIds' | 'authorId'> {
})
declare tags: TagDto[];

declare authorId: number;

@ApiProperty({
type: SecurityUserDto,
description: 'Автор',
})
@IsObject()
declare author: number;
declare author: SecurityUserDto;

@ApiProperty({
type: String,
Expand Down Expand Up @@ -84,15 +82,15 @@ export class TaskDto implements Omit<TaskModel, 'tagIds' | 'authorId'> {
@ApiProperty({
type: String,
description: 'Дата создания задачи',
example: '2022-07-07',
example: new Date('2022-07-07'),
})
@IsISO8601()
declare createdAt: Date;

@ApiProperty({
type: String,
description: 'Дата обновления',
example: '2022-07-07',
example: new Date('2022-07-07'),
})
@IsISO8601()
declare updatedAt: Date;
Expand Down
1 change: 1 addition & 0 deletions src/tasks/repositories/configs/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './select';
23 changes: 23 additions & 0 deletions src/tasks/repositories/configs/select.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { Prisma } from '@prisma/client';

import { SECURITY_USER_SELECT } from '@/users';

export const taskSelect = {
id: true,
roomId: true,
title: true,
description: true,
status: true,
tags: {
select: {
tag: true,
},
},
author: {
select: {
user: { select: SECURITY_USER_SELECT, },
},
},
updatedAt: true,
createdAt: true,
} satisfies Prisma.TaskSelect;
2 changes: 2 additions & 0 deletions src/tasks/repositories/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
export * from './task';
export * from './lib';
export * from './configs';
13 changes: 13 additions & 0 deletions src/tasks/repositories/lib/convertTaskRecordToTaskDto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { TaskDto } from '@/tasks/dto';
import { TagDto } from '@/tags/dto';
import { TaskRecord } from '../task/types';

export const convertTaskRecordToTaskDto = (record: TaskRecord): TaskDto => {
const { tags, author, ...rest } = record;

return {
...rest,
author: author.user,
tags: tags.map((tags) => tags.tag) as TagDto[],
};
};
1 change: 1 addition & 0 deletions src/tasks/repositories/lib/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './convertTaskRecordToTaskDto';
19 changes: 5 additions & 14 deletions src/tasks/repositories/task/task.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Prisma } from '@prisma/client';
import { DatabaseService } from '@/database/database.service';
import { SECURITY_USER_SELECT } from '@/users/repositories';
import { TaskDto } from '../../dto';
import { convertTaskRecordToTaskDto } from '../lib';
import {
CreateParams,
GetAllParams,
Expand Down Expand Up @@ -57,7 +58,7 @@ export class TaskRepository {
select,
});

return tasks.map(TaskRepository.map);
return tasks.map(convertTaskRecordToTaskDto);
}

async getOne(params: GetOneParams): Promise<TaskDto | null> {
Expand All @@ -68,7 +69,7 @@ export class TaskRepository {
select,
});

return task ? TaskRepository.map(task) : null;
return task ? convertTaskRecordToTaskDto(task) : null;
}

async create(params: CreateParams): Promise<TaskDto> {
Expand All @@ -85,7 +86,7 @@ export class TaskRepository {
select,
});

return task ? TaskRepository.map(task) : null;
return task ? convertTaskRecordToTaskDto(task) : null;
}

async update(params: UpdateParams): Promise<TaskDto> {
Expand All @@ -110,7 +111,7 @@ export class TaskRepository {
select,
});

return task ? TaskRepository.map(task) : null;
return task ? convertTaskRecordToTaskDto(task) : null;
}

async remove(params: RemoveParams): Promise<void> {
Expand All @@ -135,14 +136,4 @@ export class TaskRepository {
},
});
}

private static map(task: any): TaskDto {
const { tags, author, ...rest } = task;

return {
...rest,
author: author.user,
tags: tags.map((tags) => tags.tag),
};
}
}
4 changes: 4 additions & 0 deletions src/tasks/repositories/task/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { Prisma } from '@prisma/client';
import { CreateTaskDto, GetTasksDto, UpdateTaskDto } from '../../dto';
import { taskSelect } from '../configs';

export type TaskRecord = Prisma.TaskGetPayload<{ select: typeof taskSelect }>;

export interface GetAllParams extends GetTasksDto {
readonly roomId: number;
Expand Down
Loading