/// /// /// import * as Request from 'request'; import { Observable } from 'rx'; import { parser } from '../helpers/parser'; import { Course } from '../models/course'; import { IUserLogin, ISearchCoursesOption } from '../utils/interfaces' export interface IProcedureResult { response: any, body: string, result: TResult } export class Procedure { url: string = null; method: string = null; user: IUserLogin = null; followRedirect: boolean = true; queryData: { [id: string]: string } = null; formData: { [id: string]: string } = null; tmpData: any = {}; constructor (url: string, method: string, user: IUserLogin) { this.url = url; this.method = method; this.user = user; } form (formData: { [id: string]: string }): void { this.formData = formData; } run (): Observable> { return Observable.create>((observer) => { Request({ uri: this.url, method: this.method, followRedirect: this.followRedirect, qs: this.queryData, form: this.formData, jar: this.user.jar }, (error, response, body) => { if (error) { observer.onError(error); } else { observer.onNext({ response: response, body: body , result: null}); observer.onCompleted(); } }); }).retry(3); } } export class AppSearchCoursesPreProcedure extends Procedure { constructor (user: IUserLogin) { super('http://eams.uestc.edu.cn/eams/publicSearch.action', 'GET', user); } run (): Observable> { return super.run().map((res) => { res.result = true; return res; }); } } export class AppSearchCoursesProcedure extends Procedure { constructor (option: ISearchCoursesOption, user: IUserLogin) { super('http://eams.uestc.edu.cn/eams/publicSearch!search.action', 'POST', user); this.form({ 'lesson.course.name': option.name || '', 'teacher.name': option.instructor || '', 'limitGroup.grade': option.grade || '' }); } run (): Observable> { return super.run().flatMap((res) => { return parser.getAppCourses(res.body).map((courses) => { res.result = courses; return res; }); }); } } export class UserEnsureLoginProcedure extends Procedure { constructor (user: IUserLogin) { super('http://portal.uestc.edu.cn/login.portal', 'GET', user); this.tmpData.user = user; this.followRedirect = false; } run (): Observable> { return super.run().flatMap((x) => { if(x.response.statusCode === 302) { x.result = true; return Observable.return(x); } return new UserLoginProcedure(this.tmpData.user).run().map((x) => { return x; }); }) } } export class UserLoginProcedure extends Procedure { constructor (user: IUserLogin) { super('https://uis.uestc.edu.cn/amserver/UI/Login', 'POST', user); this.form({ 'IDToken0': '', 'IDToken1': user.id, 'IDToken2': user.password, 'IDButton': 'Submit', 'goto': 'aHR0cDovL3BvcnRhbC51ZXN0Yy5lZHUuY24vbG9naW4ucG9ydGFs', 'encoded': 'true', 'gx_charset': 'UTF-8' }); } run (): Observable> { return super.run().map((x) => { x.result = (x.response.statusCode === 302); return x; }); } }