groups are created when lecturer is loggin in

This commit is contained in:
unknown 2019-12-01 19:02:44 +01:00
parent c7eba40e53
commit 6bca27c3a3
9 changed files with 184 additions and 15 deletions

View File

@ -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));
}
}

View File

@ -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<StudyGroup, Long> {
@ -11,4 +12,5 @@ public interface GroupRepository extends JpaRepository<StudyGroup, Long> {
List<StudyGroup> findByGroupKey(String groupKey);
Optional<StudyGroup> findByUsosGroupId(String course_id);
}

View File

@ -86,7 +86,7 @@ public class GroupService {
while (!this.groupRepository.findByGroupKey(groupKey).isEmpty()) {
groupKey = generator.generate(10);
}
;
group.setGroupKey(groupKey);
Optional<User> owner = this.userRepository.findByUsername(groupDto.getOwner());
if (!owner.isPresent()) {

View File

@ -26,6 +26,8 @@ public class StudyGroup {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String usosGroupId;
private String name;
private String description;

View File

@ -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;
}
}

View File

@ -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<StudyGroupMemb
@Query("select t from StudyGroupMember t where (t.group.id = :g and t.user.id = :u)")
StudyGroupMember findUserInGroup(@Param("g") Long g, @Param("u") Long u);
Optional<StudyGroupMember> findByUserUsosUserUsosIdAndGroupUsosGroupId(String id, String groupId);
}

View File

@ -7,4 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
Optional<User> findByEmail(String email);
Optional<User> findByUsosUserUsosId(String id);
}

View File

@ -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<NameValuePair> 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<NameValuePair> 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<NameValuePair> 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<StudyGroup> 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<NameValuePair> 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<StudyGroup> 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> 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<NameValuePair> 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());
}
}

View File

@ -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;
}