implement getbookings for calendar

This commit is contained in:
Schneider Roland
2025-12-17 07:58:52 +01:00
parent c26abee957
commit 72c213eaea
4 changed files with 103 additions and 3 deletions

View File

@@ -4,7 +4,14 @@ import {
NotFoundException, NotFoundException,
} from '@nestjs/common'; } from '@nestjs/common';
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
import { Repository, Between, IsNull, DataSource, In } from 'typeorm'; import {
Repository,
Between,
IsNull,
DataSource,
In,
FindManyOptions,
} from 'typeorm';
import { RRule } from 'rrule'; // Corrected import import { RRule } from 'rrule'; // Corrected import
import { Event } from '../entity/event.entity'; import { Event } from '../entity/event.entity';
@@ -16,6 +23,7 @@ import { Booking } from '../entity/booking.entity';
import { CancelBookingDto } from './dto/cancel-booking.dto'; import { CancelBookingDto } from './dto/cancel-booking.dto';
import { CalendarCreateBookingDto } from './dto/create-booking.dto'; import { CalendarCreateBookingDto } from './dto/create-booking.dto';
import { EventType } from '../entity/event-type.entity'; import { EventType } from '../entity/event-type.entity';
import { CalendarGetBookingDto } from './dto/calendar.get.booking.dto';
// --- Type-Safe Maps --- // --- Type-Safe Maps ---
const frequencyMap: Record<string, RRule.Frequency> = { const frequencyMap: Record<string, RRule.Frequency> = {
@@ -593,10 +601,35 @@ export class CalendarService {
async getBookings( async getBookings(
userId: number, userId: number,
eventId: number, eventId: number,
startTime: Date, queryParams: CalendarGetBookingDto,
): Promise<Booking[]> { ): Promise<Booking[]> {
console.info('getBookings', userId, eventId, startTime); console.info('getBookings', userId, eventId);
await Promise.resolve(); await Promise.resolve();
const { page = 1, limit = 0, sortBy, order } = queryParams;
const findOptions: FindManyOptions<Booking> = {};
const paginated = limit > 0;
if (paginated) {
findOptions.skip = (page - 1) * limit;
findOptions.take = limit;
}
if (sortBy && order) {
findOptions.order = { [sortBy]: order };
}
const [data, totalItems] =
await this.bookingRepository.findAndCount(findOptions);
if (!paginated) {
return { data, total: data.length };
}
return {
data,
meta: {
totalItems,
itemCount: data.length,
itemsPerPage: limit,
totalPages: Math.ceil(totalItems / limit),
currentPage: page,
},
};
// const booking = await this.bookingRepository.findOneBy({ id: bookingId }); // const booking = await this.bookingRepository.findOneBy({ id: bookingId });
// if (!booking) { // if (!booking) {
// throw new NotFoundException(`Booking with ID ${bookingId} not found.`); // throw new NotFoundException(`Booking with ID ${bookingId} not found.`);

View File

@@ -0,0 +1,16 @@
import {
IsOptional,
IsString,
IsNumber,
IsIn,
IsBoolean,
} from 'class-validator';
import { Type } from 'class-transformer';
export class CalendarGetBookingDto {
@IsOptional() @Type(() => Number) @IsNumber() page?: number;
@IsOptional() @Type(() => Number) @IsNumber() limit?: number;
@IsOptional() @IsString() sortBy?: string;
@IsOptional() @IsIn(['ASC', 'DESC']) order?: 'ASC' | 'DESC';
@IsString() startTime: string;
}

View File

@@ -18,3 +18,15 @@ export interface UserPayload {
username: string; username: string;
roles: string[]; roles: string[];
} }
export interface PaginatedResponse<T> {
data: T[];
meta: PaginatedResponseMeta;
}
export interface PaginatedResponseMeta {
totalItems: number;
itemCount: number;
itemsPerPage: number;
totalPages: number;
currentPage: number;
}

39
server/src/util.ts Normal file
View File

@@ -0,0 +1,39 @@
import { PaginatedResponse } from './types';
import { FindManyOptions, FindOptions, FindOptionsOrder } from 'typeorm';
export const createPaginatedResponse = <T>(
data: T[],
totalItems: number,
limit: number,
page: number,
) => {
return {
data,
meta: {
totalItems,
itemCount: data.length,
itemsPerPage: limit,
totalPages: Math.ceil(totalItems / limit),
currentPage: page,
},
} as PaginatedResponse<T>;
};
export const createFindOptions = <T>(
page: number,
limit: number,
sortBy?: string,
order?: 'ASC' | 'DESC',
): FindManyOptions<T> => {
const findOptions: FindManyOptions<T> = {};
const paginated = limit > 0;
if (paginated) {
findOptions.skip = (page - 1) * limit;
findOptions.take = limit;
}
if (sortBy && order) {
findOptions.order = { [sortBy]: order } as FindOptionsOrder<T>;
}
return findOptions;
};