parent
65e94fae91
commit
4974bb14f1
@ -1,52 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradCourseTableParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradCourseTableApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.Course; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import cn.wustlinghang.wusthelper.rpc.response.RpcResponse; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
@Path("/course_table") |
|
||||||
@ApplicationScoped |
|
||||||
public class CourseTableApi { |
|
||||||
private final UndergradCourseTableApiService studentInfoApiService; |
|
||||||
private final UndergradCourseTableParser studentInfoPageParser; |
|
||||||
|
|
||||||
public CourseTableApi(UndergradCourseTableApiService studentInfoApiService, |
|
||||||
UndergradCourseTableParser studentInfoPageParser) { |
|
||||||
this.studentInfoApiService = studentInfoApiService; |
|
||||||
this.studentInfoPageParser = studentInfoPageParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public List<Course> get(@QueryParam("cookie") @NotNull String cookie, @QueryParam("term") String term) |
|
||||||
throws IOException, ApiException, ParseException { |
|
||||||
String html = studentInfoApiService.getPage(term, cookie); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie, @QueryParam("term") String term) |
|
||||||
throws IOException, ApiException { |
|
||||||
return studentInfoApiService.getPage(term, cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public List<Course> parse(String html) throws ParseException { |
|
||||||
return studentInfoPageParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,54 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradCreditStatusParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradCreditStatusApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import cn.wustlinghang.mywust.network.RequestClientOption; |
|
||||||
import cn.wustlinghang.wusthelper.rpc.response.RpcResponse; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Path("/credit_status") |
|
||||||
@ApplicationScoped |
|
||||||
public class CreditStatusApi { |
|
||||||
private final UndergradCreditStatusApiService creditStatusApiService; |
|
||||||
private final UndergradCreditStatusParser creditStatusParser; |
|
||||||
|
|
||||||
private final RequestClientOption option; |
|
||||||
|
|
||||||
public CreditStatusApi(UndergradCreditStatusApiService creditStatusApiService, |
|
||||||
UndergradCreditStatusParser creditStatusParser, |
|
||||||
RequestClientOption option) { |
|
||||||
this.creditStatusApiService = creditStatusApiService; |
|
||||||
this.creditStatusParser = creditStatusParser; |
|
||||||
this.option = option; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public String get(String cookie) throws IOException, ApiException, ParseException { |
|
||||||
String html = creditStatusApiService.getPage(cookie, option, false); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return creditStatusApiService.getPage(cookie, option, false); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public String parse(String html) throws ParseException { |
|
||||||
return creditStatusParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,50 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradScoreParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradScoreApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.Score; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import cn.wustlinghang.wusthelper.rpc.response.RpcResponse; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
@Path("/score") |
|
||||||
@ApplicationScoped |
|
||||||
public class ScoreApi { |
|
||||||
private final UndergradScoreApiService scoreApiService; |
|
||||||
private final UndergradScoreParser scoreParser; |
|
||||||
|
|
||||||
public ScoreApi(UndergradScoreApiService scoreApiService, UndergradScoreParser scoreParser) { |
|
||||||
this.scoreApiService = scoreApiService; |
|
||||||
this.scoreParser = scoreParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public List<Score> get(String cookie) throws IOException, ApiException, ParseException { |
|
||||||
String html = scoreApiService.getPage(cookie); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return scoreApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public List<Score> parse(String html) throws ParseException { |
|
||||||
return scoreParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradStudentInfoPageParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradStudentInfoApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Path("/student_info") |
|
||||||
@ApplicationScoped |
|
||||||
public class StudentInfoApi { |
|
||||||
private final UndergradStudentInfoApiService studentInfoApiService; |
|
||||||
private final UndergradStudentInfoPageParser studentInfoPageParser; |
|
||||||
|
|
||||||
public StudentInfoApi(UndergradStudentInfoApiService studentInfoApiService, |
|
||||||
UndergradStudentInfoPageParser studentInfoPageParser) { |
|
||||||
this.studentInfoApiService = studentInfoApiService; |
|
||||||
this.studentInfoPageParser = studentInfoPageParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public StudentInfo get(@QueryParam("cookie") @NotNull String cookie) throws IOException, ApiException, ParseException { |
|
||||||
return this.parse(this.agent(cookie)); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return studentInfoApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public StudentInfo parse(String html) throws ParseException { |
|
||||||
return studentInfoPageParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradTrainingPlanPageParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradTrainingPlanApiService; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Path("/training_plan") |
|
||||||
@ApplicationScoped |
|
||||||
public class TrainingPlanApi { |
|
||||||
private final UndergradTrainingPlanApiService trainingPlanApiService; |
|
||||||
private final UndergradTrainingPlanPageParser trainingPlanPageParser; |
|
||||||
|
|
||||||
public TrainingPlanApi(UndergradTrainingPlanApiService trainingPlanApiService, |
|
||||||
UndergradTrainingPlanPageParser trainingPlanPageParser) { |
|
||||||
this.trainingPlanApiService = trainingPlanApiService; |
|
||||||
this.trainingPlanPageParser = trainingPlanPageParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public String get(String cookie) throws IOException, ApiException, ParseException { |
|
||||||
String html = trainingPlanApiService.getPage(cookie); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return trainingPlanApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public String parse(String html) throws ParseException { |
|
||||||
return trainingPlanPageParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,14 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.api.json.handler; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import jakarta.ws.rs.core.Response; |
|
||||||
import jakarta.ws.rs.ext.ExceptionMapper; |
|
||||||
import jakarta.ws.rs.ext.Provider; |
|
||||||
|
|
||||||
@Provider |
|
||||||
public class ApiExceptionHandler extends ExceptionHandlerBase implements ExceptionMapper<ApiException> { |
|
||||||
@Override |
|
||||||
public Response toResponse(ApiException e) { |
|
||||||
return super.toResponse(e.getCodeValue(), e.toString(), "ApiExceptionHandler"); |
|
||||||
} |
|
||||||
} |
|
@ -1,32 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.services; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.network.RequestClientOption; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@ApplicationScoped |
|
||||||
public class LoginService { |
|
||||||
private final RequestClientOption option; |
|
||||||
private final UndergraduateLogin undergraduateLogin; |
|
||||||
|
|
||||||
public LoginService(RequestClientOption option, |
|
||||||
UndergraduateLogin undergraduateLogin) { |
|
||||||
this.option = option; |
|
||||||
this.undergraduateLogin = undergraduateLogin; |
|
||||||
} |
|
||||||
|
|
||||||
public String login(String username, String password, boolean legacy) throws IOException, ApiException { |
|
||||||
if (legacy) { |
|
||||||
return undergraduateLogin.getLoginCookieLegacy(username, password, option); |
|
||||||
} else { |
|
||||||
return undergraduateLogin.getLoginCookie(username, password, option); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public boolean verify(String cookie) throws IOException { |
|
||||||
return !undergraduateLogin.checkCookiesFail(cookie); |
|
||||||
} |
|
||||||
} |
|
@ -1,60 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.services; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
|
||||||
import cn.wustlinghang.mywust.data.global.Course; |
|
||||||
import cn.wustlinghang.mywust.data.global.Score; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
@ApplicationScoped |
|
||||||
public class ParseService { |
|
||||||
private final UndergradCourseTableParser courseTableParser; |
|
||||||
private final UndergradScoreParser scoreParser; |
|
||||||
private final UndergradStudentInfoPageParser studentInfoPageParser; |
|
||||||
private final UndergradTrainingPlanPageParser trainingPlanPageParser; |
|
||||||
private final UndergradCreditStatusParser creditStatusParser; |
|
||||||
private final UndergradExamDelayParser examDelayParser; |
|
||||||
|
|
||||||
public ParseService(UndergradCourseTableParser courseTableParser, |
|
||||||
UndergradScoreParser scoreParser, |
|
||||||
UndergradStudentInfoPageParser studentInfoPageParser, |
|
||||||
UndergradTrainingPlanPageParser trainingPlanPageParser, |
|
||||||
UndergradCreditStatusParser creditStatusParser, |
|
||||||
UndergradExamDelayParser examDelayParser) { |
|
||||||
|
|
||||||
this.courseTableParser = courseTableParser; |
|
||||||
this.scoreParser = scoreParser; |
|
||||||
this.studentInfoPageParser = studentInfoPageParser; |
|
||||||
this.trainingPlanPageParser = trainingPlanPageParser; |
|
||||||
this.creditStatusParser = creditStatusParser; |
|
||||||
this.examDelayParser = examDelayParser; |
|
||||||
} |
|
||||||
|
|
||||||
public List<Course> parseCourseTable(String data) throws ParseException { |
|
||||||
return courseTableParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public List<Score> parseScore(String data) throws ParseException { |
|
||||||
return scoreParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public StudentInfo parseStudentInfo(String data) throws ParseException { |
|
||||||
return studentInfoPageParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public String parseTrainingPlan(String data) throws ParseException { |
|
||||||
return trainingPlanPageParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public String parseCreditStatus(String data) throws ParseException { |
|
||||||
return creditStatusParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public List<ExamDelayApplication> parseExamDelayApplications(String data) throws ParseException { |
|
||||||
return examDelayParser.parse(data); |
|
||||||
} |
|
||||||
} |
|
@ -1,62 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.services; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@ApplicationScoped |
|
||||||
public class RequestAgentService { |
|
||||||
private final UndergradCourseTableApiService courseTableApiService; |
|
||||||
private final UndergradScoreApiService scoreApiService; |
|
||||||
private final UndergradStudentInfoApiService studentInfoApiService; |
|
||||||
private final UndergradTrainingPlanApiService trainingPlanApiService; |
|
||||||
private final UndergradCreditStatusApiService creditStatusApiService; |
|
||||||
private final UndergradExamDelayApiService examDelayApiService; |
|
||||||
|
|
||||||
public RequestAgentService(UndergradCourseTableApiService courseTableApiService, |
|
||||||
UndergradScoreApiService scoreApiService, |
|
||||||
UndergradStudentInfoApiService studentInfoApiService, |
|
||||||
UndergradTrainingPlanApiService trainingPlanApiService, |
|
||||||
UndergradCreditStatusApiService creditStatusApiService, |
|
||||||
UndergradExamDelayApiService examDelayApiService) { |
|
||||||
|
|
||||||
this.courseTableApiService = courseTableApiService; |
|
||||||
this.scoreApiService = scoreApiService; |
|
||||||
this.studentInfoApiService = studentInfoApiService; |
|
||||||
this.trainingPlanApiService = trainingPlanApiService; |
|
||||||
this.creditStatusApiService = creditStatusApiService; |
|
||||||
this.examDelayApiService = examDelayApiService; |
|
||||||
} |
|
||||||
|
|
||||||
public String getStudentInfoPage(String cookie) throws IOException, ApiException { |
|
||||||
return studentInfoApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getCourseTable(String cookie, String term) throws IOException, ApiException { |
|
||||||
return courseTableApiService.getPage(term, cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getScore(String cookie) throws IOException, ApiException { |
|
||||||
return scoreApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getTrainingPlan(String cookie) throws IOException, ApiException { |
|
||||||
return trainingPlanApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getCreditStatus(String cookie) throws IOException, ApiException { |
|
||||||
return creditStatusApiService.getPage(cookie, null, false); |
|
||||||
} |
|
||||||
|
|
||||||
public UndergradExamDelayApiService.ExamActivity[] getExamActivities(String cookie, String term) |
|
||||||
throws IOException, ApiException { |
|
||||||
return examDelayApiService.getActivities(term, cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getExamDelayApplications(String cookie, String term, String activityId) |
|
||||||
throws IOException, ApiException { |
|
||||||
return examDelayApiService.getPage(term, activityId, cookie); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,16 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad; |
||||||
|
|
||||||
|
import io.quarkus.runtime.Startup; |
||||||
|
import jakarta.annotation.PostConstruct; |
||||||
|
import jakarta.inject.Singleton; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@Startup |
||||||
|
@Singleton |
||||||
|
public class Main { |
||||||
|
@PostConstruct |
||||||
|
public void run() { |
||||||
|
log.info("Undergrad service started."); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.global.Course; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/course_table") |
||||||
|
@ApplicationScoped |
||||||
|
public class CourseTableApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public CourseTableApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public List<Course> get(@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") String term) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie, term)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") String term) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getCourseTable(cookie, term); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<Course> parse(String html) throws RpcException { |
||||||
|
return parseService.parseCourseTable(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Path("/credit_status") |
||||||
|
@ApplicationScoped |
||||||
|
public class CreditStatusApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public CreditStatusApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public String get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
String html = this.agent(cookie); |
||||||
|
return this.parse(html); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getCreditStatus(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public String parse(String html) throws RpcException { |
||||||
|
return parseService.parseCreditStatus(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradExamDelayApiService; |
||||||
|
import cn.wustlinghang.mywust.data.global.Score; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/exam_activities") |
||||||
|
@ApplicationScoped |
||||||
|
public class ExamActivitiesApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
|
||||||
|
public ExamActivitiesApi(RequestAgentService agentService) { |
||||||
|
this.agentService = agentService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public UndergradExamDelayApiService.ExamActivity[] get( |
||||||
|
@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term) |
||||||
|
throws RpcException { |
||||||
|
return this.agent(cookie, term); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public UndergradExamDelayApiService.ExamActivity[] agent( |
||||||
|
@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getExamActivities(cookie, term); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<Score> parse(String html) throws RpcException { |
||||||
|
throw RpcException.ApiNotImplement(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/exam_delay_application") |
||||||
|
@ApplicationScoped |
||||||
|
public class ExamDelayApplicationApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public ExamDelayApplicationApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public List<ExamDelayApplication> get( |
||||||
|
@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term, |
||||||
|
@QueryParam("activity_id") @NotNull String activityId) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie, term, activityId)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term, |
||||||
|
@QueryParam("activity_id") @NotNull String activityId) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getExamDelayApplications(cookie, term, activityId); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<ExamDelayApplication> parse(String html) throws RpcException { |
||||||
|
return parseService.parseExamDelayApplications(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.global.Score; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/score") |
||||||
|
@ApplicationScoped |
||||||
|
public class ScoreApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public ScoreApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public List<Score> get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getScore(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<Score> parse(String html) throws RpcException { |
||||||
|
return parseService.parseScore(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.global.StudentInfo; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Path("/student_info") |
||||||
|
@ApplicationScoped |
||||||
|
public class StudentInfoApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public StudentInfoApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public StudentInfo get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getStudentInfoPage(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public StudentInfo parse(String html) throws RpcException { |
||||||
|
return parseService.parseStudentInfo(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Path("/training_plan") |
||||||
|
@ApplicationScoped |
||||||
|
public class TrainingPlanApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public TrainingPlanApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public String get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getTrainingPlan(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public String parse(String html) throws RpcException { |
||||||
|
return parseService.parseTrainingPlan(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json.handler; |
||||||
|
|
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.ws.rs.core.Response; |
||||||
|
import jakarta.ws.rs.ext.ExceptionMapper; |
||||||
|
import jakarta.ws.rs.ext.Provider; |
||||||
|
|
||||||
|
@Provider |
||||||
|
public class RpcExceptionHandler extends BaseExceptionHandler implements ExceptionMapper<RpcException> { |
||||||
|
@Override |
||||||
|
public Response toResponse(RpcException e) { |
||||||
|
return super.toResponse( |
||||||
|
e.getCode(), |
||||||
|
e.toString(), |
||||||
|
"RpcExceptionHandler"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json.handler; |
||||||
|
|
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.ws.rs.WebApplicationException; |
||||||
|
import jakarta.ws.rs.core.Response; |
||||||
|
import jakarta.ws.rs.ext.ExceptionMapper; |
||||||
|
import jakarta.ws.rs.ext.Provider; |
||||||
|
|
||||||
|
@Provider |
||||||
|
public class WebApplicationExceptionHandler extends BaseExceptionHandler implements ExceptionMapper<WebApplicationException> { |
||||||
|
@Override |
||||||
|
public Response toResponse(WebApplicationException e) { |
||||||
|
return super.toResponse( |
||||||
|
e.getResponse().getStatus(), |
||||||
|
RpcException.toIntCode( |
||||||
|
UndergradRpcException.UNDERGRAD_MODULE, |
||||||
|
UndergradRpcException.SubModuleCode.COMMON.ordinal(), |
||||||
|
UndergradRpcException.TypeCode.OTHER_EXCEPTION.ordinal() * 100 |
||||||
|
+ UndergradRpcException.ErrorCode.REQUEST_INVALID.ordinal() |
||||||
|
), |
||||||
|
e.getMessage(), |
||||||
|
"WebApplicationExceptionHandler" |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.bean; |
package cn.wustlinghang.wusthelper.internal.undergrad.bean; |
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper; |
import com.fasterxml.jackson.databind.ObjectMapper; |
||||||
import jakarta.enterprise.context.ApplicationScoped; |
import jakarta.enterprise.context.ApplicationScoped; |
@ -1,4 +1,4 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.bean; |
package cn.wustlinghang.wusthelper.internal.undergrad.bean; |
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
||||||
import jakarta.enterprise.context.ApplicationScoped; |
import jakarta.enterprise.context.ApplicationScoped; |
@ -1,4 +1,4 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.bean; |
package cn.wustlinghang.wusthelper.internal.undergrad.bean; |
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
@ -0,0 +1,73 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.exception; |
||||||
|
|
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
|
||||||
|
import java.util.StringJoiner; |
||||||
|
|
||||||
|
public class UndergradRpcException extends RpcException { |
||||||
|
public static final int UNDERGRAD_MODULE = 1; |
||||||
|
|
||||||
|
public UndergradRpcException(TypeCode typeCode, |
||||||
|
SubModuleCode subModuleCode, |
||||||
|
ErrorCode errorCode) { |
||||||
|
super(UNDERGRAD_MODULE, |
||||||
|
typeCode.ordinal(), |
||||||
|
subModuleCode.ordinal() * 100 + errorCode.ordinal(), |
||||||
|
new StringJoiner("-") |
||||||
|
.add("UNDERGRAD") |
||||||
|
.add(typeCode.name()) |
||||||
|
.add(subModuleCode.name()) |
||||||
|
.add(errorCode.name()) |
||||||
|
.toString() |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 异常类型编码 |
||||||
|
*/ |
||||||
|
public enum TypeCode { |
||||||
|
// 网络异常类型
|
||||||
|
NETWORK_EXCEPTION, |
||||||
|
// 参数异常类型
|
||||||
|
PARAM_EXCEPTION, |
||||||
|
// 权限认证异常类型
|
||||||
|
AUTH_EXCEPTION, |
||||||
|
// 网页解析异常类型
|
||||||
|
PARSE_EXCEPTION, |
||||||
|
// 其他的异常类型
|
||||||
|
OTHER_EXCEPTION |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 子模块编码 |
||||||
|
*/ |
||||||
|
public enum SubModuleCode { |
||||||
|
COMMON, AUTH, COURSE_TABLE, CREDIT_STATUS, SCORE, |
||||||
|
STUDENT_INFO, TRAINING_PLAN, EXAM_ACTIVITIES, EXAM_DELAY_APPLICATION |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 具体错误编码 |
||||||
|
*/ |
||||||
|
public enum ErrorCode { |
||||||
|
REQUEST_INVALID, |
||||||
|
PARAM_INVALID, |
||||||
|
COOKIE_INVALID, |
||||||
|
NETWORK_ERROR, |
||||||
|
PARSE_ERROR, |
||||||
|
|
||||||
|
// 需要评教
|
||||||
|
NEED_EVALUATE, |
||||||
|
|
||||||
|
AUTH_PASSWORD_WRONG, |
||||||
|
// 用户不存在
|
||||||
|
AUTH_USER_NOT_EXISTS, |
||||||
|
// 封号
|
||||||
|
AUTH_USER_BANNED, |
||||||
|
// 用户账号禁用
|
||||||
|
AUTH_USER_DISABLED, |
||||||
|
// 用户账号需要更改
|
||||||
|
AUTH_NEED_CHANGE_PASSWORD, |
||||||
|
AUTH_UNKNOWN_ERROR |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,78 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.services; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.network.RequestClientOption; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@ApplicationScoped |
||||||
|
public class LoginService { |
||||||
|
private final RequestClientOption option; |
||||||
|
private final UndergraduateLogin undergraduateLogin; |
||||||
|
|
||||||
|
public LoginService(RequestClientOption option, |
||||||
|
UndergraduateLogin undergraduateLogin) { |
||||||
|
this.option = option; |
||||||
|
this.undergraduateLogin = undergraduateLogin; |
||||||
|
} |
||||||
|
|
||||||
|
public String login(String username, String password, boolean legacy) throws UndergradRpcException { |
||||||
|
try { |
||||||
|
if (legacy) { |
||||||
|
return undergraduateLogin.getLoginCookieLegacy(username, password, option); |
||||||
|
} else { |
||||||
|
return undergraduateLogin.getLoginCookie(username, password, option); |
||||||
|
} |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.AUTH, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean verify(String cookie) throws UndergradRpcException { |
||||||
|
try { |
||||||
|
return !undergraduateLogin.checkCookiesFail(cookie); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.AUTH, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private UndergradRpcException wrapApiException(ApiException e) { |
||||||
|
UndergradRpcException.ErrorCode errorCode = switch (e.getCode()) { |
||||||
|
case NETWORK_EXCEPTION -> UndergradRpcException.ErrorCode.NETWORK_ERROR; |
||||||
|
case UNI_LOGIN_PASSWORD_WRONG -> UndergradRpcException.ErrorCode.AUTH_PASSWORD_WRONG; |
||||||
|
case UNI_LOGIN_USER_NOT_EXISTS -> UndergradRpcException.ErrorCode.AUTH_USER_NOT_EXISTS; |
||||||
|
case UNI_LOGIN_USER_BANNED -> UndergradRpcException.ErrorCode.AUTH_USER_BANNED; |
||||||
|
case UNI_LOGIN_USER_DISABLED -> UndergradRpcException.ErrorCode.AUTH_USER_DISABLED; |
||||||
|
case UNI_LOGIN_NEED_CHANGE_PASSWORD -> UndergradRpcException.ErrorCode.AUTH_NEED_CHANGE_PASSWORD; |
||||||
|
case UNI_LOGIN_USER_NOT_ONLY -> UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
case UNI_LOGIN_NO_REGISTER -> UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
case UNI_LOGIN_NEED_TFA -> UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
default -> { |
||||||
|
log.error("本科生:登录代理请求异常,异常未处理"); |
||||||
|
log.error("异常:", e); |
||||||
|
yield UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.AUTH, |
||||||
|
errorCode |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,132 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.services; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
||||||
|
import cn.wustlinghang.mywust.data.global.Course; |
||||||
|
import cn.wustlinghang.mywust.data.global.Score; |
||||||
|
import cn.wustlinghang.mywust.data.global.StudentInfo; |
||||||
|
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@ApplicationScoped |
||||||
|
public class ParseService { |
||||||
|
private final UndergradCourseTableParser courseTableParser; |
||||||
|
private final UndergradScoreParser scoreParser; |
||||||
|
private final UndergradStudentInfoPageParser studentInfoPageParser; |
||||||
|
private final UndergradTrainingPlanPageParser trainingPlanPageParser; |
||||||
|
private final UndergradCreditStatusParser creditStatusParser; |
||||||
|
private final UndergradExamDelayParser examDelayParser; |
||||||
|
|
||||||
|
public ParseService(UndergradCourseTableParser courseTableParser, |
||||||
|
UndergradScoreParser scoreParser, |
||||||
|
UndergradStudentInfoPageParser studentInfoPageParser, |
||||||
|
UndergradTrainingPlanPageParser trainingPlanPageParser, |
||||||
|
UndergradCreditStatusParser creditStatusParser, |
||||||
|
UndergradExamDelayParser examDelayParser) { |
||||||
|
|
||||||
|
this.courseTableParser = courseTableParser; |
||||||
|
this.scoreParser = scoreParser; |
||||||
|
this.studentInfoPageParser = studentInfoPageParser; |
||||||
|
this.trainingPlanPageParser = trainingPlanPageParser; |
||||||
|
this.creditStatusParser = creditStatusParser; |
||||||
|
this.examDelayParser = examDelayParser; |
||||||
|
} |
||||||
|
|
||||||
|
public List<Course> parseCourseTable(String data) throws UndergradRpcException { |
||||||
|
try { |
||||||
|
if (data.contains("评教")) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.COURSE_TABLE, |
||||||
|
UndergradRpcException.ErrorCode.NEED_EVALUATE |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return courseTableParser.parse(data); |
||||||
|
|
||||||
|
} catch (UndergradRpcException e) { |
||||||
|
throw e; |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.COURSE_TABLE, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public List<Score> parseScore(String data) throws RpcException { |
||||||
|
try { |
||||||
|
if (data.contains("评教")) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.SCORE, |
||||||
|
UndergradRpcException.ErrorCode.NEED_EVALUATE |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return scoreParser.parse(data); |
||||||
|
|
||||||
|
} catch (UndergradRpcException e) { |
||||||
|
throw e; |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.SCORE, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public StudentInfo parseStudentInfo(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return studentInfoPageParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.STUDENT_INFO, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String parseTrainingPlan(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return trainingPlanPageParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.TRAINING_PLAN, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String parseCreditStatus(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return creditStatusParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.CREDIT_STATUS, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public List<ExamDelayApplication> parseExamDelayApplications(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return examDelayParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.EXAM_DELAY_APPLICATION, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,166 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.services; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.network.RequestClientOption; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@ApplicationScoped |
||||||
|
public class RequestAgentService { |
||||||
|
private final UndergradCourseTableApiService courseTableApiService; |
||||||
|
private final UndergradScoreApiService scoreApiService; |
||||||
|
private final UndergradStudentInfoApiService studentInfoApiService; |
||||||
|
private final UndergradTrainingPlanApiService trainingPlanApiService; |
||||||
|
private final UndergradCreditStatusApiService creditStatusApiService; |
||||||
|
private final UndergradExamDelayApiService examDelayApiService; |
||||||
|
|
||||||
|
private final RequestClientOption requestClientOption; |
||||||
|
|
||||||
|
public RequestAgentService(UndergradCourseTableApiService courseTableApiService, |
||||||
|
UndergradScoreApiService scoreApiService, |
||||||
|
UndergradStudentInfoApiService studentInfoApiService, |
||||||
|
UndergradTrainingPlanApiService trainingPlanApiService, |
||||||
|
UndergradCreditStatusApiService creditStatusApiService, |
||||||
|
UndergradExamDelayApiService examDelayApiService, |
||||||
|
RequestClientOption requestClientOption) { |
||||||
|
|
||||||
|
this.courseTableApiService = courseTableApiService; |
||||||
|
this.scoreApiService = scoreApiService; |
||||||
|
this.studentInfoApiService = studentInfoApiService; |
||||||
|
this.trainingPlanApiService = trainingPlanApiService; |
||||||
|
this.creditStatusApiService = creditStatusApiService; |
||||||
|
this.examDelayApiService = examDelayApiService; |
||||||
|
|
||||||
|
this.requestClientOption = requestClientOption; |
||||||
|
} |
||||||
|
|
||||||
|
public String getStudentInfoPage(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return studentInfoApiService.getPage(cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.STUDENT_INFO); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.STUDENT_INFO, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getCourseTable(String cookie, String term) throws RpcException { |
||||||
|
try { |
||||||
|
return courseTableApiService.getPage(term, cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.COURSE_TABLE); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.COURSE_TABLE, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getScore(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return scoreApiService.getPage(cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.SCORE); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.SCORE, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getTrainingPlan(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return trainingPlanApiService.getPage(cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.TRAINING_PLAN); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.TRAINING_PLAN, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getCreditStatus(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return creditStatusApiService.getPage(cookie, requestClientOption, false); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.CREDIT_STATUS); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.CREDIT_STATUS, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public UndergradExamDelayApiService.ExamActivity[] getExamActivities(String cookie, String term) |
||||||
|
throws RpcException { |
||||||
|
try { |
||||||
|
return examDelayApiService.getActivities(term, cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.EXAM_ACTIVITIES); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.EXAM_ACTIVITIES, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getExamDelayApplications(String cookie, String term, String activityId) |
||||||
|
throws RpcException { |
||||||
|
try { |
||||||
|
return examDelayApiService.getPage(term, activityId, cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.EXAM_DELAY_APPLICATION); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.EXAM_DELAY_APPLICATION, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private UndergradRpcException wrapApiException(ApiException e, UndergradRpcException.SubModuleCode subModuleCode) { |
||||||
|
return switch (e.getCode()) { |
||||||
|
case NETWORK_EXCEPTION -> new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
subModuleCode, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
case COOKIE_INVALID -> new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.AUTH_EXCEPTION, |
||||||
|
subModuleCode, |
||||||
|
UndergradRpcException.ErrorCode.COOKIE_INVALID |
||||||
|
); |
||||||
|
default -> { |
||||||
|
log.error("本科生:{}代理请求异常,异常未处理", subModuleCode.name()); |
||||||
|
log.error("异常:", e); |
||||||
|
yield new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.AUTH_EXCEPTION, |
||||||
|
subModuleCode, |
||||||
|
UndergradRpcException.ErrorCode.COOKIE_INVALID |
||||||
|
); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -1,52 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradCourseTableParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradCourseTableApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.Course; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import cn.wustlinghang.wusthelper.rpc.response.RpcResponse; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
@Path("/course_table") |
|
||||||
@ApplicationScoped |
|
||||||
public class CourseTableApi { |
|
||||||
private final UndergradCourseTableApiService studentInfoApiService; |
|
||||||
private final UndergradCourseTableParser studentInfoPageParser; |
|
||||||
|
|
||||||
public CourseTableApi(UndergradCourseTableApiService studentInfoApiService, |
|
||||||
UndergradCourseTableParser studentInfoPageParser) { |
|
||||||
this.studentInfoApiService = studentInfoApiService; |
|
||||||
this.studentInfoPageParser = studentInfoPageParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public List<Course> get(@QueryParam("cookie") @NotNull String cookie, @QueryParam("term") String term) |
|
||||||
throws IOException, ApiException, ParseException { |
|
||||||
String html = studentInfoApiService.getPage(term, cookie); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie, @QueryParam("term") String term) |
|
||||||
throws IOException, ApiException { |
|
||||||
return studentInfoApiService.getPage(term, cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public List<Course> parse(String html) throws ParseException { |
|
||||||
return studentInfoPageParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,54 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradCreditStatusParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradCreditStatusApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import cn.wustlinghang.mywust.network.RequestClientOption; |
|
||||||
import cn.wustlinghang.wusthelper.rpc.response.RpcResponse; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Path("/credit_status") |
|
||||||
@ApplicationScoped |
|
||||||
public class CreditStatusApi { |
|
||||||
private final UndergradCreditStatusApiService creditStatusApiService; |
|
||||||
private final UndergradCreditStatusParser creditStatusParser; |
|
||||||
|
|
||||||
private final RequestClientOption option; |
|
||||||
|
|
||||||
public CreditStatusApi(UndergradCreditStatusApiService creditStatusApiService, |
|
||||||
UndergradCreditStatusParser creditStatusParser, |
|
||||||
RequestClientOption option) { |
|
||||||
this.creditStatusApiService = creditStatusApiService; |
|
||||||
this.creditStatusParser = creditStatusParser; |
|
||||||
this.option = option; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public String get(String cookie) throws IOException, ApiException, ParseException { |
|
||||||
String html = creditStatusApiService.getPage(cookie, option, false); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return creditStatusApiService.getPage(cookie, option, false); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public String parse(String html) throws ParseException { |
|
||||||
return creditStatusParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,50 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradScoreParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradScoreApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.Score; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import cn.wustlinghang.wusthelper.rpc.response.RpcResponse; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
@Path("/score") |
|
||||||
@ApplicationScoped |
|
||||||
public class ScoreApi { |
|
||||||
private final UndergradScoreApiService scoreApiService; |
|
||||||
private final UndergradScoreParser scoreParser; |
|
||||||
|
|
||||||
public ScoreApi(UndergradScoreApiService scoreApiService, UndergradScoreParser scoreParser) { |
|
||||||
this.scoreApiService = scoreApiService; |
|
||||||
this.scoreParser = scoreParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public List<Score> get(String cookie) throws IOException, ApiException, ParseException { |
|
||||||
String html = scoreApiService.getPage(cookie); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return scoreApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public List<Score> parse(String html) throws ParseException { |
|
||||||
return scoreParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradStudentInfoPageParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradStudentInfoApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Path("/student_info") |
|
||||||
@ApplicationScoped |
|
||||||
public class StudentInfoApi { |
|
||||||
private final UndergradStudentInfoApiService studentInfoApiService; |
|
||||||
private final UndergradStudentInfoPageParser studentInfoPageParser; |
|
||||||
|
|
||||||
public StudentInfoApi(UndergradStudentInfoApiService studentInfoApiService, |
|
||||||
UndergradStudentInfoPageParser studentInfoPageParser) { |
|
||||||
this.studentInfoApiService = studentInfoApiService; |
|
||||||
this.studentInfoPageParser = studentInfoPageParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public StudentInfo get(@QueryParam("cookie") @NotNull String cookie) throws IOException, ApiException, ParseException { |
|
||||||
return this.parse(this.agent(cookie)); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return studentInfoApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public StudentInfo parse(String html) throws ParseException { |
|
||||||
return studentInfoPageParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradTrainingPlanPageParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradTrainingPlanApiService; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Path("/training_plan") |
|
||||||
@ApplicationScoped |
|
||||||
public class TrainingPlanApi { |
|
||||||
private final UndergradTrainingPlanApiService trainingPlanApiService; |
|
||||||
private final UndergradTrainingPlanPageParser trainingPlanPageParser; |
|
||||||
|
|
||||||
public TrainingPlanApi(UndergradTrainingPlanApiService trainingPlanApiService, |
|
||||||
UndergradTrainingPlanPageParser trainingPlanPageParser) { |
|
||||||
this.trainingPlanApiService = trainingPlanApiService; |
|
||||||
this.trainingPlanPageParser = trainingPlanPageParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public String get(String cookie) throws IOException, ApiException, ParseException { |
|
||||||
String html = trainingPlanApiService.getPage(cookie); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return trainingPlanApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public String parse(String html) throws ParseException { |
|
||||||
return trainingPlanPageParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,14 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.api.json.handler; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import jakarta.ws.rs.core.Response; |
|
||||||
import jakarta.ws.rs.ext.ExceptionMapper; |
|
||||||
import jakarta.ws.rs.ext.Provider; |
|
||||||
|
|
||||||
@Provider |
|
||||||
public class ApiExceptionHandler extends ExceptionHandlerBase implements ExceptionMapper<ApiException> { |
|
||||||
@Override |
|
||||||
public Response toResponse(ApiException e) { |
|
||||||
return super.toResponse(e.getCodeValue(), e.toString(), "ApiExceptionHandler"); |
|
||||||
} |
|
||||||
} |
|
@ -1,32 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.services; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.network.RequestClientOption; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@ApplicationScoped |
|
||||||
public class LoginService { |
|
||||||
private final RequestClientOption option; |
|
||||||
private final UndergraduateLogin undergraduateLogin; |
|
||||||
|
|
||||||
public LoginService(RequestClientOption option, |
|
||||||
UndergraduateLogin undergraduateLogin) { |
|
||||||
this.option = option; |
|
||||||
this.undergraduateLogin = undergraduateLogin; |
|
||||||
} |
|
||||||
|
|
||||||
public String login(String username, String password, boolean legacy) throws IOException, ApiException { |
|
||||||
if (legacy) { |
|
||||||
return undergraduateLogin.getLoginCookieLegacy(username, password, option); |
|
||||||
} else { |
|
||||||
return undergraduateLogin.getLoginCookie(username, password, option); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public boolean verify(String cookie) throws IOException { |
|
||||||
return !undergraduateLogin.checkCookiesFail(cookie); |
|
||||||
} |
|
||||||
} |
|
@ -1,60 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.services; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
|
||||||
import cn.wustlinghang.mywust.data.global.Course; |
|
||||||
import cn.wustlinghang.mywust.data.global.Score; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
@ApplicationScoped |
|
||||||
public class ParseService { |
|
||||||
private final UndergradCourseTableParser courseTableParser; |
|
||||||
private final UndergradScoreParser scoreParser; |
|
||||||
private final UndergradStudentInfoPageParser studentInfoPageParser; |
|
||||||
private final UndergradTrainingPlanPageParser trainingPlanPageParser; |
|
||||||
private final UndergradCreditStatusParser creditStatusParser; |
|
||||||
private final UndergradExamDelayParser examDelayParser; |
|
||||||
|
|
||||||
public ParseService(UndergradCourseTableParser courseTableParser, |
|
||||||
UndergradScoreParser scoreParser, |
|
||||||
UndergradStudentInfoPageParser studentInfoPageParser, |
|
||||||
UndergradTrainingPlanPageParser trainingPlanPageParser, |
|
||||||
UndergradCreditStatusParser creditStatusParser, |
|
||||||
UndergradExamDelayParser examDelayParser) { |
|
||||||
|
|
||||||
this.courseTableParser = courseTableParser; |
|
||||||
this.scoreParser = scoreParser; |
|
||||||
this.studentInfoPageParser = studentInfoPageParser; |
|
||||||
this.trainingPlanPageParser = trainingPlanPageParser; |
|
||||||
this.creditStatusParser = creditStatusParser; |
|
||||||
this.examDelayParser = examDelayParser; |
|
||||||
} |
|
||||||
|
|
||||||
public List<Course> parseCourseTable(String data) throws ParseException { |
|
||||||
return courseTableParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public List<Score> parseScore(String data) throws ParseException { |
|
||||||
return scoreParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public StudentInfo parseStudentInfo(String data) throws ParseException { |
|
||||||
return studentInfoPageParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public String parseTrainingPlan(String data) throws ParseException { |
|
||||||
return trainingPlanPageParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public String parseCreditStatus(String data) throws ParseException { |
|
||||||
return creditStatusParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public List<ExamDelayApplication> parseExamDelayApplications(String data) throws ParseException { |
|
||||||
return examDelayParser.parse(data); |
|
||||||
} |
|
||||||
} |
|
@ -1,62 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.services; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@ApplicationScoped |
|
||||||
public class RequestAgentService { |
|
||||||
private final UndergradCourseTableApiService courseTableApiService; |
|
||||||
private final UndergradScoreApiService scoreApiService; |
|
||||||
private final UndergradStudentInfoApiService studentInfoApiService; |
|
||||||
private final UndergradTrainingPlanApiService trainingPlanApiService; |
|
||||||
private final UndergradCreditStatusApiService creditStatusApiService; |
|
||||||
private final UndergradExamDelayApiService examDelayApiService; |
|
||||||
|
|
||||||
public RequestAgentService(UndergradCourseTableApiService courseTableApiService, |
|
||||||
UndergradScoreApiService scoreApiService, |
|
||||||
UndergradStudentInfoApiService studentInfoApiService, |
|
||||||
UndergradTrainingPlanApiService trainingPlanApiService, |
|
||||||
UndergradCreditStatusApiService creditStatusApiService, |
|
||||||
UndergradExamDelayApiService examDelayApiService) { |
|
||||||
|
|
||||||
this.courseTableApiService = courseTableApiService; |
|
||||||
this.scoreApiService = scoreApiService; |
|
||||||
this.studentInfoApiService = studentInfoApiService; |
|
||||||
this.trainingPlanApiService = trainingPlanApiService; |
|
||||||
this.creditStatusApiService = creditStatusApiService; |
|
||||||
this.examDelayApiService = examDelayApiService; |
|
||||||
} |
|
||||||
|
|
||||||
public String getStudentInfoPage(String cookie) throws IOException, ApiException { |
|
||||||
return studentInfoApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getCourseTable(String cookie, String term) throws IOException, ApiException { |
|
||||||
return courseTableApiService.getPage(term, cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getScore(String cookie) throws IOException, ApiException { |
|
||||||
return scoreApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getTrainingPlan(String cookie) throws IOException, ApiException { |
|
||||||
return trainingPlanApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getCreditStatus(String cookie) throws IOException, ApiException { |
|
||||||
return creditStatusApiService.getPage(cookie, null, false); |
|
||||||
} |
|
||||||
|
|
||||||
public UndergradExamDelayApiService.ExamActivity[] getExamActivities(String cookie, String term) |
|
||||||
throws IOException, ApiException { |
|
||||||
return examDelayApiService.getActivities(term, cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getExamDelayApplications(String cookie, String term, String activityId) |
|
||||||
throws IOException, ApiException { |
|
||||||
return examDelayApiService.getPage(term, activityId, cookie); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,16 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad; |
||||||
|
|
||||||
|
import io.quarkus.runtime.Startup; |
||||||
|
import jakarta.annotation.PostConstruct; |
||||||
|
import jakarta.inject.Singleton; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@Startup |
||||||
|
@Singleton |
||||||
|
public class Main { |
||||||
|
@PostConstruct |
||||||
|
public void run() { |
||||||
|
log.info("Undergrad service started."); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.global.Course; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/course_table") |
||||||
|
@ApplicationScoped |
||||||
|
public class CourseTableApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public CourseTableApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public List<Course> get(@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") String term) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie, term)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") String term) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getCourseTable(cookie, term); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<Course> parse(String html) throws RpcException { |
||||||
|
return parseService.parseCourseTable(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Path("/credit_status") |
||||||
|
@ApplicationScoped |
||||||
|
public class CreditStatusApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public CreditStatusApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public String get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
String html = this.agent(cookie); |
||||||
|
return this.parse(html); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getCreditStatus(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public String parse(String html) throws RpcException { |
||||||
|
return parseService.parseCreditStatus(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradExamDelayApiService; |
||||||
|
import cn.wustlinghang.mywust.data.global.Score; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/exam_activities") |
||||||
|
@ApplicationScoped |
||||||
|
public class ExamActivitiesApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
|
||||||
|
public ExamActivitiesApi(RequestAgentService agentService) { |
||||||
|
this.agentService = agentService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public UndergradExamDelayApiService.ExamActivity[] get( |
||||||
|
@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term) |
||||||
|
throws RpcException { |
||||||
|
return this.agent(cookie, term); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public UndergradExamDelayApiService.ExamActivity[] agent( |
||||||
|
@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getExamActivities(cookie, term); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<Score> parse(String html) throws RpcException { |
||||||
|
throw RpcException.ApiNotImplement(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/exam_delay_application") |
||||||
|
@ApplicationScoped |
||||||
|
public class ExamDelayApplicationApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public ExamDelayApplicationApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public List<ExamDelayApplication> get( |
||||||
|
@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term, |
||||||
|
@QueryParam("activity_id") @NotNull String activityId) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie, term, activityId)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term, |
||||||
|
@QueryParam("activity_id") @NotNull String activityId) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getExamDelayApplications(cookie, term, activityId); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<ExamDelayApplication> parse(String html) throws RpcException { |
||||||
|
return parseService.parseExamDelayApplications(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.global.Score; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/score") |
||||||
|
@ApplicationScoped |
||||||
|
public class ScoreApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public ScoreApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public List<Score> get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getScore(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<Score> parse(String html) throws RpcException { |
||||||
|
return parseService.parseScore(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.global.StudentInfo; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Path("/student_info") |
||||||
|
@ApplicationScoped |
||||||
|
public class StudentInfoApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public StudentInfoApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public StudentInfo get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getStudentInfoPage(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public StudentInfo parse(String html) throws RpcException { |
||||||
|
return parseService.parseStudentInfo(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Path("/training_plan") |
||||||
|
@ApplicationScoped |
||||||
|
public class TrainingPlanApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public TrainingPlanApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public String get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getTrainingPlan(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public String parse(String html) throws RpcException { |
||||||
|
return parseService.parseTrainingPlan(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json.handler; |
||||||
|
|
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.ws.rs.core.Response; |
||||||
|
import jakarta.ws.rs.ext.ExceptionMapper; |
||||||
|
import jakarta.ws.rs.ext.Provider; |
||||||
|
|
||||||
|
@Provider |
||||||
|
public class RpcExceptionHandler extends BaseExceptionHandler implements ExceptionMapper<RpcException> { |
||||||
|
@Override |
||||||
|
public Response toResponse(RpcException e) { |
||||||
|
return super.toResponse( |
||||||
|
e.getCode(), |
||||||
|
e.toString(), |
||||||
|
"RpcExceptionHandler"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json.handler; |
||||||
|
|
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.ws.rs.WebApplicationException; |
||||||
|
import jakarta.ws.rs.core.Response; |
||||||
|
import jakarta.ws.rs.ext.ExceptionMapper; |
||||||
|
import jakarta.ws.rs.ext.Provider; |
||||||
|
|
||||||
|
@Provider |
||||||
|
public class WebApplicationExceptionHandler extends BaseExceptionHandler implements ExceptionMapper<WebApplicationException> { |
||||||
|
@Override |
||||||
|
public Response toResponse(WebApplicationException e) { |
||||||
|
return super.toResponse( |
||||||
|
e.getResponse().getStatus(), |
||||||
|
RpcException.toIntCode( |
||||||
|
UndergradRpcException.UNDERGRAD_MODULE, |
||||||
|
UndergradRpcException.SubModuleCode.COMMON.ordinal(), |
||||||
|
UndergradRpcException.TypeCode.OTHER_EXCEPTION.ordinal() * 100 |
||||||
|
+ UndergradRpcException.ErrorCode.REQUEST_INVALID.ordinal() |
||||||
|
), |
||||||
|
e.getMessage(), |
||||||
|
"WebApplicationExceptionHandler" |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.bean; |
package cn.wustlinghang.wusthelper.internal.undergrad.bean; |
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper; |
import com.fasterxml.jackson.databind.ObjectMapper; |
||||||
import jakarta.enterprise.context.ApplicationScoped; |
import jakarta.enterprise.context.ApplicationScoped; |
@ -1,4 +1,4 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.bean; |
package cn.wustlinghang.wusthelper.internal.undergrad.bean; |
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
||||||
import jakarta.enterprise.context.ApplicationScoped; |
import jakarta.enterprise.context.ApplicationScoped; |
@ -1,4 +1,4 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.bean; |
package cn.wustlinghang.wusthelper.internal.undergrad.bean; |
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
@ -0,0 +1,73 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.exception; |
||||||
|
|
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
|
||||||
|
import java.util.StringJoiner; |
||||||
|
|
||||||
|
public class UndergradRpcException extends RpcException { |
||||||
|
public static final int UNDERGRAD_MODULE = 1; |
||||||
|
|
||||||
|
public UndergradRpcException(TypeCode typeCode, |
||||||
|
SubModuleCode subModuleCode, |
||||||
|
ErrorCode errorCode) { |
||||||
|
super(UNDERGRAD_MODULE, |
||||||
|
typeCode.ordinal(), |
||||||
|
subModuleCode.ordinal() * 100 + errorCode.ordinal(), |
||||||
|
new StringJoiner("-") |
||||||
|
.add("UNDERGRAD") |
||||||
|
.add(typeCode.name()) |
||||||
|
.add(subModuleCode.name()) |
||||||
|
.add(errorCode.name()) |
||||||
|
.toString() |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 异常类型编码 |
||||||
|
*/ |
||||||
|
public enum TypeCode { |
||||||
|
// 网络异常类型
|
||||||
|
NETWORK_EXCEPTION, |
||||||
|
// 参数异常类型
|
||||||
|
PARAM_EXCEPTION, |
||||||
|
// 权限认证异常类型
|
||||||
|
AUTH_EXCEPTION, |
||||||
|
// 网页解析异常类型
|
||||||
|
PARSE_EXCEPTION, |
||||||
|
// 其他的异常类型
|
||||||
|
OTHER_EXCEPTION |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 子模块编码 |
||||||
|
*/ |
||||||
|
public enum SubModuleCode { |
||||||
|
COMMON, AUTH, COURSE_TABLE, CREDIT_STATUS, SCORE, |
||||||
|
STUDENT_INFO, TRAINING_PLAN, EXAM_ACTIVITIES, EXAM_DELAY_APPLICATION |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 具体错误编码 |
||||||
|
*/ |
||||||
|
public enum ErrorCode { |
||||||
|
REQUEST_INVALID, |
||||||
|
PARAM_INVALID, |
||||||
|
COOKIE_INVALID, |
||||||
|
NETWORK_ERROR, |
||||||
|
PARSE_ERROR, |
||||||
|
|
||||||
|
// 需要评教
|
||||||
|
NEED_EVALUATE, |
||||||
|
|
||||||
|
AUTH_PASSWORD_WRONG, |
||||||
|
// 用户不存在
|
||||||
|
AUTH_USER_NOT_EXISTS, |
||||||
|
// 封号
|
||||||
|
AUTH_USER_BANNED, |
||||||
|
// 用户账号禁用
|
||||||
|
AUTH_USER_DISABLED, |
||||||
|
// 用户账号需要更改
|
||||||
|
AUTH_NEED_CHANGE_PASSWORD, |
||||||
|
AUTH_UNKNOWN_ERROR |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,78 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.services; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.network.RequestClientOption; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@ApplicationScoped |
||||||
|
public class LoginService { |
||||||
|
private final RequestClientOption option; |
||||||
|
private final UndergraduateLogin undergraduateLogin; |
||||||
|
|
||||||
|
public LoginService(RequestClientOption option, |
||||||
|
UndergraduateLogin undergraduateLogin) { |
||||||
|
this.option = option; |
||||||
|
this.undergraduateLogin = undergraduateLogin; |
||||||
|
} |
||||||
|
|
||||||
|
public String login(String username, String password, boolean legacy) throws UndergradRpcException { |
||||||
|
try { |
||||||
|
if (legacy) { |
||||||
|
return undergraduateLogin.getLoginCookieLegacy(username, password, option); |
||||||
|
} else { |
||||||
|
return undergraduateLogin.getLoginCookie(username, password, option); |
||||||
|
} |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.AUTH, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean verify(String cookie) throws UndergradRpcException { |
||||||
|
try { |
||||||
|
return !undergraduateLogin.checkCookiesFail(cookie); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.AUTH, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private UndergradRpcException wrapApiException(ApiException e) { |
||||||
|
UndergradRpcException.ErrorCode errorCode = switch (e.getCode()) { |
||||||
|
case NETWORK_EXCEPTION -> UndergradRpcException.ErrorCode.NETWORK_ERROR; |
||||||
|
case UNI_LOGIN_PASSWORD_WRONG -> UndergradRpcException.ErrorCode.AUTH_PASSWORD_WRONG; |
||||||
|
case UNI_LOGIN_USER_NOT_EXISTS -> UndergradRpcException.ErrorCode.AUTH_USER_NOT_EXISTS; |
||||||
|
case UNI_LOGIN_USER_BANNED -> UndergradRpcException.ErrorCode.AUTH_USER_BANNED; |
||||||
|
case UNI_LOGIN_USER_DISABLED -> UndergradRpcException.ErrorCode.AUTH_USER_DISABLED; |
||||||
|
case UNI_LOGIN_NEED_CHANGE_PASSWORD -> UndergradRpcException.ErrorCode.AUTH_NEED_CHANGE_PASSWORD; |
||||||
|
case UNI_LOGIN_USER_NOT_ONLY -> UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
case UNI_LOGIN_NO_REGISTER -> UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
case UNI_LOGIN_NEED_TFA -> UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
default -> { |
||||||
|
log.error("本科生:登录代理请求异常,异常未处理"); |
||||||
|
log.error("异常:", e); |
||||||
|
yield UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.AUTH, |
||||||
|
errorCode |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,132 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.services; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
||||||
|
import cn.wustlinghang.mywust.data.global.Course; |
||||||
|
import cn.wustlinghang.mywust.data.global.Score; |
||||||
|
import cn.wustlinghang.mywust.data.global.StudentInfo; |
||||||
|
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@ApplicationScoped |
||||||
|
public class ParseService { |
||||||
|
private final UndergradCourseTableParser courseTableParser; |
||||||
|
private final UndergradScoreParser scoreParser; |
||||||
|
private final UndergradStudentInfoPageParser studentInfoPageParser; |
||||||
|
private final UndergradTrainingPlanPageParser trainingPlanPageParser; |
||||||
|
private final UndergradCreditStatusParser creditStatusParser; |
||||||
|
private final UndergradExamDelayParser examDelayParser; |
||||||
|
|
||||||
|
public ParseService(UndergradCourseTableParser courseTableParser, |
||||||
|
UndergradScoreParser scoreParser, |
||||||
|
UndergradStudentInfoPageParser studentInfoPageParser, |
||||||
|
UndergradTrainingPlanPageParser trainingPlanPageParser, |
||||||
|
UndergradCreditStatusParser creditStatusParser, |
||||||
|
UndergradExamDelayParser examDelayParser) { |
||||||
|
|
||||||
|
this.courseTableParser = courseTableParser; |
||||||
|
this.scoreParser = scoreParser; |
||||||
|
this.studentInfoPageParser = studentInfoPageParser; |
||||||
|
this.trainingPlanPageParser = trainingPlanPageParser; |
||||||
|
this.creditStatusParser = creditStatusParser; |
||||||
|
this.examDelayParser = examDelayParser; |
||||||
|
} |
||||||
|
|
||||||
|
public List<Course> parseCourseTable(String data) throws UndergradRpcException { |
||||||
|
try { |
||||||
|
if (data.contains("评教")) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.COURSE_TABLE, |
||||||
|
UndergradRpcException.ErrorCode.NEED_EVALUATE |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return courseTableParser.parse(data); |
||||||
|
|
||||||
|
} catch (UndergradRpcException e) { |
||||||
|
throw e; |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.COURSE_TABLE, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public List<Score> parseScore(String data) throws RpcException { |
||||||
|
try { |
||||||
|
if (data.contains("评教")) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.SCORE, |
||||||
|
UndergradRpcException.ErrorCode.NEED_EVALUATE |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return scoreParser.parse(data); |
||||||
|
|
||||||
|
} catch (UndergradRpcException e) { |
||||||
|
throw e; |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.SCORE, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public StudentInfo parseStudentInfo(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return studentInfoPageParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.STUDENT_INFO, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String parseTrainingPlan(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return trainingPlanPageParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.TRAINING_PLAN, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String parseCreditStatus(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return creditStatusParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.CREDIT_STATUS, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public List<ExamDelayApplication> parseExamDelayApplications(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return examDelayParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.EXAM_DELAY_APPLICATION, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,166 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.services; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.network.RequestClientOption; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@ApplicationScoped |
||||||
|
public class RequestAgentService { |
||||||
|
private final UndergradCourseTableApiService courseTableApiService; |
||||||
|
private final UndergradScoreApiService scoreApiService; |
||||||
|
private final UndergradStudentInfoApiService studentInfoApiService; |
||||||
|
private final UndergradTrainingPlanApiService trainingPlanApiService; |
||||||
|
private final UndergradCreditStatusApiService creditStatusApiService; |
||||||
|
private final UndergradExamDelayApiService examDelayApiService; |
||||||
|
|
||||||
|
private final RequestClientOption requestClientOption; |
||||||
|
|
||||||
|
public RequestAgentService(UndergradCourseTableApiService courseTableApiService, |
||||||
|
UndergradScoreApiService scoreApiService, |
||||||
|
UndergradStudentInfoApiService studentInfoApiService, |
||||||
|
UndergradTrainingPlanApiService trainingPlanApiService, |
||||||
|
UndergradCreditStatusApiService creditStatusApiService, |
||||||
|
UndergradExamDelayApiService examDelayApiService, |
||||||
|
RequestClientOption requestClientOption) { |
||||||
|
|
||||||
|
this.courseTableApiService = courseTableApiService; |
||||||
|
this.scoreApiService = scoreApiService; |
||||||
|
this.studentInfoApiService = studentInfoApiService; |
||||||
|
this.trainingPlanApiService = trainingPlanApiService; |
||||||
|
this.creditStatusApiService = creditStatusApiService; |
||||||
|
this.examDelayApiService = examDelayApiService; |
||||||
|
|
||||||
|
this.requestClientOption = requestClientOption; |
||||||
|
} |
||||||
|
|
||||||
|
public String getStudentInfoPage(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return studentInfoApiService.getPage(cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.STUDENT_INFO); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.STUDENT_INFO, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getCourseTable(String cookie, String term) throws RpcException { |
||||||
|
try { |
||||||
|
return courseTableApiService.getPage(term, cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.COURSE_TABLE); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.COURSE_TABLE, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getScore(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return scoreApiService.getPage(cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.SCORE); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.SCORE, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getTrainingPlan(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return trainingPlanApiService.getPage(cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.TRAINING_PLAN); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.TRAINING_PLAN, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getCreditStatus(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return creditStatusApiService.getPage(cookie, requestClientOption, false); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.CREDIT_STATUS); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.CREDIT_STATUS, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public UndergradExamDelayApiService.ExamActivity[] getExamActivities(String cookie, String term) |
||||||
|
throws RpcException { |
||||||
|
try { |
||||||
|
return examDelayApiService.getActivities(term, cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.EXAM_ACTIVITIES); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.EXAM_ACTIVITIES, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getExamDelayApplications(String cookie, String term, String activityId) |
||||||
|
throws RpcException { |
||||||
|
try { |
||||||
|
return examDelayApiService.getPage(term, activityId, cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.EXAM_DELAY_APPLICATION); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.EXAM_DELAY_APPLICATION, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private UndergradRpcException wrapApiException(ApiException e, UndergradRpcException.SubModuleCode subModuleCode) { |
||||||
|
return switch (e.getCode()) { |
||||||
|
case NETWORK_EXCEPTION -> new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
subModuleCode, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
case COOKIE_INVALID -> new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.AUTH_EXCEPTION, |
||||||
|
subModuleCode, |
||||||
|
UndergradRpcException.ErrorCode.COOKIE_INVALID |
||||||
|
); |
||||||
|
default -> { |
||||||
|
log.error("本科生:{}代理请求异常,异常未处理", subModuleCode.name()); |
||||||
|
log.error("异常:", e); |
||||||
|
yield new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.AUTH_EXCEPTION, |
||||||
|
subModuleCode, |
||||||
|
UndergradRpcException.ErrorCode.COOKIE_INVALID |
||||||
|
); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -1,52 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradCourseTableParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradCourseTableApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.Course; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import cn.wustlinghang.wusthelper.rpc.response.RpcResponse; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
@Path("/course_table") |
|
||||||
@ApplicationScoped |
|
||||||
public class CourseTableApi { |
|
||||||
private final UndergradCourseTableApiService studentInfoApiService; |
|
||||||
private final UndergradCourseTableParser studentInfoPageParser; |
|
||||||
|
|
||||||
public CourseTableApi(UndergradCourseTableApiService studentInfoApiService, |
|
||||||
UndergradCourseTableParser studentInfoPageParser) { |
|
||||||
this.studentInfoApiService = studentInfoApiService; |
|
||||||
this.studentInfoPageParser = studentInfoPageParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public List<Course> get(@QueryParam("cookie") @NotNull String cookie, @QueryParam("term") String term) |
|
||||||
throws IOException, ApiException, ParseException { |
|
||||||
String html = studentInfoApiService.getPage(term, cookie); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie, @QueryParam("term") String term) |
|
||||||
throws IOException, ApiException { |
|
||||||
return studentInfoApiService.getPage(term, cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public List<Course> parse(String html) throws ParseException { |
|
||||||
return studentInfoPageParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,54 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradCreditStatusParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradCreditStatusApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import cn.wustlinghang.mywust.network.RequestClientOption; |
|
||||||
import cn.wustlinghang.wusthelper.rpc.response.RpcResponse; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Path("/credit_status") |
|
||||||
@ApplicationScoped |
|
||||||
public class CreditStatusApi { |
|
||||||
private final UndergradCreditStatusApiService creditStatusApiService; |
|
||||||
private final UndergradCreditStatusParser creditStatusParser; |
|
||||||
|
|
||||||
private final RequestClientOption option; |
|
||||||
|
|
||||||
public CreditStatusApi(UndergradCreditStatusApiService creditStatusApiService, |
|
||||||
UndergradCreditStatusParser creditStatusParser, |
|
||||||
RequestClientOption option) { |
|
||||||
this.creditStatusApiService = creditStatusApiService; |
|
||||||
this.creditStatusParser = creditStatusParser; |
|
||||||
this.option = option; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public String get(String cookie) throws IOException, ApiException, ParseException { |
|
||||||
String html = creditStatusApiService.getPage(cookie, option, false); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return creditStatusApiService.getPage(cookie, option, false); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public String parse(String html) throws ParseException { |
|
||||||
return creditStatusParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,50 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradScoreParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradScoreApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.Score; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import cn.wustlinghang.wusthelper.rpc.response.RpcResponse; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
@Path("/score") |
|
||||||
@ApplicationScoped |
|
||||||
public class ScoreApi { |
|
||||||
private final UndergradScoreApiService scoreApiService; |
|
||||||
private final UndergradScoreParser scoreParser; |
|
||||||
|
|
||||||
public ScoreApi(UndergradScoreApiService scoreApiService, UndergradScoreParser scoreParser) { |
|
||||||
this.scoreApiService = scoreApiService; |
|
||||||
this.scoreParser = scoreParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public List<Score> get(String cookie) throws IOException, ApiException, ParseException { |
|
||||||
String html = scoreApiService.getPage(cookie); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return scoreApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public List<Score> parse(String html) throws ParseException { |
|
||||||
return scoreParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradStudentInfoPageParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradStudentInfoApiService; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Path("/student_info") |
|
||||||
@ApplicationScoped |
|
||||||
public class StudentInfoApi { |
|
||||||
private final UndergradStudentInfoApiService studentInfoApiService; |
|
||||||
private final UndergradStudentInfoPageParser studentInfoPageParser; |
|
||||||
|
|
||||||
public StudentInfoApi(UndergradStudentInfoApiService studentInfoApiService, |
|
||||||
UndergradStudentInfoPageParser studentInfoPageParser) { |
|
||||||
this.studentInfoApiService = studentInfoApiService; |
|
||||||
this.studentInfoPageParser = studentInfoPageParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public StudentInfo get(@QueryParam("cookie") @NotNull String cookie) throws IOException, ApiException, ParseException { |
|
||||||
return this.parse(this.agent(cookie)); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return studentInfoApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public StudentInfo parse(String html) throws ParseException { |
|
||||||
return studentInfoPageParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.api.json; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.UndergradTrainingPlanPageParser; |
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradTrainingPlanApiService; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
import jakarta.validation.constraints.NotNull; |
|
||||||
import jakarta.ws.rs.GET; |
|
||||||
import jakarta.ws.rs.POST; |
|
||||||
import jakarta.ws.rs.Path; |
|
||||||
import jakarta.ws.rs.QueryParam; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Path("/training_plan") |
|
||||||
@ApplicationScoped |
|
||||||
public class TrainingPlanApi { |
|
||||||
private final UndergradTrainingPlanApiService trainingPlanApiService; |
|
||||||
private final UndergradTrainingPlanPageParser trainingPlanPageParser; |
|
||||||
|
|
||||||
public TrainingPlanApi(UndergradTrainingPlanApiService trainingPlanApiService, |
|
||||||
UndergradTrainingPlanPageParser trainingPlanPageParser) { |
|
||||||
this.trainingPlanApiService = trainingPlanApiService; |
|
||||||
this.trainingPlanPageParser = trainingPlanPageParser; |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/") |
|
||||||
public String get(String cookie) throws IOException, ApiException, ParseException { |
|
||||||
String html = trainingPlanApiService.getPage(cookie); |
|
||||||
return this.parse(html); |
|
||||||
} |
|
||||||
|
|
||||||
@GET |
|
||||||
@Path("/agent") |
|
||||||
public String agent(@QueryParam("cookie") @NotNull String cookie) |
|
||||||
throws IOException, ApiException { |
|
||||||
return trainingPlanApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
@POST |
|
||||||
@Path("/parse") |
|
||||||
public String parse(String html) throws ParseException { |
|
||||||
return trainingPlanPageParser.parse(html); |
|
||||||
} |
|
||||||
} |
|
@ -1,14 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.api.json.handler; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import jakarta.ws.rs.core.Response; |
|
||||||
import jakarta.ws.rs.ext.ExceptionMapper; |
|
||||||
import jakarta.ws.rs.ext.Provider; |
|
||||||
|
|
||||||
@Provider |
|
||||||
public class ApiExceptionHandler extends ExceptionHandlerBase implements ExceptionMapper<ApiException> { |
|
||||||
@Override |
|
||||||
public Response toResponse(ApiException e) { |
|
||||||
return super.toResponse(e.getCodeValue(), e.toString(), "ApiExceptionHandler"); |
|
||||||
} |
|
||||||
} |
|
@ -1,32 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.services; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import cn.wustlinghang.mywust.network.RequestClientOption; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@ApplicationScoped |
|
||||||
public class LoginService { |
|
||||||
private final RequestClientOption option; |
|
||||||
private final UndergraduateLogin undergraduateLogin; |
|
||||||
|
|
||||||
public LoginService(RequestClientOption option, |
|
||||||
UndergraduateLogin undergraduateLogin) { |
|
||||||
this.option = option; |
|
||||||
this.undergraduateLogin = undergraduateLogin; |
|
||||||
} |
|
||||||
|
|
||||||
public String login(String username, String password, boolean legacy) throws IOException, ApiException { |
|
||||||
if (legacy) { |
|
||||||
return undergraduateLogin.getLoginCookieLegacy(username, password, option); |
|
||||||
} else { |
|
||||||
return undergraduateLogin.getLoginCookie(username, password, option); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public boolean verify(String cookie) throws IOException { |
|
||||||
return !undergraduateLogin.checkCookiesFail(cookie); |
|
||||||
} |
|
||||||
} |
|
@ -1,60 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.services; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
|
||||||
import cn.wustlinghang.mywust.data.global.Course; |
|
||||||
import cn.wustlinghang.mywust.data.global.Score; |
|
||||||
import cn.wustlinghang.mywust.data.global.StudentInfo; |
|
||||||
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication; |
|
||||||
import cn.wustlinghang.mywust.exception.ParseException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
@ApplicationScoped |
|
||||||
public class ParseService { |
|
||||||
private final UndergradCourseTableParser courseTableParser; |
|
||||||
private final UndergradScoreParser scoreParser; |
|
||||||
private final UndergradStudentInfoPageParser studentInfoPageParser; |
|
||||||
private final UndergradTrainingPlanPageParser trainingPlanPageParser; |
|
||||||
private final UndergradCreditStatusParser creditStatusParser; |
|
||||||
private final UndergradExamDelayParser examDelayParser; |
|
||||||
|
|
||||||
public ParseService(UndergradCourseTableParser courseTableParser, |
|
||||||
UndergradScoreParser scoreParser, |
|
||||||
UndergradStudentInfoPageParser studentInfoPageParser, |
|
||||||
UndergradTrainingPlanPageParser trainingPlanPageParser, |
|
||||||
UndergradCreditStatusParser creditStatusParser, |
|
||||||
UndergradExamDelayParser examDelayParser) { |
|
||||||
|
|
||||||
this.courseTableParser = courseTableParser; |
|
||||||
this.scoreParser = scoreParser; |
|
||||||
this.studentInfoPageParser = studentInfoPageParser; |
|
||||||
this.trainingPlanPageParser = trainingPlanPageParser; |
|
||||||
this.creditStatusParser = creditStatusParser; |
|
||||||
this.examDelayParser = examDelayParser; |
|
||||||
} |
|
||||||
|
|
||||||
public List<Course> parseCourseTable(String data) throws ParseException { |
|
||||||
return courseTableParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public List<Score> parseScore(String data) throws ParseException { |
|
||||||
return scoreParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public StudentInfo parseStudentInfo(String data) throws ParseException { |
|
||||||
return studentInfoPageParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public String parseTrainingPlan(String data) throws ParseException { |
|
||||||
return trainingPlanPageParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public String parseCreditStatus(String data) throws ParseException { |
|
||||||
return creditStatusParser.parse(data); |
|
||||||
} |
|
||||||
|
|
||||||
public List<ExamDelayApplication> parseExamDelayApplications(String data) throws ParseException { |
|
||||||
return examDelayParser.parse(data); |
|
||||||
} |
|
||||||
} |
|
@ -1,62 +0,0 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.physics.services; |
|
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
|
||||||
import cn.wustlinghang.mywust.exception.ApiException; |
|
||||||
import jakarta.enterprise.context.ApplicationScoped; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@ApplicationScoped |
|
||||||
public class RequestAgentService { |
|
||||||
private final UndergradCourseTableApiService courseTableApiService; |
|
||||||
private final UndergradScoreApiService scoreApiService; |
|
||||||
private final UndergradStudentInfoApiService studentInfoApiService; |
|
||||||
private final UndergradTrainingPlanApiService trainingPlanApiService; |
|
||||||
private final UndergradCreditStatusApiService creditStatusApiService; |
|
||||||
private final UndergradExamDelayApiService examDelayApiService; |
|
||||||
|
|
||||||
public RequestAgentService(UndergradCourseTableApiService courseTableApiService, |
|
||||||
UndergradScoreApiService scoreApiService, |
|
||||||
UndergradStudentInfoApiService studentInfoApiService, |
|
||||||
UndergradTrainingPlanApiService trainingPlanApiService, |
|
||||||
UndergradCreditStatusApiService creditStatusApiService, |
|
||||||
UndergradExamDelayApiService examDelayApiService) { |
|
||||||
|
|
||||||
this.courseTableApiService = courseTableApiService; |
|
||||||
this.scoreApiService = scoreApiService; |
|
||||||
this.studentInfoApiService = studentInfoApiService; |
|
||||||
this.trainingPlanApiService = trainingPlanApiService; |
|
||||||
this.creditStatusApiService = creditStatusApiService; |
|
||||||
this.examDelayApiService = examDelayApiService; |
|
||||||
} |
|
||||||
|
|
||||||
public String getStudentInfoPage(String cookie) throws IOException, ApiException { |
|
||||||
return studentInfoApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getCourseTable(String cookie, String term) throws IOException, ApiException { |
|
||||||
return courseTableApiService.getPage(term, cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getScore(String cookie) throws IOException, ApiException { |
|
||||||
return scoreApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getTrainingPlan(String cookie) throws IOException, ApiException { |
|
||||||
return trainingPlanApiService.getPage(cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getCreditStatus(String cookie) throws IOException, ApiException { |
|
||||||
return creditStatusApiService.getPage(cookie, null, false); |
|
||||||
} |
|
||||||
|
|
||||||
public UndergradExamDelayApiService.ExamActivity[] getExamActivities(String cookie, String term) |
|
||||||
throws IOException, ApiException { |
|
||||||
return examDelayApiService.getActivities(term, cookie); |
|
||||||
} |
|
||||||
|
|
||||||
public String getExamDelayApplications(String cookie, String term, String activityId) |
|
||||||
throws IOException, ApiException { |
|
||||||
return examDelayApiService.getPage(term, activityId, cookie); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,16 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad; |
||||||
|
|
||||||
|
import io.quarkus.runtime.Startup; |
||||||
|
import jakarta.annotation.PostConstruct; |
||||||
|
import jakarta.inject.Singleton; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@Startup |
||||||
|
@Singleton |
||||||
|
public class Main { |
||||||
|
@PostConstruct |
||||||
|
public void run() { |
||||||
|
log.info("Undergrad service started."); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.global.Course; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/course_table") |
||||||
|
@ApplicationScoped |
||||||
|
public class CourseTableApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public CourseTableApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public List<Course> get(@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") String term) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie, term)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") String term) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getCourseTable(cookie, term); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<Course> parse(String html) throws RpcException { |
||||||
|
return parseService.parseCourseTable(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Path("/credit_status") |
||||||
|
@ApplicationScoped |
||||||
|
public class CreditStatusApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public CreditStatusApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public String get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
String html = this.agent(cookie); |
||||||
|
return this.parse(html); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getCreditStatus(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public String parse(String html) throws RpcException { |
||||||
|
return parseService.parseCreditStatus(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.request.service.undergraduate.UndergradExamDelayApiService; |
||||||
|
import cn.wustlinghang.mywust.data.global.Score; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/exam_activities") |
||||||
|
@ApplicationScoped |
||||||
|
public class ExamActivitiesApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
|
||||||
|
public ExamActivitiesApi(RequestAgentService agentService) { |
||||||
|
this.agentService = agentService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public UndergradExamDelayApiService.ExamActivity[] get( |
||||||
|
@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term) |
||||||
|
throws RpcException { |
||||||
|
return this.agent(cookie, term); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public UndergradExamDelayApiService.ExamActivity[] agent( |
||||||
|
@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getExamActivities(cookie, term); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<Score> parse(String html) throws RpcException { |
||||||
|
throw RpcException.ApiNotImplement(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/exam_delay_application") |
||||||
|
@ApplicationScoped |
||||||
|
public class ExamDelayApplicationApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public ExamDelayApplicationApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public List<ExamDelayApplication> get( |
||||||
|
@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term, |
||||||
|
@QueryParam("activity_id") @NotNull String activityId) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie, term, activityId)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie, |
||||||
|
@QueryParam("term") @NotNull String term, |
||||||
|
@QueryParam("activity_id") @NotNull String activityId) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getExamDelayApplications(cookie, term, activityId); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<ExamDelayApplication> parse(String html) throws RpcException { |
||||||
|
return parseService.parseExamDelayApplications(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.global.Score; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Path("/score") |
||||||
|
@ApplicationScoped |
||||||
|
public class ScoreApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public ScoreApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public List<Score> get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getScore(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public List<Score> parse(String html) throws RpcException { |
||||||
|
return parseService.parseScore(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.data.global.StudentInfo; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Path("/student_info") |
||||||
|
@ApplicationScoped |
||||||
|
public class StudentInfoApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public StudentInfoApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public StudentInfo get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getStudentInfoPage(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public StudentInfo parse(String html) throws RpcException { |
||||||
|
return parseService.parseStudentInfo(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.ParseService; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.services.RequestAgentService; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import jakarta.validation.constraints.NotNull; |
||||||
|
import jakarta.ws.rs.GET; |
||||||
|
import jakarta.ws.rs.POST; |
||||||
|
import jakarta.ws.rs.Path; |
||||||
|
import jakarta.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Path("/training_plan") |
||||||
|
@ApplicationScoped |
||||||
|
public class TrainingPlanApi { |
||||||
|
private final RequestAgentService agentService; |
||||||
|
private final ParseService parseService; |
||||||
|
|
||||||
|
public TrainingPlanApi(RequestAgentService agentService, |
||||||
|
ParseService parseService) { |
||||||
|
this.agentService = agentService; |
||||||
|
this.parseService = parseService; |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/") |
||||||
|
public String get(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return this.parse(this.agent(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/agent") |
||||||
|
public String agent(@QueryParam("cookie") @NotNull String cookie) |
||||||
|
throws RpcException { |
||||||
|
return agentService.getTrainingPlan(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
@POST |
||||||
|
@Path("/parse") |
||||||
|
public String parse(String html) throws RpcException { |
||||||
|
return parseService.parseTrainingPlan(html); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json.handler; |
||||||
|
|
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.ws.rs.core.Response; |
||||||
|
import jakarta.ws.rs.ext.ExceptionMapper; |
||||||
|
import jakarta.ws.rs.ext.Provider; |
||||||
|
|
||||||
|
@Provider |
||||||
|
public class RpcExceptionHandler extends BaseExceptionHandler implements ExceptionMapper<RpcException> { |
||||||
|
@Override |
||||||
|
public Response toResponse(RpcException e) { |
||||||
|
return super.toResponse( |
||||||
|
e.getCode(), |
||||||
|
e.toString(), |
||||||
|
"RpcExceptionHandler"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.api.json.handler; |
||||||
|
|
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.ws.rs.WebApplicationException; |
||||||
|
import jakarta.ws.rs.core.Response; |
||||||
|
import jakarta.ws.rs.ext.ExceptionMapper; |
||||||
|
import jakarta.ws.rs.ext.Provider; |
||||||
|
|
||||||
|
@Provider |
||||||
|
public class WebApplicationExceptionHandler extends BaseExceptionHandler implements ExceptionMapper<WebApplicationException> { |
||||||
|
@Override |
||||||
|
public Response toResponse(WebApplicationException e) { |
||||||
|
return super.toResponse( |
||||||
|
e.getResponse().getStatus(), |
||||||
|
RpcException.toIntCode( |
||||||
|
UndergradRpcException.UNDERGRAD_MODULE, |
||||||
|
UndergradRpcException.SubModuleCode.COMMON.ordinal(), |
||||||
|
UndergradRpcException.TypeCode.OTHER_EXCEPTION.ordinal() * 100 |
||||||
|
+ UndergradRpcException.ErrorCode.REQUEST_INVALID.ordinal() |
||||||
|
), |
||||||
|
e.getMessage(), |
||||||
|
"WebApplicationExceptionHandler" |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.bean; |
package cn.wustlinghang.wusthelper.internal.undergrad.bean; |
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper; |
import com.fasterxml.jackson.databind.ObjectMapper; |
||||||
import jakarta.enterprise.context.ApplicationScoped; |
import jakarta.enterprise.context.ApplicationScoped; |
@ -1,4 +1,4 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.library.bean; |
package cn.wustlinghang.wusthelper.internal.undergrad.bean; |
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
||||||
import jakarta.enterprise.context.ApplicationScoped; |
import jakarta.enterprise.context.ApplicationScoped; |
@ -1,4 +1,4 @@ |
|||||||
package cn.wustlinghang.wusthelper.internal.graduate.bean; |
package cn.wustlinghang.wusthelper.internal.undergrad.bean; |
||||||
|
|
||||||
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
||||||
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
@ -0,0 +1,73 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.exception; |
||||||
|
|
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
|
||||||
|
import java.util.StringJoiner; |
||||||
|
|
||||||
|
public class UndergradRpcException extends RpcException { |
||||||
|
public static final int UNDERGRAD_MODULE = 1; |
||||||
|
|
||||||
|
public UndergradRpcException(TypeCode typeCode, |
||||||
|
SubModuleCode subModuleCode, |
||||||
|
ErrorCode errorCode) { |
||||||
|
super(UNDERGRAD_MODULE, |
||||||
|
typeCode.ordinal(), |
||||||
|
subModuleCode.ordinal() * 100 + errorCode.ordinal(), |
||||||
|
new StringJoiner("-") |
||||||
|
.add("UNDERGRAD") |
||||||
|
.add(typeCode.name()) |
||||||
|
.add(subModuleCode.name()) |
||||||
|
.add(errorCode.name()) |
||||||
|
.toString() |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 异常类型编码 |
||||||
|
*/ |
||||||
|
public enum TypeCode { |
||||||
|
// 网络异常类型
|
||||||
|
NETWORK_EXCEPTION, |
||||||
|
// 参数异常类型
|
||||||
|
PARAM_EXCEPTION, |
||||||
|
// 权限认证异常类型
|
||||||
|
AUTH_EXCEPTION, |
||||||
|
// 网页解析异常类型
|
||||||
|
PARSE_EXCEPTION, |
||||||
|
// 其他的异常类型
|
||||||
|
OTHER_EXCEPTION |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 子模块编码 |
||||||
|
*/ |
||||||
|
public enum SubModuleCode { |
||||||
|
COMMON, AUTH, COURSE_TABLE, CREDIT_STATUS, SCORE, |
||||||
|
STUDENT_INFO, TRAINING_PLAN, EXAM_ACTIVITIES, EXAM_DELAY_APPLICATION |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 具体错误编码 |
||||||
|
*/ |
||||||
|
public enum ErrorCode { |
||||||
|
REQUEST_INVALID, |
||||||
|
PARAM_INVALID, |
||||||
|
COOKIE_INVALID, |
||||||
|
NETWORK_ERROR, |
||||||
|
PARSE_ERROR, |
||||||
|
|
||||||
|
// 需要评教
|
||||||
|
NEED_EVALUATE, |
||||||
|
|
||||||
|
AUTH_PASSWORD_WRONG, |
||||||
|
// 用户不存在
|
||||||
|
AUTH_USER_NOT_EXISTS, |
||||||
|
// 封号
|
||||||
|
AUTH_USER_BANNED, |
||||||
|
// 用户账号禁用
|
||||||
|
AUTH_USER_DISABLED, |
||||||
|
// 用户账号需要更改
|
||||||
|
AUTH_NEED_CHANGE_PASSWORD, |
||||||
|
AUTH_UNKNOWN_ERROR |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,78 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.services; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.request.service.auth.UndergraduateLogin; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.network.RequestClientOption; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@ApplicationScoped |
||||||
|
public class LoginService { |
||||||
|
private final RequestClientOption option; |
||||||
|
private final UndergraduateLogin undergraduateLogin; |
||||||
|
|
||||||
|
public LoginService(RequestClientOption option, |
||||||
|
UndergraduateLogin undergraduateLogin) { |
||||||
|
this.option = option; |
||||||
|
this.undergraduateLogin = undergraduateLogin; |
||||||
|
} |
||||||
|
|
||||||
|
public String login(String username, String password, boolean legacy) throws UndergradRpcException { |
||||||
|
try { |
||||||
|
if (legacy) { |
||||||
|
return undergraduateLogin.getLoginCookieLegacy(username, password, option); |
||||||
|
} else { |
||||||
|
return undergraduateLogin.getLoginCookie(username, password, option); |
||||||
|
} |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.AUTH, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean verify(String cookie) throws UndergradRpcException { |
||||||
|
try { |
||||||
|
return !undergraduateLogin.checkCookiesFail(cookie); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.AUTH, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private UndergradRpcException wrapApiException(ApiException e) { |
||||||
|
UndergradRpcException.ErrorCode errorCode = switch (e.getCode()) { |
||||||
|
case NETWORK_EXCEPTION -> UndergradRpcException.ErrorCode.NETWORK_ERROR; |
||||||
|
case UNI_LOGIN_PASSWORD_WRONG -> UndergradRpcException.ErrorCode.AUTH_PASSWORD_WRONG; |
||||||
|
case UNI_LOGIN_USER_NOT_EXISTS -> UndergradRpcException.ErrorCode.AUTH_USER_NOT_EXISTS; |
||||||
|
case UNI_LOGIN_USER_BANNED -> UndergradRpcException.ErrorCode.AUTH_USER_BANNED; |
||||||
|
case UNI_LOGIN_USER_DISABLED -> UndergradRpcException.ErrorCode.AUTH_USER_DISABLED; |
||||||
|
case UNI_LOGIN_NEED_CHANGE_PASSWORD -> UndergradRpcException.ErrorCode.AUTH_NEED_CHANGE_PASSWORD; |
||||||
|
case UNI_LOGIN_USER_NOT_ONLY -> UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
case UNI_LOGIN_NO_REGISTER -> UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
case UNI_LOGIN_NEED_TFA -> UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
default -> { |
||||||
|
log.error("本科生:登录代理请求异常,异常未处理"); |
||||||
|
log.error("异常:", e); |
||||||
|
yield UndergradRpcException.ErrorCode.AUTH_UNKNOWN_ERROR; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.AUTH, |
||||||
|
errorCode |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,132 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.services; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.parser.undergraduate.*; |
||||||
|
import cn.wustlinghang.mywust.data.global.Course; |
||||||
|
import cn.wustlinghang.mywust.data.global.Score; |
||||||
|
import cn.wustlinghang.mywust.data.global.StudentInfo; |
||||||
|
import cn.wustlinghang.mywust.data.undergrad.ExamDelayApplication; |
||||||
|
import cn.wustlinghang.mywust.exception.ParseException; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@ApplicationScoped |
||||||
|
public class ParseService { |
||||||
|
private final UndergradCourseTableParser courseTableParser; |
||||||
|
private final UndergradScoreParser scoreParser; |
||||||
|
private final UndergradStudentInfoPageParser studentInfoPageParser; |
||||||
|
private final UndergradTrainingPlanPageParser trainingPlanPageParser; |
||||||
|
private final UndergradCreditStatusParser creditStatusParser; |
||||||
|
private final UndergradExamDelayParser examDelayParser; |
||||||
|
|
||||||
|
public ParseService(UndergradCourseTableParser courseTableParser, |
||||||
|
UndergradScoreParser scoreParser, |
||||||
|
UndergradStudentInfoPageParser studentInfoPageParser, |
||||||
|
UndergradTrainingPlanPageParser trainingPlanPageParser, |
||||||
|
UndergradCreditStatusParser creditStatusParser, |
||||||
|
UndergradExamDelayParser examDelayParser) { |
||||||
|
|
||||||
|
this.courseTableParser = courseTableParser; |
||||||
|
this.scoreParser = scoreParser; |
||||||
|
this.studentInfoPageParser = studentInfoPageParser; |
||||||
|
this.trainingPlanPageParser = trainingPlanPageParser; |
||||||
|
this.creditStatusParser = creditStatusParser; |
||||||
|
this.examDelayParser = examDelayParser; |
||||||
|
} |
||||||
|
|
||||||
|
public List<Course> parseCourseTable(String data) throws UndergradRpcException { |
||||||
|
try { |
||||||
|
if (data.contains("评教")) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.COURSE_TABLE, |
||||||
|
UndergradRpcException.ErrorCode.NEED_EVALUATE |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return courseTableParser.parse(data); |
||||||
|
|
||||||
|
} catch (UndergradRpcException e) { |
||||||
|
throw e; |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.COURSE_TABLE, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public List<Score> parseScore(String data) throws RpcException { |
||||||
|
try { |
||||||
|
if (data.contains("评教")) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.SCORE, |
||||||
|
UndergradRpcException.ErrorCode.NEED_EVALUATE |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return scoreParser.parse(data); |
||||||
|
|
||||||
|
} catch (UndergradRpcException e) { |
||||||
|
throw e; |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.SCORE, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public StudentInfo parseStudentInfo(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return studentInfoPageParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.STUDENT_INFO, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String parseTrainingPlan(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return trainingPlanPageParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.TRAINING_PLAN, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String parseCreditStatus(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return creditStatusParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.CREDIT_STATUS, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public List<ExamDelayApplication> parseExamDelayApplications(String data) throws RpcException { |
||||||
|
try { |
||||||
|
return examDelayParser.parse(data); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.PARSE_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.EXAM_DELAY_APPLICATION, |
||||||
|
UndergradRpcException.ErrorCode.PARSE_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,166 @@ |
|||||||
|
package cn.wustlinghang.wusthelper.internal.undergrad.services; |
||||||
|
|
||||||
|
import cn.wustlinghang.mywust.core.request.service.undergraduate.*; |
||||||
|
import cn.wustlinghang.mywust.exception.ApiException; |
||||||
|
import cn.wustlinghang.mywust.network.RequestClientOption; |
||||||
|
import cn.wustlinghang.wusthelper.internal.undergrad.exception.UndergradRpcException; |
||||||
|
import cn.wustlinghang.wusthelper.rpc.exception.RpcException; |
||||||
|
import jakarta.enterprise.context.ApplicationScoped; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@ApplicationScoped |
||||||
|
public class RequestAgentService { |
||||||
|
private final UndergradCourseTableApiService courseTableApiService; |
||||||
|
private final UndergradScoreApiService scoreApiService; |
||||||
|
private final UndergradStudentInfoApiService studentInfoApiService; |
||||||
|
private final UndergradTrainingPlanApiService trainingPlanApiService; |
||||||
|
private final UndergradCreditStatusApiService creditStatusApiService; |
||||||
|
private final UndergradExamDelayApiService examDelayApiService; |
||||||
|
|
||||||
|
private final RequestClientOption requestClientOption; |
||||||
|
|
||||||
|
public RequestAgentService(UndergradCourseTableApiService courseTableApiService, |
||||||
|
UndergradScoreApiService scoreApiService, |
||||||
|
UndergradStudentInfoApiService studentInfoApiService, |
||||||
|
UndergradTrainingPlanApiService trainingPlanApiService, |
||||||
|
UndergradCreditStatusApiService creditStatusApiService, |
||||||
|
UndergradExamDelayApiService examDelayApiService, |
||||||
|
RequestClientOption requestClientOption) { |
||||||
|
|
||||||
|
this.courseTableApiService = courseTableApiService; |
||||||
|
this.scoreApiService = scoreApiService; |
||||||
|
this.studentInfoApiService = studentInfoApiService; |
||||||
|
this.trainingPlanApiService = trainingPlanApiService; |
||||||
|
this.creditStatusApiService = creditStatusApiService; |
||||||
|
this.examDelayApiService = examDelayApiService; |
||||||
|
|
||||||
|
this.requestClientOption = requestClientOption; |
||||||
|
} |
||||||
|
|
||||||
|
public String getStudentInfoPage(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return studentInfoApiService.getPage(cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.STUDENT_INFO); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.STUDENT_INFO, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getCourseTable(String cookie, String term) throws RpcException { |
||||||
|
try { |
||||||
|
return courseTableApiService.getPage(term, cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.COURSE_TABLE); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.COURSE_TABLE, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getScore(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return scoreApiService.getPage(cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.SCORE); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.SCORE, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getTrainingPlan(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return trainingPlanApiService.getPage(cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.TRAINING_PLAN); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.TRAINING_PLAN, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getCreditStatus(String cookie) throws RpcException { |
||||||
|
try { |
||||||
|
return creditStatusApiService.getPage(cookie, requestClientOption, false); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.CREDIT_STATUS); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.CREDIT_STATUS, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public UndergradExamDelayApiService.ExamActivity[] getExamActivities(String cookie, String term) |
||||||
|
throws RpcException { |
||||||
|
try { |
||||||
|
return examDelayApiService.getActivities(term, cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.EXAM_ACTIVITIES); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.EXAM_ACTIVITIES, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getExamDelayApplications(String cookie, String term, String activityId) |
||||||
|
throws RpcException { |
||||||
|
try { |
||||||
|
return examDelayApiService.getPage(term, activityId, cookie); |
||||||
|
} catch (ApiException e) { |
||||||
|
throw wrapApiException(e, UndergradRpcException.SubModuleCode.EXAM_DELAY_APPLICATION); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
UndergradRpcException.SubModuleCode.EXAM_DELAY_APPLICATION, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private UndergradRpcException wrapApiException(ApiException e, UndergradRpcException.SubModuleCode subModuleCode) { |
||||||
|
return switch (e.getCode()) { |
||||||
|
case NETWORK_EXCEPTION -> new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.NETWORK_EXCEPTION, |
||||||
|
subModuleCode, |
||||||
|
UndergradRpcException.ErrorCode.NETWORK_ERROR |
||||||
|
); |
||||||
|
case COOKIE_INVALID -> new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.AUTH_EXCEPTION, |
||||||
|
subModuleCode, |
||||||
|
UndergradRpcException.ErrorCode.COOKIE_INVALID |
||||||
|
); |
||||||
|
default -> { |
||||||
|
log.error("本科生:{}代理请求异常,异常未处理", subModuleCode.name()); |
||||||
|
log.error("异常:", e); |
||||||
|
yield new UndergradRpcException( |
||||||
|
UndergradRpcException.TypeCode.AUTH_EXCEPTION, |
||||||
|
subModuleCode, |
||||||
|
UndergradRpcException.ErrorCode.COOKIE_INVALID |
||||||
|
); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue