Resrservice docs 1st part
This commit is contained in:
parent
061c3a24fe
commit
f77213a01e
@ -21,6 +21,9 @@ import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
|
||||
import com.plannaplan.services.ConfiguratorService;
|
||||
|
||||
/**
|
||||
* Root class of Application.
|
||||
*/
|
||||
@SpringBootApplication
|
||||
@EnableScheduling
|
||||
public class App {
|
||||
|
@ -3,6 +3,9 @@ package com.plannaplan;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
/**
|
||||
* Class to generate logo string on start application and make logs info
|
||||
*/
|
||||
public class Logo {
|
||||
|
||||
public static final String ANSI_RESET = "\u001B[0m";
|
||||
@ -35,6 +38,11 @@ ANSI_RESET;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* return init string to log
|
||||
* @param isDev is spring profile dev
|
||||
* @return string to print in log
|
||||
*/
|
||||
public static String getInitInfo(boolean isDev){
|
||||
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
@ -45,6 +53,11 @@ ANSI_RESET;
|
||||
return ANSI_BLACK + dtf.format(now) + ANSI_YELLOW + " plannaplan" + ANSI_RESET + " initializing [" +ANSI_BLUE + "prod" + ANSI_RESET +"]";
|
||||
}
|
||||
|
||||
/**
|
||||
* return start string to log
|
||||
* @param isDev is spring profile dev
|
||||
* @return string to print in log
|
||||
*/
|
||||
public static String getStartedInfo(boolean isDev){
|
||||
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
@ -18,6 +18,9 @@ import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
/**
|
||||
* Config class of Swagger to generate rest api documentation
|
||||
*/
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
public class Swagger2Config extends WebMvcConfigurationSupport {
|
||||
|
@ -8,6 +8,9 @@ import com.plannaplan.types.GroupType;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
|
||||
/**
|
||||
* Assignment entity api response
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about given assigment to course.", value = "AssignmentResponse")
|
||||
public class AssignmentResponse {
|
||||
private Long id;
|
||||
@ -15,6 +18,11 @@ public class AssignmentResponse {
|
||||
private GroupWithCapacityResponse classes;
|
||||
private GroupWithCapacityResponse lecture;
|
||||
|
||||
/**
|
||||
* @param course course entity
|
||||
* @param lecture lecture Groups entity
|
||||
* @param classes class Groups entity
|
||||
*/
|
||||
public AssignmentResponse(Course course, Groups lecture, Groups classes) {
|
||||
this.id = course.getId();
|
||||
this.name = course.getName();
|
||||
@ -22,6 +30,13 @@ public class AssignmentResponse {
|
||||
this.classes = classes == null ? null : new GroupWithCapacityResponse(classes);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param course course entity
|
||||
* @param lecture lecture Groups entity
|
||||
* @param classes class Groups entity
|
||||
* @param ammounts map with ammounts key - group id, value - ammounts of taken
|
||||
* places
|
||||
*/
|
||||
public AssignmentResponse(Course course, Groups lecture, Groups classes, HashMap<Long, Integer> ammounts) {
|
||||
this.id = course.getId();
|
||||
this.name = course.getName();
|
||||
@ -29,28 +44,51 @@ public class AssignmentResponse {
|
||||
this.classes = classes == null ? null : new GroupWithCapacityResponse(classes, ammounts.get(classes.getId()));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param course course entity
|
||||
* @param group class/lecture entity
|
||||
*/
|
||||
public AssignmentResponse(Course course, Groups group) {
|
||||
this(course, group.getType() == GroupType.LECTURE ? group : null,
|
||||
group.getType() == GroupType.CLASS ? group : null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param course course entity
|
||||
* @param group class/lecture entity
|
||||
* @param ammounts map with ammounts key - group id, value - ammounts of taken
|
||||
* places
|
||||
*/
|
||||
public AssignmentResponse(Course course, Groups group, HashMap<Long, Integer> ammounts) {
|
||||
this(course, group.getType() == GroupType.LECTURE ? group : null,
|
||||
group.getType() == GroupType.CLASS ? group : null, ammounts);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Lecture in api response forms
|
||||
*/
|
||||
public GroupWithCapacityResponse getLecture() {
|
||||
return this.lecture;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Class in api response forms
|
||||
*/
|
||||
public GroupWithCapacityResponse getClasses() {
|
||||
return this.classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String course name
|
||||
*/
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return db assignment id
|
||||
*/
|
||||
public Long getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
@ -5,6 +5,9 @@ import com.plannaplan.entities.Commision;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
/**
|
||||
* Commision api response
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about commision.", value = "CommisionResponse")
|
||||
public class CommisionResponse {
|
||||
@ApiModelProperty(value = "ID created by database")
|
||||
@ -19,6 +22,9 @@ public class CommisionResponse {
|
||||
@ApiModelProperty(value = "Timestamp where the user commit the commision")
|
||||
private String commisionDate;
|
||||
|
||||
/**
|
||||
* @param commision commision to map to api response
|
||||
*/
|
||||
public CommisionResponse(Commision commision) {
|
||||
this.id = commision.getId();
|
||||
this.commisionDate = commision.getCommisionDate().toString();
|
||||
@ -27,18 +33,30 @@ public class CommisionResponse {
|
||||
: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return get Commiter user as api response
|
||||
*/
|
||||
public UserResponse getCommiter() {
|
||||
return commiter;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return get Owner user as api response
|
||||
*/
|
||||
public UserResponse getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return when commision was created string formated
|
||||
*/
|
||||
public String getCommisionDate() {
|
||||
return commisionDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return db id
|
||||
*/
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
@ -11,12 +11,18 @@ import com.plannaplan.entities.Commision;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
/**
|
||||
* Commision With Groups api Response. It extends CommisionResponse repsone
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about commision and its groups.", value = "CommisionWithGroupsResponse")
|
||||
public class CommisionWithGroupsResponse extends CommisionResponse {
|
||||
|
||||
@ApiModelProperty(value = "List of groups ids in databse that belongs to commision")
|
||||
private List<Long> groups;
|
||||
|
||||
/**
|
||||
* @param commision commision to map to api response
|
||||
*/
|
||||
public CommisionWithGroupsResponse(Commision commision) {
|
||||
super(commision);
|
||||
this.groups = commision.getAssignments().stream().filter(Objects::nonNull)
|
||||
@ -29,6 +35,9 @@ public class CommisionWithGroupsResponse extends CommisionResponse {
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return lsit of fetured groups ids
|
||||
*/
|
||||
public List<Long> getGroups() {
|
||||
return groups;
|
||||
}
|
||||
|
@ -5,21 +5,36 @@ import java.util.List;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
|
||||
/**
|
||||
* Course respose with all realted groups as api response. Alse needs to specify
|
||||
* what type of Groups api response will be kept here. For excmaple it can be
|
||||
* <b> GroupDefaultRespnse </b>
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about groups to given course.", value = "CourseWithGroupsResponse")
|
||||
public class CourseWithGroupsResponse <T> {
|
||||
public class CourseWithGroupsResponse<T> {
|
||||
|
||||
private List<T> lectures = new ArrayList<>();
|
||||
private List<T> classes = new ArrayList<>();
|
||||
|
||||
public CourseWithGroupsResponse(List<T> classes, List<T> lectures ){
|
||||
/**
|
||||
* @param classes realted classes Groups instance
|
||||
* @param lectures realted lectures Groups instance
|
||||
*/
|
||||
public CourseWithGroupsResponse(List<T> classes, List<T> lectures) {
|
||||
this.lectures = lectures;
|
||||
this.classes = classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return realted classes Groups instance
|
||||
*/
|
||||
public List<T> getClasses() {
|
||||
return this.classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return realted lectures Groups instance
|
||||
*/
|
||||
public List<T> getLectures() {
|
||||
return this.lectures;
|
||||
}
|
||||
|
@ -5,9 +5,21 @@ import com.plannaplan.responses.models.abstracts.CoursesResponse;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
|
||||
/**
|
||||
* Courses Default Api Response. It extends abstract response - CoursesResponse.
|
||||
* It was one of first repsones created in system. Later we resigned from
|
||||
* asbstract and used settig
|
||||
* <code>spring.jackson.default-property-inclusion = NON_NULL</code> in
|
||||
* properties instead.
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about course.", value = "CoursesDefaultResponse")
|
||||
public class CoursesDefaultResponse extends CoursesResponse {
|
||||
|
||||
/**
|
||||
* create new instance
|
||||
*
|
||||
* @param course course to map to api response
|
||||
*/
|
||||
public CoursesDefaultResponse(Course course) {
|
||||
super(course);
|
||||
}
|
||||
|
@ -9,12 +9,24 @@ import com.plannaplan.types.GroupType;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
|
||||
/**
|
||||
* Courses With Groups Api Response . It extends abstract response -
|
||||
* CoursesResponse. It was one of first repsones created in system. Later we
|
||||
* resigned from asbstract and used settig
|
||||
* <code>spring.jackson.default-property-inclusion = NON_NULL</code> in
|
||||
* properties instead.
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about groups to given course.", value = "CoursesWithGroupsResponse")
|
||||
public class CoursesWithGroupsResponse extends CoursesResponse {
|
||||
|
||||
private List<GroupWithCapacityResponse> lectures = new ArrayList<>();
|
||||
private List<GroupWithCapacityResponse> classes = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* create new instance
|
||||
*
|
||||
* @param course course to map to api response
|
||||
*/
|
||||
public CoursesWithGroupsResponse(Course course) {
|
||||
super(course);
|
||||
course.getGroups().stream().forEach(group -> {
|
||||
@ -26,6 +38,12 @@ public class CoursesWithGroupsResponse extends CoursesResponse {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param course course to map to api response
|
||||
* @param lectures list of api resposnes of lectures
|
||||
* @param classes list of api resposnes of classes
|
||||
*/
|
||||
public CoursesWithGroupsResponse(Course course, List<GroupWithCapacityResponse> lectures,
|
||||
List<GroupWithCapacityResponse> classes) {
|
||||
super(course);
|
||||
@ -33,10 +51,16 @@ public class CoursesWithGroupsResponse extends CoursesResponse {
|
||||
this.classes = classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list of api resposnes of classes
|
||||
*/
|
||||
public List<GroupWithCapacityResponse> getClasses() {
|
||||
return this.classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list of api resposnes of lectures
|
||||
*/
|
||||
public List<GroupWithCapacityResponse> getLectures() {
|
||||
return this.lectures;
|
||||
}
|
||||
|
@ -2,35 +2,72 @@ package com.plannaplan.responses.models;
|
||||
|
||||
import com.plannaplan.entities.Exchange;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
/**
|
||||
* Exchange proposal api repsonse
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about user exchanges", value = "CourseWithGroupsResponse")
|
||||
public class ExchangeResponse {
|
||||
private Long id;
|
||||
private GroupDefaultResponse ownedAssignment;
|
||||
private GroupDefaultResponse desiredGroup;
|
||||
@ApiModelProperty(value = "Database id")
|
||||
private Long id;
|
||||
@ApiModelProperty(value = "Assignmetn that user want to trade")
|
||||
private GroupDefaultResponse ownedAssignment;
|
||||
@ApiModelProperty(value = "Group that user want to get")
|
||||
private GroupDefaultResponse desiredGroup;
|
||||
|
||||
public ExchangeResponse(Exchange exchange){
|
||||
this.id = exchange.getId();
|
||||
this.ownedAssignment = new GroupDefaultResponse(exchange.getOwnedAssignment().getGroup());
|
||||
this.desiredGroup = new GroupDefaultResponse(exchange.getDesiredAssignment());
|
||||
}
|
||||
/**
|
||||
* creat new instance
|
||||
*
|
||||
* @param exchange entity to map to api repsone
|
||||
*/
|
||||
public ExchangeResponse(Exchange exchange) {
|
||||
this.id = exchange.getId();
|
||||
this.ownedAssignment = new GroupDefaultResponse(exchange.getOwnedAssignment().getGroup());
|
||||
this.desiredGroup = new GroupDefaultResponse(exchange.getDesiredAssignment());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return get api respondse of wanted byt user group
|
||||
*/
|
||||
public GroupDefaultResponse getDesiredGroup() {
|
||||
return desiredGroup;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param desiredGroup set api respondse of wanted byt user group
|
||||
*/
|
||||
public void setDesiredGroup(GroupDefaultResponse desiredGroup) {
|
||||
this.desiredGroup = desiredGroup;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return get api respondse of owned user group
|
||||
*/
|
||||
public GroupDefaultResponse getOwnedAssignment() {
|
||||
return ownedAssignment;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ownedAssignment set api respondse of owned user group
|
||||
*/
|
||||
public void setOwnedAssignment(GroupDefaultResponse ownedAssignment) {
|
||||
this.ownedAssignment = ownedAssignment;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return database id
|
||||
*/
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id set database id
|
||||
*/
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -8,6 +8,9 @@ import com.plannaplan.types.GroupType;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
/**
|
||||
* Default api response for Groups entity
|
||||
*/
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@ApiModel(description = "Response shows information about given group.", value = "GroupDefaultResponse")
|
||||
public class GroupDefaultResponse {
|
||||
@ -36,6 +39,11 @@ public class GroupDefaultResponse {
|
||||
@ApiModelProperty(value = "Value shows how many places is already taken by other students.")
|
||||
private Integer takenPlaces;
|
||||
|
||||
/**
|
||||
* creat new entity
|
||||
*
|
||||
* @param group entity to map to api response
|
||||
*/
|
||||
public GroupDefaultResponse(Groups group) {
|
||||
this.id = group.getId() != null ? group.getId() : null;
|
||||
this.day = group.getDay() != null ? group.getDay().label : -1;
|
||||
@ -46,43 +54,77 @@ public class GroupDefaultResponse {
|
||||
this.type = group.getType() != null ? group.getType() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param group entity to map to api response
|
||||
* @param takenPlaces ammount of taken places for group by other users
|
||||
*/
|
||||
public GroupDefaultResponse(Groups group, int takenPlaces) {
|
||||
this(group);
|
||||
this.takenPlaces = takenPlaces;
|
||||
}
|
||||
|
||||
/**
|
||||
* creat new entity
|
||||
*
|
||||
* @param assignment entity to map to api response
|
||||
*/
|
||||
public GroupDefaultResponse(Assignment assignment) {
|
||||
this(assignment.getGroup());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return what typew of group is this (lecture or class)
|
||||
*/
|
||||
public GroupType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return room where classes will take place
|
||||
*/
|
||||
public String getRoom() {
|
||||
return room;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return name of group lecturer
|
||||
*/
|
||||
public String getLecturer() {
|
||||
return lecturer;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return time when group is scheduled on
|
||||
*/
|
||||
public String getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return time when class ends
|
||||
*/
|
||||
public String getEndTime() {
|
||||
return endTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int what day is it. 0-6 (Monday - Sunday)
|
||||
*/
|
||||
public int getDay() {
|
||||
return day;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return db id
|
||||
*/
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ammount of taken places for group by other users
|
||||
*/
|
||||
public Integer getTakenPlaces() {
|
||||
return this.takenPlaces;
|
||||
}
|
||||
|
@ -4,29 +4,57 @@ import com.plannaplan.entities.Assignment;
|
||||
import com.plannaplan.entities.Groups;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
|
||||
/**
|
||||
* Group api response featuring group capacity
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about group with included capacity.", value = "GroupWithCapacityResponse")
|
||||
public class GroupWithCapacityResponse extends GroupDefaultResponse {
|
||||
|
||||
private int capacity;
|
||||
|
||||
/**
|
||||
* create new instance
|
||||
*
|
||||
* @param group entity to map to api response
|
||||
*/
|
||||
public GroupWithCapacityResponse(Groups group) {
|
||||
super(group);
|
||||
this.capacity = group.getCapacity();
|
||||
}
|
||||
|
||||
/**
|
||||
* create new instance
|
||||
*
|
||||
* @param group entity to map to api response
|
||||
* @param takenPlaces group taken places
|
||||
*/
|
||||
public GroupWithCapacityResponse(Groups group, int takenPlaces) {
|
||||
super(group, takenPlaces);
|
||||
this.capacity = group.getCapacity();
|
||||
}
|
||||
|
||||
/**
|
||||
* create new instance
|
||||
*
|
||||
* @param assignment entity to map to api response
|
||||
*/
|
||||
public GroupWithCapacityResponse(Assignment assignment) {
|
||||
this(assignment.getGroup());
|
||||
}
|
||||
|
||||
/**
|
||||
* create new instance
|
||||
*
|
||||
* @param assignment entity to map to api response
|
||||
* @param takenPlaces group taken places
|
||||
*/
|
||||
public GroupWithCapacityResponse(Assignment assignment, int takenPlaces) {
|
||||
this(assignment.getGroup(), takenPlaces);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return group taken places
|
||||
*/
|
||||
public int getCapacity() {
|
||||
return capacity;
|
||||
}
|
||||
|
@ -5,6 +5,9 @@ import com.plannaplan.entities.User;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
/**
|
||||
* Response to show after successfully login cation
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about logged user.", value = "TokenResponse")
|
||||
public class TokenResponse {
|
||||
@ApiModelProperty(value = "user token used to verify requests")
|
||||
@ -18,6 +21,9 @@ public class TokenResponse {
|
||||
@ApiModelProperty(value = "user unviersity email")
|
||||
private String email;
|
||||
|
||||
/**
|
||||
* @param user user to be mapped to api response
|
||||
*/
|
||||
public TokenResponse(User user) {
|
||||
this.id = user.getId();
|
||||
this.authorityRole = user.getRole().toString();
|
||||
@ -26,22 +32,37 @@ public class TokenResponse {
|
||||
this.refreshToken = user.getRefreshToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return user email
|
||||
*/
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return user role in system
|
||||
*/
|
||||
public String getAuthorityRole() {
|
||||
return authorityRole;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return db id
|
||||
*/
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return user token to authorize other requests
|
||||
*/
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return user refresh token
|
||||
*/
|
||||
public String getRefreshToken() {
|
||||
return this.refreshToken;
|
||||
}
|
||||
|
@ -4,6 +4,9 @@ import com.plannaplan.entities.User;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
|
||||
/**
|
||||
* Model for api response for user serach results.
|
||||
*/
|
||||
@ApiModel(description = "Response shows information about user.", value = "UserResponse")
|
||||
public class UserResponse {
|
||||
|
||||
@ -12,6 +15,9 @@ public class UserResponse {
|
||||
private String surname;
|
||||
private String email;
|
||||
|
||||
/**
|
||||
* @param user entity to be mapped to api response
|
||||
*/
|
||||
public UserResponse(User user) {
|
||||
this.id = user.getId();
|
||||
this.name = user.getName() != null ? user.getName() : "";
|
||||
@ -19,18 +25,30 @@ public class UserResponse {
|
||||
this.email = user.getEmail();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return user email
|
||||
*/
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return user surname
|
||||
*/
|
||||
public String getSurname() {
|
||||
return surname;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return user name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return db id
|
||||
*/
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
@ -2,20 +2,34 @@ package com.plannaplan.responses.models.abstracts;
|
||||
|
||||
import com.plannaplan.entities.Course;
|
||||
|
||||
/**
|
||||
* Course entity api response
|
||||
*/
|
||||
public abstract class CoursesResponse {
|
||||
|
||||
private Long id;
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* create instance
|
||||
*
|
||||
* @param course entity to map to api response
|
||||
*/
|
||||
public CoursesResponse(Course course) {
|
||||
this.id = course.getId() != null ? course.getId() : null;
|
||||
this.name = course.getName() != null ? course.getName() : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return course name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return db id
|
||||
*/
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
@ -17,6 +17,9 @@ import org.springframework.security.web.util.matcher.RequestMatcher;
|
||||
|
||||
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
|
||||
|
||||
/**
|
||||
* Spring authentication filter class
|
||||
*/
|
||||
public class AuthenticationFilter extends AbstractAuthenticationProcessingFilter {
|
||||
|
||||
AuthenticationFilter(final RequestMatcher requiresAuth) {
|
||||
|
@ -16,6 +16,9 @@ import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* Spring authentication provider
|
||||
*/
|
||||
@Component
|
||||
public class AuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {
|
||||
|
||||
@ -25,8 +28,6 @@ public class AuthenticationProvider extends AbstractUserDetailsAuthenticationPro
|
||||
@Override
|
||||
protected void additionalAuthenticationChecks(UserDetails userDetails,
|
||||
UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
|
||||
// is being done in other task
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -6,6 +6,9 @@ import com.plannaplan.types.UserRoles;
|
||||
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
|
||||
/**
|
||||
* Users Roles for spring app
|
||||
*/
|
||||
public enum AuthorityRoles implements GrantedAuthority {
|
||||
STUDENT("ROLE_STUDENT"), DEANERY("ROLE_DEANERY"), ADMIN("ROLE_ADMIN"), TEST_USER("ROLE_TESTUSER");
|
||||
|
||||
@ -20,6 +23,12 @@ public enum AuthorityRoles implements GrantedAuthority {
|
||||
return this.role;
|
||||
}
|
||||
|
||||
/**
|
||||
* map buisness logic UserRoles enum to spring enum
|
||||
*
|
||||
* @param role buisness logic enum
|
||||
* @return restservice AuthorityRoles enum
|
||||
*/
|
||||
public static final Optional<AuthorityRoles> getAuthorityRole(UserRoles role) {
|
||||
switch (role) {
|
||||
case ADMIN:
|
||||
|
@ -16,9 +16,11 @@ import org.springframework.http.HttpStatus;
|
||||
import org.springframework.security.web.authentication.AnonymousAuthenticationFilter;
|
||||
import org.springframework.security.web.authentication.HttpStatusEntryPoint;
|
||||
|
||||
/**
|
||||
* Spring config class for security
|
||||
*/
|
||||
@Configuration
|
||||
@EnableWebSecurity
|
||||
|
||||
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
|
||||
private static final RequestMatcher PROTECTED_URLS = new OrRequestMatcher(new AntPathRequestMatcher("/api/**"));
|
||||
|
@ -1,19 +1,36 @@
|
||||
package com.plannaplan.security.cas;
|
||||
|
||||
/**
|
||||
* Model to keep data from Cas response. It's important to remember that wee
|
||||
* need to register our domain name in CAS in order to get this data. Otherwise
|
||||
* CAS will retuned what user typed as login.
|
||||
*/
|
||||
public class CasUserIdentity {
|
||||
private String usosId;
|
||||
private String email;
|
||||
|
||||
public CasUserIdentity(String usosId, String email){
|
||||
|
||||
/**
|
||||
* creates new instance
|
||||
*
|
||||
* @param usosId usosId retured from CAS
|
||||
* @param email emial returned from CAS
|
||||
*/
|
||||
public CasUserIdentity(String usosId, String email) {
|
||||
this.usosId = usosId;
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string with usosid
|
||||
*/
|
||||
public String getUsosId() {
|
||||
return usosId;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string with email
|
||||
*/
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package com.plannaplan.security.cas;
|
||||
|
||||
/**
|
||||
* Exception to throw when cas didn't validate provided ticket
|
||||
*/
|
||||
public class CasValidationExcepiton extends RuntimeException {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public CasValidationExcepiton(String s) {
|
||||
|
@ -1,6 +1,17 @@
|
||||
package com.plannaplan.security.cas;
|
||||
|
||||
/**
|
||||
* We can authorize in different contexts. For example if we rgister our domain
|
||||
* we will get more info than on localhost. This abstraction let's us handle
|
||||
* both cases based on spring profile
|
||||
*/
|
||||
public interface CasValidator {
|
||||
|
||||
|
||||
/**
|
||||
* validate ticket (should be provided in costructor or by setter)
|
||||
*
|
||||
* @return CasUserIdentity instance with values from response or null if
|
||||
* validation failed
|
||||
*/
|
||||
CasUserIdentity validate();
|
||||
}
|
||||
|
@ -4,6 +4,10 @@ import org.jasig.cas.client.validation.Assertion;
|
||||
import org.jasig.cas.client.validation.Cas20ServiceTicketValidator;
|
||||
import org.jasig.cas.client.validation.TicketValidationException;
|
||||
|
||||
/**
|
||||
* Cas Validator for UAM with domain registered for email and usosid as a
|
||||
* repsonse
|
||||
*/
|
||||
public class CustomUAMCasValidator implements CasValidator {
|
||||
private static String CAS_URL = "https://cas.amu.edu.pl/cas";
|
||||
private static String EMAIL_FIELD = "mail";
|
||||
@ -11,31 +15,36 @@ public class CustomUAMCasValidator implements CasValidator {
|
||||
private String service;
|
||||
private String ticket;
|
||||
|
||||
public CustomUAMCasValidator(String service, String ticket){
|
||||
/**
|
||||
* craste new instance
|
||||
*
|
||||
* @param service string with url of our service from where request began
|
||||
* @param ticket ticket returned after user provided creeds on cas page
|
||||
*/
|
||||
public CustomUAMCasValidator(String service, String ticket) {
|
||||
this.service = service;
|
||||
this.ticket = ticket;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CasUserIdentity validate() {
|
||||
/*
|
||||
* TO DO
|
||||
* Dodać case z CAS10/CAS20/CAS30
|
||||
*/
|
||||
final Cas20ServiceTicketValidator validator = new Cas20ServiceTicketValidator(CustomUAMCasValidator.CAS_URL);
|
||||
|
||||
try {
|
||||
final Assertion assertion = validator.validate(this.ticket, this.service);
|
||||
|
||||
|
||||
if (assertion == null) {
|
||||
throw new CasValidationExcepiton("Validation failed. Assertion could not be retrieved for ticket " + "");
|
||||
throw new CasValidationExcepiton(
|
||||
"Validation failed. Assertion could not be retrieved for ticket " + "");
|
||||
}
|
||||
|
||||
final String usosid = assertion.getPrincipal().getAttributes().get(CustomUAMCasValidator.USOS_ID).toString();
|
||||
|
||||
final String mail = assertion.getPrincipal().getAttributes().get(CustomUAMCasValidator.EMAIL_FIELD).toString();
|
||||
final String usosid = assertion.getPrincipal().getAttributes().get(CustomUAMCasValidator.USOS_ID)
|
||||
.toString();
|
||||
|
||||
return new CasUserIdentity(usosid,mail);
|
||||
final String mail = assertion.getPrincipal().getAttributes().get(CustomUAMCasValidator.EMAIL_FIELD)
|
||||
.toString();
|
||||
|
||||
return new CasUserIdentity(usosid, mail);
|
||||
|
||||
} catch (TicketValidationException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -9,12 +9,21 @@ import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
|
||||
/**
|
||||
* Cas Validator for localhost and not registered dopmains
|
||||
*/
|
||||
public class DefaultUAMCasValidator implements CasValidator {
|
||||
private static String CAS_URL = "https://cas.amu.edu.pl/cas";
|
||||
private final CloseableHttpClient httpClient = HttpClients.createDefault();
|
||||
private String service;
|
||||
private String ticket;
|
||||
|
||||
/**
|
||||
* craste new instance
|
||||
*
|
||||
* @param service string with url of our service from where request began
|
||||
* @param ticket ticket returned after user provided creeds on cas page
|
||||
*/
|
||||
public DefaultUAMCasValidator(String service, String ticket) {
|
||||
this.service = service;
|
||||
this.ticket = ticket;
|
||||
@ -39,13 +48,13 @@ public class DefaultUAMCasValidator implements CasValidator {
|
||||
}
|
||||
|
||||
String res = result.substring(result.indexOf('\n') + 1);
|
||||
return new CasUserIdentity(null,res);
|
||||
return new CasUserIdentity(null, res);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
catch (Exception e) {
|
||||
throw new CasValidationExcepiton("Cas Validation has failed.");
|
||||
throw new CasValidationExcepiton("Cas Validation has failed.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,6 +14,21 @@
|
||||
"name": "plannaplan.email",
|
||||
"type": "java.lang.String",
|
||||
"description": "Email from which app sends message"
|
||||
},
|
||||
{
|
||||
"name": "plannaplan.apiurl",
|
||||
"type": "java.lang.String",
|
||||
"description": "Url to usos api endpoints"
|
||||
},
|
||||
{
|
||||
"name": "plannaplan.apikey",
|
||||
"type": "java.lang.String",
|
||||
"description": "Api consumer key"
|
||||
},
|
||||
{
|
||||
"name": "plannaplan.apisecret",
|
||||
"type": "java.lang.String",
|
||||
"description": "Api consumer secret"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user