Course.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import type { IStudio, IUser } from "./Auth";
  2. import type { IChannel } from "./channel";
  3. export interface ICourseListApiResponse {
  4. article: string;
  5. title: string;
  6. level: string;
  7. children: number;
  8. }
  9. export interface ICourseDataRequest {
  10. id?: string; //课程ID
  11. title: string; //标题
  12. subtitle?: string; //副标题
  13. summary?: string; //副标题
  14. content?: string | null;
  15. sign_up_message?: string | null;
  16. cover?: string; //封面图片文件名
  17. teacher_id?: string; //UserID
  18. publicity: number; //类型-公开/内部
  19. anthology_id?: string; //文集ID
  20. channel_id?: string; //标准答案channel
  21. start_at?: string; //课程开始时间
  22. end_at?: string; //课程结束时间
  23. sign_up_start_at: string | null; //报名开始时间
  24. sign_up_end_at: string | null; //报名结束时间
  25. join: string;
  26. request_exp: string;
  27. number: number;
  28. }
  29. export type TCourseRole =
  30. | "owner"
  31. | "teacher"
  32. | "manager"
  33. | "assistant"
  34. | "student";
  35. export type TCourseJoinMode = "invite" | "manual" | "open";
  36. export type TCourseExpRequest = "none" | "begin-end" | "daily";
  37. export interface IMember {
  38. role: TCourseRole;
  39. status: TCourseMemberStatus;
  40. }
  41. export interface ICourseDataResponse {
  42. id: string; //课程ID
  43. title: string; //标题
  44. subtitle: string; //副标题
  45. summary?: string; //副标题
  46. sign_up_message?: string | null; //报名弹窗消息
  47. teacher?: IUser; //UserID
  48. course_count?: number; //课程数
  49. publicity: number; //类型-公开/内部
  50. anthology_id?: string; //文集ID
  51. anthology_title?: string; //文集标题
  52. anthology_owner?: IStudio; //文集拥有者
  53. channel_id: string; //标准答案ID
  54. channel_name?: string; //文集标题
  55. channel_owner?: IStudio; //文集拥有者
  56. studio?: IStudio; //课程拥有者
  57. start_at: string; //课程开始时间
  58. end_at: string; //课程结束时间
  59. sign_up_start_at: string; //报名开始时间
  60. sign_up_end_at: string; //报名结束时间
  61. content: string; //简介
  62. cover: string; //封面图片文件名
  63. cover_url?: string[]; //封面图片文件名
  64. member_count: number;
  65. join: TCourseJoinMode; //报名方式
  66. request_exp: TCourseExpRequest;
  67. my_status?: TCourseMemberStatus;
  68. my_status_id?: string;
  69. count_progressing?: number;
  70. number: number;
  71. members?: IMember[];
  72. my_role?: TCourseRole;
  73. created_at: string; //创建时间
  74. updated_at: string; //修改时间
  75. }
  76. export interface ICourseResponse {
  77. ok: boolean;
  78. message: string;
  79. data: ICourseDataResponse;
  80. }
  81. export interface ICourseListResponse {
  82. ok: boolean;
  83. message: string;
  84. data: {
  85. rows: ICourseDataResponse[];
  86. count: number;
  87. };
  88. }
  89. export interface ICourseCreateRequest {
  90. title: string;
  91. lang: string;
  92. studio: string;
  93. }
  94. export interface IAnthologyCreateRequest {
  95. title: string;
  96. lang: string;
  97. studio: string;
  98. }
  99. export interface ICourseNumberResponse {
  100. ok: boolean;
  101. message: string;
  102. data: {
  103. create: number;
  104. teach: number;
  105. study: number;
  106. };
  107. }
  108. export type TCourseMemberStatus =
  109. | "none" /*无*/
  110. | "normal" /*开放课程直接加入*/
  111. | "joined" /*开放课程已经加入*/
  112. | "applied" /**学生已经报名 管理员尚未审核 */
  113. | "canceled" /**学生取消报名 */
  114. | "agreed" /**学生/助教已经接受邀请 */
  115. | "disagreed" /**学生/助教已经拒绝邀请 */
  116. | "left" /**学生自己退出 */
  117. | "invited" /**管理员已经邀请学生加入 */
  118. | "revoked" /**管理员撤销邀请 */
  119. | "accepted" /**已经被管理员录取 */
  120. | "rejected" /**报名已经被管理员拒绝 */
  121. | "blocked"; /**被管理员清退 */
  122. export type TCourseMemberAction =
  123. | "join" /*加入自学课程*/
  124. | "apply" /**学生报名 */
  125. | "cancel" /**学生取消报名 */
  126. | "agree" /**学生/助教接受邀请 */
  127. | "disagree" /**学生/助教拒绝邀请 */
  128. | "leave" /**学生/助教自己退出 */
  129. | "invite" /**管理员邀请学生加入 */
  130. | "revoke" /**管理员撤销邀请 */
  131. | "accept" /**管理员录取 */
  132. | "reject" /**管理员拒绝 */
  133. | "block"; /**管理员清退 */
  134. interface IActionMap {
  135. action: TCourseMemberAction;
  136. status: TCourseMemberStatus;
  137. }
  138. export const actionMap = (action: TCourseMemberAction) => {
  139. const data: IActionMap[] = [
  140. { action: "join", status: "joined" },
  141. { action: "apply", status: "applied" },
  142. { action: "cancel", status: "canceled" },
  143. { action: "agree", status: "agreed" },
  144. { action: "disagree", status: "disagreed" },
  145. { action: "leave", status: "left" },
  146. { action: "invite", status: "invited" },
  147. { action: "revoke", status: "revoked" },
  148. { action: "accept", status: "accepted" },
  149. { action: "reject", status: "rejected" },
  150. { action: "block", status: "blocked" },
  151. ];
  152. const current = data.find((value) => value.action === action);
  153. return current?.status;
  154. };
  155. export interface ICourseMemberData {
  156. id?: string;
  157. user_id: string;
  158. course_id: string;
  159. course?: ICourseDataResponse;
  160. channel_id?: string;
  161. channel?: IChannel;
  162. role?: TCourseRole;
  163. operating?: "invite" | "sign_up";
  164. user?: IUser;
  165. editor?: IUser;
  166. status?: TCourseMemberStatus;
  167. created_at?: string;
  168. updated_at?: string;
  169. }
  170. export interface ICourseMemberResponse {
  171. ok: boolean;
  172. message: string;
  173. data: ICourseMemberData;
  174. }
  175. export interface ICourseMemberListResponse {
  176. ok: boolean;
  177. message: string;
  178. data: {
  179. rows: ICourseMemberData[];
  180. role: TCourseRole;
  181. count: number;
  182. };
  183. }
  184. export interface ICourseMemberDeleteResponse {
  185. ok: boolean;
  186. message: string;
  187. data: boolean;
  188. }
  189. export interface ICourseUser {
  190. role: TCourseRole;
  191. channel_id?: string | null;
  192. }
  193. export interface ICourseCurrUserResponse {
  194. ok: boolean;
  195. message: string;
  196. data: ICourseUser;
  197. }
  198. export interface IExerciseListData {
  199. user: IUser;
  200. wbw: number;
  201. translation: number;
  202. question: number;
  203. html: string;
  204. }
  205. export interface ICourseExerciseResponse {
  206. ok: boolean;
  207. message: string;
  208. data: {
  209. rows: IExerciseListData[];
  210. count: number;
  211. };
  212. }