Coder Social home page Coder Social logo

averito / averlist Goto Github PK

View Code? Open in Web Editor NEW
15.0 1.0 2.0 12.68 MB

This site need for watching a anime and management your anime list.

Home Page: https://averlist.ru

TypeScript 84.38% SCSS 12.82% Shell 0.03% JavaScript 0.83% CSS 1.94%
typescript anime react anilibria-api fullstack fullstack-javascript nestjs passport-jwt postgresql nextjs

averlist's Introduction

Averlist

Данный сайт позволяет смотреть аниме и управлять своим аниме-листом. Также позволяет добавлять аниме которых нет на сайте (Ограничено базой данных Anilibria).

Как начать?

Установите зависимости командой:

npm install

Затем:

npm run install:project

Затем вам потребуется заполнить .env.local в client и .env в server.

После этого можно запускать командой:

npm run dev

Данная команда запустит отдельно frontend:

npm run client:dev

Данная команда запустит отдельно backend:

npm run server:dev

averlist's People

Contributors

averito avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

averlist's Issues

Code review

Код Ревью

Общее

  1. Папки по конвенции nest именуются с маленькой буквы.
    image
  2. Обычно DTO кладут внутрь модуля, т.е. к примеру, а не делают для этого shared папку в корне src:
.
└── src/
    ├── invitations/
    │   ├── dto/
    │   │   ├── create-invitation.dto.ts
    │   │   └── update-invitation.dto.ts
    │   ├── invitations.module.ts
    │   ├── invitations.service.ts
    │   └── invitations.controller.ts
    └── ...
  1. В Nest, если имя файла состоит из более чем одного слова, то они разделяются дефисом, а не camelCase. Например, create-news-body.dto.ts
    image

  2. Не нужно писать public перед методами, это bad practice во многих конвенциях по TS.

Основные моменты

  1. Мощь DTO используется лишь на 10%. В твоём коде DTO — всего лишь тип данных для автокомплита и сваггера. Главная фишка нестовских DTO — это ультрадекларативная валидация входящих параметров при помощи class-validator и их трансформация при помощи class-transformer.

Для начало надо их установить: yarn add class-transformer@latest class-validator@latest.

Затем глобально зарегистрировать ValidationPipe (чтобы не писать везде @UsePipes()):

/* main.ts */

...

app.useGlobalPipes(
    new ValidationPipe({
        transform: true, // Стараться приводить всё к указанным типам данным
        whitelist: true, // Поля, которых нет в DTO будут удалены
        forbidNonWhitelisted: true, // Клиенту будет запрещено отправлять поля, которых нет в DTO
        always: true, // Проверка независимо от группы (почитай документацию class-validator)
        forbidUnknownValues: true // Название говорит само за себя
    })
);

Теперь возьмём какой-нибудь DTO, например create-collection-body.dto, и навесим на него декораторы валидации:

/* create-collection-body.dto.ts */

import { ApiProperty } from '@nestjs/swagger'
import { CollectionType } from '@enums/collectionType.enum'
import { IsString, IsEnum, IsNotEmpty } from 'class-validator'

export class CreateCollectionBodyDto {
    @ApiProperty({ name: 'name' })
    @IsNotEmpty()
    @IsString()
    name: string

    @ApiProperty({ name: 'type', enum: CollectionType })
    @IsEnum(CollectionType)
    type: CollectionType

    @ApiProperty({ name: 'anime_list', default: 'id,id,id,id' })
    @IsString()
    anime_list: string
}

Далее, необходимо поменять edit-collection-body.dto. Во-первых, все edit меняй на update, во-вторых, нет смысла дублировать все эти поля, когда ты используешь данный подход.

import { PartialType, OmitType } from '@nestjs/swagger' // если не используешь swagger, импортируй из @nestjs/common
import { CollectionType } from '@enums/collectionType.enum'

export class UpdateCollectionBodyDto extends PartialType(
  OmitType(CreateCollectionBodyDto, ['anime_list'] as const),
) {}

Если бы тебе просто нужно было сделать DTO с идентичными полями, но при этом сделать их необязательными, то тогда тебе нужно было бы просто наследоваться от PartialType(), но так как в этом DTO отсутствует поле anime_list, то нужен ещё один mapped typeOmitType().

Теперь тебе остаётся только попробовать отправить какие-либо некорректные данные и ты сам всё увидишь.

  1. Пагинацию можно также сделать при помощи DTO. Сделай pagination.dto, определи там поля limit иpage с типом number, добавь нужную валидацию и используй его как ты обычно используешь DTO. Таким образом ты ещё и избавляешься от нужды приводить это к типу number, так как этим занимается class-transformer и опция transform: true, которую мы включили ранее.
export class PaginationDto {
    @ApiProperty()
    @IsOptional()
    @IsNumber()
    @IsPositive()
    @Max(100)
    limit: number;
    
    @ApiProperty()
    @IsOptional()
    @IsNumber()
    @IsPositive()
    @Min(1)
    page: number;
}

...

async getAllUsers(
	@Query() { limit, page }: PaginationDto
): Promise<GetAllUsersType[]> {
	return this.userService.getAll(limit ?? 15, page ?? 1)
}
  1. Странное название «AccessJwt», назвал бы Auth хотя бы...

Мелочи

  1. НИКОГДА НЕ ИСПОЛЬЗУЙ ТАБЫ. ТОЛЬКО ПРОБЕЛЫ. КОД НА ГИТХАБЕ НАЧИНАЕТ ЕХАТЬ В ЕБЕНЯ.
  2. Я никогда не видел, чтобы использовались такие user-frendly ошибки, как тут, обычно, в REST отвечают статусом. Т.е. если на GET ничего не найдено, то просто выбрасывай NotFound безо всяких "Пользователь не найден". Однако подход с class-validator позволяет выбрасывать информативные BadRequest.

Error on npm run install:project

Скриншот 24-06-2022 06 17 44
Я пытаюсь установить зависимости при помощи npm run install:project но у них проблемы.(скрин прикрепил) такая ситуация в linux(только сегодня поставил все) и windows(windows скрин версий прикрепил).
Скриншот 24-06-2022 06 19 17

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.