diff --git a/BackEnd/src/main/java/studycave/studycaverestservice/controller/UsosController.java b/BackEnd/src/main/java/studycave/studycaverestservice/controller/UsosController.java index 5329fba..9d03a2b 100644 --- a/BackEnd/src/main/java/studycave/studycaverestservice/controller/UsosController.java +++ b/BackEnd/src/main/java/studycave/studycaverestservice/controller/UsosController.java @@ -51,7 +51,7 @@ public class UsosController { responseHeaders.add("authorization", responseToken.getKey()); return ResponseEntity.status(HttpStatus.OK).headers(responseHeaders).body(responseToken); } catch (NoSuchAlgorithmException | InvalidKeyException | IOException e) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).headers(responseHeaders).body(new TokenResponseDTO(e.getCause().toString(), null)); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).headers(responseHeaders).body(new TokenResponseDTO(e.getCause().toString(), null, null)); } } diff --git a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/GroupRepository.java b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/GroupRepository.java index 6554ee4..4f951f1 100644 --- a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/GroupRepository.java +++ b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/GroupRepository.java @@ -4,6 +4,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import studycave.studycaverestservice.model.studyGroup.StudyGroup; import java.util.List; +import java.util.Optional; public interface GroupRepository extends JpaRepository { @@ -11,4 +12,5 @@ public interface GroupRepository extends JpaRepository { List findByGroupKey(String groupKey); + Optional findByUsosGroupId(String course_id); } diff --git a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/GroupService.java b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/GroupService.java index 0cb4bb6..45d9709 100644 --- a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/GroupService.java +++ b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/GroupService.java @@ -86,7 +86,7 @@ public class GroupService { while (!this.groupRepository.findByGroupKey(groupKey).isEmpty()) { groupKey = generator.generate(10); } - ; + group.setGroupKey(groupKey); Optional owner = this.userRepository.findByUsername(groupDto.getOwner()); if (!owner.isPresent()) { diff --git a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/StudyGroup.java b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/StudyGroup.java index 8e6dd53..99073e9 100644 --- a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/StudyGroup.java +++ b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroup/StudyGroup.java @@ -26,6 +26,8 @@ public class StudyGroup { @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + private String usosGroupId; + private String name; private String description; diff --git a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroupMember/StudyGroupMember.java b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroupMember/StudyGroupMember.java index 8ea3e36..ac836d1 100644 --- a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroupMember/StudyGroupMember.java +++ b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroupMember/StudyGroupMember.java @@ -31,4 +31,10 @@ public class StudyGroupMember { @Column(name="is_group_leader") private Boolean isGroupLeader; + + public StudyGroupMember(StudyGroup group, User user, Boolean isGroupLeader) { + this.group = group; + this.user = user; + this.isGroupLeader = isGroupLeader; + } } diff --git a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroupMember/StudyGroupMemberRepository.java b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroupMember/StudyGroupMemberRepository.java index 873b5fa..1ea7a9f 100644 --- a/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroupMember/StudyGroupMemberRepository.java +++ b/BackEnd/src/main/java/studycave/studycaverestservice/model/studyGroupMember/StudyGroupMemberRepository.java @@ -1,6 +1,7 @@ package studycave.studycaverestservice.model.studyGroupMember; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -15,4 +16,5 @@ public interface StudyGroupMemberRepository extends JpaRepository findByUserUsosUserUsosIdAndGroupUsosGroupId(String id, String groupId); } diff --git a/BackEnd/src/main/java/studycave/studycaverestservice/model/user/UserRepository.java b/BackEnd/src/main/java/studycave/studycaverestservice/model/user/UserRepository.java index 5a31615..1165767 100644 --- a/BackEnd/src/main/java/studycave/studycaverestservice/model/user/UserRepository.java +++ b/BackEnd/src/main/java/studycave/studycaverestservice/model/user/UserRepository.java @@ -7,4 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository { Optional findByUsername(String username); Optional findByEmail(String email); + + Optional findByUsosUserUsosId(String id); } diff --git a/BackEnd/src/main/java/studycave/studycaverestservice/usos/AuthorizationService.java b/BackEnd/src/main/java/studycave/studycaverestservice/usos/AuthorizationService.java index f2afd67..21907be 100644 --- a/BackEnd/src/main/java/studycave/studycaverestservice/usos/AuthorizationService.java +++ b/BackEnd/src/main/java/studycave/studycaverestservice/usos/AuthorizationService.java @@ -3,6 +3,7 @@ package studycave.studycaverestservice.usos; import io.restassured.response.Response; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.text.RandomStringGenerator; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; @@ -11,11 +12,16 @@ import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicNameValuePair; +import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import studycave.studycaverestservice.PropertiesLoader; +import studycave.studycaverestservice.model.studyGroup.GroupRepository; +import studycave.studycaverestservice.model.studyGroup.StudyGroup; +import studycave.studycaverestservice.model.studyGroupMember.StudyGroupMember; +import studycave.studycaverestservice.model.studyGroupMember.StudyGroupMemberRepository; import studycave.studycaverestservice.model.user.User; import studycave.studycaverestservice.model.user.UserRepository; import studycave.studycaverestservice.model.user.UsosUser; @@ -29,12 +35,14 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Optional; -import static io.restassured.RestAssured.get; -import static io.restassured.RestAssured.when; +import static io.restassured.RestAssured.*; import static studycave.studycaverestservice.utils.PasswordGenerator.*; @Service @@ -56,6 +64,12 @@ public class AuthorizationService { @Autowired private UserRepository userRepository; + @Autowired + private GroupRepository groupRepository; + + @Autowired + private StudyGroupMemberRepository studyGroupMemberRepository; + public TokenResponseDTO authorize(String oauth_token, String oauth_token_secret, String oauth_verifier) throws IOException, InvalidKeyException, NoSuchAlgorithmException { List queryParams = new ArrayList<>(); queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey())); @@ -74,28 +88,165 @@ public class AuthorizationService { oauth_token = tokens[0].replace("oauth_token=", ""); oauth_token_secret = tokens[1].replace("oauth_token_secret=", ""); TokenResponseDTO tokenResponseDTO = createUserAccountAndReturnHeaderToken(oauth_token, oauth_token_secret); - updateUserGroupsAndStudents(oauth_token, oauth_token_secret); + String finalOauth_token = oauth_token; + String finalOauth_token_secret = oauth_token_secret; + Thread thread = new Thread(() -> { + try { + if (checkIfEmploye(finalOauth_token, finalOauth_token_secret, tokenResponseDTO.getUserId())) + updateUserGroupsAndStudents(finalOauth_token, finalOauth_token_secret, tokenResponseDTO.getUserId()); + } catch (UnsupportedEncodingException | InvalidKeyException | NoSuchAlgorithmException e) { + e.printStackTrace(); + } + }); + thread.start(); //logOut(oauth_token, oauth_token_secret); return tokenResponseDTO; } - return new TokenResponseDTO("authorization failed", null); + return new TokenResponseDTO("authorization failed", null, null); } - private void updateUserGroupsAndStudents(String oauth_token, String oauth_token_secret) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException { + private boolean checkIfEmploye(String oauth_token, String oauth_token_secret, String userId) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException { List queryParams = new ArrayList<>(); - queryParams.add(new BasicNameValuePair("fields", "lecturers")); queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey())); queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000))); queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1")); queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000))); queryParams.add(new BasicNameValuePair("oauth_token", oauth_token)); queryParams.add(new BasicNameValuePair("oauth_version", "1.0")); - String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/groups/user", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret); - queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature)); - String url = "/groups/user?" + URLEncodedUtils.format(queryParams, ENC); + queryParams.add(new BasicNameValuePair("user_id", userId)); + String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/users/employment_positions", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret); - String courses = when().get(url).body().asString(); - System.out.println(courses); + queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature)); + String url = "/users/employment_positions?" + URLEncodedUtils.format(queryParams, ENC); + + Response response = get(url); + JSONArray responseJSON = new JSONArray(response.getBody().print()); + return responseJSON.length() > 0; + } + + private void updateUserGroupsAndStudents(String oauth_token, String oauth_token_secret, String userId) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException { + + RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange('0', 'z') + .filteredBy(Character::isLetterOrDigit).build(); + + String semesterId; + try { + semesterId = getActualSemester(oauth_token, oauth_token_secret); + } catch (ParseException e) { + e.printStackTrace(); + return; + } + + List queryParams = new ArrayList<>(); + queryParams.add(new BasicNameValuePair("fields", "course_unit_id|group_number|class_type|class_type_id|course_id|course_fac_id|term_id|lecturers")); + queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey())); + queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000))); + queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1")); + queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000))); + queryParams.add(new BasicNameValuePair("oauth_token", oauth_token)); + queryParams.add(new BasicNameValuePair("oauth_version", "1.0")); + queryParams.add(new BasicNameValuePair("user_id", userId)); + String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/groups/lecturer", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret); + queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature)); + String url = "/groups/lecturer?" + URLEncodedUtils.format(queryParams, ENC); + Response response = given().urlEncodingEnabled(false).get(url); + JSONObject responseJSON = new JSONObject(response.getBody().print()); + if (response.statusCode() == 200) { + responseJSON = responseJSON.getJSONObject("groups"); + if (responseJSON.has(semesterId)) { + JSONArray subjects = responseJSON.getJSONArray(semesterId); + for (int i = 0; i < subjects.length(); i++) { + JSONObject subject = subjects.getJSONObject(i); + if (subject.getString("class_type_id").equalsIgnoreCase("WYK")) { + Optional group = groupRepository.findByUsosGroupId(subject.getString("course_id") + "-" + subject.getString("term_id")); + if (!group.isPresent()) { + StudyGroup studyGroup = new StudyGroup(); + studyGroup.setName(subject.getJSONObject("course_name").getString("pl")); + studyGroup.setUsosGroupId(subject.getString("course_id") + "-" + subject.getString("term_id")); + studyGroup.setDescription("Wykład"); + studyGroup.getMembers().add(new StudyGroupMember(studyGroup, userRepository.findByUsername(userId).get(), true)); + String groupKey = generator.generate(10); + + while (!this.groupRepository.findByGroupKey(groupKey).isEmpty()) { + groupKey = generator.generate(10); + } + + studyGroup.setGroupKey(groupKey); + groupRepository.save(studyGroup); + } + } + } + updateGroupStudents(oauth_token, oauth_token_secret, semesterId); + } + } + } + + private void updateGroupStudents(String oauth_token, String oauth_token_secret, String semesterId) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException { + List queryParams = new ArrayList<>(); + queryParams.add(new BasicNameValuePair("fields", "course_editions[course_id|course_name|term_id|user_groups]")); + queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey())); + queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000))); + queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1")); + queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000))); + queryParams.add(new BasicNameValuePair("oauth_token", oauth_token)); + queryParams.add(new BasicNameValuePair("oauth_version", "1.0")); + String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/courses/user", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret); + queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature)); + String url = "/courses/user?" + URLEncodedUtils.format(queryParams, ENC); + + Response response = given().urlEncodingEnabled(false).get(url); + + JSONObject jsonObject = new JSONObject(response.getBody().print()); + JSONArray array = jsonObject.getJSONObject("course_editions").getJSONArray(semesterId); + for (int i = 0 ; i < array.length() ; i++){ + JSONObject course = array.getJSONObject(i); + String groupId = course.getString("course_id") + "-" + course.getString("term_id"); + Optional studyGroupCheck = groupRepository.findByUsosGroupId(groupId); + if (!studyGroupCheck.isPresent()) + continue; + StudyGroup studyGroup = studyGroupCheck.get(); + JSONArray participants = course.getJSONArray("user_groups").getJSONObject(0).getJSONArray("participants"); + for (int j = 0 ; j < participants.length() ; j++){ + String id = participants.getJSONObject(j).getString("id"); + Optional user = userRepository.findByUsosUserUsosId(id); + if (user.isPresent()) + if (!studyGroupMemberRepository.findByUserUsosUserUsosIdAndGroupUsosGroupId(id, groupId).isPresent()) + studyGroup.getMembers().add(new StudyGroupMember(studyGroup, user.get(), false)); + } + groupRepository.save(studyGroup); + } + } + + private String getActualSemester(String oauth_token, String oauth_token_secret) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, ParseException { + + List queryParams = new ArrayList<>(); + queryParams.add(new BasicNameValuePair("fields", "terms")); + queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey())); + queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000))); + queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1")); + queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000))); + queryParams.add(new BasicNameValuePair("oauth_token", oauth_token)); + queryParams.add(new BasicNameValuePair("oauth_version", "1.0")); + String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/courses/user", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret); + queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature)); + String url = "/courses/user?" + URLEncodedUtils.format(queryParams, ENC); + + Response response = given().urlEncodingEnabled(false).get(url); + JSONObject jsonObject = new JSONObject(response.getBody().print()); + JSONArray jsonArray = new JSONArray(jsonObject.getJSONArray("terms").toString()); + + Date currentDate = new Date(System.currentTimeMillis()); + + for (int i = jsonArray.length() - 1 ; i >= 0 ; i++){ + JSONObject academicYear = jsonArray.getJSONObject(i); + Date beginDate = new SimpleDateFormat("yyyy-MM-dd").parse(academicYear.getString("start_date")); + Date endDate = new SimpleDateFormat("yyyy-MM-dd").parse(academicYear.getString("end_date")); + if (currentDate.compareTo(beginDate) >= 0){ + if (currentDate.compareTo(endDate) <= 0) + return academicYear.getString("id"); + } + } + return null; } public String requestToken(String oauth_callback) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException { @@ -163,14 +314,14 @@ public class AuthorizationService { user.setUsername(id); user = userRepository.save(user); String token = getAuthToken(user.getUsername(), generatedPassword); - return new TokenResponseDTO(token, user.getUsername()); + return new TokenResponseDTO(token, user.getUsername(), user.getUsosUser().getUsosId()); } else { User user = userCheck.get(); user.getUsosUser().setPassword(bCryptPasswordEncoder.encode(generatedPassword)); user = userRepository.save(user); String token = getAuthToken(user.getUsername(), generatedPassword); - return new TokenResponseDTO(token, user.getUsername()); + return new TokenResponseDTO(token, user.getUsername(), user.getUsosUser().getUsosId()); } } diff --git a/BackEnd/src/main/java/studycave/studycaverestservice/usos/TokenResponseDTO.java b/BackEnd/src/main/java/studycave/studycaverestservice/usos/TokenResponseDTO.java index 3a04236..a8c5cdf 100644 --- a/BackEnd/src/main/java/studycave/studycaverestservice/usos/TokenResponseDTO.java +++ b/BackEnd/src/main/java/studycave/studycaverestservice/usos/TokenResponseDTO.java @@ -1,5 +1,6 @@ package studycave.studycaverestservice.usos; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,4 +16,7 @@ public class TokenResponseDTO { private String username; + @JsonIgnore + private String userId; + }