Skip to content

Commit 966646a

Browse files
committed
feat: improve meetup date setting
- Support both unix time and date string for meetup date in create and update. - Hard set UTC time to 00:00:00.000 - Improve Open API spec for date
1 parent e664aae commit 966646a

File tree

6 files changed

+42
-8
lines changed

6 files changed

+42
-8
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "course-vue-backend",
3-
"version": "1.3.9",
3+
"version": "1.4.0",
44
"description": "API backend for learn.javascript.ru VueJS Course",
55
"author": "Grigorii K. Shartsev <me@shgk.me>",
66
"private": true,

src/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ async function bootstrap() {
3535

3636
const options = new DocumentBuilder()
3737
.setTitle('Meetups API')
38-
.setVersion('1.3.9')
38+
.setVersion('1.4.0')
3939
.addSecurity('cookie-session', {
4040
type: 'apiKey',
4141
in: 'cookie',

src/meetups/dto/create-meetup.dto.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,27 @@
11
import { CreateAgendaItemDto } from './create-agenda-item.dto';
22
import {
33
Allow,
4-
IsDateString,
54
IsNotEmpty,
5+
Validate,
66
ValidateNested,
7+
ValidationArguments,
8+
ValidatorConstraint,
9+
ValidatorConstraintInterface,
710
} from 'class-validator';
811
import { Type } from 'class-transformer';
12+
import { ApiProperty } from '@nestjs/swagger';
13+
14+
@ValidatorConstraint()
15+
class DateAsStringOrNumberValidator implements ValidatorConstraintInterface {
16+
validate(text: string | number) {
17+
if (typeof text === 'string') {
18+
return /^\d\d\d\d-\d\d-\d\d/.test(text) && !isNaN(Date.parse(text));
19+
} else if (typeof text === 'number') {
20+
return true;
21+
}
22+
return false;
23+
}
24+
}
925

1026
export class CreateMeetupDto {
1127
@IsNotEmpty({ message: 'Название не может быть пустым' })
@@ -14,9 +30,20 @@ export class CreateMeetupDto {
1430
@IsNotEmpty({ message: 'Описание не может быть пустым' })
1531
readonly description: string;
1632

17-
@IsNotEmpty({ message: 'Название не может быть пустым' })
18-
@IsDateString({ message: 'Некорректный формат даты' })
19-
readonly date: string;
33+
@IsNotEmpty({ message: 'Митап должен иметь дату' })
34+
@ApiProperty({
35+
description: 'Дата митапа в 00:00:00.000 по UTC',
36+
example: 1609459200000,
37+
oneOf: [
38+
{ type: 'number', description: 'Unix Timestamp', example: 1609459200000 },
39+
{ type: 'string', description: 'YYYY-MM-DD', example: '2021-01-01' },
40+
],
41+
})
42+
@Validate(DateAsStringOrNumberValidator, {
43+
message:
44+
'Дата должна быть либо числом, либо строковой датой в формате YYYY-MM-DD ',
45+
})
46+
readonly date: string | number;
2047

2148
@Allow()
2249
readonly imageId: number;

src/meetups/dto/meetup.dto.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ApiProperty } from '@nestjs/swagger';
12
import { MeetupEntity } from '../entities/meetup.entity';
23

34
export class MeetupDto {
@@ -6,7 +7,10 @@ export class MeetupDto {
67
readonly description: string;
78
readonly imageId: number | null;
89
readonly date: number | string;
9-
readonly organizer: number | string;
10+
@ApiProperty({
11+
title: 'Дата митапа в формате UNIX Timestamp в 00:00:00.000 по UTC',
12+
})
13+
readonly organizer: string;
1014
readonly place: string;
1115
readonly organizing?: boolean;
1216
readonly attending?: boolean;

src/meetups/entities/meetup.entity.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ export class MeetupEntity {
6464
constructor(meetupDto: Partial<CreateMeetupDto>) {
6565
this.title = meetupDto.title;
6666
this.description = meetupDto.description;
67-
this.date = new Date(meetupDto.date);
6867
this.place = meetupDto.place;
68+
69+
this.date = new Date(meetupDto.date);
70+
this.date.setUTCHours(0, 0, 0, 0);
6971
}
7072
}

src/meetups/meetups.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ export class MeetupsService {
104104
meetup.description = newMeetup.description;
105105
meetup.place = newMeetup.place;
106106
meetup.date = new Date(newMeetup.date);
107+
meetup.date.setUTCHours(0, 0, 0, 0);
107108
if (newMeetup.imageId) {
108109
meetup.image = await this.imagesRepository.findOne({
109110
id: newMeetup.imageId,

0 commit comments

Comments
 (0)