/** * https://github.com/jinke18/educoder_weapp * @licence GPL-3.0 * @author jinke18 */ import {Account, Course, Exercise, Question, School, Ui} from "./eduapi" import {Session} from "./requests"; import {Cookie} from "./cookie"; /** * 客户端类,其method实现客户端各种操作,将接口Promise化, * 要在此处实现网络数据及cookie的缓存 */ export class Client{ constructor({session}={}){ if(!session) { this.session = new Session(); }else { this.session = session; } this.load_cached_cookies(); this.current_user = {}; this.callback={require_login: ()=>{}}; this.load_current_user(); } load_current_user(){ var value = wx.getStorageSync('current_user'); if(value) { this.current_user = value; console.log("read current_user from storage"); console.log(this.current_user); } } save_current_user(){ console.log("save current user to storage"); console.log(this.current_user); wx.setStorageSync("current_user", this.current_user); } clear_current_user(){ wx.setStorageSync("current_user", {}); } load_cached_cookies(){ try { var value = wx.getStorageSync('_educoder_session'); if (value) { this.session.set_cookie(new Cookie(value)) } var value = wx.getStorageSync("autologin_trustie"); if (value) { this.session.set_cookie(new Cookie(value)); } console.log("read cookies from wx.Storage:"); console.log(this.session.cookies); } catch (e) { // Do something when catch error console.error("there is not cached cookie") console.error(e); } } save_cookies(){ for(var cookie of Object.values(this.session.cookies)){ console.log("client save new cookie"); console.log(cookie); cookie.save(); } } onRequireLogin(cd){ this.callback.require_login = cd; } require_login(){ wx.redirectTo({ url: "../pages/login/login" }); wx.showToast({ title:"请先登陆", icon: "none", duration: 4000 }); } login({login, password, autologin, success, fail, complete}){ return new Promise((resolve, reject) => { Account.login({ session: this.session, login: login, password: password, autologin: autologin, fail: error => { if(typeof fail == "function") { fail(error); } reject(error); }, complete: complete, success: res => { this.save_cookies(); this.current_user = {...this.current_user, ...res.data}; console.log("current_user info update"); console.log(this.current_user); this.get_user_info(); if (typeof success == "function") { success(res); } resolve(res); } }); }); } logout({success, fail, complete}={}){ return new Promise((resolve, reject) => { Account.logout({session: this.session, success: res=>{ if(typeof success == "function") { success(res); } this.get_user_info(); resolve(res); }, fail: error=>{ if(typeof fail =="function"){ fail(error); } reject(error); }, complete: complete}); }) } register({login, password, code, success, fail, complete}){ return new Promise((resolve, reject) => { Account.register({session: this.session, login:login, password:password, code:code, complete:complete, success: res=>{ this.save_cookies(); if(typeof success == "function"){ success(res); } resolve(res); }, fail:error=>{ if(typeof fail == "function") { fail(error); } reject(error) } }); }); } reset_password({login, code, new_password, new_password_confirmation, success, fail, complete}){ return new Promise((resolve, reject) => { Account.reset_password({ session: this.session, login: login, code: code, new_password: new_password, new_password_confirmation: new_password_confirmation, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }) }) } attendance({success, fail, complete}={}){ return new Promise((resolve, reject)=>{ Account.attendance({ session: this.session, complete: complete, success: res => { if (typeof success == "function") { success(res); } resolve(res); }, fail: error => { if (typeof fail == "function") { fail(error); } reject(error); }}) }); } get_user_info({success, fail, complete}={}){ return new Promise((resolve, reject) => { Account.get_user_info({session: this.session, complete: complete, success: res=>{ this.current_user = {...this.current_user, ...res.data}; console.log("current_user info update"); console.log(this.current_user); if(typeof success == "function"){ success(res); } resolve(res); this.save_current_user(); this.save_user_info() }, fail: error=>{ this.callback.require_login(); if(typeof fail == "function"){ fail(error); } reject(error); } }) }); } save_user_info(){ const app = getApp(); const db = wx.cloud.database(); if(!app.globalData.openid || !this.current_user.login){ console.warn("save user info", "undifined data", app.globalData.openid, this.current_user.login) return; } console.log("saving user info") return db.collection("user").doc(this.current_user.login + "_" + app.globalData.openid).set({ data: { user_info: this.current_user, updatedAt: new Date(), cookies: this.session.cookies } }).then(res => { console.log("save user success", res); }).catch(console.error); } get_verification_code_for_register({login, success, fail, complete}){ return new Promise((resolve, reject) => { Account.get_verification_code({ session: this.session, login: login, type: 1, complete: complete, success: res => { if (typeof success == "function") { success(res); } resolve(res); }, fail: error => { if (typeof fail == "function") { fail(error); } reject(error); } }); }) } get_verification_code_for_reset_password({login, success, fail, complete}){ return new Promise((resolve, reject) => { Account.get_verification_code({ session: this.session, login: login, type: 2, complete: complete, success: res => { if (typeof success == "function") { success(res); } resolve(res); }, fail: error => { if (typeof fail == "function") { fail(error); } reject(error); } }); }) } upload_avatar({avatar_path, success, fail, complete}){ console.log("upload_avatar"); console.log(this.current_user); return new Promise((resolve, reject) => { Account.upload_avatar({ session: this.session, avatar_path: avatar_path, login: this.current_user.login||this.current_user.user_id, complete: complete, success: res => { if (typeof success == "function") { success(res); } resolve(res); }, fail: error => { if (typeof fail == "function") { fail(error); } reject(error); } }) }); } search_courses({limit=20, page=1, order="all", search="", success, fail, complete}={}){ return new Promise((resolve, reject) => { Course.search({session: this.session, page: page, order: order, search: search, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }); }); } get_course_info({course_id, success, fail, complete}){ return new Promise((resolve, reject) => { Course.get_course_info({ session: this.session, course_id: course_id, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }) }); } get_user_courses({category="",status="",sort_by="",sort_direction="",page=1, per_page=16, success, fail, complete}={}){ return new Promise((resolve, reject) => { Account.get_user_courses({ session: this.session, category: category, status: status, sort_by: sort_by, sort_direction: sort_direction, page: page, per_page: per_page, login: this.current_user.login, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }); }); } create_course({data, success, fail, complete}){ return new Promise((resolve,reject)=>{ Course.create({ session: this.session, data: data, complete: complete, success: res => { if (typeof success == "function") { success(res); } resolve(res); }, fail: error => { if (typeof fail == "function") { fail(error); } reject(error); } }) }); } join_course({invite_code, professor=null,assistant_professor=null,student=null, success, fail, complete}){ return new Promise((resolve, reject)=>{ Course.join({session: this.session, invite_code: invite_code, professor: professor, assistant_professor: assistant_professor, student: student, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }) }); } get_course_files({course_id, page_size=15, page=1,search="",sort=0, sort_type="created_on", success, fail, complete}){ return new Promise((resolve, reject) => { Course.get_files({ session: this.session,course_id:course_id, page_size: page_size, page:page, search: search, sort: sort, sort_type: sort_type, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); }; resolve(res); }, fail: error=>{ if(typeof success == "function"){ fail(error); } reject(error); } }); }); } get_course_students({course_id, order=1,sort="asc",page=1, limit=20, course_group_id="", success, fail, complete}){ return new Promise((resolve, reject) => { Course.get_students({ session: this.session, course_id: course_id, order: order, sort: sort, page: page, limit: limit, course_group_id: course_group_id, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); }; resolve(res); }, fail: error=>{ if(typeof success == "function"){ fail(error); } reject(error); } }) }) } search_exercises({course_id, type="", page=1, limit=15, success, fail, complete}){ return new Promise((resolve, reject) => { Exercise.search({ session: this.session, course_id: course_id, type: type, page: page, limit: limit, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); }; resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }) }); } start_answer_exercise({exercise_id, success, fail, complete}){ return new Promise((resolve, reject) => { Exercise.start_answer({ session: this.session, exercise_id: exercise_id, login: this.current_user.login, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); }; resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }) }); } answer_question({question_id, exercise_choice_id,answer_text ,success, fail, complete}){ return new Promise((resolve, reject) =>{ Question.answer({ session: this.session, question_id: question_id, answer_text: answer_text, exercise_choice_id: exercise_choice_id, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); }; resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }) } ); } create_question({exercise_id, data,success, fail, complete}){ return new Promise((resolve, reject) => { Question.create({ session: this.session, exercise_id, data, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }); }); } update_question({question_id, data, success, fail, complete}){ return new Promise((resolve, reject) => { Question.update({ session: this.session, question_id, data, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }); }); } create_exercise({course_id ,exercise_name, exercise_description, success, fail, complete}){ return new Promise((resolve, reject) => { Exercise.create({ session: this.session, course_id, exercise_name, exercise_description, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }); }); } update_exercise({exercise_id, exercise_name, exercise_description, success, fail, complete}){ return new Promise((resolve, reject) => { Exercise.update({ session: this.session, exercise_id, exercise_name, exercise_description, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }) }) } get_exercise_edit({exercise_id, success, fail, complete}){ return new Promise((resolve, reject) => { Exercise.get_edit({ session: this.session, exercise_id, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }) }); } publish_exercise({course_id, exercise_ids, end_time, success, fail, complete}){ return new Promise((resolve, reject) => { Exercise.publish({ session: this.session, course_id, exercise_ids, end_time, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); } resolve(res); }, fail: error=>{ if(typeof fail == "function"){ fail(error); } reject(error); } }) }) } /** * @todo change limit default 10 */ get_exercise_result({ exercise_id, sort = "asc", page = 1, limit=50, success, fail, complete}){ return new Promise((resolve, reject)=>{ Exercise.get_result({ session: this.session, exercise_id, sort, page, limit, success: res => { if (typeof success == "function") { success(res); } resolve(res); }, fail: error => { if (typeof fail == "function") { fail(error); } reject(error); } }) }) } get_exercise_grade({exercise_id,order="end_at", search="", success, fail, complete}){ return new Promise((resolve, reject) => { Exercise.get_grade({ session: this.session, exercise_id, order, search, complete: complete, success: res => { if (typeof success == "function") { success(res); } resolve(res); }, fail: error => { if (typeof fail == "function") { fail(error); } reject(error); } }); }); } save_exercise({exercise_id, success, fail, complete}){ return new Promise((resolve, reject) => { Exercise.save({ session: this.session, exercise_id: exercise_id, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); }; resolve(res); }, fail: error=>{ if(typeof success == "function"){ fail(error); } reject(error); } }) }); } commit_exercise({exercise_id, commit_method=1, success, fail , complete}){ return new Promise((resolve, reject) => { Exercise.commit({ session: this.session, exercise_id: exercise_id, commit_method: commit_method, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); }; resolve(res); }, fail: error=>{ if(typeof success == "function"){ fail(error); } reject(error); } }) }); } search_schools({search = "", success, fail, complete} = {}){ return new Promise((resolve, reject) => { School.search({ session: this.session, search: search, complete: complete, success: res => { if (typeof success == "function") { success(res); } resolve(res); }, fail: error => { if (typeof fail == "function") { fail(error); } reject(error); } }); }); } get_home_page({success, fail, complete}={}){ return new Promise((resolve, reject) => { Ui.get_home_page({ session: this.session, complete: complete, success: res=>{ if(typeof success == "function"){ success(res); }; resolve(res); }, fail: error=>{ if(typeof success == "function"){ fail(error); } reject(error); } }) }) } }