diff --git a/src/migrations/1713520000000-AddTypeToViolations.ts b/src/migrations/1713520000000-AddTypeToViolations.ts new file mode 100644 index 0000000..c3b76c4 --- /dev/null +++ b/src/migrations/1713520000000-AddTypeToViolations.ts @@ -0,0 +1,13 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddTypeToViolations1713520000000 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "violations" ADD "type" varchar NOT NULL DEFAULT 'standard'`, + ) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "violations" DROP COLUMN "type"`) + } +} diff --git a/src/violations/api/violation.dto.ts b/src/violations/api/violation.dto.ts index a543987..f812610 100644 --- a/src/violations/api/violation.dto.ts +++ b/src/violations/api/violation.dto.ts @@ -10,6 +10,7 @@ import { IsArray, IsBoolean, IsEmail, + IsEnum, IsNotEmpty, IsOptional, IsPhoneNumber, @@ -21,7 +22,11 @@ import { } from 'class-validator' import { SectionDto } from '../../sections/api/section.dto' import { PictureDto } from '../../pictures/api/picture.dto' -import { Violation, ViolationStatus } from '../entities/violation.entity' +import { + Violation, + ViolationStatus, + ViolationType, +} from '../entities/violation.entity' import { TownDto } from '../../sections/api/town.dto' import { UserDto } from 'src/users/api/user.dto' import { ViolationUpdateDto } from './violation-update.dto' @@ -42,6 +47,11 @@ export class ViolationDto { @Expose({ groups: ['read', ViolationDto.FEED] }) id: string + @Expose({ groups: ['read', 'create', ViolationDto.FEED] }) + @IsOptional({ groups: ['create'] }) + @IsEnum(ViolationType, { groups: ['create'] }) + type: ViolationType + @Expose({ groups: ['read', 'create', ViolationDto.FEED] }) @Type(() => SectionDto) @ValidateIf((violationDto: ViolationDto) => violationDto.town !== undefined) diff --git a/src/violations/api/violations-filters.dto.ts b/src/violations/api/violations-filters.dto.ts index 4f94a1c..28aaaf0 100644 --- a/src/violations/api/violations-filters.dto.ts +++ b/src/violations/api/violations-filters.dto.ts @@ -9,7 +9,7 @@ import { } from 'class-validator' import { IsTownExists } from 'src/sections/api/town-exists.constraint' import { PageDTO } from 'src/utils/page.dto' -import { ViolationStatus } from '../entities/violation.entity' +import { ViolationStatus, ViolationType } from '../entities/violation.entity' export class ViolationsFilters extends PageDTO { @IsOptional() @@ -54,4 +54,9 @@ export class ViolationsFilters extends PageDTO { @IsOptional() @IsBooleanString() published: boolean + + @IsOptional() + @IsString() + @IsEnum(ViolationType) + type: ViolationType } diff --git a/src/violations/entities/violation.entity.ts b/src/violations/entities/violation.entity.ts index 48e51bb..f573fbc 100644 --- a/src/violations/entities/violation.entity.ts +++ b/src/violations/entities/violation.entity.ts @@ -31,6 +31,11 @@ export enum ViolationStatus { REJECTED = 'rejected', } +export enum ViolationType { + STANDARD = 'standard', + VIDEO = 'video', +} + @Entity('violations', { orderBy: { id: 'DESC' } }) export class Violation { @PrimaryColumn('char', { @@ -38,6 +43,9 @@ export class Violation { }) id: string = ulid() + @Column({ type: 'varchar', default: ViolationType.STANDARD }) + type: ViolationType + @Column({ type: 'text' }) description: string diff --git a/src/violations/entities/violations.repository.ts b/src/violations/entities/violations.repository.ts index 304f2a9..5d75556 100644 --- a/src/violations/entities/violations.repository.ts +++ b/src/violations/entities/violations.repository.ts @@ -233,6 +233,10 @@ export class ViolationsRepository { }) } + if (filters.type) { + qb.andWhere('violation.type = :type', { type: filters.type }) + } + return qb } @@ -302,6 +306,10 @@ export class ViolationsRepository { }) } + if (filters.type) { + qb.andWhere('violation.type = :type', { type: filters.type }) + } + return qb.getCount() }