https://project.mdnd-it.cc/work_packages/94
This commit is contained in:
2025-08-23 04:25:28 +02:00
parent 725516ad6c
commit 19cfa031d0
25823 changed files with 1095587 additions and 2801760 deletions
@@ -0,0 +1,3 @@
export interface GetDeckByIdQuery {
id: string;
}
@@ -0,0 +1,14 @@
import { IDeckRepository } from '../../../Domain/IRepository/IDeckRepository';
import { GetDeckByIdQuery } from './GetDeckByIdQuery';
import { ShortDeckDto } from '../../DTOs/DeckDto';
import { DeckMapper } from '../../DTOs/Mappers/DeckMapper';
export class GetDeckByIdQueryHandler {
constructor(private readonly deckRepo: IDeckRepository) {}
async execute(query: GetDeckByIdQuery): Promise<ShortDeckDto | null> {
const deck = await this.deckRepo.findById(query.id);
if (!deck) return null;
return DeckMapper.toShortDto(deck);
}
}
@@ -0,0 +1,8 @@
export interface GetDecksByPageQuery {
from: number;
to: number;
userId: string;
userOrgId?: string;
isAdmin: boolean;
includeDeleted?: boolean;
}
@@ -0,0 +1,82 @@
import { IDeckRepository } from '../../../Domain/IRepository/IDeckRepository';
import { GetDecksByPageQuery } from './GetDecksByPageQuery';
import { ShortDeckDto } from '../../DTOs/DeckDto';
import { DeckMapper } from '../../DTOs/Mappers/DeckMapper';
import { AdminBypassService } from '../../Services/AdminBypassService';
import { logRequest, logError } from '../../Services/Logger';
export class GetDecksByPageQueryHandler {
constructor(private readonly deckRepo: IDeckRepository) {}
async execute(query: GetDecksByPageQuery): Promise<{ decks: ShortDeckDto[], totalCount: number }> {
try {
// Validate pagination parameters
if (query.from < 0 || query.to < query.from) {
throw new Error('Invalid pagination parameters');
}
const limit = query.to - query.from + 1;
if (limit > 100) {
throw new Error('Page size too large. Maximum 100 records per request');
}
// Log admin bypass if applicable
if (query.isAdmin) {
AdminBypassService.logAdminBypass(
'GET_DECKS_PAGE_BYPASS',
query.userId,
'paginated-decks',
{
from: query.from,
to: query.to,
includesDeleted: query.includeDeleted || false,
operation: 'read'
}
);
}
logRequest('Get decks by page query started', undefined, undefined, {
userId: query.userId,
userOrgId: query.userOrgId,
isAdmin: query.isAdmin,
from: query.from,
to: query.to,
includeDeleted: query.includeDeleted || false
});
// Use paginated filtered deck finding method
const result = await this.deckRepo.findFilteredDecks(
query.userId,
query.userOrgId,
query.isAdmin,
query.from,
query.to
);
logRequest('Get decks by page query completed', undefined, undefined, {
userId: query.userId,
userOrgId: query.userOrgId,
isAdmin: query.isAdmin,
from: query.from,
to: query.to,
returned: result.decks.length,
totalCount: result.totalCount,
includeDeleted: query.includeDeleted || false
});
return {
decks: DeckMapper.toShortDtoList(result.decks),
totalCount: result.totalCount
};
} catch (error) {
logError('GetDecksByPageQueryHandler error', error instanceof Error ? error : new Error(String(error)));
// Re-throw validation errors as-is
if (error instanceof Error && (error.message.includes('Invalid pagination') || error.message.includes('Page size'))) {
throw error;
}
throw new Error('Failed to retrieve decks page');
}
}
}