80 Commits

Author SHA1 Message Date
db0115280f Windows white spaces 2020-10-24 18:04:59 +02:00
f71715fd6b Merge pull request 'scurity-roles' (#13) from scurity-roles into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/13
LGMT
2020-10-24 18:01:29 +02:00
9dba639674 Merge pull request 'ZPI-139' (#12) from ZPI-139 into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/12
2020-10-24 18:01:17 +02:00
4614a11a8b Cors 2020-10-24 17:54:00 +02:00
a1f17d271f WE HAVE THE GOD DMAN TEST 2020-10-24 17:51:16 +02:00
6384f3d9b9 User Controller Tests 2020-10-24 17:28:10 +02:00
7d57157078 Mapper test 2020-10-24 17:08:51 +02:00
468b6e6b87 ShearchForStduentsResponseTest.java 2020-10-24 16:49:26 +02:00
c003198aa1 Fixed old tests 2020-10-24 16:43:42 +02:00
603dadd9c1 Mapping of getCourseGroups
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-10-20 19:02:18 +02:00
4b07793849 Added test to implement and some tests failed rightnow 2020-10-19 12:33:54 +02:00
67c8b9bf25 Added response mappers 2020-10-19 12:13:02 +02:00
0ad97a8e3f Added auth endpoint 2020-10-19 11:12:24 +02:00
5fd688fc7a Added roles 2020-10-16 16:31:10 +02:00
a20bc89fc6 Added GetCourseGroupsResponse(-Test)
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-10-16 16:13:40 +02:00
9c02a0b596 Merge pull request 'refactor' (#11) from refactor into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/11
2020-10-15 18:14:13 +02:00
2b067f63fc Commisions respone updatede 2020-10-15 17:29:40 +02:00
010f0b4566 Warinings fix 2020-10-15 17:09:23 +02:00
cb60b17389 groups by course fix 2020-10-15 16:56:31 +02:00
3e8bfe85d6 Checkpoint - group controller needs to be fixed 2020-10-13 18:03:37 +02:00
932e1a8830 Little refactor 2020-10-13 17:13:43 +02:00
148d7a31c6 Responses up[dated 2020-10-13 17:07:04 +02:00
bdd0278880 Moved CoursesResponse To Abstract 2020-10-13 16:19:40 +02:00
29851dac0d Courses Controller getCourses Mapping 2020-10-09 14:53:54 +02:00
f97e22fa5f Made ASsignm,ents Conmtroller more readable 2020-10-08 16:41:13 +02:00
9d97306e5c Added Assignment Response Model 2020-10-08 15:57:42 +02:00
f9706e0e01 Tests works 2020-10-08 15:24:23 +02:00
f9dd6e38c3 3/4 Commisions test 2020-10-05 17:56:35 +02:00
73104850fe Assignments Controller test + authj test fix 2020-10-05 16:52:52 +02:00
fe5d2d20c3 lol small diff fix 2020-10-02 18:01:51 +02:00
30222d6856 Commision service tests 2020-10-02 17:55:42 +02:00
95fcfc4e06 Assignments tests 2020-10-02 17:18:03 +02:00
e9ae1a0ed0 Checkpoint: Added tests to impleement 2020-10-02 16:51:49 +02:00
bb9ea7529f Added what commision tests needst to be written 2020-10-01 17:08:10 +02:00
398a84854f Merge with assign 2020-10-01 16:46:45 +02:00
51ea557a06 Small fix 2020-09-30 19:16:15 +02:00
fa74965504 Works 2020-09-30 19:15:32 +02:00
b503ebcbcc Added commisions endponts 2020-09-30 17:46:04 +02:00
b4d1c87461 Checkpoint getting authority works + added new user 2020-09-29 19:06:29 +02:00
3ad4d3a84b Checkpoint kinda workls. Ill take a nap and go bacjk to work 2020-09-29 17:21:34 +02:00
4efedf7f35 concept for assigmnents 2020-09-28 16:07:10 +02:00
917a4e3535 optional to users 2020-09-25 17:01:51 +02:00
15a4c526b4 access modifiers and constructors fix 2020-09-25 17:01:38 +02:00
44bcc24110 access modifiers and constructors fix 2020-09-25 16:43:24 +02:00
ce4a5942d5 Added missing tests 2020-09-25 16:17:52 +02:00
9cec5a902c CHECKPOINT: Tests for rest service 2020-09-24 19:12:04 +02:00
305b86945d Small test fixc 2020-09-24 17:46:35 +02:00
3d1269037b Buisness logic tests 2020-09-24 17:44:23 +02:00
694fe74690 CHECKPOINT: Made configuyrator as a service. Test and java access modifier correction needs to be done before pull request 2020-09-23 19:12:25 +02:00
9599d58543 Removed unimplemented classes (no longer needed due to coneption changed) 2020-09-23 18:39:43 +02:00
bf6e1fc2b1 Maciek refactor works + delete unnecesery interface (conception changed) 2020-09-23 18:17:52 +02:00
ec77fa782b Moved to new computer 2020-09-22 18:00:28 +02:00
c449bc22e1 Major refactor of reading from excel to db 2020-09-21 17:45:52 +02:00
e91965e9b5 Merge pull request 'CourseServiceTest' (#10) from CourseServiceTest into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/10
2020-09-17 16:24:58 +02:00
6be6bd0184 Added LecturerServiceTest with createAndDeleteLecturer
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-16 17:41:36 +02:00
1cff3ceb74 Added delete method into LecturerService
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-16 17:35:39 +02:00
a717a85a80 Created test GroupServiceTest.java. It contains createAndDeleteGroup
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-16 17:33:39 +02:00
d5e32a487b Added delete method in GroupService
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-16 17:23:33 +02:00
551011db1c Zmiana nazwy z Remove na Delete, dodanie testu na usuwanie.
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-16 17:21:01 +02:00
283be6603d Dodanie usuniecie kursu.
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-16 17:15:56 +02:00
43660c4fe9 Dodanie nowego testu do dodawnia kursu.
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-16 17:14:37 +02:00
579da3f038 Merge pull request 'security' (#9) from security into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/9
2020-09-15 17:27:04 +02:00
b951f1f934 Added some endpoints not protected 2020-09-15 11:31:30 +02:00
82c4c9d0fe Added forbiden urls and protected 2020-09-14 14:02:05 +02:00
478ea27480 Endpoint returnung token if valid data 2020-09-14 12:55:47 +02:00
11f3625684 User service added login and returning token 2020-09-14 12:39:25 +02:00
8c16b2f3d1 Added auth endpoint 2020-09-11 14:33:29 +02:00
c9f50c5b16 Cas update 2020-09-11 14:12:13 +02:00
3deebe9248 Added CasValidator 2020-09-11 13:15:22 +02:00
824c137141 Merge pull request 'Removed ConfiguratorTest.java, and rewrite it into configutils/FileToDatabaseMigratorTest.java' (#8) from ConfiguratorTest-to-FileToDatabaseMigratorTest into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/8
2020-09-09 16:34:00 +02:00
408c8a8242 Removed ConfiguratorTest.java, and rewrite it into configutils/FileToDatabaseMigratorTest.java
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-09 16:26:42 +02:00
333ceb9b74 Merge pull request 'testing-web' (#7) from testing-web into master
Testy zakończone sukcesem. Brak błędów pomiędzy discro.

Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/7
2020-09-04 16:25:40 +02:00
7a7c882163 Added config test 2020-09-04 16:24:00 +02:00
16b9cb3cf2 Spring starts on test run 2020-09-04 16:09:57 +02:00
56e519dcd6 Updated
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-03 17:09:35 +02:00
b659f70a1f Changed version junit 4.11 to 4.12
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-03 17:02:17 +02:00
f6d4674ec8 Inny error, zmiana lokalizacji pliku
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-03 16:59:27 +02:00
9ea2912e98 Added ConfiguratorTest.java. Updated pom.xml
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-09-03 16:30:42 +02:00
b65c56078b Merge pull request 'sql -> hql' (#6) from hql into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/6
2020-09-03 15:27:37 +02:00
bf5b78c3b6 sql -> hql 2020-09-02 16:56:49 +02:00
136 changed files with 2721 additions and 887 deletions

0
.gitignore vendored Normal file → Executable file
View File

0
README.md Normal file → Executable file
View File

24
buisnesslogic/pom.xml Normal file → Executable file
View File

@ -12,24 +12,32 @@
<version>1.0-SNAPSHOT</version>
<name>buisnesslogic</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<url>http://plannaplan.pl</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.14</maven.compiler.source>
<maven.compiler.target>1.14</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
@ -49,7 +57,7 @@
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
<version>4.0.0</version>
</dependency>
<!-- dependency used for XLS older file format

View File

@ -1,9 +0,0 @@
package com.plannaplan;
public class Acceptor {
public Acceptor() {
}
public void run() {
}
}

View File

@ -1,46 +0,0 @@
package com.plannaplan;
import java.util.Date;
import com.plannaplan.types.AppStates;
public class App {
private static App instance;
private Date round1;
private Date round2;
private AppStates state;
private App() {
}
public AppStates getState() {
return state;
}
public void setState(AppStates state) {
this.state = state;
}
public Date getRound2() {
return round2;
}
public void setRound2(Date round2) {
this.round2 = round2;
}
public Date getRound1() {
return round1;
}
public void setRound1(Date round1) {
this.round1 = round1;
}
public App getInstance() {
if (App.instance == null) {
App.instance = new App();
}
return App.instance;
}
}

View File

@ -1,26 +0,0 @@
package com.plannaplan;
import com.plannaplan.interfaces.Historable;
import com.plannaplan.interfaces.ProtectedAction;
public class Assigner implements Historable, ProtectedAction {
public Assigner() {
}
public void assing() {
}
@Override
public void validateAction() {
// TODO Auto-generated method stub
}
@Override
public void addActionToHistory() {
// TODO Auto-generated method stub
}
}

View File

@ -1,43 +0,0 @@
package com.plannaplan;
import com.plannaplan.interfaces.ProtectedAction;
import com.plannaplan.models.ConfigData;
import com.plannaplan.models.FileData;
import com.plannaplan.services.CourseService;
import com.plannaplan.services.GroupService;
import com.plannaplan.services.LecturerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.plannaplan.configutils.*;
@Component
public class Configurator implements ProtectedAction {
@Autowired
private LecturerService lecturerService;
@Autowired
private CourseService courseService;
@Autowired
private GroupService groupService;
public Configurator() {
}
public void config(ConfigData data) {
FileReader reader = new FileReader(data.getFilestream());
FileData coursesData = reader.read();
FileToDatabaseMigrator mgtr = new FileToDatabaseMigrator(lecturerService, courseService, groupService);
mgtr.migrate(coursesData);
}
@Override
public void validateAction() {
// TODO Auto-generated method stub
}
}

View File

@ -1,41 +0,0 @@
package com.plannaplan;
import com.plannaplan.models.ConfigData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Controller {
@Autowired
private Configurator configurator;
public Controller() {
}
public void startApp() {
}
public void assignCourse() {
}
public void addUnavailibility() {
}
public void addGroup() {
}
public void editGroup() {
}
public void getHistoryAtPoint() {
}
public void config(ConfigData data) {
configurator.config(data);
}
public void createTransfer() {
}
}

View File

@ -1,9 +0,0 @@
package com.plannaplan;
public class Emailer {
public Emailer() {
}
public void performAllMails() {
}
}

View File

@ -1,13 +0,0 @@
package com.plannaplan;
import com.plannaplan.interfaces.EventCreator;
public class EventChcker implements EventCreator {
@Override
public void update() {
// TODO Auto-generated method stub
}
}

View File

@ -1,26 +0,0 @@
package com.plannaplan;
import com.plannaplan.interfaces.Historable;
import com.plannaplan.interfaces.ProtectedAction;
public class GroupAdder implements Historable, ProtectedAction {
public GroupAdder() {
}
public void addGroup() {
}
@Override
public void addActionToHistory() {
// TODO Auto-generated method stub
}
@Override
public void validateAction() {
// TODO Auto-generated method stub
}
}

View File

@ -1,19 +0,0 @@
package com.plannaplan;
import com.plannaplan.interfaces.ProtectedAction;
public class GroupEditor implements ProtectedAction {
public GroupEditor() {
}
public void setNewCapacity(int capaity) {
}
@Override
public void validateAction() {
// TODO Auto-generated method stub
}
}

View File

@ -1,22 +0,0 @@
package com.plannaplan;
import com.plannaplan.interfaces.ProtectedAction;
public class HistoryResolver implements ProtectedAction {
public HistoryResolver() {
}
public void getHistoryAtPoint() {
}
public void reproduce() {
}
@Override
public void validateAction() {
// TODO Auto-generated method stub
}
}

View File

@ -1,26 +0,0 @@
package com.plannaplan;
import com.plannaplan.interfaces.Historable;
import com.plannaplan.interfaces.ProtectedAction;
public class TransferCreator implements Historable, ProtectedAction {
public TransferCreator() {
}
public void createTransfer() {
}
@Override
public void validateAction() {
// TODO Auto-generated method stub
}
@Override
public void addActionToHistory() {
// TODO Auto-generated method stub
}
}

View File

@ -1,19 +0,0 @@
package com.plannaplan;
import com.plannaplan.interfaces.Historable;
public class TransferValidator implements Historable {
public TransferValidator() {
}
public void performAllTransfers() {
}
@Override
public void addActionToHistory() {
// TODO Auto-generated method stub
}
}

View File

@ -1,26 +0,0 @@
package com.plannaplan;
import com.plannaplan.interfaces.Historable;
import com.plannaplan.interfaces.ProtectedAction;
public class UnavailabilityAdder implements Historable, ProtectedAction {
public UnavailabilityAdder() {
}
public void add() {
}
@Override
public void validateAction() {
// TODO Auto-generated method stub
}
@Override
public void addActionToHistory() {
// TODO Auto-generated method stub
}
}

View File

@ -1,26 +0,0 @@
package com.plannaplan.abstracts;
import java.util.ArrayList;
import java.util.List;
import com.plannaplan.interfaces.EventCreator;
public abstract class EventWatcher {
protected List<EventCreator> creators;
public EventWatcher() {
this.creators = new ArrayList<>();
}
public void attach(EventCreator creator) {
this.creators.add(creator);
}
public void detach(EventCreator creator) {
this.creators.remove(creator);
}
public void update() {
}
}

View File

@ -2,7 +2,7 @@ package com.plannaplan.configutils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.HashMap;
import java.util.Iterator;
import org.apache.poi.xssf.usermodel.XSSFSheet;
@ -33,12 +33,12 @@ public class FileReader {
Row row = rowIt.next();
Iterator<Cell> cellIt = row.cellIterator();
Hashtable<String, Integer> keys = new Hashtable<>();
HashMap<String, Integer> keys = new HashMap<>();
int index = 0;
while (cellIt.hasNext()) {
Cell c = cellIt.next();
keys.put(c.toString(), index);
index+=1;
index += 1;
}
rowIt.remove();

View File

@ -1,7 +1,6 @@
package com.plannaplan.configutils;
import java.util.Iterator;
import com.plannaplan.entities.Course;
import com.plannaplan.entities.Groups;
import com.plannaplan.entities.Lecturer;
@ -9,140 +8,85 @@ import com.plannaplan.models.FileData;
import com.plannaplan.services.CourseService;
import com.plannaplan.services.GroupService;
import com.plannaplan.services.LecturerService;
import com.plannaplan.types.GroupType;
import com.plannaplan.types.WeekDay;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class FileToDatabaseMigrator {
public static String LECTURER_NAME_STRING = "imie";
public static String LECTURER_SURNAME_STRING = "nazwisko";
public static String LECTURER_TITLE_STRING = "tytul";
public static String COURSE_SYMBOL_STRING = "sym";
public static String COURSE_NAME_STRING = "nazwa";
private static final String LECTURER_NAME_STRING = "imie";
private static final String LECTURER_SURNAME_STRING = "nazwisko";
private static final String LECTURER_TITLE_STRING = "tytul";
public static String GROUP_DAY_STRING = "dzien";
public static String GROUP_TIME_STRING = "godz_od";
public static String ROOM_STRING = "sala";
public static String CAPACITY_STRING = "Mc";
private static final String COURSE_SYMBOL_STRING = "sym";
private static final String COURSE_NAME_STRING = "nazwa";
LecturerService lecturerService;
CourseService courseService;
GroupService groupService;
private static final String groupDay_STRING = "dzien";
private static final String GROUP_TIME_STRING = "godz_od";
private static final String ROOM_STRING = "sala";
private static final String CAPACITY_STRING = "Mc";
public FileToDatabaseMigrator(LecturerService lecturerService, CourseService courseService,
GroupService groupService) {
this.lecturerService = lecturerService;
this.groupService = groupService;
this.courseService = courseService;
@Autowired
private LecturerService lecturerService;
@Autowired
private CourseService courseService;
@Autowired
private GroupService groupService;
public FileToDatabaseMigrator() {
}
public void migrate(FileData data) {
Iterator<Row> rows = data.getRows();
int courseNameIndex = data.getIndexOf(FileToDatabaseMigrator.COURSE_NAME_STRING);
int symbolIndex = data.getIndexOf(FileToDatabaseMigrator.COURSE_SYMBOL_STRING);
int course_name_index = data.getIndexOf(FileToDatabaseMigrator.COURSE_NAME_STRING);
int sym_index = data.getIndexOf(FileToDatabaseMigrator.COURSE_SYMBOL_STRING);
int titleIndex = data.getIndexOf(FileToDatabaseMigrator.LECTURER_TITLE_STRING);
int surnameIndex = data.getIndexOf(FileToDatabaseMigrator.LECTURER_SURNAME_STRING);
int nameIndex = data.getIndexOf(FileToDatabaseMigrator.LECTURER_NAME_STRING);
int title_index = data.getIndexOf(FileToDatabaseMigrator.LECTURER_TITLE_STRING);
int surname_index = data.getIndexOf(FileToDatabaseMigrator.LECTURER_SURNAME_STRING);
int name_index = data.getIndexOf(FileToDatabaseMigrator.LECTURER_NAME_STRING);
int day_index = data.getIndexOf(FileToDatabaseMigrator.GROUP_DAY_STRING);
int time_index = data.getIndexOf(FileToDatabaseMigrator.GROUP_TIME_STRING);
int room_index = data.getIndexOf(FileToDatabaseMigrator.ROOM_STRING);
int capacity_index = data.getIndexOf(FileToDatabaseMigrator.CAPACITY_STRING);
int dayIndex = data.getIndexOf(FileToDatabaseMigrator.groupDay_STRING);
int timeIndex = data.getIndexOf(FileToDatabaseMigrator.GROUP_TIME_STRING);
int roomIndex = data.getIndexOf(FileToDatabaseMigrator.ROOM_STRING);
int capacityIndex = data.getIndexOf(FileToDatabaseMigrator.CAPACITY_STRING);
while (rows.hasNext()) {
Row row = rows.next();
Cell course_name_cell = row.getCell(course_name_index);
Cell sym = row.getCell(sym_index);
String courseName = row.getCell(courseNameIndex).toString().trim();
String symbol = row.getCell(symbolIndex).toString().trim();
Cell title_cell = row.getCell(title_index);
Cell name_cell = row.getCell(name_index);
Cell surname_cell = row.getCell(surname_index);
String lecturerTitle = row.getCell(titleIndex) != null ? row.getCell(titleIndex).toString().trim() : "";
String lecturerName = row.getCell(nameIndex) != null ? row.getCell(nameIndex).toString().trim() : "";
String lecturerSurname = row.getCell(surnameIndex) != null ? row.getCell(surnameIndex).toString().trim()
: "";
Cell day_cell = row.getCell(day_index);
Cell time_cell = row.getCell(time_index);
Cell room_cell = row.getCell(room_index);
Cell capacity_cell = row.getCell(capacity_index);
int day = (int) Double.parseDouble(row.getCell(dayIndex).toString());
WeekDay groupDay = WeekDay.getDay(day - 1);
int time = parseTimeToInt(row.getCell(timeIndex).toString());
String room = row.getCell(roomIndex).toString().trim();
int capacity = (int) Double.parseDouble(row.getCell(capacityIndex).toString());
String lecturer_title = "";
String lecturer_surname = "";
String lecturer_name = "";
Course course = this.courseService.getCourseByName(courseName)
.orElseGet(() -> this.courseService.save(new Course(courseName, symbol)));
String course_name = course_name_cell.toString().trim();
String sym_str = sym.toString().trim();
Lecturer lecturer = this.lecturerService.getLecturer(lecturerTitle, lecturerName, lecturerSurname)
.orElseGet(() -> this.lecturerService
.save(new Lecturer(lecturerTitle, lecturerName, lecturerSurname)));
int day = (int) Double.parseDouble(day_cell.toString());
WeekDay group_day = WeekDay.getDay(day - 1);
String room = room_cell.toString().trim();
int time = this.parseTimeToInt(time_cell.toString());
int capacity = (int) Double.parseDouble(capacity_cell.toString());
Groups group = groupService.find(time, capacity, room);
Course course = this.courseService.getCourseByName(course_name);
if (course == null) {
course = new Course();
course.setName(course_name);
course.setSymbol(sym_str);
}
courseService.save(course);
if (title_cell != null) {
lecturer_title = title_cell.toString().trim();
}
if (name_cell != null) {
lecturer_name = name_cell.toString().trim();
}
if (surname_cell != null) {
lecturer_surname = surname_cell.toString().trim();
}
Lecturer lecturer = lecturerService.getLecturer(lecturer_title, lecturer_name, lecturer_surname);
if (lecturer == null) {
lecturer = new Lecturer(lecturer_title, lecturer_name, lecturer_surname);
lecturerService.save(lecturer);
}
if (group == null) {
group = new Groups();
group.setCapacity(capacity);
group.setRoom(room);
group.setCourseId(course);
group.setTime(time);
if (capacity >= 50) {
group.setType(GroupType.LECTURE);
} else {
group.setType(GroupType.CLASS);
}
group.setDay(group_day);
group.setLecturer(lecturer);
groupService.save(group);
}
this.groupService.find(time, capacity, room).orElseGet(
() -> this.groupService.save(new Groups(capacity, room, course, time, groupDay, lecturer)));
}
}
private Integer parseTimeToInt(String time) {
String times[] = time.split("\\.");
if (times.length == 2) {
return Integer.parseInt(times[0]) * 60 + Integer.parseInt(times[1]);
}
times = time.split("\\:");
if (times.length == 2) {
return Integer.parseInt(times[0]) * 60 + Integer.parseInt(times[1]);
}
private static int parseTimeToInt(String time) {
String times[] = time.split("\\.|\\:");
return times.length == 2 ? Integer.parseInt(times[0]) * 60 + Integer.parseInt(times[1]) : 0;
return 0;
}
}

View File

@ -16,9 +16,22 @@ public class Assignment {
@JoinColumn(name = "group_id")
private Groups group;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@JoinColumn(name = "commision_id")
private Commision commision;
public Assignment(Groups group, Commision commision) {
this.commision = commision;
this.group = group;
}
public Assignment() {
}
public Long getId() {
return this.id;
}
public Groups getGroup() {
return this.group;
}
}

View File

@ -0,0 +1,47 @@
package com.plannaplan.entities;
import java.sql.Timestamp;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
@Entity
public class Commision {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@JoinColumn(name = "owner_id")
private User commisionOwner;
private Timestamp commisionDate;
@OneToMany(mappedBy = "commision")
private List<Assignment> assignments;
public Commision(User user) {
this.commisionDate = new Timestamp(System.currentTimeMillis());
this.commisionOwner = user;
}
public Commision() {
}
public Long getId() {
return this.id;
}
public Timestamp getCommisionDate() {
return commisionDate;
}
public User getCommisionOwner() {
return commisionOwner;
}
}

View File

@ -17,12 +17,17 @@ public class Course {
private Long id;
private String name;
private String symbol;
@OneToMany(mappedBy = "courseId", fetch = FetchType.EAGER)
@OneToMany(mappedBy = "course", fetch = FetchType.EAGER)
private List<Groups> groups = new ArrayList<>();
public Course() {
}
public Course(String name, String symbol) {
this.name = name;
this.symbol = symbol;
}
public Long getId() {
return this.id;
}
@ -43,7 +48,7 @@ public class Course {
this.name = name;
}
public List<Groups> getGroups(){
public List<Groups> getGroups() {
return this.groups;
}

View File

@ -1,32 +0,0 @@
package com.plannaplan.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import com.plannaplan.types.EventTypes;
@Entity
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private EventTypes type;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
public Event() {
}
public EventTypes getType() {
return type;
}
public void setType(EventTypes type) {
this.type = type;
}
}

View File

@ -10,6 +10,8 @@ import javax.persistence.ManyToOne;
import com.plannaplan.types.GroupType;
import com.plannaplan.types.WeekDay;
@Entity
public class Groups {
@Id
@ -17,7 +19,7 @@ public class Groups {
private Long id;
@ManyToOne
@JoinColumn(name = "course_id")
private Course courseId;
private Course course;
private int time;
private String room;
private int capacity;
@ -30,6 +32,16 @@ public class Groups {
public Groups() {
}
public Groups(int capacity, String room, Course course, int time, WeekDay day, Lecturer lecturer) {
this.capacity = capacity;
this.room = room;
this.course = course;
this.time = time;
this.day = day;
this.lecturer = lecturer;
this.type = capacity >= 50 ? GroupType.LECTURE : GroupType.CLASS;
}
public Long getId() {
return this.id;
}
@ -83,11 +95,11 @@ public class Groups {
}
public Course getCourseId() {
return courseId;
return course;
}
public void setCourseId(Course courseId) {
this.courseId = courseId;
this.course = courseId;
}
public String getTimeString() {

View File

@ -1,25 +0,0 @@
package com.plannaplan.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class HistoryElement {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@ManyToOne
@JoinColumn(name = "incoming_id")
private Groups incoming;
@ManyToOne
@JoinColumn(name = "outcoming_id")
private Groups outcoming;
}

View File

View File

@ -1,28 +0,0 @@
package com.plannaplan.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Transfer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "owner_id")
private User ownerUser;
@ManyToOne
@JoinColumn(name = "group_id")
private Groups ownerGroup;
@ManyToOne
@JoinColumn(name = "target_id")
private Groups targetGroup;
public Transfer() {
}
}

View File

@ -1,30 +0,0 @@
package com.plannaplan.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Unavailability {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User lecturer;
private int time;
public Unavailability() {
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}

View File

@ -1,5 +1,7 @@
package com.plannaplan.entities;
import java.sql.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@ -14,11 +16,42 @@ public class User {
private Long id;
private String name;
private String surname;
private String email;
private UserRoles role;
private String token;
private Date tokenCreatedDate;
public User() {
}
public User(String name, String surname, String mail, UserRoles role) {
this.name = name;
this.surname = surname;
this.email = mail;
this.role = role;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getTokenCreatedDate() {
return tokenCreatedDate;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.tokenCreatedDate = new Date(System.currentTimeMillis());
this.token = token;
}
public String getName() {
return name;
}
@ -42,4 +75,8 @@ public class User {
public void setName(String name) {
this.name = name;
}
public Long getId() {
return this.id;
}
}

View File

@ -0,0 +1,13 @@
package com.plannaplan.exceptions;
public class UserNotFoundException extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
public UserNotFoundException(String message) {
super(message);
}
}

View File

@ -1,5 +0,0 @@
package com.plannaplan.interfaces;
public interface EventCreator {
void update();
}

View File

@ -1,5 +0,0 @@
package com.plannaplan.interfaces;
public interface Historable {
void addActionToHistory();
}

View File

@ -1,5 +0,0 @@
package com.plannaplan.interfaces;
public interface ProtectedAction {
void validateAction();
}

View File

View File

@ -1,18 +1,17 @@
package com.plannaplan.models;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Row;
public class FileData {
private Dictionary<String, Integer> keys;
private HashMap<String, Integer> keys;
private Iterator<Row> rows;
public FileData(Dictionary<String, Integer> keys, Iterator<Row> rows) {
this.setKeys(keys);
this.setRows(rows);
public FileData(HashMap<String, Integer> keys, Iterator<Row> rows) {
this.keys = keys;
this.rows = rows;
}
public Iterator<Row> getRows() {
@ -23,11 +22,11 @@ public class FileData {
this.rows = rows;
}
public Dictionary<String, Integer> getKeys() {
public HashMap<String, Integer> getKeys() {
return keys;
}
public void setKeys(Dictionary<String, Integer> keys) {
public void setKeys(HashMap<String, Integer> keys) {
this.keys = keys;
}

View File

@ -1,11 +1,18 @@
package com.plannaplan.repositories;
import java.util.List;
import com.plannaplan.entities.Assignment;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface AssignmentRepository extends JpaRepository<Assignment, Long> {
@Query("FROM Assignment WHERE commision_id = ?1")
List<Assignment> getByCommision(@Param("commision_id") Long id);
}

View File

@ -0,0 +1,20 @@
package com.plannaplan.repositories;
import java.util.List;
import com.plannaplan.entities.Commision;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface CommisionRepository extends JpaRepository<Commision, Long> {
@Query("FROM Commision WHERE owner_id = ?1")
List<Commision> getUsers(@Param("owner_id") Long id);
@Query("FROM Commision WHERE owner_id = ?1 order by commisionDate desc")
List<Commision> getNewestCommision(@Param("owner_id") Long id);
}

View File

@ -1,5 +1,7 @@
package com.plannaplan.repositories;
import java.util.Optional;
import com.plannaplan.entities.Course;
import org.springframework.data.jpa.repository.JpaRepository;
@ -9,6 +11,6 @@ import org.springframework.stereotype.Repository;
@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
@Query(value = "SELECT * FROM course WHERE name = :name", nativeQuery = true)
Course findByName(@Param("name") String name);
@Query("FROM Course WHERE name = ?1")
Optional<Course> findByName(@Param("name") String name);
}

View File

@ -1,11 +0,0 @@
package com.plannaplan.repositories;
import com.plannaplan.entities.Event;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EventRepository extends JpaRepository<Event, Long> {
}

View File

@ -1,6 +1,7 @@
package com.plannaplan.repositories;
import java.util.List;
import java.util.Optional;
import com.plannaplan.entities.Groups;
@ -11,10 +12,10 @@ import org.springframework.stereotype.Repository;
@Repository
public interface GroupRepository extends JpaRepository<Groups, Long> {
@Query(value = "SELECT * FROM groups WHERE time = :time AND room = :room AND capacity = :capacity ", nativeQuery = true)
Groups find(@Param("time") int time, @Param("room") String room, @Param("capacity") int capacity);
@Query("FROM Groups WHERE time = ?1 AND room = ?2 AND capacity = ?3")
Optional<Groups> find(@Param("time") int time, @Param("room") String room, @Param("capacity") int capacity);
@Query(value = "SELECT * FROM groups WHERE course_id = :id", nativeQuery = true)
@Query("FROM Groups WHERE course_id = ?1")
List<Groups> getByCourse(@Param("id") Long id);
}

View File

@ -1,11 +0,0 @@
package com.plannaplan.repositories;
import com.plannaplan.entities.HistoryElement;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface HistoryRepository extends JpaRepository<HistoryElement, Long> {
}

View File

@ -1,5 +1,7 @@
package com.plannaplan.repositories;
import java.util.Optional;
import com.plannaplan.entities.Lecturer;
import org.springframework.data.jpa.repository.JpaRepository;
@ -9,6 +11,6 @@ import org.springframework.stereotype.Repository;
@Repository
public interface LecturerRepository extends JpaRepository<Lecturer, Long> {
@Query(value = "SELECT * FROM lecturer WHERE name = :name AND surname = :surname AND title = :title ", nativeQuery = true)
Lecturer find(@Param("title") String title, @Param("name") String name, @Param("surname") String surname);
@Query("FROM Lecturer WHERE title = ?1 AND name = ?2 AND surname = ?3")
Optional<Lecturer> find(@Param("title") String title, @Param("name") String name, @Param("surname") String surname);
}

View File

@ -1,11 +0,0 @@
package com.plannaplan.repositories;
import com.plannaplan.entities.Transfer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TransferRepository extends JpaRepository<Transfer, Long> {
}

View File

@ -1,11 +0,0 @@
package com.plannaplan.repositories;
import com.plannaplan.entities.Unavailability;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UnavailabilityRepository extends JpaRepository<Unavailability, Long> {
}

View File

@ -1,11 +1,27 @@
package com.plannaplan.repositories;
import java.util.List;
import java.util.Optional;
import com.plannaplan.entities.User;
import com.plannaplan.types.UserRoles;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("FROM User WHERE email = ?1")
Optional<User> getByAuthority(@Param("authority") String authority);
@Query("FROM User WHERE token = ?1")
Optional<User> getByToken(@Param("token") String token);
@Query("FROM User WHERE (name LIKE %?1% OR surname LIKE %?1%)")
List<User> searchForUsers(@Param("query") String query);
@Query("FROM User WHERE (name LIKE %?1% OR surname LIKE %?1%) AND role=?2")
List<User> searchForUsers(@Param("query") String query, @Param("role") UserRoles role);
}

View File

@ -1,17 +1,31 @@
package com.plannaplan.services;
import com.plannaplan.abstracts.EventWatcher;
import java.util.List;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import com.plannaplan.repositories.AssignmentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AssignmentService extends EventWatcher {
public class AssignmentService {
@Autowired
private AssignmentRepository repo;
public AssignmentService() {
super();
}
public void save(Assignment assignment) {
this.repo.save(assignment);
}
public List<Assignment> getCommisionAssignments(Commision com) {
return this.repo.getByCommision(com.getId());
}
public long getAssignmentsAmmount() {
return this.repo.count();
}
}

View File

@ -0,0 +1,38 @@
package com.plannaplan.services;
import java.util.List;
import java.util.Optional;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.User;
import com.plannaplan.repositories.CommisionRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CommisionService {
@Autowired
private CommisionRepository repo;
public CommisionService() {
}
public Commision save(Commision commision) {
this.repo.save(commision);
return commision;
}
public List<Commision> getUsersCommisions(User user) {
return this.repo.getUsers(user.getId());
}
public Optional<Commision> getNewestCommision(User user) {
return this.repo.getNewestCommision(user.getId()).stream().findFirst();
}
public long getCommisionsAmmount() {
return this.repo.count();
}
}

View File

@ -0,0 +1,26 @@
package com.plannaplan.services;
import com.plannaplan.models.ConfigData;
import com.plannaplan.models.FileData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.plannaplan.configutils.*;
@Component
public class ConfiguratorService {
@Autowired
private FileToDatabaseMigrator migrator;
public ConfiguratorService() {
}
public void config(ConfigData data) {
FileReader reader = new FileReader(data.getFilestream());
FileData coursesData = reader.read();
migrator.migrate(coursesData);
}
}

View File

@ -1,6 +1,7 @@
package com.plannaplan.services;
import java.util.List;
import java.util.Optional;
import com.plannaplan.entities.Course;
import com.plannaplan.repositories.CourseRepository;
@ -13,7 +14,7 @@ public class CourseService {
@Autowired
private CourseRepository repo;
public Course getCourseByName(String name) {
public Optional<Course> getCourseByName(String name) {
return this.repo.findByName(name);
}
@ -21,7 +22,16 @@ public class CourseService {
return this.repo.findAll();
}
public void save(Course course) {
public Course save(Course course) {
this.repo.save(course);
return course;
}
public void delete(Course course) {
this.repo.delete(course);
}
public int getCoursesAmmount() {
return (int) this.repo.count();
}
}

View File

@ -1,12 +0,0 @@
package com.plannaplan.services;
import com.plannaplan.repositories.EventRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EventService {
@Autowired
private EventRepository repo;
}

View File

@ -1,6 +1,7 @@
package com.plannaplan.services;
import java.util.List;
import java.util.Optional;
import com.plannaplan.entities.Groups;
import com.plannaplan.repositories.GroupRepository;
@ -16,7 +17,7 @@ public class GroupService {
public GroupService() {
}
public Groups find(int time, int capacity, String room) {
public Optional<Groups> find(int time, int capacity, String room) {
return this.repo.find(time, room, capacity);
}
@ -24,7 +25,20 @@ public class GroupService {
return this.repo.getByCourse(id);
}
public void save(Groups group) {
public Groups save(Groups group) {
this.repo.save(group);
return group;
}
public void delete(Groups groups) {
this.repo.delete(groups);
}
public int getGroupsAmmount() {
return (int) this.repo.count();
}
public Optional<Groups> getGroupById(Long id) {
return this.repo.findById(id);
}
}

View File

@ -1,12 +0,0 @@
package com.plannaplan.services;
import com.plannaplan.repositories.HistoryRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HistoryService {
@Autowired
private HistoryRepository repo;
}

View File

@ -1,5 +1,7 @@
package com.plannaplan.services;
import java.util.Optional;
import com.plannaplan.entities.Lecturer;
import com.plannaplan.repositories.LecturerRepository;
@ -11,11 +13,20 @@ public class LecturerService {
@Autowired
private LecturerRepository repo;
public Lecturer getLecturer(String title, String name, String surname) {
public Optional<Lecturer> getLecturer(String title, String name, String surname) {
return repo.find(title, name, surname);
}
public void save(Lecturer lecturer) {
public Lecturer save(Lecturer lecturer) {
repo.save(lecturer);
return lecturer;
}
public void delete(Lecturer lecturer) {
repo.delete(lecturer);
}
public int getLecturersAmmount() {
return (int) this.repo.count();
}
}

View File

@ -1,17 +0,0 @@
package com.plannaplan.services;
import com.plannaplan.abstracts.EventWatcher;
import com.plannaplan.repositories.TransferRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class TransferService extends EventWatcher {
@Autowired
private TransferRepository repo;
public TransferService() {
super();
}
}

View File

@ -1,12 +0,0 @@
package com.plannaplan.services;
import com.plannaplan.repositories.UnavailabilityRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UnavailabilityService {
@Autowired
private UnavailabilityRepository repos;
}

View File

@ -1,13 +1,19 @@
package com.plannaplan.services;
import com.plannaplan.abstracts.EventWatcher;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import com.plannaplan.entities.User;
import com.plannaplan.exceptions.UserNotFoundException;
import com.plannaplan.repositories.UserRepository;
import com.plannaplan.types.UserRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService extends EventWatcher {
public class UserService {
@Autowired
private UserRepository repo;
@ -15,4 +21,32 @@ public class UserService extends EventWatcher {
super();
}
public String login(String authority) throws UserNotFoundException {
User user = this.repo.getByAuthority(authority.replace("\n", "").trim())
.orElseThrow(() -> new UserNotFoundException("Can not find user with given authority"));
final String token = UUID.randomUUID().toString();
user.setToken(token);
this.repo.save(user);
return token;
}
public void save(User user) {
this.repo.save(user);
}
public User getUserByEmail(String email) throws UserNotFoundException {
return this.repo.getByAuthority(email.replace("\n", "").trim())
.orElseThrow(() -> new UserNotFoundException("Cannot find user with given authority"));
}
public Optional<User> getByToken(String token) {
return this.repo.getByToken(token);
}
public List<User> searchForStudents(String query) {
return this.repo.searchForUsers(query, UserRoles.STUDENT);
}
}

View File

@ -1,10 +0,0 @@
package com.plannaplan.statisticutils;
public class Statistics {
public Statistics() {
}
public void getAll() {
}
}

View File

@ -1,9 +0,0 @@
package com.plannaplan.transferutils;
public class TransferMatcher {
public TransferMatcher() {
}
public void findMatches() {
}
}

View File

@ -1,9 +0,0 @@
package com.plannaplan.transferutils;
public class TransfersExecuter {
public TransfersExecuter() {
}
public void execute() {
}
}

View File

@ -1,5 +0,0 @@
package com.plannaplan.types;
public enum ActionTypes {
ADD, DELETE, REPLACE
}

View File

@ -1,5 +0,0 @@
package com.plannaplan.types;
public enum AppStates {
STOPPED, RUNNING, PAUSED
}

View File

@ -1,5 +0,0 @@
package com.plannaplan.types;
public enum EventTypes {
DROPPED_OUT, TOUR_STARTED, TRANSFER_FOUND, TOUR_FINISHED, COURSES_ACCEPTED
}

View File

View File

@ -1,5 +1,5 @@
package com.plannaplan.types;
public enum UserRoles {
STUDENT, DEANERY, ADMIN
STUDENT, DEANERY, ADMIN, TEST_USER
}

View File

View File

@ -0,0 +1,8 @@
package com.plannaplan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TestApplication {
public final static String TEST_CONFIG_FILE = "Zajecia.xlsx";
}

View File

@ -11,9 +11,9 @@ import org.junit.Test;
public class FileReaderTest {
@Test
public void shoulReturnNull() {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("Zajecia.xlsx");
FileReader r = new FileReader(inputStream);
FileData d = r.read();
final InputStream inputStream = getClass().getClassLoader().getResourceAsStream("Zajecia.xlsx");
final FileReader r = new FileReader(inputStream);
final FileData d = r.read();
assertTrue(d.getRows().next().getCell(0).toString().equals("1.0"));
assertTrue(d.getKeys().size() == 22);
assertTrue(d != null);

View File

@ -1,19 +1,49 @@
package com.plannaplan.configutils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertTrue;
import java.io.InputStream;
import com.plannaplan.models.FileData;
import com.plannaplan.TestApplication;
import com.plannaplan.services.CourseService;
import com.plannaplan.services.GroupService;
import com.plannaplan.services.LecturerService;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class FileToDatabaseMigratorTest {
@Autowired
private FileToDatabaseMigrator migrator;
@Autowired
private CourseService courseService;
@Autowired
private GroupService groupService;
@Autowired
private LecturerService lecturerService;
@Test
public void shouldInsertToDatabase() {
// FileToDatabaseMigrator migrator = new FileToDatabaseMigrator();
// InputStream inputStream =
// getClass().getClassLoader().getResourceAsStream("Zajecia.xlsx");
// FileReader r = new FileReader(inputStream);
// FileData d = r.read();
// migrator.migrate(d);
public void shouldImportDataFromFileToDatabase() throws Exception {
final InputStream inputStream = getClass().getClassLoader()
.getResourceAsStream(TestApplication.TEST_CONFIG_FILE);
final FileReader reader = new FileReader(inputStream);
this.migrator.migrate(reader.read());
int courses_ammount = this.courseService.getCoursesAmmount();
int groups_ammount = this.groupService.getGroupsAmmount();
int lecturers_ammount = this.lecturerService.getLecturersAmmount();
assertTrue(courses_ammount > 0 && groups_ammount > 0 && lecturers_ammount > 0);
}
}

View File

@ -0,0 +1,56 @@
package com.plannaplan.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertTrue;
import java.util.List;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class AssignmentServiceTest {
@Autowired
private AssignmentService service;
@Autowired
private CommisionService comServie;
private Commision com;
@Before
public void init() {
this.com = new Commision();
this.comServie.save(this.com);
}
@Test
public void shouldSaveAssignment() {
long beginState = this.service.getAssignmentsAmmount();
this.addAssignmentToCommision(this.com);
assertTrue("Assign ammount should increase", this.service.getAssignmentsAmmount() > beginState);
}
@Test
public void shouldGetCommisionAssignments() {
this.addAssignmentToCommision(this.com);
final List<Assignment> response = this.service.getCommisionAssignments(com);
assertTrue("Returned list size should be 1", response.size() == 1);
}
private void addAssignmentToCommision(Commision com) {
Assignment a = new Assignment(null, com);
this.service.save(a);
}
}

View File

@ -0,0 +1,60 @@
package com.plannaplan.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertTrue;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.User;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class CommisionServiceTest {
@Autowired
private CommisionService service;
@Autowired
private UserService userService;
@Test
public void shouldSaveCommision() {
long beginState = this.service.getCommisionsAmmount();
this.service.save(new Commision());
assertTrue("Commision ammount should have changed", this.service.getCommisionsAmmount() > beginState);
}
@Test
public void shouldGetUserCommisions() {
User usr = new User();
this.userService.save(usr);
this.service.save(new Commision(usr));
assertTrue("User should have one commision", this.service.getUsersCommisions(usr).size() == 1);
}
@Test
public void shouldGetNewestCommision() throws NullPointerException, InterruptedException {
User usr = new User();
this.userService.save(usr);
this.service.save(new Commision(usr));
Thread.sleep(2000);
final Commision newestCommision = new Commision(usr);
this.service.save(newestCommision);
final Commision result = this.service.getNewestCommision(usr)
.orElseThrow(() -> new NullPointerException("There was no commision"));
assertTrue("Wrong commision was returned", result.getId().equals(newestCommision.getId()));
}
}

View File

@ -0,0 +1,49 @@
package com.plannaplan.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertTrue;
import java.io.InputStream;
import com.plannaplan.TestApplication;
import com.plannaplan.models.ConfigData;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class ConfiguratorServiceTest {
@Autowired
private ConfiguratorService configuratorService;
@Autowired
private CourseService courseService;
@Autowired
private GroupService groupService;
@Autowired
private LecturerService lecturerService;
@Test
public void shouldImportDataToDataBase() {
final InputStream inputStream = getClass().getClassLoader()
.getResourceAsStream(TestApplication.TEST_CONFIG_FILE);
final ConfigData data = new ConfigData(null, null, inputStream);
this.configuratorService.config(data);
int courses_ammount = this.courseService.getCoursesAmmount();
int groups_ammount = this.groupService.getGroupsAmmount();
int lecturers_ammount = this.lecturerService.getLecturersAmmount();
assertTrue(courses_ammount > 0 && groups_ammount > 0 && lecturers_ammount > 0);
}
}

View File

@ -0,0 +1,32 @@
package com.plannaplan.services;
import static org.junit.Assert.assertTrue;
import com.plannaplan.entities.Course;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class CourseServiceTest {
@Autowired
private CourseService courseService;
@Test
public void createAndDeleteCourse() {
Course course = new Course("Testowy kurs", "TK");
int startAmmount = this.courseService.getCoursesAmmount();
courseService.save(course);
assertTrue(this.courseService.getCoursesAmmount() > startAmmount);
courseService.delete(course);
assertTrue(this.courseService.getCoursesAmmount() == startAmmount);
}
}

View File

@ -0,0 +1,34 @@
package com.plannaplan.services;
import static org.junit.Assert.assertTrue;
import com.plannaplan.entities.Groups;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class GroupServiceTest {
@Autowired
private GroupService groupService;
@Test
public void createAndDeleteGroup() {
int startAmmount = this.groupService.getGroupsAmmount();
Groups group = new Groups();
group.setRoom("A1");
groupService.save(group);
assertTrue(this.groupService.getGroupsAmmount() > startAmmount);
groupService.delete(group);
assertTrue(this.groupService.getGroupsAmmount() == startAmmount);
}
}

View File

@ -0,0 +1,32 @@
package com.plannaplan.services;
import static org.junit.Assert.assertTrue;
import com.plannaplan.entities.Lecturer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class LecturerServiceTest {
@Autowired
private LecturerService lecturerService;
@Test
public void createAndDeleteLecturer() {
int startAmmount = this.lecturerService.getLecturersAmmount();
Lecturer lecturer = new Lecturer("prof.", "Tomasz", "Kowalski");
lecturerService.save(lecturer);
assertTrue(this.lecturerService.getLecturersAmmount() > startAmmount);
lecturerService.delete(lecturer);
assertTrue(this.lecturerService.getLecturersAmmount() == startAmmount);
}
}

View File

@ -0,0 +1,96 @@
package com.plannaplan.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List;
import com.plannaplan.entities.User;
import com.plannaplan.exceptions.UserNotFoundException;
import com.plannaplan.types.UserRoles;
import org.junit.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.runner.RunWith;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
@TestMethodOrder(OrderAnnotation.class)
public class UserServiceTest {
private static String TEST_USER_MAIL = "noteexisitingmail@notexistingdomain.com";
private static String TEST_USER_NAME = "Tom";
private static String TEST_USER_SUERNAME = "Kovalsky";
@Autowired
private UserService userService;
@Test
public void shouldReturnToken() {
final User testUser = new User(TEST_USER_NAME, TEST_USER_SUERNAME, TEST_USER_MAIL, UserRoles.TEST_USER);
this.userService.save(testUser);
try {
final String token = this.userService.login(TEST_USER_MAIL);
System.out.println("Returned token: " + token);
assertTrue(token != null);
assertTrue(this.userService.getUserByEmail(TEST_USER_MAIL).getToken() != null);
} catch (UserNotFoundException e) {
e.printStackTrace();
assertTrue(false);
}
}
@Test
public void shouldThrowException() {
try {
this.userService.login("thiseamilisnotindatabase@gmail.com");
assertTrue(false);
} catch (UserNotFoundException e) {
assertTrue(true);
}
}
@Test
public void shouldFindStudents() {
this.userService.save(new User("Nemo", "TheFish", "Nemo@shouldFindStudents.test", UserRoles.STUDENT));
final List<User> response = this.userService.searchForStudents("Nemo");
assertTrue(response.size() >= 1);
assertTrue(containsName(response, "Nemo"));
}
@Test
public void shouldReturnAllStudents() {
final User veryWantedUser = new User("Xavier", "123", "Xavier@shouldReturnAllStudents.test", UserRoles.STUDENT);
final User littleLessWanted = new User("Ravier", "321", "Ravier@shouldReturnAllStudents.test",
UserRoles.STUDENT);
final User notWantadUser = new User("Fiona", "Raskolnikov", "Fiona@shouldReturnAllStudents.test",
UserRoles.DEANERY);
this.userService.save(veryWantedUser);
this.userService.save(littleLessWanted);
this.userService.save(notWantadUser);
final List<User> response = this.userService.searchForStudents("");
assertTrue(response.size() >= 2);
assertTrue(!containsName(response, notWantadUser.getName()));
assertTrue(containsName(response, littleLessWanted.getName()));
assertTrue(containsName(response, veryWantedUser.getName()));
}
@Test
public void shouldntFindStudents() {
this.userService.save(new User("Nadia", "Ladia", "Nadia@shouldntFindStudents.test", UserRoles.STUDENT));
final List<User> response = this.userService.searchForStudents(
"THISisIMPOIBLEQUEryThatShouldntReturnAnyPersonAtAllfnjiasdfjivlsdfnjgklsomerandomcharsjustinCaseXD");
assertTrue(response.size() == 0);
}
private boolean containsName(final List<User> list, final String name) {
return list.stream().map(User::getName).filter(name::equals).findFirst().isPresent();
}
}

0
buisnesslogic/src/test/resources/Zajecia.xlsx Normal file → Executable file
View File

View File

@ -6,5 +6,6 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.open-in-view=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.jackson.serialization.fail-on-empty-beans=false
spring.main.allow-bean-definition-overriding=true
server.port=1285

37
docs/api.md Normal file → Executable file
View File

@ -1,11 +1,12 @@
# Dokumetacja API
| Api | Zadania endpointa |
| ---------------------------------------------- | ---------------------------------------------------------- |
| [/config](#config) | Załadowanie konfiguracji startowej do aplikacji PlanNaPlan |
| [/getCoursesWithGroups](#getcourseswithgroups) | Zwrócenie wszytskich kursów razem z grupami |
| [/getCourseGroups](#getcoursegroups) | Zwrócenie grup dla danego kursu |
| [/getCourses](#getcourses) | Zwrócenie wszystkich kursów |
| Api | Zadania endpointa |
| ------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| [/api/v1/configurator/config](#config) | Załadowanie konfiguracji startowej do aplikacji PlanNaPlan |
| [/api/v1/courses/getCoursesWithGroups](#getcourseswithgroups) | Zwrócenie wszytskich kursów razem z grupami |
| [/api/v1/groups/getCourseGroups](#getcoursegroups) | Zwrócenie grup dla danego kursu |
| [/api/v1/courses/getCourses](#getcourses) | Zwrócenie wszystkich kursów |
| [/token](#token) | Wymienia ticket z CAS-a na token ktorym beda autoryzowane chronione requesty |
## config
@ -30,7 +31,7 @@ Endpoint konfigurujacy caly system i importujacy dane do bazy.
Source code: [link](../restservice/src/main/java/com/plannaplan/controllers/getCoursesWithGroups.java)
```
GET /getCoursesWithGroups
GET /api/v1/courses/getCoursesWithGroups
```
#### Opis
@ -42,7 +43,7 @@ Zwraca wszystkie dostepne kursy wraz z listą grup.
Source code: [link](../restservice/src/main/java/com/plannaplan/controllers/GroupController.java)
```
GET /getCourseGroups
GET /api/v1/groups/getCourseGroups
```
#### Opis
@ -61,9 +62,27 @@ Zwraca wszytskie grupy dla danego kursu.
Source code: [link](../restservice/src/main/java/com/plannaplan/controllers/CoursesController.java)
```
GET /getCourses
GET /api/v1/courses/getCourses
```
#### Opis
Zwraca wszystkie dostepne kursy.
## token
Source code: [link](../restservice/src/main/java/com/plannaplan/controllers/TokenController.java)
```
GET /token?ticket=ST-668405-W0gfvSVDRBdMUWLweKzv-cas.amu.edu.pl
```
#### Opis
Po odpytaniu tego endpointa z podanym ticketem system zrobi nma nim validate i dostanie uzytkownika dla ktorego zostal on wygenerowany. System utworzy dla niego access token i go zwroci w odpowiedzi
#### Parametry
| Type | Name | Consumes | Opis | Type |
| ----------- | ------------------------- | -------- | --------------------------------------- | ------ |
| Query Param | **ticket** </br> required | - | ticket uzyskany z logowania poprzez CAS | string |

0
init.sql Normal file → Executable file
View File

4
pom.xml Normal file → Executable file
View File

@ -19,8 +19,8 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
</properties>
<dependencies>

38
restservice/pom.xml Normal file → Executable file
View File

@ -18,8 +18,8 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.14</maven.compiler.source>
<maven.compiler.target>1.14</maven.compiler.target>
<start-class>com.plannaplan.App</start-class>
</properties>
@ -27,15 +27,41 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-test -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<version>5.3.4.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
@ -48,6 +74,12 @@
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<artifactId>buisnesslogic</artifactId>
<groupId>com.plannaplan</groupId>

57
restservice/src/main/java/com/plannaplan/App.java Normal file → Executable file
View File

@ -1,15 +1,60 @@
package com.plannaplan;
import com.plannaplan.entities.User;
import com.plannaplan.services.UserService;
import com.plannaplan.types.UserRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
@SpringBootApplication
public class App {
public static void main(String[] args) {
Logo logo = new Logo("beta");
System.out.println(logo.getLogo());
System.out.println("|=============================================================================================|");
SpringApplication.run(App.class, args);
}
public final static String API_VERSION = "v1";
@Autowired
UserService userService;
public static void main(String[] args) {
Logo logo = new Logo("beta");
System.out.println(logo.getLogo());
System.out.println(
"|=============================================================================================|");
SpringApplication.run(App.class, args);
}
@EventListener(ApplicationReadyEvent.class)
public void importData() {
User filip = new User();
filip.setEmail("filizy@st.amu.edu.pl");
filip.setName("Filip");
filip.setSurname("Izydorczyk");
filip.setRole(UserRoles.DEANERY);
this.userService.save(filip);
User hub = new User();
hub.setEmail("hubwrz1@st.amu.edu.pl");
hub.setName("Hubert");
hub.setSurname("Wrzesiński");
hub.setRole(UserRoles.STUDENT);
this.userService.save(hub);
User mac = new User();
mac.setEmail("macglo2@st.amu.edu.pl");
mac.setName("Maciej");
mac.setSurname("Głowacki");
mac.setRole(UserRoles.STUDENT);
this.userService.save(mac);
User mar = new User();
mar.setEmail("marwoz16@st.amu.edu.pl");
mar.setName("Marcin");
mar.setSurname("Woźniak");
mar.setRole(UserRoles.STUDENT);
this.userService.save(mar);
}
}

0
restservice/src/main/java/com/plannaplan/Logo.java Normal file → Executable file
View File

View File

@ -0,0 +1,47 @@
package com.plannaplan.controllers;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Optional;
import com.plannaplan.App;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.User;
import com.plannaplan.responses.mappers.AssignmentResponseMappers;
import com.plannaplan.responses.models.GetCurrentAssignmentsResponse;
import com.plannaplan.services.AssignmentService;
import com.plannaplan.services.CommisionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
@CrossOrigin
@RequestMapping("/api/" + App.API_VERSION + "/assignments")
public class AssignmentsController extends TokenBasedController {
@Autowired
private CommisionService commisionService;
@Autowired
private AssignmentService assignmentService;
@GetMapping("/getCurrentAssignments")
public ResponseEntity<List<GetCurrentAssignmentsResponse>> getCurrentAssignments() throws Exception {
User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException("User not found"));
Optional<Commision> com = this.commisionService.getNewestCommision(user);
if (com.isPresent()) {
List<Assignment> respone = this.assignmentService.getCommisionAssignments(com.get());
return new ResponseEntity<>(AssignmentResponseMappers.mapToResponse(respone), HttpStatus.OK);
}
return new ResponseEntity<>(null, HttpStatus.OK);
}
}

View File

@ -0,0 +1,69 @@
package com.plannaplan.controllers;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import com.plannaplan.App;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.Groups;
import com.plannaplan.entities.User;
import com.plannaplan.exceptions.UserNotFoundException;
import com.plannaplan.responses.mappers.CommisionResponseMappers;
import com.plannaplan.responses.models.CommisionResponse;
import com.plannaplan.services.AssignmentService;
import com.plannaplan.services.CommisionService;
import com.plannaplan.services.GroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
@CrossOrigin
@RequestMapping("/api/" + App.API_VERSION + "/commisions")
public class CommisionController extends TokenBasedController {
@Autowired
private CommisionService commisionService;
@Autowired
private GroupService groupServcicxe;
@Autowired
private AssignmentService assignmentService;
public CommisionController() {
}
@PostMapping("/add")
public ResponseEntity<String> addCommision(@RequestBody List<Long> groups) throws UserNotFoundException {
User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException());
Commision com = new Commision(user);
this.commisionService.save(com);
groups.stream().forEach((groupId) -> {
Groups group = this.groupServcicxe.getGroupById(groupId).orElseThrow(() -> new NullPointerException());
Assignment a = new Assignment(group, com);
this.assignmentService.save(a);
});
return new ResponseEntity<>("Succes", HttpStatus.OK);
}
@GetMapping("/getAllCommisions")
public ResponseEntity<List<CommisionResponse>> getAlCommisions() throws UserNotFoundException {
User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException());
List<CommisionResponse> result = CommisionResponseMappers
.mapToResponse(this.commisionService.getUsersCommisions(user));
return new ResponseEntity<>(result, HttpStatus.OK);
}
}

View File

@ -5,27 +5,35 @@ import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import com.plannaplan.Controller;
import com.plannaplan.App;
import com.plannaplan.models.ConfigData;
import com.plannaplan.services.ConfiguratorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@RestController
@CrossOrigin
@RequestMapping("/api/" + App.API_VERSION + "/configurator")
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ConfigController {
@Autowired
private Controller contrl;
private ConfiguratorService contrl;
@PostMapping("/config")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public ResponseEntity<String> configApp(@RequestParam("file") MultipartFile file) {
try {
ConfigData data = new ConfigData(null, null, file.getInputStream());
final ConfigData data = new ConfigData(null, null, file.getInputStream());
this.contrl.config(data);
return new ResponseEntity<>("Sucess", HttpStatus.OK);
} catch (IOException e) {

View File

@ -1,12 +1,12 @@
package com.plannaplan.controllers;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import com.plannaplan.App;
import com.plannaplan.entities.Course;
import com.plannaplan.entities.Groups;
import com.plannaplan.responses.mappers.CoursesResponseMappers;
import com.plannaplan.responses.models.GetCoursesResponse;
import com.plannaplan.responses.models.GetCoursesWithGroupsResponse;
import com.plannaplan.services.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
@ -15,52 +15,29 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
@CrossOrigin
@RequestMapping("/api/" + App.API_VERSION + "/courses")
public class CoursesController {
@Autowired
private CourseService courseService;
@GetMapping("/getCourses")
public ResponseEntity<List<Dictionary<String,Object>>> getMethodName() {
public ResponseEntity<List<GetCoursesResponse>> getMethodName() {
List<Course> courses = this.courseService.getAllCourses();
List<Dictionary<String,Object>> response = new ArrayList<>();
for(Course c : courses){
Dictionary<String, Object> element = new Hashtable<>();
element.put("id", c.getId());
element.put("name",c.getName());
response.add(element);
}
List<GetCoursesResponse> response = CoursesResponseMappers.mapToGetCoursesResponse(courses);
return new ResponseEntity<>(response, HttpStatus.OK);
}
@GetMapping("/getCoursesWithGroups")
public ResponseEntity<List<Dictionary<String,Object>>> getCoursesWithGroups() {
List<Course> courses = this.courseService.getAllCourses();
List<Dictionary<String,Object>> response = new ArrayList<>();
for(Course c : courses){
Dictionary<String, Object> element = new Hashtable<>();
element.put("id", c.getId());
element.put("name",c.getName());
List<Dictionary<String,Object>> groups = new ArrayList<>();
for(Groups g : c.getGroups()){
Dictionary<String,Object> group = new Hashtable<>();
group.put("id", g.getId());
group.put("day", g.getDay().label);
group.put("time", g.getTimeString());
group.put("lecturer", g.getLecturer().toString());
group.put("room", g.getRoom());
group.put("type", g.getType());
groups.add(group);
}
element.put("groups", groups);
response.add(element);
}
public ResponseEntity<List<GetCoursesWithGroupsResponse>> getCoursesWithGroups() {
final List<Course> courses = this.courseService.getAllCourses();
final List<GetCoursesWithGroupsResponse> response = CoursesResponseMappers
.mapToGetCoursesWithGroupsResponse(courses);
return new ResponseEntity<>(response, HttpStatus.OK);
}
}

View File

@ -1,11 +1,12 @@
package com.plannaplan.controllers;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import com.plannaplan.App;
import com.plannaplan.entities.Groups;
import com.plannaplan.responses.mappers.GroupsMappers;
import com.plannaplan.responses.models.DefaultGroupResponse;
import com.plannaplan.responses.models.GetCourseGroupsResponse;
import com.plannaplan.services.GroupService;
import org.springframework.beans.factory.annotation.Autowired;
@ -13,36 +14,24 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin
@RequestMapping("/api/" + App.API_VERSION + "/groups")
public class GroupController {
@Autowired
private GroupService groupService;
@GetMapping("/getCourseGroups")
public ResponseEntity<List<Dictionary<String, Object>>> getCourses(@RequestParam("id") Long id, @RequestParam(name="capacity", defaultValue="true") Boolean capacity){
public ResponseEntity<GetCourseGroupsResponse<? extends DefaultGroupResponse>> getCourses(@RequestParam("id") Long id,
@RequestParam(name = "capacity", defaultValue = "true") Boolean capacity) {
List<Groups> groups = this.groupService.getGroupsByCourse(id);
List<Dictionary<String, Object>> response = new ArrayList<>();
for (Groups g : groups) {
Dictionary<String, Object> group = new Hashtable<>();
group.put("id", g.getId());
group.put("day", g.getDay().label);
group.put("time", g.getTimeString());
group.put("lecturer", g.getLecturer().toString());
group.put("room", g.getRoom());
if (capacity) {
group.put("capacity", g.getCapacity());
}
group.put("type", g.getType());
response.add(group);
if (capacity) {
return new ResponseEntity<>(GroupsMappers.mapToGetCourseGroupsWithCapacityResponse(groups), HttpStatus.OK);
}
return new ResponseEntity<>(response, HttpStatus.OK);
return new ResponseEntity<>(GroupsMappers.mapToGetCourseGroupsDefaultResponse(groups), HttpStatus.OK);
}
}

View File

@ -0,0 +1,30 @@
package com.plannaplan.controllers;
import java.util.Optional;
import com.plannaplan.entities.User;
import com.plannaplan.exceptions.UserNotFoundException;
import com.plannaplan.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
public abstract class TokenBasedController {
@Autowired
protected UserService userService;
public TokenBasedController() {
}
protected Optional<User> getCurrentUser() throws UserNotFoundException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (!(authentication instanceof AnonymousAuthenticationToken)) {
return Optional.of(this.userService.getUserByEmail(authentication.getName()));
} else {
return Optional.empty();
}
}
}

View File

@ -0,0 +1,42 @@
package com.plannaplan.controllers;
import com.plannaplan.exceptions.UserNotFoundException;
import com.plannaplan.security.CasValidationExcepiton;
import com.plannaplan.security.CasValidator;
import com.plannaplan.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin
public class TokenController {
private final static String SERVICE_URL = "http://localhost:3000";
@Autowired
private UserService userService;
@GetMapping("/token")
public ResponseEntity<String> getToken(@RequestParam("ticket") final String ticket) {
final CasValidator validator = new CasValidator(SERVICE_URL, ticket);
try {
String authority = validator.validate();
String token = this.userService.login(authority);
return new ResponseEntity<>(token, HttpStatus.OK);
} catch (CasValidationExcepiton e) {
return new ResponseEntity<>("Wrong ticket", HttpStatus.UNAUTHORIZED);
} catch (UserNotFoundException e) {
return new ResponseEntity<>("User not found", HttpStatus.NOT_FOUND);
} catch (Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

View File

@ -0,0 +1,38 @@
package com.plannaplan.controllers;
import java.util.List;
import com.plannaplan.App;
import com.plannaplan.entities.User;
import com.plannaplan.responses.mappers.UserResponseMappers;
import com.plannaplan.responses.models.SearchForStudentsResponse;
import com.plannaplan.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@RestController
@CrossOrigin
@RequestMapping("/api/" + App.API_VERSION + "/users")
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class UsersController {
@Autowired
private UserService userService;
@GetMapping("/searchForStudents")
@PreAuthorize("hasRole('ROLE_DEANERY')")
public ResponseEntity<List<SearchForStudentsResponse>> configApp(@RequestParam("query") String query) {
final List<User> searches = this.userService.searchForStudents(query);
final List<SearchForStudentsResponse> response = UserResponseMappers.mapToDefaultResponse(searches);
return new ResponseEntity<>(response, HttpStatus.OK);
}
}

View File

@ -0,0 +1,16 @@
package com.plannaplan.responses.mappers;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import com.plannaplan.entities.Assignment;
import com.plannaplan.responses.models.GetCurrentAssignmentsResponse;
public class AssignmentResponseMappers {
public static final List<GetCurrentAssignmentsResponse> mapToResponse(List<Assignment> assignments) {
return assignments.stream().filter(Objects::nonNull).map(GetCurrentAssignmentsResponse::new)
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,14 @@
package com.plannaplan.responses.mappers;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import com.plannaplan.entities.Commision;
import com.plannaplan.responses.models.CommisionResponse;
public class CommisionResponseMappers {
public static final List<CommisionResponse> mapToResponse(List<Commision> commisions) {
return commisions.stream().filter(Objects::nonNull).map(CommisionResponse::new).collect(Collectors.toList());
}
}

View File

@ -0,0 +1,20 @@
package com.plannaplan.responses.mappers;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import com.plannaplan.entities.Course;
import com.plannaplan.responses.models.GetCoursesResponse;
import com.plannaplan.responses.models.GetCoursesWithGroupsResponse;
public class CoursesResponseMappers {
public static final List<GetCoursesResponse> mapToGetCoursesResponse(List<Course> courses) {
return courses.stream().filter(Objects::nonNull).map(GetCoursesResponse::new).collect(Collectors.toList());
}
public static final List<GetCoursesWithGroupsResponse> mapToGetCoursesWithGroupsResponse(List<Course> courses) {
return courses.stream().filter(Objects::nonNull).map(GetCoursesWithGroupsResponse::new)
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,58 @@
package com.plannaplan.responses.mappers;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import com.plannaplan.entities.Groups;
import com.plannaplan.responses.models.DefaultGroupResponse;
import com.plannaplan.responses.models.GetCourseGroupsResponse;
import com.plannaplan.responses.models.WithCapacityGroupResponse;
import com.plannaplan.types.GroupType;
public class GroupsMappers {
public static List<DefaultGroupResponse> mapToDefaultResponse(List<Groups> groups) {
return groups.stream().filter(Objects::nonNull).map(DefaultGroupResponse::new).collect(Collectors.toList());
}
public static List<WithCapacityGroupResponse> mapToCapacityResponse(List<Groups> groups) {
return groups.stream().filter(Objects::nonNull).map(WithCapacityGroupResponse::new)
.collect(Collectors.toList());
}
public static GetCourseGroupsResponse<DefaultGroupResponse> mapToGetCourseGroupsDefaultResponse (List<Groups> groups){
List<DefaultGroupResponse> lectures = new ArrayList<>();
List<DefaultGroupResponse> classes = new ArrayList<>();
groups.stream().forEach(group -> {
if (group.getType() == GroupType.CLASS) {
classes.add(new DefaultGroupResponse(group));
} else {
lectures.add(new DefaultGroupResponse(group));
}
});
return new GetCourseGroupsResponse<>(classes, lectures);
}
public static GetCourseGroupsResponse<WithCapacityGroupResponse> mapToGetCourseGroupsWithCapacityResponse (List<Groups> groups){
List<WithCapacityGroupResponse> lectures = new ArrayList<>();
List<WithCapacityGroupResponse> classes = new ArrayList<>();
groups.stream().forEach(group -> {
if (group.getType() == GroupType.CLASS) {
classes.add(new WithCapacityGroupResponse(group));
} else {
lectures.add(new WithCapacityGroupResponse(group));
}
});
return new GetCourseGroupsResponse<>(classes, lectures);
}
}

View File

@ -0,0 +1,15 @@
package com.plannaplan.responses.mappers;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import com.plannaplan.entities.User;
import com.plannaplan.responses.models.SearchForStudentsResponse;
public class UserResponseMappers {
public static List<SearchForStudentsResponse> mapToDefaultResponse(List<User> groups) {
return groups.stream().filter(Objects::nonNull).map(SearchForStudentsResponse::new)
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,24 @@
package com.plannaplan.responses.models;
import java.sql.Timestamp;
import com.plannaplan.entities.Commision;
public class CommisionResponse {
private Long id;
private Timestamp commisionDate;
public CommisionResponse(Commision commision) {
this.id = commision.getId();
this.commisionDate = commision.getCommisionDate();
}
public Timestamp getCommisionDate() {
return commisionDate;
}
public Long getId() {
return id;
}
}

View File

@ -0,0 +1,53 @@
package com.plannaplan.responses.models;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Groups;
import com.plannaplan.types.GroupType;
public class DefaultGroupResponse {
private Long id;
private int day;
private String time;
private String lecturer;
private String room;
private GroupType type;
public DefaultGroupResponse(Groups group) {
this.id = group.getId() != null ? group.getId() : null;
this.day = group.getDay() != null ? group.getDay().label : -1;
this.time = group.getTimeString() != null ? group.getTimeString() : "";
this.lecturer = group.getLecturer() != null ? group.getLecturer().toString() : "";
this.room = group.getRoom() != null ? group.getRoom() : "";
this.type = group.getType() != null ? group.getType() : null;
}
public DefaultGroupResponse(Assignment assignment) {
this(assignment.getGroup());
}
public GroupType getType() {
return type;
}
public String getRoom() {
return room;
}
public String getLecturer() {
return lecturer;
}
public String getTime() {
return time;
}
public int getDay() {
return day;
}
public Long getId() {
return id;
}
}

View File

@ -0,0 +1,24 @@
package com.plannaplan.responses.models;
import java.util.ArrayList;
import java.util.List;
public class GetCourseGroupsResponse <T> {
private List<T> lectures = new ArrayList<>();
private List<T> classes = new ArrayList<>();
public GetCourseGroupsResponse(List<T> classes, List<T> lectures ){
this.lectures = lectures;
this.classes = classes;
}
public List<T> getClasses() {
return this.classes;
}
public List<T> getLectures() {
return this.lectures;
}
}

View File

@ -0,0 +1,12 @@
package com.plannaplan.responses.models;
import com.plannaplan.entities.Course;
import com.plannaplan.responses.models.abstracts.CoursesResponse;
public class GetCoursesResponse extends CoursesResponse {
public GetCoursesResponse(Course course) {
super(course);
}
}

Some files were not shown because too many files have changed in this diff Show More