#91 using RestTemplate & show error on timetable loading exception

This commit is contained in:
Artem.Arefev 2019-05-25 14:03:43 +04:00
parent 505a054cc8
commit 193b2b3a32
11 changed files with 63 additions and 48 deletions

View File

@ -51,6 +51,6 @@ public class UserMvcController extends OdinController<UserListDto, UserDto> {
@GetMapping("/dashboard")
public void getUsersDashboard(ModelMap modelMap) {
modelMap.addAttribute("users", userService.getUsersInfo());
modelMap.addAllAttributes(userService.getUsersInfo());
}
}

View File

@ -42,10 +42,10 @@ import ru.ulstu.user.repository.UserRepository;
import ru.ulstu.user.repository.UserRoleRepository;
import ru.ulstu.user.util.UserUtils;
import ru.ulstu.utils.timetable.TimetableService;
import ru.ulstu.utils.timetable.errors.TimetableClientException;
import ru.ulstu.utils.timetable.model.Lesson;
import javax.mail.MessagingException;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
@ -358,14 +358,16 @@ public class UserService implements UserDetailsService {
}
}
public List<UserInfoNow> getUsersInfo() {
public Map<String, Object> getUsersInfo() {
List<UserInfoNow> usersInfoNow = new ArrayList<>();
String err = "";
for (User user : userRepository.findAll()) {
Lesson lesson = null;
try {
lesson = timetableService.getCurrentLesson(user.getUserAbbreviate());
} catch (IOException e) {
e.printStackTrace();
} catch (TimetableClientException e) {
err = "Не удалось загрузить расписание";
}
usersInfoNow.add(new UserInfoNow(
lesson,
@ -374,6 +376,6 @@ public class UserService implements UserDetailsService {
userSessionService.isOnline(user))
);
}
return usersInfoNow;
return ImmutableMap.of("users", usersInfoNow, "error", err);
}
}

View File

@ -1,15 +1,12 @@
package ru.ulstu.utils.timetable;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import ru.ulstu.utils.timetable.errors.TimetableClientException;
import ru.ulstu.utils.timetable.model.Lesson;
import ru.ulstu.utils.timetable.model.TimetableResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
@ -17,7 +14,7 @@ import java.util.Date;
import java.util.List;
public class TimetableService {
private static final String TIMETABLE_URL = "http://timetable.athene.tech";
private static final String TIMETABLE_URL = "http://timetable.athene.tech/api/1.0/timetable?filter=%s";
private SimpleDateFormat lessonTimeFormat = new SimpleDateFormat("hh:mm");
private long[] lessonsStarts = new long[] {
@ -30,7 +27,8 @@ public class TimetableService {
lessonTimeFormat.parse("18:10:00").getTime(),
};
public TimetableService() throws ParseException { }
public TimetableService() throws ParseException {
}
private int getCurrentDay() {
Calendar calendar = Calendar.getInstance();
@ -42,6 +40,7 @@ public class TimetableService {
long lessonDuration = 90 * 60000;
Date now = new Date();
long timeNow = now.getTime() % (24 * 60 * 60 * 1000L);
for (int i = 0; i < lessonsStarts.length; i++) {
if (timeNow > lessonsStarts[i] && timeNow < lessonsStarts[i] + lessonDuration) {
return i;
@ -56,31 +55,26 @@ public class TimetableService {
return (cal.get(Calendar.WEEK_OF_YEAR) + 1) % 2;
}
private TimetableResponse getTimetableForUser(String userFIO) throws IOException {
URL url = new URL(TIMETABLE_URL + "/api/1.0/timetable?filter=" + URLEncoder.encode(userFIO, "UTF-8"));
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
return new ObjectMapper().readValue(content.toString(), TimetableResponse.class);
private TimetableResponse getTimetableForUser(String userFIO) throws RestClientException {
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(String.format(TIMETABLE_URL, userFIO), TimetableResponse.class);
}
public Lesson getCurrentLesson(String userFio) {
TimetableResponse response;
try {
response = getTimetableForUser(userFio);
} catch (RestClientException e) {
e.printStackTrace();
throw new TimetableClientException(userFio);
}
public Lesson getCurrentLesson(String userFio) throws IOException {
TimetableResponse response = getTimetableForUser(userFio);
int lessonNumber = getCurrentLessonNumber();
if (lessonNumber < 0) {
return null;
}
List<Object> lessons = response
List<Lesson> lessons = response
.getResponse()
.getWeeks()
.get(getCurrentWeek())

View File

@ -0,0 +1,7 @@
package ru.ulstu.utils.timetable.errors;
public class TimetableClientException extends RuntimeException {
public TimetableClientException(String message) {
super(message);
}
}

View File

@ -1,12 +1,13 @@
package ru.ulstu.utils.timetable.model;
import java.util.ArrayList;
import java.util.List;
public class Day {
private Integer day;
private List<List<Object>> lessons = null;
private List<List<Lesson>> lessons = new ArrayList<>();
public Integer getDay() {
return day;
@ -16,11 +17,11 @@ public class Day {
this.day = day;
}
public List<List<Object>> getLessons() {
public List<List<Lesson>> getLessons() {
return lessons;
}
public void setLessons(List<List<Object>> lessons) {
public void setLessons(List<List<Lesson>> lessons) {
this.lessons = lessons;
}
}

View File

@ -6,9 +6,6 @@ public class Lesson {
private String teacher;
private String room;
public Lesson() {
}
public String getGroup() {
return group;
}

View File

@ -1,10 +1,11 @@
package ru.ulstu.utils.timetable.model;
import java.util.ArrayList;
import java.util.List;
public class Response {
private List<Week> weeks = null;
private List<Week> weeks = new ArrayList<>();
public List<Week> getWeeks() {
return weeks;

View File

@ -1,10 +1,12 @@
package ru.ulstu.utils.timetable.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Week {
public class Week implements Serializable {
private List<Day> days = null;
private List<Day> days = new ArrayList<>();
public List<Day> getDays() {
return days;

View File

@ -24,7 +24,7 @@ spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFact
# JPA Settings
spring.datasource.url=jdbc:postgresql://localhost:5432/ng-tracker
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.password=password
spring.datasource.driverclassName=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=validate
# Liquibase Settings
@ -34,6 +34,6 @@ liquibase.change-log=classpath:db/changelog-master.xml
# Application Settings
ng-tracker.base-url=http://127.0.0.1:8080
ng-tracker.undead-user-login=admin
ng-tracker.dev-mode=true
ng-tracker.dev-mode=false
ng-tracker.use-https=false
ng-tracker.check-run=false

View File

@ -3,15 +3,18 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="default" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<script src="/js/core.js"></script>
</head>
<body>
<div class="container" layout:fragment="content">
<section id="services">
<div class="container">
<div class="col-lg-12 text-center">
<h2 class="section-heading text-uppercase">Пользователи</h2>
</div>
<div class="text-center">
<h2 th:text="${error}">teste</h2>
</div>
<div class="row justify-content-center" id="dashboard">
<th:block th:each="user : ${users}">
<div th:replace="users/fragments/userDashboardFragment :: userDashboard(user=${user})"/>
@ -19,6 +22,14 @@
</div>
</div>
</section>
<script th:inline="javascript">
/*<![CDATA[*/
$(document).ready(function () {
var error = /*[[${error}]]*/
showFeedbackMessage(error, MessageTypesEnum.WARNING)
});
/*]]>*/
</script>
</div>
</body>
</html>