Много

This commit is contained in:
2024-09-12 00:39:01 +04:00
parent 6b07bd89b8
commit 8fb9214246
24 changed files with 643 additions and 194 deletions

View File

@@ -1,19 +1,25 @@
import { ApiProperty, PickType } from "@nestjs/swagger";
import { ApiProperty, IntersectionType, PickType } from "@nestjs/swagger";
import { UserDto } from "./user.dto";
import { IsString } from "class-validator";
export class SignInDto extends PickType(UserDto, ["username"]) {
// SignIn
export class SignInReqDto extends PickType(UserDto, ["username"]) {
@ApiProperty({ description: "Пароль в исходном виде" })
@IsString()
password: string;
}
export class SignInResultDto extends PickType(UserDto, ["id", "accessToken"]) {}
export class SignInResDto extends PickType(UserDto, ["id", "accessToken"]) {}
export class SignUpDto extends SignInDto {}
// SignUp
export class SignUpReqDto extends IntersectionType(
SignInReqDto,
PickType(UserDto, ["role", "group"]),
) {}
export class SignUpResultDto extends SignInResultDto {}
export class SignUpResDto extends SignInResDto {}
// Update token
export class UpdateTokenDto extends PickType(UserDto, ["accessToken"]) {}
export class UpdateTokenResultDto extends UpdateTokenDto {}

View File

@@ -8,8 +8,8 @@ import {
IsString,
ValidateNested,
} from "class-validator";
import { ApiProperty } from "@nestjs/swagger";
import { Type } from "class-transformer";
import { ApiProperty, OmitType, PickType } from "@nestjs/swagger";
import { Transform, Type } from "class-transformer";
export class LessonTimeDto {
@ApiProperty({
@@ -49,8 +49,7 @@ export class LessonTimeDto {
}
export enum LessonTypeDto {
NONE = 0,
DEFAULT,
DEFAULT = 0,
CUSTOM,
}
@@ -138,8 +137,9 @@ export class DayDto {
@ApiProperty({ example: [], description: "Занятия" })
@IsArray()
@ValidateNested({ each: true })
@IsOptional()
@Type(() => LessonDto)
lessons: Array<LessonDto>;
lessons: Array<LessonDto | null>;
constructor(name: string) {
this.name = name;
@@ -160,7 +160,7 @@ export class DayDto {
const lessonIdx = Number.parseInt(lessonRawIdx);
const lesson = this.lessons[lessonIdx];
if (lesson.type === LessonTypeDto.NONE) continue;
if (lesson === null) continue;
this.nonNullIndices.push(lessonIdx);
@@ -183,8 +183,9 @@ export class GroupDto {
@ApiProperty({ example: [], description: "Дни недели" })
@IsArray()
@ValidateNested({ each: true })
@IsOptional()
@Type(() => DayDto)
days: Array<DayDto>;
days: Array<DayDto | null>;
constructor(name: string) {
this.name = name;
@@ -208,9 +209,48 @@ export class ScheduleDto {
@IsString()
etag: string;
@ApiProperty({ description: "Расписание групп" })
@IsObject()
@IsOptional()
groups: any;
@ApiProperty({
example: { "ИС-214/23": [5, 6] },
description: "Обновлённые дни с последнего изменения расписания",
})
@IsObject()
@Type(() => Object)
@Transform(({ value }) => {
const object = {};
for (const key in value) {
object[key] = value[key];
}
return object;
})
@Type(() => Object)
lastChangedDays: Array<Array<number>>;
}
export class GroupScheduleRequestDto extends PickType(GroupDto, ["name"]) {}
export class ScheduleGroupsDto {
@ApiProperty({
example: ["ИС-214/23", "ИС-213/23"],
description: "Список названий всех групп в текущем расписании",
})
@IsArray()
names: Array<string>;
}
export class GroupScheduleDto extends OmitType(ScheduleDto, [
"groups",
"lastChangedDays",
]) {
@ApiProperty({ description: "Расписание группы" })
@IsObject()
data: GroupDto;
group: GroupDto;
@ApiProperty({
example: [5, 6],

View File

@@ -1,36 +1,79 @@
import { ApiProperty, OmitType } from "@nestjs/swagger";
import {
IsEnum,
IsJWT,
IsMongoId,
IsString,
MaxLength,
MinLength,
} from "class-validator";
import { Expose, plainToClass } from "class-transformer";
export enum UserRoleDto {
STUDENT = "STUDENT",
TEACHER = "TEACHER",
ADMIN = "ADMIN",
}
export class UserDto {
@ApiProperty({ description: "Идентификатор (ObjectId)" })
@IsMongoId()
@Expose()
id: string;
@ApiProperty({ example: "n08i40k", description: "Имя" })
@IsString()
@MinLength(4)
@MaxLength(10)
@Expose()
username: string;
@ApiProperty({ description: "Соль пароля" })
@ApiProperty({
example: "$2b$08$34xwFv1WVJpvpVi3tZZuv.",
description: "Соль пароля",
})
@IsString()
@Expose()
salt: string;
@ApiProperty({ description: "Хеш пароля" })
@ApiProperty({
example: "$2b$08$34xwFv1WVJpvpVi3tZZuv...",
description: "Хеш пароля",
})
@IsString()
@Expose()
password: string;
@ApiProperty({ description: "Последний токен доступа" })
@ApiProperty({
example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
description: "Последний токен доступа",
})
@IsJWT()
@Expose()
accessToken: string;
@ApiProperty({ example: "ИС-214/23", description: "Группа пользователя" })
@IsString()
@Expose()
group: string;
@ApiProperty({
example: UserRoleDto.STUDENT,
description: "Роль пользователя",
})
@IsEnum(UserRoleDto)
@Expose()
role: UserRoleDto;
}
// TODO: Доделать пользователей
// noinspection JSUnusedGlobalSymbols
export class ClientUserDto extends OmitType(UserDto, [
"password",
"salt",
"accessToken",
]) {}
]) {
static fromUserDto(userDto: UserDto): ClientUserDto {
return plainToClass(ClientUserDto, userDto, {
excludeExtraneousValues: true,
});
}
}