80 lines
1.6 KiB
TypeScript
80 lines
1.6 KiB
TypeScript
import { QuestionType, Difficulty } from './category.model';
|
|
|
|
/**
|
|
* Question Interface
|
|
* Represents a quiz question
|
|
*/
|
|
export interface Question {
|
|
id: string;
|
|
questionText: string;
|
|
questionType: QuestionType;
|
|
difficulty: Difficulty;
|
|
categoryId: string;
|
|
categoryName?: string;
|
|
category?: {
|
|
id: string;
|
|
name: string;
|
|
slug?: string;
|
|
icon?: string;
|
|
color?: string;
|
|
guestAccessible?: boolean;
|
|
};
|
|
options?: string[] | { id: string; text: string }[]; // For multiple choice
|
|
correctAnswer: string | string[];
|
|
explanation: string;
|
|
points: number;
|
|
timeLimit?: number; // in seconds
|
|
tags?: string[];
|
|
keywords?: string[];
|
|
isActive: boolean;
|
|
isPublic: boolean;
|
|
timesAttempted?: number;
|
|
timesCorrect?: number;
|
|
accuracy?: number;
|
|
createdBy?: string;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
/**
|
|
* Question Create/Update Request
|
|
*/
|
|
export interface QuestionFormData {
|
|
questionText: string;
|
|
questionType: QuestionType;
|
|
difficulty: Difficulty;
|
|
categoryId: string;
|
|
options?: string[];
|
|
correctAnswer: string | string[];
|
|
explanation: string;
|
|
points?: number;
|
|
timeLimit?: number;
|
|
tags?: string[];
|
|
keywords?: string[];
|
|
isPublic: boolean;
|
|
isGuestAccessible: boolean;
|
|
}
|
|
|
|
/**
|
|
* Question Search Filters
|
|
*/
|
|
export interface QuestionSearchFilters {
|
|
q?: string; // search query
|
|
category?: string;
|
|
difficulty?: Difficulty;
|
|
questionType?: QuestionType;
|
|
isPublic?: boolean;
|
|
page?: number;
|
|
limit?: number;
|
|
}
|
|
|
|
/**
|
|
* Question Search Response
|
|
*/
|
|
export interface QuestionSearchResponse {
|
|
results: Question[];
|
|
totalCount: number;
|
|
page: number;
|
|
limit: number;
|
|
}
|