feat: check week

This commit is contained in:
Nevo David 2024-07-28 11:36:16 +07:00
parent b07f4b7f59
commit 1bb0511ede
6 changed files with 70 additions and 27 deletions

View File

@ -53,7 +53,8 @@ export class PostsController {
this._commentsService.getAllCommentsByWeekYear(
org.id,
query.year,
query.week
query.week,
query.isIsoWeek === 'true'
),
]);

View File

@ -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]);

View File

@ -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,
}
}
},
},
},
},
},

View File

@ -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);
}
}

View File

@ -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: {

View File

@ -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;
}
@Type(() => Number)
@IsNumber()
@Max(dayjs().add(10, 'year').year())
@Min(2022)
year: number;
@IsIn(['true', 'false'])
@IsString()
isIsoWeek: 'true' | 'false';
}