diff --git a/apps/backend/src/api/routes/posts.controller.ts b/apps/backend/src/api/routes/posts.controller.ts index 8814a6b0..c13c614a 100644 --- a/apps/backend/src/api/routes/posts.controller.ts +++ b/apps/backend/src/api/routes/posts.controller.ts @@ -53,7 +53,8 @@ export class PostsController { this._commentsService.getAllCommentsByWeekYear( org.id, query.year, - query.week + query.week, + query.isIsoWeek === 'true' ), ]); diff --git a/apps/frontend/src/components/launches/calendar.context.tsx b/apps/frontend/src/components/launches/calendar.context.tsx index 1103a5e0..0105bda9 100644 --- a/apps/frontend/src/components/launches/calendar.context.tsx +++ b/apps/frontend/src/components/launches/calendar.context.tsx @@ -38,6 +38,32 @@ export interface Integrations { type: string; picture: string; } + +function getWeekNumber(date: Date) { + // Copy date so don't modify original + const targetDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); + // Set to nearest Thursday: current date + 4 - current day number + // Make Sunday's day number 7 + targetDate.setUTCDate(targetDate.getUTCDate() + 4 - (targetDate.getUTCDay() || 7)); + // Get first day of year + const yearStart = new Date(Date.UTC(targetDate.getUTCFullYear(), 0, 1)); + // Calculate full weeks to nearest Thursday + return Math.ceil((((targetDate.getTime() - yearStart.getTime()) / 86400000) + 1) / 7); +} + +function isISOWeek(date: Date, weekNumber: number): boolean { + // Copy date so don't modify original + const targetDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); + // Set to nearest Thursday: current date + 4 - current day number + // Make Sunday's day number 7 + targetDate.setUTCDate(targetDate.getUTCDate() + 4 - (targetDate.getUTCDay() || 7)); + // Get first day of year + const yearStart = new Date(Date.UTC(targetDate.getUTCFullYear(), 0, 1)); + // Calculate full weeks to nearest Thursday + const isoWeekNo = Math.ceil((((targetDate.getTime() - yearStart.getTime()) / 86400000) + 1) / 7); + return isoWeekNo === weekNumber; +} + export const CalendarWeekProvider: FC<{ children: ReactNode; integrations: Integrations[]; @@ -59,10 +85,14 @@ export const CalendarWeekProvider: FC<{ }, []); const [filters, setFilters] = useState({ - currentWeek: +(searchParams.get('week') || dayjs().week()), + currentWeek: +(searchParams.get('week') || getWeekNumber(new Date())), currentYear: +(searchParams.get('year') || dayjs().year()), }); + const isIsoWeek = useMemo(() => { + return isISOWeek(new Date(), filters.currentWeek); + }, [filters]); + const setFiltersWrapper = useCallback( (filters: { currentWeek: number; currentYear: number }) => { setFilters(filters); @@ -80,6 +110,7 @@ export const CalendarWeekProvider: FC<{ return new URLSearchParams({ week: filters.currentWeek.toString(), year: filters.currentYear.toString(), + isIsoWeek: isIsoWeek.toString(), }).toString(); }, [filters]); diff --git a/libraries/nestjs-libraries/src/database/prisma/comments/comments.repository.ts b/libraries/nestjs-libraries/src/database/prisma/comments/comments.repository.ts index 232ed55a..58230c0c 100644 --- a/libraries/nestjs-libraries/src/database/prisma/comments/comments.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/comments/comments.repository.ts @@ -112,10 +112,16 @@ export class CommentsRepository { }); } - async getAllCommentsByWeekYear(orgId: string, year: number, week: number) { - const date = dayjs().year(year).isoWeek(week); - const startDate = date.startOf('isoWeek').toDate(); - const endDate = date.endOf('isoWeek').toDate(); + async getAllCommentsByWeekYear( + orgId: string, + year: number, + week: number, + isIsoWeek: boolean + ) { + const dateYear = dayjs().year(year); + const date = isIsoWeek ? dateYear.isoWeek(week) : dateYear.week(week); + const startDate = date.startOf('isoWeek').subtract(2, 'days').toDate(); + const endDate = date.endOf('isoWeek').add(2, 'days').toDate(); const load = await this._media.model.comments.findMany({ where: { @@ -134,8 +140,8 @@ export class CommentsRepository { childrenComment: { where: { deletedAt: null, - } - } + }, + }, }, }, }, diff --git a/libraries/nestjs-libraries/src/database/prisma/comments/comments.service.ts b/libraries/nestjs-libraries/src/database/prisma/comments/comments.service.ts index 7882a01e..85b4c755 100644 --- a/libraries/nestjs-libraries/src/database/prisma/comments/comments.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/comments/comments.service.ts @@ -44,7 +44,7 @@ export class CommentsService { ); } - getAllCommentsByWeekYear(orgId: string, year: number, week: number) { - return this._commentsRepository.getAllCommentsByWeekYear(orgId, year, week); + getAllCommentsByWeekYear(orgId: string, year: number, week: number, isIsoWeek: boolean) { + return this._commentsRepository.getAllCommentsByWeekYear(orgId, year, week, isIsoWeek); } } diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts index 020e83c7..70b86ed4 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts @@ -63,10 +63,11 @@ export class PostsRepository { } getPosts(orgId: string, query: GetPostsDto) { - const date = dayjs().year(query.year).week(query.week); + const dateYear = dayjs().year(query.year); + const date = query.isIsoWeek === 'true' ? dateYear.isoWeek(query.week) : dateYear.week(query.week); - const startDate = date.startOf('week').toDate(); - const endDate = date.endOf('week').toDate(); + const startDate = date.startOf('week').subtract(2, 'days').toDate(); + const endDate = date.endOf('week').add(2, 'days').toDate(); return this._post.model.post.findMany({ where: { diff --git a/libraries/nestjs-libraries/src/dtos/posts/get.posts.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/get.posts.dto.ts index 525c504d..557f551d 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/get.posts.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/get.posts.dto.ts @@ -1,17 +1,21 @@ -import {Type} from "class-transformer"; -import {IsNumber, Max, Min} from "class-validator"; -import dayjs from "dayjs"; +import { Type } from 'class-transformer'; +import { IsIn, IsNumber, IsString, Max, Min } from 'class-validator'; +import dayjs from 'dayjs'; export class GetPostsDto { - @Type(() => Number) - @IsNumber() - @Max(52) - @Min(1) - week: number; + @Type(() => Number) + @IsNumber() + @Max(52) + @Min(1) + week: number; - @Type(() => Number) - @IsNumber() - @Max(dayjs().add(10, 'year').year()) - @Min(2022) - year: number; -} \ No newline at end of file + @Type(() => Number) + @IsNumber() + @Max(dayjs().add(10, 'year').year()) + @Min(2022) + year: number; + + @IsIn(['true', 'false']) + @IsString() + isIsoWeek: 'true' | 'false'; +}