feat: check week
This commit is contained in:
parent
b07f4b7f59
commit
1bb0511ede
|
|
@ -53,7 +53,8 @@ export class PostsController {
|
|||
this._commentsService.getAllCommentsByWeekYear(
|
||||
org.id,
|
||||
query.year,
|
||||
query.week
|
||||
query.week,
|
||||
query.isIsoWeek === 'true'
|
||||
),
|
||||
]);
|
||||
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue