// API Response Types based on Swagger schema export interface MessageSchema { message: string; } export interface ErrorSchema { detail: string; } // Auth Types export interface TokenSchema { access_token: string; refresh_token: string; token_type?: string; } export interface MajorOption { code: string; label: string; } export interface UserProfileSchema { id: number; email?: string | null; mobile?: string | null; username: string; first_name: string; last_name: string; profile_picture?: string; profile_picture_thumbnail_url?: string | null; profile_picture_preview_url?: string | null; bio?: string; student_id?: string | null; year_of_study?: number; university?: string; major?: string; date_joined: string; is_email_verified?: boolean; is_mobile_verified?: boolean; requires_mobile_verification?: boolean; has_google_link?: boolean; is_active?: boolean; is_staff?: boolean; is_superuser?: boolean; is_committee?: boolean; is_deleted?: boolean; deleted_at?: string | null; can_access_blog_admin?: boolean; can_write_blog_posts?: boolean; can_review_blog_posts?: boolean; } export interface UserListSchema { id: number; username: string; email?: string | null; mobile?: string | null; first_name: string; last_name: string; full_name?: string | null; university?: string | null; major?: string | null; is_active: boolean; is_staff: boolean; is_superuser: boolean; date_joined: string; } export interface AuthorizationRoleSchema { key: string; label: string; description: string; enabled: boolean; locked: boolean; } export interface UserAuthorizationSchema { id: number; username: string; email?: string | null; mobile?: string | null; first_name: string; last_name: string; is_active: boolean; is_staff: boolean; is_superuser: boolean; groups: string[]; roles: AuthorizationRoleSchema[]; } export interface UserAuthorizationUpdateSchema { is_staff: boolean; groups: string[]; } export interface UserRegistrationSchema { mobile: string; code: string; password: string; username: string; email?: string | null; first_name?: string | null; last_name?: string | null; student_id?: string | null; year_of_study?: number | null; major?: string | null; university?: string | null; } export type UserUpdateSchema = { email?: string | null; first_name?: string | null; last_name?: string | null; bio?: string | null; year_of_study?: number | null; major?: string | null; university?: string | null; student_id?: string | null; }; export interface UserLoginSchema { identifier: string; password: string; } export interface UserOtpLoginSchema { mobile: string; code: string; } export interface RegisterOtpVerifySchema { mobile: string; code: string; } export interface OtpSendSchema { mobile: string; mode: "register" | "login" | "reset_password" | "verify_mobile" | "google_claim"; } export interface OtpSendResponseSchema { message: string; expires_in_seconds: number; expires_at: string; } export interface TokenRefreshIn { refresh_token: string; } export interface UsernameCheckSchema { exists: boolean; } export interface MobileLookupSchema { exists: boolean; has_password: boolean; } export interface PasswordResetSchema { mobile: string; code: string; new_password: string; } export interface MobileOtpSendSchema { mobile: string; } export interface MobileOtpVerifySchema { mobile: string; code: string; } export interface GoogleFlowResponseSchema { status: "authenticated" | "collect_profile" | "claim_required" | "error"; email?: string | null; first_name?: string | null; last_name?: string | null; avatar_url?: string | null; resolution?: "new_account" | "existing_email_claim" | "existing_mobile_claim" | null; mobile?: string | null; mobile_hint?: string | null; detail?: string | null; access_token?: string | null; refresh_token?: string | null; } export interface GoogleCompleteSchema { flow: string; mobile: string; username?: string | null; student_id?: string | null; year_of_study?: number | null; major?: string | null; university?: string | null; first_name?: string | null; last_name?: string | null; } export interface NotificationSchema { id: string; type: string; title: string; message: string; level: "info" | "success" | "warning" | "error"; created_at: string; is_seen: boolean; delete_on_seen: boolean; action_url?: string | null; entity_type?: string | null; entity_id?: string | number | null; meta?: Record; } export interface NotificationListSchema { count: number; unread_count: number; notifications: NotificationSchema[]; } export interface NotificationSeenResponseSchema { marked_read: boolean; notification_id?: string | null; deleted?: boolean; notification?: NotificationSchema | null; unread_count?: number | null; } export interface NotificationDeleteResponseSchema { deleted: boolean; notification_id?: string | null; unread_count?: number | null; } export interface NotificationStreamTokenResponseSchema { token: string; expires_in: number; } // Blog Types export interface PostListSchema { id: number; title: string; slug: string; excerpt?: string; featured_image?: string; absolute_featured_image_url?: string | null; absolute_featured_image_thumbnail_url?: string | null; absolute_featured_image_preview_url?: string | null; author: { id: number; username: string; first_name: string; last_name: string; bio?: string | null; profile_picture?: string; profile_picture_thumbnail_url?: string | null; profile_picture_preview_url?: string | null; }; category?: { id: number; name: string; slug: string; description?: string; parent_id?: number | null; }; category_path?: Array<{ id: number; name: string; slug: string; }>; writers?: Array<{ id: number; username: string; first_name: string; last_name: string; bio?: string | null; profile_picture?: string; profile_picture_thumbnail_url?: string | null; profile_picture_preview_url?: string | null; }>; tags: Array<{ id: number; name: string; slug: string; }>; status: string; published_at?: string; created_at: string; is_featured: boolean; reading_time?: number; updated_at: string; seo_title?: string; seo_description?: string; canonical_url?: string; og_title?: string; og_description?: string; noindex?: boolean; focus_keyword?: string; likes_count?: number; saves_count?: number; comments_count?: number; } export interface PostDetailSchema extends PostListSchema { content: string; content_html?: string; review_note?: string; og_image_url?: string | null; views_count?: number; assets?: PostAssetSchema[]; } export interface PostCreateSchema { title: string; content: string; excerpt?: string; category_id?: number | null; tag_ids?: number[]; writer_ids?: number[]; is_featured?: boolean; status?: 'draft' | 'submitted' | 'changes_requested' | 'published' | 'archived'; seo_title?: string; seo_description?: string; canonical_url?: string; og_title?: string; og_description?: string; noindex?: boolean; focus_keyword?: string; } export interface PostReviewSchema { action: 'publish' | 'approve' | 'request_changes' | 'changes_requested' | 'archive'; note?: string; } export interface PostAssetSchema { id: number; file_type: 'image' | 'video' | 'document' | 'archive' | 'other'; title: string; alt_text?: string; caption?: string; size: number; mime_type?: string; created_at: string; absolute_file_url?: string | null; absolute_thumbnail_url?: string | null; absolute_preview_url?: string | null; absolute_blur_url?: string | null; markdown_image?: string | null; markdown_link?: string | null; uploaded_by: { id: number; username: string; first_name: string; last_name: string; }; } export interface CommentSchema { id: number; content: string; author: { id: number; username: string; first_name: string; last_name: string; bio?: string | null; profile_picture?: string | null; profile_picture_thumbnail_url?: string | null; profile_picture_preview_url?: string | null; }; post_id: number; post_title: string; post_slug: string; parent_id?: number; created_at: string; updated_at?: string; is_approved: boolean; is_hidden?: boolean; is_deleted?: boolean; hidden_at?: string | null; deleted_at?: string | null; hidden_replies_count?: number; replies?: CommentSchema[]; } export interface CommentCreateSchema { content: string; parent_id?: number; } export interface CommentUpdateSchema { content: string; } export interface BlogBannerSchema { id: number; title?: string; alt_text?: string; image_url: string; url: string; sort_order: number; } export interface BlogInteractionSchema { liked: boolean; saved: boolean; likes_count: number; saves_count: number; comments_count: number; } export interface BlogProfileActivitySchema { liked_posts: PostListSchema[]; saved_posts: PostListSchema[]; comments: CommentSchema[]; replies: CommentSchema[]; } export interface CategorySchema { id: number; name: string; slug: string; description?: string; parent_id?: number | null; created_at: string; } export interface AdminCategorySchema extends CategorySchema { post_count: number; } export interface CategoryWriteSchema { name: string; slug?: string | null; description?: string | null; parent_id?: number | null; } export interface TagSchema { id: number; name: string; slug: string; created_at: string; } export interface AdminTagSchema extends TagSchema { post_count: number; } export interface TagWriteSchema { name: string; slug?: string | null; } export interface BlogFilterCategory { id: number; name: string; slug: string; parent_id?: number | null; post_count: number; children: BlogFilterCategory[]; } export interface BlogFilterTag { id: number; name: string; slug: string; post_count: number; } export interface BlogFilterAuthor { id: number; username: string; first_name: string; last_name: string; post_count: number; } export interface BlogFiltersSchema { categories: BlogFilterCategory[]; tags: BlogFilterTag[]; authors: BlogFilterAuthor[]; } // Events Types export interface EventListItemSchema { id: number; title: string; slug: string; description: string; featured_image?: string | null; absolute_featured_image_url?: string | null; absolute_featured_image_thumbnail_url?: string | null; absolute_featured_image_preview_url?: string | null; event_type: 'online' | 'on_site' | 'hybrid'; address?: string | null; location?: string | null; online_link?: string | null; start_time: string; // ISO end_time: string; // ISO registration_start_date?: string | null; registration_end_date?: string | null; capacity?: number | null; price?: number | null; status: 'draft' | 'published' | 'cancelled' | 'completed'; status_label?: string; event_type_label?: string; registration_count: number; created_at: string; } export interface EventGalleryItem { id: number; title: string; description: string; absolute_image_url?: string | null; absolute_image_preview_url?: string | null; absolute_image_blur_url?: string | null; width?: number; height?: number; } export interface EventDetailSchema extends EventListItemSchema { description_html: string; gallery_images: EventGalleryItem[]; updated_at: string; registration_success_markdown: string; } export interface EventCreateSchema { title: string; description: string; start_date: string; end_date?: string; location: string; capacity?: number; event_image?: string; requirements?: string; is_registration_open?: boolean; } export interface PaymentAdminSchema { id: number; authority?: string | null; ref_id?: string | null; status: number; status_label: string; base_amount: number; discount_amount: number; amount: number; verified_at?: string | null; created_at: string; discount_code?: string | null; } export interface RegistrationAdminSchema { id: number; ticket_id: string; status: 'pending' | 'confirmed' | 'cancelled' | 'attended'; status_label: string; registered_at: string; final_price?: number | null; discount_amount?: number | null; user: { id: number; username: string; first_name: string; last_name: string; email: string; }; payments: PaymentAdminSchema[]; } export interface EventAdminDetailSchema extends EventDetailSchema { registrations: RegistrationAdminSchema[]; } export interface EventUpdateSchema { title?: string; description?: string; event_type?: 'online' | 'on_site' | 'hybrid'; address?: string | null; location?: string | null; online_link?: string | null; start_time?: string; end_time?: string | null; registration_start_date?: string | null; registration_end_date?: string | null; capacity?: number | null; price?: number | null; status?: 'draft' | 'published' | 'cancelled' | 'completed'; gallery_image_ids?: number[] | null; } export interface EventRegistrationSchema { id: number; status: 'pending' | 'confirmed' | 'cancelled' | 'attended'; ticket_id: string; registered_at: string; created_at: string; updated_at: string; user: { id: number; username: string; first_name: string; last_name: string; }; event_id: number; } export interface RegistrationStatusSchema { is_registered: boolean; } export interface MyEventRegistrationSchema { id: number; created_at: string; status: 'pending' | 'confirmed' | 'cancelled' | 'attended'; event: EventListItemSchema; } // Gallery Types export interface GalleryImageSchema { id: number; title: string; description?: string; image: string; absolute_image_url?: string | null; absolute_image_preview_url?: string | null; absolute_image_blur_url?: string | null; width?: number | null; height?: number | null; uploaded_by: { id: number; username: string; }; created_at: string; tags: TagSchema[]; } export interface GalleryImageCreateSchema { title: string; description?: string; tag_ids?: number[]; } // Pagination export interface PaginatedResponse { results: T[]; count: number; next?: string; previous?: string; } // payment export interface CreatePaymentOut { start_pay_url: string; authority: string; base_amount: number; discount_amount: number; amount: number; }