|
|
@@ -0,0 +1,227 @@
|
|
|
+import type { IStudio } from "../auth/Studio"
|
|
|
+import type { IUser } from "../auth/User"
|
|
|
+import type { IChannel } from "../channel/Channel"
|
|
|
+import type { _TRole } from "./Auth"
|
|
|
+
|
|
|
+export interface ICourseListApiResponse {
|
|
|
+ article: string;
|
|
|
+ title: string;
|
|
|
+ level: string;
|
|
|
+ children: number;
|
|
|
+}
|
|
|
+
|
|
|
+export interface ICourseDataRequest {
|
|
|
+ id?: string; //课程ID
|
|
|
+ title: string; //标题
|
|
|
+ subtitle?: string; //副标题
|
|
|
+ summary?: string; //副标题
|
|
|
+ content?: string | null;
|
|
|
+ sign_up_message?: string | null;
|
|
|
+ cover?: string; //封面图片文件名
|
|
|
+ teacher_id?: string; //UserID
|
|
|
+ publicity: number; //类型-公开/内部
|
|
|
+ anthology_id?: string; //文集ID
|
|
|
+ channel_id?: string; //标准答案channel
|
|
|
+ start_at?: string; //课程开始时间
|
|
|
+ end_at?: string; //课程结束时间
|
|
|
+ sign_up_start_at: string | null; //报名开始时间
|
|
|
+ sign_up_end_at: string | null; //报名结束时间
|
|
|
+ join: string;
|
|
|
+ request_exp: string;
|
|
|
+ number: number;
|
|
|
+}
|
|
|
+export type TCourseRole =
|
|
|
+ | "owner"
|
|
|
+ | "teacher"
|
|
|
+ | "manager"
|
|
|
+ | "assistant"
|
|
|
+ | "student";
|
|
|
+export type TCourseJoinMode = "invite" | "manual" | "open";
|
|
|
+export type TCourseExpRequest = "none" | "begin-end" | "daily";
|
|
|
+
|
|
|
+export interface IMember {
|
|
|
+ role: TCourseRole;
|
|
|
+ status: TCourseMemberStatus;
|
|
|
+}
|
|
|
+export interface ICourseDataResponse {
|
|
|
+ id: string; //课程ID
|
|
|
+ title: string; //标题
|
|
|
+ subtitle: string; //副标题
|
|
|
+ summary?: string; //副标题
|
|
|
+ sign_up_message?: string | null; //报名弹窗消息
|
|
|
+ teacher?: IUser; //UserID
|
|
|
+ course_count?: number; //课程数
|
|
|
+ publicity: number; //类型-公开/内部
|
|
|
+ anthology_id?: string; //文集ID
|
|
|
+ anthology_title?: string; //文集标题
|
|
|
+ anthology_owner?: IStudio; //文集拥有者
|
|
|
+ channel_id: string; //标准答案ID
|
|
|
+ channel_name?: string; //文集标题
|
|
|
+ channel_owner?: IStudio; //文集拥有者
|
|
|
+ studio?: IStudio; //课程拥有者
|
|
|
+ start_at: string; //课程开始时间
|
|
|
+ end_at: string; //课程结束时间
|
|
|
+ sign_up_start_at: string; //报名开始时间
|
|
|
+ sign_up_end_at: string; //报名结束时间
|
|
|
+ content: string; //简介
|
|
|
+ cover: string; //封面图片文件名
|
|
|
+ cover_url?: string[]; //封面图片文件名
|
|
|
+ member_count: number;
|
|
|
+ join: TCourseJoinMode; //报名方式
|
|
|
+ request_exp: TCourseExpRequest;
|
|
|
+ my_status?: TCourseMemberStatus;
|
|
|
+ my_status_id?: string;
|
|
|
+ count_progressing?: number;
|
|
|
+ number: number;
|
|
|
+ members?: IMember[];
|
|
|
+ my_role?: TCourseRole;
|
|
|
+ created_at: string; //创建时间
|
|
|
+ updated_at: string; //修改时间
|
|
|
+}
|
|
|
+export interface ICourseResponse {
|
|
|
+ ok: boolean;
|
|
|
+ message: string;
|
|
|
+ data: ICourseDataResponse;
|
|
|
+}
|
|
|
+export interface ICourseListResponse {
|
|
|
+ ok: boolean;
|
|
|
+ message: string;
|
|
|
+ data: {
|
|
|
+ rows: ICourseDataResponse[];
|
|
|
+ count: number;
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+export interface ICourseCreateRequest {
|
|
|
+ title: string;
|
|
|
+ lang: string;
|
|
|
+ studio: string;
|
|
|
+}
|
|
|
+
|
|
|
+export interface IAnthologyCreateRequest {
|
|
|
+ title: string;
|
|
|
+ lang: string;
|
|
|
+ studio: string;
|
|
|
+}
|
|
|
+export interface ICourseNumberResponse {
|
|
|
+ ok: boolean;
|
|
|
+ message: string;
|
|
|
+ data: {
|
|
|
+ create: number;
|
|
|
+ teach: number;
|
|
|
+ study: number;
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+export type TCourseMemberStatus =
|
|
|
+ | "none" /*无*/
|
|
|
+ | "normal" /*开放课程直接加入*/
|
|
|
+ | "joined" /*开放课程已经加入*/
|
|
|
+ | "applied" /**学生已经报名 管理员尚未审核 */
|
|
|
+ | "canceled" /**学生取消报名 */
|
|
|
+ | "agreed" /**学生/助教已经接受邀请 */
|
|
|
+ | "disagreed" /**学生/助教已经拒绝邀请 */
|
|
|
+ | "left" /**学生自己退出 */
|
|
|
+ | "invited" /**管理员已经邀请学生加入 */
|
|
|
+ | "revoked" /**管理员撤销邀请 */
|
|
|
+ | "accepted" /**已经被管理员录取 */
|
|
|
+ | "rejected" /**报名已经被管理员拒绝 */
|
|
|
+ | "blocked"; /**被管理员清退 */
|
|
|
+
|
|
|
+export type TCourseMemberAction =
|
|
|
+ | "join" /*加入自学课程*/
|
|
|
+ | "apply" /**学生报名 */
|
|
|
+ | "cancel" /**学生取消报名 */
|
|
|
+ | "agree" /**学生/助教接受邀请 */
|
|
|
+ | "disagree" /**学生/助教拒绝邀请 */
|
|
|
+ | "leave" /**学生/助教自己退出 */
|
|
|
+ | "invite" /**管理员邀请学生加入 */
|
|
|
+ | "revoke" /**管理员撤销邀请 */
|
|
|
+ | "accept" /**管理员录取 */
|
|
|
+ | "reject" /**管理员拒绝 */
|
|
|
+ | "block"; /**管理员清退 */
|
|
|
+
|
|
|
+interface IActionMap {
|
|
|
+ action: TCourseMemberAction;
|
|
|
+ status: TCourseMemberStatus;
|
|
|
+}
|
|
|
+export const actionMap = (action: TCourseMemberAction) => {
|
|
|
+ const data: IActionMap[] = [
|
|
|
+ { action: "join", status: "joined" },
|
|
|
+ { action: "apply", status: "applied" },
|
|
|
+ { action: "cancel", status: "canceled" },
|
|
|
+ { action: "agree", status: "agreed" },
|
|
|
+ { action: "disagree", status: "disagreed" },
|
|
|
+ { action: "leave", status: "left" },
|
|
|
+ { action: "invite", status: "invited" },
|
|
|
+ { action: "revoke", status: "revoked" },
|
|
|
+ { action: "accept", status: "accepted" },
|
|
|
+ { action: "reject", status: "rejected" },
|
|
|
+ { action: "block", status: "blocked" },
|
|
|
+ ];
|
|
|
+
|
|
|
+ const current = data.find((value) => value.action === action);
|
|
|
+ return current?.status;
|
|
|
+};
|
|
|
+
|
|
|
+export interface ICourseMemberData {
|
|
|
+ id?: string;
|
|
|
+ user_id: string;
|
|
|
+ course_id: string;
|
|
|
+ course?: ICourseDataResponse;
|
|
|
+ channel_id?: string;
|
|
|
+ channel?: IChannel;
|
|
|
+ role?: TCourseRole;
|
|
|
+ operating?: "invite" | "sign_up";
|
|
|
+ user?: IUser;
|
|
|
+ editor?: IUser;
|
|
|
+ status?: TCourseMemberStatus;
|
|
|
+ created_at?: string;
|
|
|
+ updated_at?: string;
|
|
|
+}
|
|
|
+export interface ICourseMemberResponse {
|
|
|
+ ok: boolean;
|
|
|
+ message: string;
|
|
|
+ data: ICourseMemberData;
|
|
|
+}
|
|
|
+export interface ICourseMemberListResponse {
|
|
|
+ ok: boolean;
|
|
|
+ message: string;
|
|
|
+ data: {
|
|
|
+ rows: ICourseMemberData[];
|
|
|
+ role: TCourseRole;
|
|
|
+ count: number;
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+export interface ICourseMemberDeleteResponse {
|
|
|
+ ok: boolean;
|
|
|
+ message: string;
|
|
|
+ data: boolean;
|
|
|
+}
|
|
|
+
|
|
|
+export interface ICourseUser {
|
|
|
+ role: TCourseRole;
|
|
|
+ channel_id?: string | null;
|
|
|
+}
|
|
|
+export interface ICourseCurrUserResponse {
|
|
|
+ ok: boolean;
|
|
|
+ message: string;
|
|
|
+ data: ICourseUser;
|
|
|
+}
|
|
|
+
|
|
|
+export interface IExerciseListData {
|
|
|
+ user: IUser;
|
|
|
+ wbw: number;
|
|
|
+ translation: number;
|
|
|
+ question: number;
|
|
|
+ html: string;
|
|
|
+}
|
|
|
+export interface ICourseExerciseResponse {
|
|
|
+ ok: boolean;
|
|
|
+ message: string;
|
|
|
+ data: {
|
|
|
+ rows: IExerciseListData[];
|
|
|
+ count: number;
|
|
|
+ };
|
|
|
+}
|