import type { TASK_TYPE } from "./const" export interface PromptMessage { id: number role: string source?: string content: string code_html: string | null code_css: string | null code_js: string | null prompt_level?: number | null created: string } export enum Role { Super = "super", Admin = "admin", Normal = "normal", } export function getRole(role: Role) { return { [Role.Super]: "超级管理员", [Role.Admin]: "管理员", [Role.Normal]: "普通用户", }[role] } export type FlagType = "red" | "blue" | "green" | "yellow" | null export interface TaskAsset { name: string url: string } export interface TutorialSlim { display: number title: string is_public: boolean } export interface TutorialReturn extends TutorialSlim { content: string } export interface TutorialIn { display: number title: string content: string } export interface ChallengeSlim { display: number title: string score: number pass_score: number | null submitted: boolean is_public: boolean } export interface ChallengeIn { display: number title: string content: string score: number is_public: boolean } export interface User { id: number username: string date_joined: Date last_login: Date role: Role is_active: boolean } export interface SubmissionOut { id: string userid: number username: string task_id: number task_display: number task_type: TASK_TYPE task_title: string score: number my_score: number flag?: FlagType zone?: "featured" | "low" | "pending" | null submit_count: number view_count: number created: Date modified: Date } export interface SubmissionAll { id: string userid: number username: string task_id: number task_display: number task_type: TASK_TYPE task_title: string score: number my_score: number flag?: FlagType html: "" css: "" js: "" submit_count: number view_count: number created: Date modified: Date } export interface UserTag { username: string classname: string } export interface SubmissionCountBucket { count_1: number count_2: number count_3: number count_4_plus: number } export interface ScoreBucket { range_1_2: number range_2_3: number range_3_4: number range_4_5: number range_5: number } export interface FlagStats { red: number blue: number green: number yellow: number } export interface TopViewedItem { username: string classname: string view_count: number submission_id: string } export interface TaskStatsOut { submitted_count: number unsubmitted_count: number average_score: number | null unrated_count: number unsubmitted_users: UserTag[] unrated_users: UserTag[] submission_count_distribution: SubmissionCountBucket score_distribution: ScoreBucket flag_stats: FlagStats classes: string[] top_viewed: TopViewedItem[] } export type GradebookTaskType = "tutorial" | "challenge" export type GradebookGrade = "A" | "B" | "C" | "D" | "E" export interface GradebookQuery { classname: string task_type?: GradebookTaskType | "" username?: string include_all_tasks?: boolean } export interface GradebookTask { id: number display: number title: string task_type: GradebookTaskType submitted_count: number coverage: number included: boolean } export interface GradebookCell { score: number submitted: boolean submission_id: string | null } export interface GradebookRow { user_id: number username: string classname: string rank: number grade: GradebookGrade scores: Record tutorial_total: number challenge_total: number total_score: number average_score: number | null submitted_task_count: number missing_task_count: number } export interface GradebookOut { classname: string classes: string[] task_count: number included_task_count: number student_count: number coverage_threshold_count: number tasks: GradebookTask[] rows: GradebookRow[] } export interface ShowcaseItem { submission_id: string username: string task_title: string task_display: number score: number view_count: number html: string | null css: string | null js: string | null has_prompt_chain: boolean } export interface AwardSection { id: number name: string description: string item_ordering: string items: ShowcaseItem[] } export type ItemOrdering = "manual" | "awarded_at" | "score" | "view_count" export interface AwardManageIn { name: string description: string sort_order: number is_active: boolean item_ordering: ItemOrdering } export interface AwardManageOut extends AwardManageIn { id: number item_count: number } export interface AwardItemIn { submission_id: string sort_order: number } export interface AwardItemUpdateIn { sort_order: number } export interface ShowcaseSubmissionLookupOut { submission_id: string username: string task_title: string task_display: number score: number view_count: number has_prompt_chain: boolean } export interface AwardItemManageOut { id: number submission_id: string username: string task_title: string task_display: number score: number view_count: number sort_order: number awarded_at: string has_prompt_chain: boolean } export interface ShowcaseDetail { submission_id: string username: string task_title: string task_display: number score: number view_count: number html: string | null css: string | null js: string | null awards: string[] has_prompt_chain: boolean } export interface PromptRound { question: string source: string prompt_level: number | null assistant_msg_id?: number | null html: string | null css: string | null js: string | null }