93 Commits

Author SHA1 Message Date
9c1a148e20 Merge pull request 'Nowa funkcjonalność: wymiana-przedmiotami' (#41) from wymiana-przedmiotami into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/41
2021-01-13 17:00:48 +01:00
ab32ad8561 Added emial to exchanges 2021-01-13 16:52:18 +01:00
1506270dec Master mergerd 2021-01-13 15:53:29 +01:00
75a3bc46f2 Checkpoint: Added performExchange into cron
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-13 14:42:13 +01:00
986407b8f8 Checkpoint: Removed unused imports
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-13 14:29:01 +01:00
11469e9314 Checkpoint: ExchangeServiceTest
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-13 14:13:26 +01:00
d1641277ac Checkpoint: ExchangeServiceTest
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-13 13:30:46 +01:00
ed528ad9a0 Checkpoint: ExchangeServiceTest
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-13 12:23:00 +01:00
f9a27abb32 Checkpoint: Added mew test
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-12 18:39:22 +01:00
1e1160736d Checkpoint: Added ShouldPerformExchange
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-12 14:35:11 +01:00
bc8f7407fc Checkpoint: added performExchange 2021-01-12 14:10:48 +01:00
1c12a778af Checkpoint: Added ExchangeServiceTest
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-12 13:04:57 +01:00
3583d30b26 Checkpoint: Added test to ExchangeRepo
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-11 16:56:39 +01:00
76faedc40d Checkpoint: Added test to ExchangeRepo
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-11 16:21:25 +01:00
5e459ac429 Checkpoint: Added test to ExchangeRepo
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-11 16:20:59 +01:00
b18f9cd50e Checkpoint: adding docs
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-10 15:59:26 +01:00
6311ecee92 Checkpoint: removed unsed imports
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-10 14:37:03 +01:00
6fe72465b9 Checkpoint: All test good :3
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-10 14:24:39 +01:00
00f639ad55 Removed unused import
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-10 14:16:31 +01:00
81f870eaa1 Checkpoint: 15/1
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-10 14:15:58 +01:00
2e6f373997 Checkpoint: 5/11
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-10 12:45:51 +01:00
c7feb10997 Checkpoint: ownedGroups.contains(groupId) and tests
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-10 10:57:33 +01:00
b0a1d929e4 Fixed problem
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-09 17:35:53 +01:00
3335155cd8 Proba naprawienia]
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-09 17:05:00 +01:00
df90a57715 Proba naprawienia]
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-09 14:17:39 +01:00
2320d66a35 Proba naprawienia
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-09 14:00:29 +01:00
11d21be627 Proba naprawienia
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-09 13:11:10 +01:00
756e854f31 Proba naprawienia
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-08 16:33:02 +01:00
bbf14b0ff9 Proba naprawienia
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-08 16:26:47 +01:00
a25843ebfd Proba naprawienia
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-08 16:17:24 +01:00
149796c42a Proba naprawienia
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-08 16:03:35 +01:00
c6c67e7e29 Poprawki 2021-01-08 15:53:15 +01:00
ad0d9e40c1 Proba naprawienia
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-08 15:28:59 +01:00
1682448627 Proba naprawienia
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-08 15:19:45 +01:00
e24938dfce Checkpoint: return per ID works
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-07 17:02:12 +01:00
842e38898a Checkpoint: return all exchanges works
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-07 16:51:35 +01:00
56120c4724 Checkpoint: deleting is working
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-07 16:01:25 +01:00
c8c8b62263 gettoken.py, README.md - update
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 17:29:18 +01:00
ebacbe892d gettoken.py WORKING IN MY GENTOO
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 17:20:49 +01:00
90f154f23b Checkpoint: Added docs, improved ExchangeEntity 2021-01-06 17:12:20 +01:00
b633d2c2df Checkpoints: WORKS but not for all
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 16:50:08 +01:00
df7701ebc8 Checkpoints: Part 1 of Added docs
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 16:23:18 +01:00
f24e62a335 Checkpoint: works first try with endpoint
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 14:50:34 +01:00
3bcc35e75b Checkpoint: dziala sprawdzanie values in the exchanges/exchange
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 14:34:25 +01:00
6e65c26e3c Checkpoint: szkielet
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 13:40:04 +01:00
cfc1e3eba7 Added changes
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 12:41:49 +01:00
3b80a70921 Merge pull request 'Changing-file-xls' (#40) from Changing-file-xls into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/40
2021-01-06 12:24:54 +01:00
5edec5aa71 Remove unused import
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 11:56:04 +01:00
5b0097e6c7 Added systemout
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 11:47:18 +01:00
fddd5b757d Changed tests
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 11:39:58 +01:00
7813f148eb Added new column type with reading it and write groupType into DB
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 11:39:42 +01:00
8c0b880412 Change update function and added new contrutor in the Groups 2021-01-06 11:39:02 +01:00
fe06243bda Added new enums and desription
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 11:38:16 +01:00
f9fc7fa7bd Added new data
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-06 11:36:29 +01:00
68dfd2473a Merge pull request 'accept-algorythm' (#39) from accept-algorythm into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/39
2021-01-05 12:20:34 +01:00
ddabc1a0b9 Docs fixes 2021-01-05 11:50:25 +01:00
463af01dc6 Added tests 2021-01-05 11:44:54 +01:00
0b40d3729c 0 0 2021-01-05 11:14:29 +01:00
3485dff86f Added performing tours and docs 2021-01-05 11:14:10 +01:00
2141f35e3f Chcekpoint - needs docs cleaning and tests 2021-01-04 18:10:14 +01:00
a6e6618202 Added structare for tour endindgs 2021-01-03 18:06:25 +01:00
44f8c610d9 Tested in big data set 2021-01-03 17:57:32 +01:00
95cc34c676 Docs + email sending 2021-01-03 17:10:36 +01:00
61d035e342 Code cleaning 2021-01-03 16:30:15 +01:00
0f8b4eafb5 Checkpint - algorythm works 2021-01-03 16:21:06 +01:00
2c0008afe1 Checkpoint - added many to many user group relations and test cerating users and groups to accept test 2021-01-02 15:26:05 +01:00
4b096a50bf Added getting sorted students 2021-01-02 14:35:00 +01:00
ff9aa64470 Added accepted status to assignments 2021-01-02 14:01:50 +01:00
a41c6f2583 Added points ranking to entity 2021-01-02 13:45:03 +01:00
ef896e9c12 Added
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2021-01-02 13:16:43 +01:00
3bce1f91ec Merge pull request 'api-service' (#38) from api-service into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/38
2020-12-31 14:33:50 +01:00
665807240f Adden user data completion and docs correction 2020-12-31 14:24:55 +01:00
cd0f4bccd9 Added api service 2020-12-31 13:45:07 +01:00
ccb0161609 Checkpoint 2020-12-29 19:01:09 +01:00
9f1e21a29f Merge pull request 'forntend-fixes' (#37) from forntend-fixes into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/37
2020-12-29 16:41:04 +01:00
a0570a055f Schedule taken places 2020-12-29 16:36:12 +01:00
eecb1a6d36 Added capacioty to course/all 2020-12-29 15:32:09 +01:00
389e934035 changed pres 2020-12-27 14:15:52 +01:00
4cec07e369 Merge pull request 'admin-user' (#36) from admin-user into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/36
2020-12-27 14:09:55 +01:00
817350e85e Added UserRepositoryTest and users/admin users/deanery
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-27 13:54:33 +01:00
da4e683248 Added new /config/tours, tests
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-26 15:33:17 +01:00
09cc994d92 Added new tests
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-26 14:31:09 +01:00
c3d78505c8 Added new test for new columns and update groups
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-26 14:18:47 +01:00
f51979484f Added new columns into a FileMigrator and etc
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-26 13:17:39 +01:00
038d0b95d2 Added ne xlsx file
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-26 13:01:19 +01:00
4758c505c4 Merge branch 'Dodanie-nowych-kolumn' into admin-user 2020-12-26 12:47:13 +01:00
7a62c8d7d8 Added ne xlsx file
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-26 12:22:00 +01:00
9e6ee6dbb3 Updated
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-26 12:09:55 +01:00
2ba4082373 Added tests
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-23 14:38:36 +01:00
2ec3699978 Added javadocs
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-23 14:26:29 +01:00
507d9fddc0 Method body ready
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-23 14:21:16 +01:00
e647698591 Fix problem with admin test - cleaning database
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-23 14:06:02 +01:00
da46582fc0 Added check for admin user and test it
Signed-off-by: Marcin Woźniak <y0rune@aol.com>
2020-12-23 13:48:26 +01:00
61 changed files with 3008 additions and 117 deletions

8
.gitignore vendored
View File

@ -33,4 +33,10 @@ build/
### Python ###
__pycache__
.pytest_cache
.pytest_cache
### Parser ###
parser/
envs.sh

View File

@ -1,4 +1,4 @@
## Start aplikacji
# Start aplikacji
Zeby wystartowac aplikacje backendu najpierw nalezy postawic testowa baze danych na naszym komputerze za pomoca dockera. Jesli raz juz go odpalimy przy nastepnym razem bardzo mozliwe, ze wlaczy sie sam. AAby sprawdzic czy docker jesty wystartowany mozna uzyc `docker ps`
@ -13,17 +13,29 @@ cd restservice
mvn spring-boot:run
```
## Token obtaining
# Token obtaining
Żeby tesotwać API wpełni potrzebny nam jest token który otrzymujemy na podstawie ticketa z systemu autoryzacyjnego **CAS**. Z tego powodu system autoryzacji działa inaczej niż w "książkowych" restowych aplikacjach i np Postman za nas jej nie dokona. Musimy mu podać już uzyskany token. Aby łatwo go uzyskać odpal skrypt
```
```bash
python gettoken.py
```
Jeżeli chcesz używać skryptu zmiejaniąc gdzie znajduje się backend wpisz:
```bash
python gettoken.py 192.168.0.212
```
Jeżeli chcesz używać skryptu bez uruchamiania przeglądarki wpisz:
```bash
python gettoken.py no-browser
```
Na koniec w przęglądarce dostaniesz w odpowiedzi token. W samym pliku można zmienić porty aplikacji jeśli to potrzebne.
## Profiles
# Profiles
W aplikacji posiadamy dwa profile. `dev` i `prod`. **Dev** używamy do testowania aplikacji lokalnie. **Pord** służy do stworzenia builda na produkcję.
Profil wybieramy w pliku `restservice/src/main/resources/application.properties` wpisując odpowiednią nazwę
@ -45,8 +57,12 @@ W paczce dla proda w protpertiesach poufne dane odczytywane są ze zmiennych śr
- `PLANNAPLAN_EMAIL_USERNAME` - login naszego maila
- `PLANNAPLAN_EMAIL_PASSWORD` - hasło naszego maila
- `PLANNAPLAN_EMAIL` - nasz adres maila
- `PLANNAPLAN_CONSUMER_KEY` - nasz klucz do usos api
- `PLANNAPLAN_CONSUMER_SECRET` - secret naszego klucza
## Packaging
Należy też pamiętać, że zmienne `PLANNAPLAN_CONSUMER_KEY` oraz `PLANNAPLAN_CONSUMER_SECRET` są potrzebne również w profilu `dev` więc trzeba je dodać w celu tesotowania do zmiennych we własnym systemie
# Packaging
Zeby spakowac apke do `jara` wystarcza dwie komendy zaczynajac z glownego katalogu projektu
@ -56,23 +72,23 @@ mvn clean; mvn install; cd restservice; mvn clean package spring-boot:repackage
Utworzony zostanie jar w `restservice/target/restservice-1.0-SNAPSHOT.jar`. Oczywiscie zeby jar zadzialal kontenery dockerowe musza byc odpalone (lub baza danych na serwerze jesli zmienialismy propertisy z localhost)
## Generowanie dokumentacji
# Generowanie dokumentacji
### Javadocs
## Javadocs
```bash
mvn javadoc:javadoc
```
### Api docs
## Api docs
Żeby zobaczyć dokumentację api trzeba wejść w przeglądarce na `http://localhost:1285/swagger-ui.html` po odpaleniu aplikacji.
#### Nazewnictwo odpowiedzi
### Nazewnictwo odpowiedzi
Każdą odpowiedź zaczynamy od modelu, który opisuje np. `Courses` a kończymy na `Response`. Między tymi dwoma członami możemy dodawać modyfikatory opisujące dokładniej odpowiedź np. `Default`. W ten sposób możemy otrzymać nazwę `CoursesDefaultResponse.java`
## Troubleshooting
# Troubleshooting
Spring chyba cacheuje jakies dane dotyczace polaczenia wiec jesli spring wywali Ci blad `Connection Refused`, a wiesz, ze ta baza stoi na podanym ip i porcie to sprobuj
@ -80,3 +96,28 @@ Spring chyba cacheuje jakies dane dotyczace polaczenia wiec jesli spring wywali
mvn clean
mvn install
```
Jeżeli używasz VSCode i testy, które wymagają podanych zmiennych środowiskowych (testy odpytywania usos api) trzeba podać te zmienne w pliku `.vscode/settings.json`
```json
{
"files.exclude": {
"**/.classpath": true,
"**/.project": true,
"**/.settings": true,
"**/.factorypath": true
},
"java.configuration.updateBuildConfiguration": "disabled",
"java.format.settings.url": "eclipse-formatter.xml",
"java.test.config": [
{
"name": "myConfiguration",
"workingDirectory": "${workspaceFolder}",
"env": {
"PLANNAPLAN_CONSUMER_KEY": "value",
"PLANNAPLAN_CONSUMER_SECRET": "value"
}
}
]
}
```

View File

@ -74,6 +74,31 @@
<version>2.2.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.social/spring-social-core -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.github.scribejava</groupId>
<artifactId>scribejava-core</artifactId>
<version>8.1.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
<build>

View File

@ -4,6 +4,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"
}
]
}

View File

@ -0,0 +1,61 @@
package com.plannaplan.api;
import com.github.scribejava.core.builder.api.DefaultApi10a;
/**
* singleton class to sign usos api requests with oauth
*/
public class UsosOauth1Service extends DefaultApi10a {
private static final String AUTHORIZE_URL = "https://usosapidemo.amu.edu.pl/services/oauth/authorize";
private static final String REQUEST_TOKEN_URL = "https://usosapidemo.amu.edu.pl/services/oauth/request_token";
private final String scopesAsString;
protected UsosOauth1Service() {
scopesAsString = null;
}
protected UsosOauth1Service(String... scopes) {
final StringBuilder builder = new StringBuilder();
for (String scope : scopes) {
builder.append('+').append(scope);
}
scopesAsString = "?scope=" + builder.substring(1);
}
private static class InstanceHolder {
private static final UsosOauth1Service INSTANCE = new UsosOauth1Service();
}
public static UsosOauth1Service instance() {
return InstanceHolder.INSTANCE;
}
/**
* get instance withj scopes
*
* @param scopes to get instance with
* @return UsosOauth1Service instance
*/
public static UsosOauth1Service instance(String... scopes) {
return scopes == null || scopes.length == 0 ? instance() : new UsosOauth1Service(scopes);
}
@Override
public String getRequestTokenEndpoint() {
return scopesAsString == null ? REQUEST_TOKEN_URL : REQUEST_TOKEN_URL + scopesAsString;
}
@Override
public String getAccessTokenEndpoint() {
return "https://usosapidemo.amu.edu.pl/services/oauth/access_token";
}
@Override
protected String getAuthorizationBaseUrl() {
return AUTHORIZE_URL;
}
}

View File

@ -8,6 +8,7 @@ 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.Row;
@ -31,6 +32,10 @@ public class FileToDatabaseMigrator {
private static final String GROUP_TIME_STRING = "godz_od";
private static final String ROOM_STRING = "sala";
private static final String CAPACITY_STRING = "Mc";
private static final String TYPE_GROUP= "typ";
private static final String ZAJ_CYK_ID = "zaj_cyk_id";
private static final String GR_NR = "gr_nr";
@Autowired
private LecturerService lecturerService;
@ -55,6 +60,10 @@ public class FileToDatabaseMigrator {
int timeIndex = data.getIndexOf(FileToDatabaseMigrator.GROUP_TIME_STRING);
int roomIndex = data.getIndexOf(FileToDatabaseMigrator.ROOM_STRING);
int capacityIndex = data.getIndexOf(FileToDatabaseMigrator.CAPACITY_STRING);
int typeGroupIndex = data.getIndexOf(FileToDatabaseMigrator.TYPE_GROUP);
int zajCykIdIndex = data.getIndexOf(FileToDatabaseMigrator.ZAJ_CYK_ID);
int grNrIndex = data.getIndexOf(FileToDatabaseMigrator.GR_NR);
while (rows.hasNext()) {
Row row = rows.next();
@ -67,11 +76,18 @@ public class FileToDatabaseMigrator {
String lecturerSurname = row.getCell(surnameIndex) != null ? row.getCell(surnameIndex).toString().trim()
: "";
int day = (int) Double.parseDouble(row.getCell(dayIndex).toString());
Integer zajCykId = row.getCell(zajCykIdIndex) != null ? (int) Double.parseDouble(row.getCell(zajCykIdIndex).toString().trim())
: null;
Integer grNr = row.getCell(grNrIndex) != null ? (int) Double.parseDouble(row.getCell(grNrIndex).toString().trim())
: null;
int day = row.getCell(dayIndex) != null ? (int) Double.parseDouble(row.getCell(dayIndex).toString()) : 0;
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());
GroupType typeGroup = GroupType.getType(row.getCell(typeGroupIndex).toString());
Course course = this.courseService.getCourseByName(courseName)
.orElseGet(() -> this.courseService.save(new Course(courseName, symbol)));
@ -80,8 +96,11 @@ public class FileToDatabaseMigrator {
.orElseGet(() -> this.lecturerService
.save(new Lecturer(lecturerTitle, lecturerName, lecturerSurname)));
this.groupService.find(time, capacity, room).orElseGet(
() -> this.groupService.save(new Groups(capacity, room, course, time, groupDay, lecturer)));
Groups group = this.groupService.find(zajCykId, grNr).orElseGet(
() -> new Groups(capacity, room, course, time, groupDay, lecturer, zajCykId, grNr, typeGroup));
group.update(capacity, room, course, time, null, groupDay, lecturer, typeGroup);
this.groupService.save(group);
}

View File

@ -2,6 +2,8 @@ package com.plannaplan.entities;
import java.sql.Date;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.util.TimeZone;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
@ -11,6 +13,8 @@ import javax.persistence.Id;
import com.plannaplan.models.TourData;
import com.plannaplan.types.AppState;
import org.springframework.scheduling.support.CronTrigger;
/**
* entity that keeps app configurations
*/
@ -115,4 +119,53 @@ public class AppConfig {
return AppState.NO_TOUR;
}
/**
* get cron expression of first tour end
*
* @return spring cron expression
*/
public CronTrigger getFirstTourEndCron() {
return getCron(this.firstTourEnd);
}
/**
* get cron expression of second tour end
*
* @return spring cron expression
*/
public CronTrigger getSecondTourEndCron() {
return getCron(this.secondTourEnd);
}
/**
* get cron expression of first tour start
*
* @return spring cron expression
*/
public CronTrigger getFirstTourStartCron() {
return getCron(this.firstTourStart);
}
/**
* get cron expression of second tour start
*
* @return spring cron expression
*/
public CronTrigger getSecondTourStartCron() {
return getCron(this.secondTourStart);
}
/**
* create spring cron expression
*
* @param date date to create cron exp from
* @return spring cron expression. Remember that spring's cron deosn't contain
* year in it.
*/
private CronTrigger getCron(Date date) {
final LocalDate tourEnd = date.toLocalDate();
return new CronTrigger("0 0 0 " + tourEnd.getDayOfMonth() + " " + tourEnd.getMonthValue() + " ?",
TimeZone.getTimeZone(TimeZone.getDefault().getID()));
}
}

View File

@ -8,8 +8,9 @@ import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
/**
* Entity of Assignment grouping of state associated about group_id and commision_id
*
* Entity of Assignment grouping of state associated about group_id and
* commision_id
*
*/
@Entity
@ -24,11 +25,12 @@ public class Assignment {
@JoinColumn(name = "commision_id")
private Commision commision;
private boolean isPastAssignment;
/**
* Assignment
* @param group group we would like to assign
* @param commision commision that assignment belongs to
*
* @param group group we would like to assign
* @param commision commision that assignment belongs to
* @param isPastAssignment is assignment past or no
*/
public Assignment(Groups group, Commision commision, boolean isPastAssignment) {
@ -36,9 +38,27 @@ public class Assignment {
this.group = group;
}
/**
* If it returns trues it mesans u are assigned to group accepted by algorythm
*
* @return boolean isAccepted
*/
public boolean isAccepted() {
return this.group.getRegisteredStudents().contains(this.commision.getCommisionOwner());
}
/**
* Getter of commision
* @return Commision Commision of given assignments
*/
public Commision getCommision(){
return this.commision;
}
/**
* Assignment
* @param group group we would like to assign
*
* @param group group we would like to assign
* @param commision commision that assignment belongs to
*/
public Assignment(Groups group, Commision commision) {
@ -48,9 +68,13 @@ public class Assignment {
public Assignment() {
}
public void setCommision(Commision commision) {
this.commision = commision;
}
/**
* Id getter
* @return id id of assignment
* Id getter
*
* @return id id of assignment
*/
public Long getId() {
@ -58,9 +82,9 @@ public class Assignment {
}
/**
* getGroup
*
* @return group
* getGroup
*
* @return group
*/
public Groups getGroup() {
return this.group;
@ -68,6 +92,7 @@ public class Assignment {
/**
* isPastAssignment getter
*
* @return isPastAssignment
*/
public boolean isPastAssignment() {
@ -76,9 +101,10 @@ public class Assignment {
/**
* setter isPastAssignment
* @param isPastAssignment
*
* @param isPastAssignment is assignment past or not
*/
public void setPastAssignment(boolean isPastAssignment) {
this.isPastAssignment = isPastAssignment;
}
}
}

View File

@ -0,0 +1,102 @@
package com.plannaplan.entities;
import java.sql.Timestamp;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
/**
* Entity that keeps user exchange offer.
*/
@Entity
public class Exchange {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@JoinColumn(name = "owned_id")
private Assignment ownedAssignment;
@OneToOne
@JoinColumn(name = "desired_id")
private Groups desiredAssignment;
private Long ownerId;
private Timestamp dateExchange;
public Exchange(){
}
/**
* @return Long ID of exchange trader
*/
public Long getOwnerId() {
return ownerId;
}
/**
* @param ownerId ID of exchange trader
*/
public void setOwnerId(Long ownerId) {
this.ownerId = ownerId;
}
public Timestamp getDataExchange() {
return this.dateExchange;
}
/**
*
* @param ownedAssignment Assignment which owner would like to trade
* @param desiredAssignment Groups instance that trader wants
*/
public Exchange(Assignment ownedAssignment, Groups desiredAssignment) {
this.ownedAssignment = ownedAssignment;
this.desiredAssignment = desiredAssignment;
this.ownerId = this.ownedAssignment != null ? this.ownedAssignment.getCommision().getCommisionOwner().getId() : null;
this.dateExchange = new Timestamp(System.currentTimeMillis());
}
/**
* @return Long ID in database
*/
public Long getId(){
return this.id;
}
/**
* @return Groups Target group
*/
public Groups getDesiredAssignment() {
return desiredAssignment;
}
/**
* @param desiredAssignment Target group
*/
public void setDesiredAssignment(Groups desiredAssignment) {
this.desiredAssignment = desiredAssignment;
}
/**
* @return Assignment Owned assignment
*/
public Assignment getOwnedAssignment() {
return ownedAssignment;
}
/**
* @param ownedAssignment Owned assignment
*/
public void setOwnedAssignment(Assignment ownedAssignment) {
this.ownedAssignment = ownedAssignment;
}
}

View File

@ -1,10 +1,15 @@
package com.plannaplan.entities;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import com.plannaplan.types.GroupType;
@ -34,10 +39,41 @@ public class Groups {
@ManyToOne
@JoinColumn(name = "lecturer_id")
private Lecturer lecturer;
private Integer zajCykId;
private Integer grNr;
@ManyToMany(mappedBy = "studentRegisteredGrups", fetch = FetchType.EAGER)
private Set<User> registeredStudents;
public Set<User> getRegisteredStudents() {
return this.registeredStudents;
}
public void assignUser(User user) {
if (this.registeredStudents == null) {
this.registeredStudents = new HashSet<>();
}
this.registeredStudents.add(user);
}
public Groups() {
}
public Integer getGrNr() {
return grNr;
}
public void setGrNr(Integer grNr) {
this.grNr = grNr;
}
public Integer getZajCykId() {
return zajCykId;
}
public void setZajCykId(Integer zajCykId) {
this.zajCykId = zajCykId;
}
/**
* Groups
*
@ -60,6 +96,84 @@ public class Groups {
this.type = capacity >= 50 ? GroupType.LECTURE : GroupType.CLASS;
}
/**
* Groups
*
* @param capacity capacity given to the groups
* @param room room given to the groups
* @param course course given to the groups
* @param time time given to the groups
* @param endTime end time of class in minutes
* @param day day given to the groups
* @param lecturer lecturer given to the groups
* @param zajCykId number of class in the term
* @param grNr Number of class/course
* @param type type of class/cource
*/
public Groups(int capacity, String room, Course course, int time, int endTime, WeekDay day, Lecturer lecturer,
Integer zajCykId, Integer grNr, GroupType type) {
this(capacity, room, course, time, endTime, day, lecturer, zajCykId, grNr);
this.type = type;
}
/**
* Groups
*
* @param capacity capacity given to the groups
* @param room room given to the groups
* @param course course given to the groups
* @param time time given to the groups
* @param day day given to the groups
* @param lecturer lecturer given to the groups
* @param zajCykId number of class in the term
* @param grNr Number of class/course
* @param type type of class/cource
*/
public Groups(int capacity, String room, Course course, int time, WeekDay day, Lecturer lecturer,
Integer zajCykId, Integer grNr, GroupType type) {
this(capacity, room, course, time, time + DEFAULT_CLASS_TIME, day, lecturer, zajCykId, grNr);
this.type = type;
}
/**
* Groups
*
* @param capacity capacity given to the groups
* @param room room given to the groups
* @param course course given to the groups
* @param time time given to the groups
* @param endTime end time of class in minutes
* @param day day given to the groups
* @param lecturer lecturer given to the groups
* @param zajCykId number of class in the term
* @param grNr Number of class/course
*/
public Groups(int capacity, String room, Course course, int time, int endTime, WeekDay day, Lecturer lecturer,
Integer zajCykId, Integer grNr) {
this(capacity, room, course, time, endTime, day, lecturer);
this.zajCykId = zajCykId;
this.grNr = grNr;
}
/**
* Groups
*
* @param capacity capacity given to the groups
* @param room room given to the groups
* @param course course given to the groups
* @param time time given to the groups
* @param day day given to the groups
* @param lecturer lecturer given to the groups
* @param zajCykId number of class in the term
* @param grNr Number of class/course
*/
public Groups(int capacity, String room, Course course, int time, WeekDay day, Lecturer lecturer, Integer zajCykId,
Integer grNr) {
this(capacity, room, course, time, time + DEFAULT_CLASS_TIME, day, lecturer);
this.zajCykId = zajCykId;
this.grNr = grNr;
}
/**
* Create groups with default class duration
*
@ -74,6 +188,53 @@ public class Groups {
this(capacity, room, course, time, time + DEFAULT_CLASS_TIME, day, lecturer);
}
/**
* Updates given values other that are not null
*
* @param capacity capacity given to the groups
* @param room room given to the groups
* @param course course given to the groups
* @param time time given to the groups
* @param endTime end time of class in minutes
* @param day day given to the groups
* @param lecturer lecturer given to the groups
* @param type type given to the groups
*/
public void update(Integer capacity, String room, Course course, Integer time, Integer endTime, WeekDay day,
Lecturer lecturer, GroupType type) {
if (capacity != null) {
this.capacity = capacity;
}
if (room != null) {
this.room = room;
}
if (course != null) {
this.course = course;
}
if (time != null) {
this.time = time;
}
if (endTime != null) {
this.endTime = endTime;
}
if (day != null) {
this.day = day;
}
if (lecturer != null) {
this.lecturer = lecturer;
}
if (type != null) {
this.type = type;
}
}
/**
* get time of class end
*

View File

@ -1,14 +1,21 @@
package com.plannaplan.entities;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import com.plannaplan.models.UserApiResponse;
import com.plannaplan.types.UserRoles;
/**
@ -31,16 +38,36 @@ public class User {
private String token;
private String refreshToken;
private Timestamp tokenUsageDate;
private Integer ranking;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable
private Set<Groups> studentRegisteredGrups;
public Set<Groups> getStudentRegisteredGrups() {
return this.studentRegisteredGrups;
}
public void removeGroup(Long id) {
final Groups groupToDelete = this.studentRegisteredGrups.stream().filter(e -> e.getId().equals(id)).findFirst().get();
this.studentRegisteredGrups.remove(groupToDelete);
}
public void claimGroup(Groups group) {
if (this.studentRegisteredGrups == null) {
this.studentRegisteredGrups = new HashSet<>();
}
this.studentRegisteredGrups.add(group);
}
public User() {
}
/**
*
*
* @param name name given to the user
* @param surname surname given to the user
* @param mail mail given to the user
* @param role
* @param role user's role
*/
public User(String name, String surname, String mail, UserRoles role) {
this.name = name;
@ -50,21 +77,36 @@ public class User {
}
/**
*
*
* @param name name given to the user
* @param surname surname given to the user
* @param mail mail given to the user
* @param usosId id in the USOS system
* @param role
* @param role user's role
*/
public User(String name, String surname, String mail, String usosId, UserRoles role) {
this(name, surname, mail, role);
this.usosId = usosId;
}
/**
*
* @param name name given to the user
* @param surname surname given to the user
* @param mail mail given to the user
* @param usosId id in the USOS system
* @param role user's role
* @param ranking ranking points [100;500]. It's calculated by
* gradesAvg*100*studiesYear
*/
public User(String name, String surname, String mail, String usosId, UserRoles role, Integer ranking) {
this(name, surname, mail, usosId, role);
this.ranking = ranking;
}
/**
* usos id getter
*
*
* @return usosid
*/
public String getUsosId() {
@ -73,7 +115,7 @@ public class User {
/**
* email getter
*
*
* @return mailof user
*/
public String getEmail() {
@ -82,7 +124,7 @@ public class User {
/**
* email setter
*
*
* @param email user email
*/
public void setEmail(String email) {
@ -91,7 +133,7 @@ public class User {
/**
* token usage getter
*
*
* @return Timestamp when token was used
*/
public Timestamp getTokenUsageDate() {
@ -100,7 +142,7 @@ public class User {
/**
* token getter
*
*
* @return user token
*/
public String getToken() {
@ -116,7 +158,7 @@ public class User {
/**
* token seter. Sets token and automaticly set time when was set
*
*
* @param token token to set
*/
public void setToken(String token) {
@ -127,7 +169,7 @@ public class User {
/**
* name setter
*
*
* @return String user name
*/
public String getName() {
@ -136,7 +178,7 @@ public class User {
/**
* user rolse getter
*
*
* @return UserRoles of user
*/
public UserRoles getRole() {
@ -145,7 +187,7 @@ public class User {
/**
* user role setter
*
*
* @param role to be set
*/
public void setRole(UserRoles role) {
@ -154,7 +196,7 @@ public class User {
/**
* surname getter
*
*
* @return string surname
*/
public String getSurname() {
@ -163,7 +205,7 @@ public class User {
/**
* surname setter
*
*
* @param surname string to be set as surnames
*/
public void setSurname(String surname) {
@ -172,7 +214,7 @@ public class User {
/**
* name stter
*
*
* @param name stirng to be set as name
*/
public void setName(String name) {
@ -181,17 +223,46 @@ public class User {
/**
* id getter
*
*
* @return id in database
*/
public Long getId() {
return this.id;
}
/**
* Ranking points are [100;500]. It's calculated by gradesAvg*100*studiesYear
*
* @return ranking points [100;500]
*/
public Integer getRanking() {
return ranking;
}
/**
* Ranking points setter. Ranking points are [100;500]. It's calculated by
* gradesAvg*100*studiesYear
*
* @param ranking ranking points [100;500]
*/
public void setRanking(Integer ranking) {
this.ranking = ranking;
}
/**
* updates user entity with data got by UsosApiService::getUserData
*
* @param usosData UserApiResponse model with needed data
*/
public void updateWithUsosData(UserApiResponse usosData) {
this.name = usosData.getName();
this.surname = usosData.getSurname();
}
/**
* it checks if given ammount of time passed since last token usage. If not
* retunr true and reset time otherwise return false and token won work anymore
*
*
* @return boolena if credentials (token) is expired or not
*/
public boolean isCredentialsNonExpired() {

View File

@ -0,0 +1,97 @@
package com.plannaplan.models;
import java.util.Iterator;
import java.util.List;
import com.plannaplan.entities.Groups;
/**
* Instance to keep data to send in mail about accepted courses results
*/
public class EmailAcceptedData {
private List<Groups> accepted;
private List<Groups> removed;
public EmailAcceptedData() {
}
/**
* creates instance of class
*
* @param accepted list of groups that user joined to
* @param removed lsit of groups that user failed to join
*/
public EmailAcceptedData(List<Groups> accepted, List<Groups> removed) {
this.accepted = accepted;
this.removed = removed;
}
/**
* get list of removed assignments
*
* @return removed assingments
*/
public List<Groups> getRemoved() {
return removed;
}
/**
* set list of removed assignments
*
* @param removed list of removed assignments
*/
public void setRemoved(List<Groups> removed) {
this.removed = removed;
}
/**
* get list of accepted assignments
*
* @return accepted assingments
*/
public List<Groups> getAccepted() {
return accepted;
}
/**
* set list of accepted assignments
*
* @param accepted list of accepted assignments
*/
public void setAccepted(List<Groups> accepted) {
this.accepted = accepted;
}
/**
* it creates and return email message body
*
* @return string with emiale massage
*/
public String getEmailMessage() {
String response = "Akceptacja Twoich przedmiotów właśnie dobiegła końca.\n\n";
if (this.accepted != null && this.accepted.size() > 0) {
response += "Zatwierdzone grupy: \n";
Iterator<Groups> iterator = accepted.iterator();
while (iterator.hasNext()) {
final Groups gorup = iterator.next();
final String courseName = gorup.getCourseId() != null ? gorup.getCourseId().getName()
: "Nieznana grupa";
response += (" - " + courseName + " - " + gorup.getType() + "\n");
}
}
if (this.removed != null && this.removed.size() > 0) {
response += "Usunięte grupy: \n";
Iterator<Groups> iterator = removed.iterator();
while (iterator.hasNext()) {
final Groups gorup = iterator.next();
final String courseName = gorup.getCourseId() != null ? gorup.getCourseId().getName()
: "Nieznana grupa";
response += (" - " + courseName + " - " + gorup.getType() + "\n");
}
}
return response;
}
}

View File

@ -0,0 +1,45 @@
package com.plannaplan.models;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.plannaplan.entities.Exchange;
import com.plannaplan.entities.User;
/**
* Class to keepm data to be send after exchanges being accept
*/
public class EmailExchangesData {
private Map<Long, List<Exchange>> data;
public EmailExchangesData() {
this.data = new HashMap<>();
}
/**
* method to add user and his event to data to be send
*
* @param user owner of exchange being performed
* @param data exchange that was executed
*/
public void addExchange(User user, Exchange data) {
final Long id = user.getId();
if (this.data.get(id) == null) {
this.data.put(id, new ArrayList<>());
}
this.data.get(id).add(data);
}
/**
* get datas entry set
*
* @return set with entries that contains Long that is user id and list of hiss
* performed Exchanges
*/
public Set<Map.Entry<Long, List<Exchange>>> getDataEntry() {
return this.data.entrySet();
}
}

View File

@ -0,0 +1,66 @@
package com.plannaplan.models;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Exchange;
public class MatchData {
private Exchange exchangeOne;
private Exchange exchangeTwo;
public MatchData(Exchange exchangeOne, Exchange exchangeTwo) {
this.exchangeOne = exchangeOne;
this.exchangeTwo = exchangeTwo;
}
public Exchange getExchangeOne() {
return this.exchangeOne;
}
public Exchange getExchangeTwo() {
return this.exchangeTwo;
}
public Assignment getAssignmentTwo() {
return this.exchangeTwo.getOwnedAssignment();
}
public Assignment getAssignmentOne() {
return this.exchangeOne.getOwnedAssignment();
}
@Override
public int hashCode() {
return this.getAssignmentOne().hashCode() + this.getAssignmentTwo().hashCode();
}
@Override
public boolean equals(Object o) {
// If the object is compared with itself then return true
if (o == this) {
return true;
}
/*
* Check if o is an instance of Complex or not "null instanceof [type]" also
* returns false
*/
if (!(o instanceof MatchData)) {
return false;
}
// typecast o to Complex so that we can compare data members
MatchData c = (MatchData) o;
// Compare the data members and return accordingly
return (this.getAssignmentOne().equals(c.getAssignmentOne()) && this.getAssignmentTwo().equals(c.getAssignmentTwo())) || (this.getAssignmentOne().equals(c.getAssignmentTwo()) && this.getAssignmentTwo().equals(c.getAssignmentOne()));
}
public int compare(MatchData m1) {
return Long.compare(m1.getExchangesMsValue(), this.getExchangesMsValue());
}
public long getExchangesMsValue(){
return this.exchangeOne.getDataExchange().getTime() + this.exchangeTwo.getDataExchange().getTime();
}
}

View File

@ -0,0 +1,29 @@
package com.plannaplan.models;
/**
* Model to keep data from /services/users/user response called in
* UsosApiService
*/
public class UserApiResponse {
private String name;
private String surname;
public UserApiResponse() {
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -0,0 +1,26 @@
package com.plannaplan.repositories;
import java.util.List;
import java.util.Optional;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Exchange;
import com.plannaplan.entities.Groups;
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 ExchangeRepository extends JpaRepository<Exchange, Long>{
@Query("FROM Exchange WHERE owned_id = ?1 AND desired_id = ?2")
Optional<Exchange> checkForExchange(@Param("owned_id") Assignment assignment, @Param("desired_id") Groups group);
@Query("FROM Exchange WHERE ownerId = ?1")
List<Exchange> getByUserId(@Param("id") Long id);
@Query("Select e1,e2 FROM Exchange e1, Exchange e2 WHERE e1.ownedAssignment.group.id = e2.desiredAssignment.id")
List<Object[]> getMatches();
}

View File

@ -28,6 +28,9 @@ public interface GroupRepository extends JpaRepository<Groups, Long> {
@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("FROM Groups WHERE zajCykId = ?1 AND grNr = ?2")
Optional<Groups> find(@Param("zajCykId") Integer zaj_cyk_id, @Param("grNr") Integer gr_nr);
@Query("FROM Groups WHERE course_id = ?1")
List<Groups> getByCourse(@Param("id") Long id);

View File

@ -35,9 +35,18 @@ import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("FROM User WHERE email = ?1")
/**
* return user by given authority
*
* @param authority user usosId or email
* @return optional with user if found
*/
@Query("FROM User WHERE email = ?1 OR usosId = ?1")
Optional<User> getByAuthority(@Param("authority") String authority);
@Query("FROM User WHERE email = ?1")
Optional<User> getByEmail(@Param("authority") String authority);
@Query("FROM User WHERE refreshToken = ?1")
Optional<User> getByRefreshToken(@Param("refreshToken") String refreshToken);
@ -47,6 +56,13 @@ public interface UserRepository extends JpaRepository<User, Long> {
@Query("FROM User WHERE (name LIKE %?1% OR surname LIKE %?1%)")
List<User> searchForUsers(@Param("query") String query);
/**
* search for user with given query
*
* @param query string that will be matched to users name and surname
* @param role limits results by role
* @return list opf results
*/
@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,22 @@
package com.plannaplan.services;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.Groups;
import com.plannaplan.entities.User;
import com.plannaplan.models.EmailAcceptedData;
import com.plannaplan.repositories.AssignmentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Service of Assignment which can save assignments, diplay assignments, get ammount of assigments.
* Service of Assignment which can save assignments, diplay assignments, get
* ammount of assigments.
*/
@Service
@ -19,11 +24,21 @@ public class AssignmentService {
@Autowired
private AssignmentRepository repo;
@Autowired
private CommisionService service;
@Autowired
private UserService userService;
@Autowired
private EmailService emailService;
public AssignmentService() {
}
/**
* Save given assignment
*
* @param assignment assignment to save
* @return assignment saved assignment with database id
*/
@ -31,17 +46,20 @@ public class AssignmentService {
return this.repo.save(assignment);
}
/*
* getCommisionAssignments
* Return id of the commision
/**
* gets list of assignments of given commision
*
* @param com Commision to get assinments from
* @return list of assignments
*/
public List<Assignment> getCommisionAssignments(Commision com) {
return this.repo.getByCommision(com.getId());
}
/*
* getAssignmentsAmmount
* Return count assignments ammount
/**
* get ammount of all assignments (not only for selected commision)
*
* @return long - ammount of assingments
*/
public long getAssignmentsAmmount() {
return this.repo.count();
@ -49,10 +67,41 @@ public class AssignmentService {
/**
* Get assigmnent by id
*
* @param id id of assigmnent
* @return Optional of assignment
*/
public Optional<Assignment> getById(Long id) {
return this.repo.findById(id);
}
/**
* this method will activate accept algorythm for all students. Algorythm is
* takeing each student in order defined by ranking and accept for him groups
* that are joinable for him
*/
public void callAcceptAlgorythm() {
final List<User> students = this.userService.getStudentsSortedByRanking();
students.forEach(e -> {
final Optional<Commision> com = this.service.getNewestCommision(e);
final List<Groups> accepted = new ArrayList<>();
final List<Groups> removed = new ArrayList<>();
if (com.isPresent()) {
final List<Assignment> assignments = this.getCommisionAssignments(com.get());
assignments.forEach(a -> {
final Groups group = a.getGroup();
if (group.getCapacity() > group.getRegisteredStudents().size()) {
e.claimGroup(group);
accepted.add(group);
} else {
removed.add(group);
}
});
}
this.userService.save(e);
this.emailService.sendAcceptationResult(e, new EmailAcceptedData(accepted, removed));
});
}
}

View File

@ -12,7 +12,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Service of CommisionService which can save commision, get user's commisions, get newest user's commision, get ammount of commisions.
* Service of CommisionService which can save commision, get user's commisions,
* get newest user's commision, get ammount of commisions.
*/
@Service
@ -25,12 +26,6 @@ public class CommisionService {
public CommisionService() {
}
/*
* save
*
* @param commision which assignment should be save in service
* @return commision
*/
public Commision save(Commision commision) {
Optional<Commision> lastCommision = this.getNewestCommision(commision.getCommisionOwner());
if (lastCommision.isPresent()) {
@ -45,25 +40,31 @@ public class CommisionService {
}
/*
* getUsersCommisions
* Return given users id
/**
* gets user commisions
*
* @param user owner of commisions
* @return list of user commisions
*/
public List<Commision> getUsersCommisions(User user) {
return this.repo.getUsers(user.getId());
}
/*
* getNewestCommision
* Return the newest commision of the user
/**
* get newest commision ov given user
*
* @param user owener of commision we attemp to get
* @return optional if commition was found
*/
public Optional<Commision> getNewestCommision(User user) {
return this.repo.getNewestCommision(user.getId()).stream().findFirst();
}
/*
* getCommisionsAmmount
* Return ammount of commisions
/**
* get ammpounts of commisions
*
* @return long - ammounts of commisions (all even from history, not only
* cutrrent one)
*/
public long getCommisionsAmmount() {
return this.repo.count();

View File

@ -2,11 +2,15 @@ package com.plannaplan.services;
import com.plannaplan.models.ConfigData;
import com.plannaplan.models.FileData;
import com.plannaplan.models.TourData;
import com.plannaplan.repositories.AppConfigRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.InputStream;
import java.sql.Date;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@ -24,20 +28,40 @@ public class ConfiguratorService {
private FileToDatabaseMigrator migrator;
@Autowired
private AppConfigRepository configRepo;
@Autowired
private EventService eventService;
@Autowired
private AssignmentService assignmentService;
public ConfiguratorService() {
}
/**
* methoid to config system
* methoid to config system. it shedules PerformAcceptAlgorythmTask as a side
* effect
*
* @param data ConfigData containng system configs
*/
public void config(ConfigData data) {
FileReader reader = new FileReader(data.getFilestream());
FileData coursesData = reader.read();
this.configRepo.save(new AppConfig(data.getFirstTour(), data.getSecondTour()));
final AppConfig config = new AppConfig(data.getFirstTour(), data.getSecondTour());
this.configRepo.save(config);
migrator.migrate(coursesData);
this.shceduleTaskAfterToursDateChange(config);
}
/**
* Save tours to DataBase and shedule PerformAcceptAlgorythmTask as a side
* effect
*
* @param firstTour First tour period.
* @param secondTour Second tour period.
*/
public void saveTours(TourData firstTour, TourData secondTour) {
final AppConfig config = new AppConfig(firstTour, secondTour);
this.configRepo.save(config);
this.shceduleTaskAfterToursDateChange(config);
}
/**
@ -62,4 +86,52 @@ public class ConfiguratorService {
return repsonse.get(0);
}
/**
*
* @param inputStream This input stream contains new courses to import.
*/
public void importCoursesStream(InputStream inputStream) {
FileReader reader = new FileReader(inputStream);
FileData coursesData = reader.read();
migrator.migrate(coursesData);
}
private void shceduleTaskAfterToursDateChange(AppConfig config) {
this.eventService.scheduleTask(EventService.FIRST_TOUR_SCHEDULE,
new AlgorythmAcceptTask(config.getFirstTourEnd()), config.getFirstTourEndCron());
this.eventService.scheduleTask(EventService.SECOND_TOUR_SCHEDULE,
new AlgorythmAcceptTask(config.getSecondTourEnd()), config.getSecondTourEndCron());
}
/**
* It's local class to perform accept Task. It's needed to be here due to have
* acces to AssignmentService.
*/
private class AlgorythmAcceptTask implements Runnable {
private LocalDate localDate;
/**
* create instance of AlgorythmAcceptTask
*
* @param date date of algorythm perform. Needed to check if ti's being called
* in correct year
*/
public AlgorythmAcceptTask(Date date) {
this.localDate = date.toLocalDate();
}
@Override
public void run() {
System.out.println("Performing event");
if (localDate.getYear() == LocalDate.now().getYear()) {
assignmentService.callAcceptAlgorythm();
}
}
}
}

View File

@ -1,5 +1,14 @@
package com.plannaplan.services;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.plannaplan.entities.Exchange;
import com.plannaplan.entities.User;
import com.plannaplan.models.EmailAcceptedData;
import com.plannaplan.models.EmailExchangesData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
@ -15,6 +24,9 @@ public class EmailService {
@Autowired
private JavaMailSender emailSender;
@Autowired
private UserService userService;
@Value("${plannaplan.email}")
private String appEmail;
@ -35,4 +47,55 @@ public class EmailService {
mailMessage.setText(message);
emailSender.send(mailMessage);
}
/**
* sends email with infromation about accepted groups
*
* @param user user to send a mail
* @param data EmailAcceptedData instance containing informations about accepted
* and removed groups
*/
public void sendAcceptationResult(User user, EmailAcceptedData data) {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom(appEmail);
mailMessage.setTo(user.getEmail());
mailMessage.setSubject("[PlanNaPlan] Akceptacja przedmiotów");
mailMessage.setText(data.getEmailMessage());
emailSender.send(mailMessage);
}
/**
* method to send email for students whose groups were swaped
*
* @param data EmailExchangesData instance that contains pair of datas user and
* list of performed exhanges
*/
public void sendExchangesResults(EmailExchangesData data) {
for (Map.Entry<Long, List<Exchange>> entry : data.getDataEntry()) {
final User user = this.userService.getById(entry.getKey()).get();
String response = "Znaleźliśmy dla Ciebie osobę, która zamieniła się z Tobą przedmiotami!!!\n Zamienione przedmioty: \n";
final Iterator<Exchange> interator = entry.getValue().iterator();
while (interator.hasNext()) {
final Exchange exchange = interator.next();
final String courseFrom = exchange.getDesiredAssignment().getCourseId() != null
? exchange.getDesiredAssignment().getCourseId().getName()
: "Nieznane zajęcie";
final String courseTo = exchange.getOwnedAssignment().getGroup().getCourseId() != null
? exchange.getOwnedAssignment().getGroup().getCourseId().getName()
: "Nieznane zajęcie";
response += (" - " + courseFrom + " za " + courseTo.toLowerCase());
}
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom(appEmail);
mailMessage.setTo(user.getEmail());
mailMessage.setSubject("[PlanNaPlan] Zamiana przedmiotów");
mailMessage.setText(response);
emailSender.send(mailMessage);
}
}
}

View File

@ -1,17 +1,61 @@
package com.plannaplan.services;
// import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;
@Service
public class EventService {
// @Autowired
// private EmailService emailService;
@Autowired
private ExchangeService exchangeService;
@Scheduled(cron = "0 2 17 * * *")
public static final int FIRST_TOUR_SCHEDULE = 0;
public static final int SECOND_TOUR_SCHEDULE = 1;
private ThreadPoolTaskScheduler scheduler;
private Map<Integer, ScheduledFuture<?>> jobsMap = new HashMap<>();
@Scheduled(cron = "0 24 17 * * *")
public void collectGroupLosses() {
System.out.println("Checking for groups");
}
@Scheduled(cron = "0 0 0 * * *")
public void performExchangeService() {
System.out.println("Performing Exchange");
this.exchangeService.performExchange();
}
/**
* Schedule provided task to perform
*
* @param taskId static filed of this class that represents to what event
* we want to assign task
* @param task runnable class that perform task in implemented run method
* @param cronTrigger CronTrigger instance with date to perform
*/
public void scheduleTask(int taskId, Runnable task, CronTrigger cronTrigger) {
ScheduledFuture<?> scheduledTask = jobsMap.get(taskId);
if (scheduledTask != null) {
scheduledTask.cancel(true);
jobsMap.put(taskId, null);
}
scheduledTask = this.scheduler.schedule(task, cronTrigger);
jobsMap.put(taskId, scheduledTask);
}
@PostConstruct
public void initialize() {
this.scheduler = new ThreadPoolTaskScheduler();
this.scheduler.initialize();
}
}

View File

@ -0,0 +1,143 @@
package com.plannaplan.services;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.Exchange;
import com.plannaplan.entities.Groups;
import com.plannaplan.entities.User;
import com.plannaplan.models.EmailExchangesData;
import com.plannaplan.models.MatchData;
import com.plannaplan.repositories.ExchangeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ExchangeService {
@Autowired
private ExchangeRepository repo;
@Autowired
private AssignmentService assignmentService;
@Autowired
private UserService userService;
@Autowired
private EmailService emailService;
/**
* @param exchange Instance to save in database
* @return Exchange Instance contains database id
*/
public Exchange save(Exchange exchange) {
return this.repo.save(exchange);
}
/**
* @param id Id of exchange in database
* @return Optional Exchange if found
*/
public Optional<Exchange> getById(Long id) {
return this.repo.findById(id);
}
public List<Exchange> getAllExchanges() {
return this.repo.findAll();
}
/**
* @param id Id of user
* @return List of exchanges that belong to user
*/
public List<Exchange> getByUserId(Long id) {
return this.repo.getByUserId(id);
}
/**
* @param entity Exchange entity which we would like to delete
*/
public void deleteExchange(Exchange entity) {
this.repo.delete(entity);
}
/**
* @param assignment Assignment to trade for
* @param group Desired group
* @return Optional with Exchange if exist
*/
public Optional<Exchange> checkForExchange(Assignment assignment, Groups group) {
return this.repo.checkForExchange(assignment, group);
}
public void performExchange() {
final List<MatchData> matchData = this.getMatches();
final List<Long> performedAssignmentExchanges = new ArrayList<>();
final EmailExchangesData emailData = new EmailExchangesData();
final List<Exchange> exchangesToDelete = new ArrayList<>();
matchData.forEach(m -> {
final Assignment assignmentOne = m.getAssignmentOne();
final Assignment assignmentTwo = m.getAssignmentTwo();
final Exchange exchange1 = m.getExchangeOne();
final Exchange exchange2 = m.getExchangeTwo();
if (!(performedAssignmentExchanges.contains(assignmentOne.getId())
|| performedAssignmentExchanges.contains(assignmentTwo.getId()))) {
final Commision commisionOne = assignmentOne.getCommision();
final User userOne = commisionOne.getCommisionOwner();
final Commision commisionTwo = assignmentTwo.getCommision();
final User userTwo = commisionTwo.getCommisionOwner();
assignmentOne.setCommision(commisionTwo);
assignmentTwo.setCommision(commisionOne);
userOne.removeGroup(assignmentOne.getGroup().getId());
userTwo.removeGroup(assignmentTwo.getGroup().getId());
userOne.claimGroup(assignmentTwo.getGroup());
userTwo.claimGroup(assignmentOne.getGroup());
this.assignmentService.save(assignmentOne);
this.assignmentService.save(assignmentTwo);
this.userService.save(userOne);
this.userService.save(userTwo);
performedAssignmentExchanges.add(assignmentOne.getId());
performedAssignmentExchanges.add(assignmentTwo.getId());
emailData.addExchange(exchange1.getOwnedAssignment().getCommision().getCommisionOwner(), exchange1);
emailData.addExchange(exchange2.getOwnedAssignment().getCommision().getCommisionOwner(), exchange2);
}
exchangesToDelete.add(exchange1);
exchangesToDelete.add(exchange2);
});
this.emailService.sendExchangesResults(emailData);
this.repo.deleteAll(exchangesToDelete);
}
public List<MatchData> getMatches() {
final List<MatchData> matches = this.repo.getMatches().stream().map(m -> {
final Exchange exchangeOne = (Exchange) m[0];
final Exchange exchangeTwo = (Exchange) m[1];
return new MatchData(exchangeOne, exchangeTwo);
}).collect(Collectors.toList());
final Set<MatchData> uniqData = new HashSet<>(matches);
final List<MatchData> matchDataListSorted = uniqData.stream().sorted((m1, m2) -> -1 * m1.compare(m2))
.collect(Collectors.toList());
return matchDataListSorted;
}
}

View File

@ -7,6 +7,7 @@ import java.util.Optional;
import java.util.stream.Collectors;
import java.util.function.Function;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Groups;
import com.plannaplan.repositories.GroupRepository;
@ -30,6 +31,10 @@ public class GroupService {
return this.repo.find(time, room, capacity);
}
public Optional<Groups> find(Integer zajCykId, Integer nrGr) {
return this.repo.find(zajCykId, nrGr);
}
public List<Groups> getGroupsByCourse(Long id) {
return this.repo.getByCourse(id);
}
@ -60,11 +65,21 @@ public class GroupService {
}
/**
*
* @param assignments list of assignments you want to get taken places ammount
* @return HashMap of Long to Integer where Long is group id and Integer is how
* many places in gorup is already taken
*/
public HashMap<Long, Integer> getTakenPlacesOfAssignments(List<Assignment> assignments) {
return getTakenPlaces(assignments.stream().map(Assignment::getGroup).collect(Collectors.toList()));
}
/**
*
* @param groups list of groups you want to get taken places ammount
* @return HashMap<Long, Integer> where Long is group id and Integer is how many
* places in gorup is already taken
* @return HashMap of Long to Integer where Long is group id and Integer is how
* many places in gorup is already taken
*/
public HashMap<Long, Integer> getTakenPlaces(List<Groups> groups) {
HashMap<Long, Integer> response = new HashMap<>();

View File

@ -3,9 +3,11 @@ package com.plannaplan.services;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import com.plannaplan.entities.User;
import com.plannaplan.exceptions.UserNotFoundException;
import com.plannaplan.models.UserApiResponse;
import com.plannaplan.repositories.UserRepository;
import com.plannaplan.types.UserRoles;
@ -20,17 +22,40 @@ public class UserService {
@Autowired
private UserRepository repo;
@Autowired
private UsosApiService service;
public UserService() {
super();
}
/**
* checks if user exist and return him or creates new one with student role
* otherwise
*
* @param email user email in usos
* @param usosId user id in usos
* @return user entity instace containing changes saved in database
*/
public User checkForUser(String email, String usosId) {
return this.checkForUser(email, usosId, UserRoles.STUDENT);
}
/**
* checks if user exist and creates new one if doesn't
*
* @param email user email in usos
* @param usosId user id in usos
* @param roleIfNotExist role to be set in case user is not in database yet
* @return user entity instace containing changes saved in database
*/
public User checkForUser(String email, String usosId, UserRoles roleIfNotExist) {
if (usosId == null) {
Optional<User> user = this.repo.getByAuthority(email.replace("\n", "").trim());
Optional<User> user = this.repo.getByEmail(email.replace("\n", "").trim());
if (user.isPresent()) {
return user.get();
} else {
final User newUser = new User(null, null, email.replace("\n", "").trim(), UserRoles.STUDENT);
final User newUser = new User(null, null, email.replace("\n", "").trim(), roleIfNotExist);
return this.repo.save(newUser);
}
} else {
@ -38,14 +63,26 @@ public class UserService {
if (user.isPresent()) {
return user.get();
} else {
final User newUser = new User(null, null, email.replace("\n", "").trim(), usosId, UserRoles.STUDENT);
final User newUser = new User(null, null, email.replace("\n", "").trim(), usosId, roleIfNotExist);
return this.repo.save(newUser);
}
}
}
/**
* generates token for user and if user don't have name in database it will
* attemp to obtain these from usos api and saves changes in database
*
* @param authority user we want to login
* @return user with changed values after save in db
* @throws UserNotFoundException throwed if user doesn't exist
*/
public User login(User authority) throws UserNotFoundException {
final String token = UUID.randomUUID().toString();
if ((authority.getName() == null || authority.getSurname() == null) && authority.getUsosId() != null) {
final UserApiResponse resp = this.service.getUserData(authority.getUsosId());
authority.updateWithUsosData(resp);
}
try {
authority.setToken(token);
this.repo.save(authority);
@ -55,20 +92,48 @@ public class UserService {
return authority;
}
/**
* sacves user to databse and return instatnce with id
*
* @param user to be saved
* @return instatnce with bd id
*/
public User save(User user) {
return this.repo.save(user);
}
/**
*
* @param email of user to be find
* @return user with given mail
* @throws UserNotFoundException throwed if user doesn't exist
*/
public User getUserByEmail(String email) throws UserNotFoundException {
return this.repo.getByAuthority(email.replace("\n", "").trim())
return this.repo.getByEmail(email.replace("\n", "").trim())
.orElseThrow(() -> new UserNotFoundException("Cannot find user with given authority"));
}
/**
* return user by given authority
*
* @param authority user usosId or email
* @return optional with user if found
*/
public Optional<User> getByAuthority(String authority) {
return this.repo.getByAuthority(authority);
}
public Optional<User> getByToken(String token) {
return this.repo.getByToken(token);
}
/**
* search for user with given query
*
* @param query string that will be matched to users name and surname
* @return list opf results
*/
public List<User> searchForStudents(String query) {
return this.repo.searchForUsers(query, UserRoles.STUDENT);
}
@ -85,4 +150,23 @@ public class UserService {
return this.repo.getByRefreshToken(refreshToken);
}
}
public boolean adminExists() {
return this.repo.getAllByRole(UserRoles.ADMIN).size() > 0;
}
public void saveAll(List<User> users) {
this.repo.saveAll(users);
}
/**
* get students sorted by their ranking
*
* @return list of students
*/
public List<User> getStudentsSortedByRanking() {
return this.repo.getAllByRole(UserRoles.STUDENT).stream().sorted((u1, u2) -> {
return -1 * u1.getRanking().compareTo(u2.getRanking());
}).collect(Collectors.toList());
}
}

View File

@ -0,0 +1,75 @@
package com.plannaplan.services;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import com.github.scribejava.core.builder.ServiceBuilder;
import com.github.scribejava.core.model.OAuth1AccessToken;
import com.github.scribejava.core.model.OAuthRequest;
import com.github.scribejava.core.model.Response;
import com.github.scribejava.core.model.Verb;
import com.github.scribejava.core.oauth.OAuth10aService;
import com.plannaplan.api.UsosOauth1Service;
import com.plannaplan.models.UserApiResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* service to call usos api endpoints
*/
@Service
public class UsosApiService {
private static final String NAME_FIELD = "first_name";
private static final String SURNAME_FIELD = "last_name";
@Value("${plannaplan.apiurl}")
private String apiUrl;
@Value("${plannaplan.apikey}")
private String apikey;
@Value("${plannaplan.apisecret}")
private String apisecret;
public UsosApiService() {
}
/**
* /services/users/user
*
* @param usosId user id in usos
* @return UserApiResponse modle contatining desired values
*/
public UserApiResponse getUserData(String usosId) {
final UserApiResponse apiResponse = new UserApiResponse();
try {
final OAuth10aService service = new ServiceBuilder(apikey).apiSecret(apisecret)
.build(UsosOauth1Service.instance());
final OAuthRequest request = new OAuthRequest(Verb.GET, apiUrl + "/services/users/user?user_id=" + usosId);
service.signRequest(new OAuth1AccessToken("", ""), request);
try (Response response = service.execute(request)) {
final String json = response.getBody();
if (!json.equals("null")){
final ObjectMapper mapper = new ObjectMapper();
Map<String, String> map = mapper.readValue(json, new TypeReference<Map<String, String>>() {
});
apiResponse.setName(map.get(NAME_FIELD));
apiResponse.setSurname(map.get(SURNAME_FIELD));
}
}
} catch (IOException | InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return apiResponse;
}
}

View File

@ -1,9 +1,23 @@
package com.plannaplan.types;
/**
* GroupType contains types: LECTURE, CLASS
* GroupType contains types: LECTURE, CLASS, LAB, SEMINAR, CONSERVATORY, PRATICE
*/
public enum GroupType {
LECTURE, CLASS
LECTURE("Wykład"), CLASS("Ćwiczenia"), LAB("Laboratorium"), SEMINAR("Seminarium"),CONSERVATORY("Konwersatorium"), PRATICE("Praktyka");
public final String type;
private GroupType(String type) {
this.type = type;
}
public final static GroupType getType(String type) {
for (GroupType d : values()) {
if (d.type.equals(type)) {
return d;
}
}
return null;
}
}

View File

@ -10,12 +10,11 @@ import org.junit.Test;
public class FileReaderTest {
@Test
public void shoulReturnNull() {
public void shouldNotReturnNull() {
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.getKeys().size() == 12);
assertTrue(d != null);
}
}

View File

@ -138,4 +138,52 @@ public class AppConfigTest {
assertTrue(config.getCurrentState() == AppState.SECOND_TOUR);
}
@Test
public void shouldReturnFirstStartDatesCorns() {
final Date firtstTourStart = Date.valueOf("2020-11-12");
final Date firtstTourEnd = Date.valueOf("2020-11-13");
final Date secondTourStart = Date.valueOf("2020-11-14");
final Date secondTourEnd = Date.valueOf("2020-11-15");
final AppConfig config = new AppConfig(new TourData(firtstTourStart, firtstTourEnd),
new TourData(secondTourStart, secondTourEnd));
assertTrue(config.getFirstTourStartCron().getExpression().equals("0 0 0 12 11 ?"));
}
@Test
public void shouldReturnSecondStartDatesCorns() {
final Date firtstTourStart = Date.valueOf("2020-11-12");
final Date firtstTourEnd = Date.valueOf("2020-11-13");
final Date secondTourStart = Date.valueOf("2020-11-14");
final Date secondTourEnd = Date.valueOf("2020-11-15");
final AppConfig config = new AppConfig(new TourData(firtstTourStart, firtstTourEnd),
new TourData(secondTourStart, secondTourEnd));
assertTrue(config.getSecondTourStartCron().getExpression().equals("0 0 0 14 11 ?"));
}
@Test
public void shouldReturnFirstEndDatesCorns() {
final Date firtstTourStart = Date.valueOf("2020-11-12");
final Date firtstTourEnd = Date.valueOf("2020-11-13");
final Date secondTourStart = Date.valueOf("2020-11-14");
final Date secondTourEnd = Date.valueOf("2020-11-15");
final AppConfig config = new AppConfig(new TourData(firtstTourStart, firtstTourEnd),
new TourData(secondTourStart, secondTourEnd));
assertTrue(config.getFirstTourEndCron().getExpression().equals("0 0 0 13 11 ?"));
}
@Test
public void shouldReturnSecondEndDatesCorns() {
final Date firtstTourStart = Date.valueOf("2020-11-12");
final Date firtstTourEnd = Date.valueOf("2020-11-13");
final Date secondTourStart = Date.valueOf("2020-11-14");
final Date secondTourEnd = Date.valueOf("2020-11-15");
final AppConfig config = new AppConfig(new TourData(firtstTourStart, firtstTourEnd),
new TourData(secondTourStart, secondTourEnd));
assertTrue(config.getSecondTourEndCron().getExpression().equals("0 0 0 15 11 ?"));
}
}

View File

@ -0,0 +1,69 @@
package com.plannaplan.repositories;
import static org.junit.Assert.assertTrue;
import java.util.List;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.Exchange;
import com.plannaplan.entities.Groups;
import com.plannaplan.entities.User;
import com.plannaplan.services.AssignmentService;
import com.plannaplan.services.GroupService;
import com.plannaplan.services.UserService;
import com.plannaplan.types.UserRoles;
import com.plannaplan.types.WeekDay;
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.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class ExchangeRepositoryTest{
@Autowired
private ExchangeRepository exchangeRepository;
@Autowired
private AssignmentService assignmentService;
@Autowired
private GroupService groupService;
@Autowired
private UserService userService;
@Autowired
private CommisionRepository commisionRepository;
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldReturnMatches() {
final User user1 = this.userService.save(
new User(null, null, "shouldReturnMatches@ExchangeRepository.test", "123454", UserRoles.STUDENT, 451));
final Groups group1 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.MONDAY, null));
final Commision commision1 = this.commisionRepository.save(new Commision(user1));
final User user2 = this.userService.save(
new User(null, null, "shouldReturnMatches@ExchangeRepository.test", "123454", UserRoles.STUDENT, 451));
final Groups group2 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.MONDAY, null));
final Commision commision2 = this.commisionRepository.save(new Commision(user2));
final Assignment assignmentUser1 = this.assignmentService.save(new Assignment(group1, commision1));
final Assignment assignmentUser2 = this.assignmentService.save(new Assignment(group2, commision2));
this.assignmentService.callAcceptAlgorythm();
this.exchangeRepository.save(new Exchange(assignmentUser1, group2));
this.exchangeRepository.save(new Exchange(assignmentUser2, group1));
final List<Object[]> exchangeRepoMatches = this.exchangeRepository.getMatches();
assertTrue(exchangeRepoMatches.size() == 2);
}
}

View File

@ -0,0 +1,52 @@
package com.plannaplan.repositories;
import static org.junit.Assert.assertTrue;
import java.util.Optional;
import com.plannaplan.entities.User;
import com.plannaplan.services.UserService;
import com.plannaplan.types.UserRoles;
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 UserRepositoryTest {
@Autowired
private UserService userService;
@Autowired
private UserRepository userRepository;
@Test
public void shouldReturnByAuthorityWithGivenEmail(){
final String email = "shouldReturnByAuthorityWithGivenEmail@UserRepository.Test";
final String usosId = "45678";
final User user = this.userService.save(new User("shouldReturnByAuthority", "WithGivenEmail", email, usosId, UserRoles.TEST_USER));
final Optional<User> response = this.userRepository.getByAuthority(email);
assertTrue(response.get().getEmail().equals(email));
assertTrue(response.get().getUsosId().equals(usosId));
assertTrue(response.get().getId().equals(user.getId()));
}
@Test
public void shouldReturnByAuthorityWithUsosId(){
final String email = "shouldReturnByAuthorityWithUsosId@UserRepository.Test";
final String usosId = "45678";
final User user = this.userService.save(new User("shouldReturnByAuthority", "WithGivenEmail", email, usosId, UserRoles.TEST_USER));
final Optional<User> response = this.userRepository.getByAuthority(usosId);
assertTrue(response.get().getEmail().equals(email));
assertTrue(response.get().getUsosId().equals(usosId));
assertTrue(response.get().getId().equals(user.getId()));
}
}

View File

@ -2,18 +2,27 @@ package com.plannaplan.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.stream.IntStream;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.Groups;
import com.plannaplan.entities.User;
import com.plannaplan.types.UserRoles;
import com.plannaplan.types.WeekDay;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -29,6 +38,8 @@ public class AssignmentServiceTest {
private CommisionService comServie;
@Autowired
private UserService userService;
@Autowired
private GroupService groupService;
@Test
public void shouldSaveAssignment() {
@ -56,6 +67,70 @@ public class AssignmentServiceTest {
assertTrue("Returned list size should be 1", response.size() == 1);
}
@Test
@Ignore
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldPerformAcceptAlgorythm() {
final Random generator = new Random();
final List<Groups> groups = new ArrayList<>();
IntStream.range(0, 418).forEach(i -> {
groups.add(this.groupService.save(new Groups(generator.nextInt(80) + 20, null, null,
generator.nextInt(9) * 30 + 9 * 30, WeekDay.getDay(generator.nextInt(5)), null)));
});
IntStream.range(0, 1700).forEach(i -> {
final User user = this.userService.save(new User(null, null,
"shouldPerformAcceptAlgorythm-" + UUID.randomUUID().toString() + "@AssignmentService.test", null,
UserRoles.STUDENT, generator.nextInt(400) + 100));
final Commision com = this.comServie.save(new Commision(user));
IntStream.range(0, 5).forEach(j -> {
this.service.save(new Assignment(groups.get(generator.nextInt(groups.size())), com));
});
});
this.service.callAcceptAlgorythm();
}
/**
* This test will also sand a mail to users as a side effect. U can check them
* in mailcater
*/
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldNotAcceptForOnePerson() {
final Random generator = new Random();
final Groups group = this.groupService.save(new Groups(5, null, null, 840, WeekDay.MONDAY, null));
IntStream.range(0, 6).forEach(i -> {
final User user = this.userService.save(new User(null, null,
"shouldNotAcceptForOnePerson-" + UUID.randomUUID().toString() + "@AssignmentService.test", null,
UserRoles.STUDENT, generator.nextInt(400) + 100));
final Commision com = this.comServie.save(new Commision(user));
this.service.save(new Assignment(group, com));
});
this.service.callAcceptAlgorythm();
final List<User> users = this.userService.getStudentsSortedByRanking();
final User loser = users.get(users.size() - 1);
assertTrue(loser.getStudentRegisteredGrups().size() == 0);
users.forEach(u -> {
final Commision com = this.comServie.getNewestCommision(u).get();
final List<Assignment> assignments = com.getAssignments();
if (u.getId() == loser.getId()) {
assertTrue(!assignments.get(0).isAccepted());
} else {
assertTrue(assignments.get(0).isAccepted());
}
});
}
private void addAssignmentToCommision(Commision com) {
Assignment a = new Assignment(null, com);
this.service.save(a);

View File

@ -2,16 +2,23 @@ package com.plannaplan.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertTrue;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Date;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ScheduledFuture;
import com.plannaplan.TestApplication;
import com.plannaplan.entities.AppConfig;
import com.plannaplan.entities.Groups;
import com.plannaplan.models.ConfigData;
import com.plannaplan.models.TourData;
import com.plannaplan.repositories.AppConfigRepository;
@ -24,6 +31,9 @@ import org.junit.runner.RunWith;
@ContextConfiguration
public class ConfiguratorServiceTest {
private final static String BEFORE_UPDATE_FILE = "ZajeciaBeforeUpdate.xlsx";
private final static String AFTER_UPDATE_FILE = "ZajeciaAfterUpdate.xlsx";
@Autowired
private ConfiguratorService configuratorService;
@ -39,6 +49,9 @@ public class ConfiguratorServiceTest {
@Autowired
private AppConfigRepository appConfigRepo;
@Autowired
private EventService eventService;
@Test
public void shouldImportDataToDataBase() {
final InputStream inputStream = getClass().getClassLoader()
@ -57,6 +70,31 @@ public class ConfiguratorServiceTest {
assertTrue(courses_ammount > 0 && groups_ammount > 0 && lecturers_ammount > 0);
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldUpdatePreviousImport() {
final InputStream inputStream = getClass().getClassLoader()
.getResourceAsStream(ConfiguratorServiceTest.BEFORE_UPDATE_FILE);
this.configuratorService.importCoursesStream(inputStream);
int groups_ammount = this.groupService.getGroupsAmmount();
assertTrue(groups_ammount == 2);
final InputStream inputStream2 = getClass().getClassLoader()
.getResourceAsStream(ConfiguratorServiceTest.AFTER_UPDATE_FILE);
this.configuratorService.importCoursesStream(inputStream2);
int groups_ammount2 = this.groupService.getGroupsAmmount();
Optional<Groups> newGroup = this.groupService.find(456458, 3);
Optional<Groups> updateGroup = this.groupService.find(456457, 2);
assertTrue(groups_ammount2 == 3);
assertTrue(newGroup.isPresent());
assertTrue(updateGroup.get().getLecturer().getSurname().equals("Murawski"));
assertTrue(updateGroup.get().getLecturer().getName().equals("Roman"));
assertTrue(updateGroup.get().getLecturer().getTitle().equals("prof. dr hab."));
}
@Test
public void shouldRetrunNewestConfig() throws InterruptedException {
final Date dateToCheck = new Date(System.currentTimeMillis());
@ -69,4 +107,28 @@ public class ConfiguratorServiceTest {
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shlouldScheduleTaskWhenSetTourDate()
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
final InputStream inputStream = getClass().getClassLoader()
.getResourceAsStream(TestApplication.TEST_CONFIG_FILE);
final ConfigData data = new ConfigData(
new TourData(new Date(System.currentTimeMillis()), new Date(System.currentTimeMillis() + 86400000)),
new TourData(new Date(System.currentTimeMillis() + 86400000),
new Date(System.currentTimeMillis() + 2 * 86400000)),
inputStream);
this.configuratorService.config(data);
final Field reader = EventService.class.getDeclaredField("jobsMap");
reader.setAccessible(true);
@SuppressWarnings("unchecked")
final Map<Integer, ScheduledFuture<?>> map = (Map<Integer, ScheduledFuture<?>>) reader.get(this.eventService);
assertTrue(map.size() == 2);
assertTrue(map.get(EventService.FIRST_TOUR_SCHEDULE).isDone() == false);
assertTrue(map.get(EventService.SECOND_TOUR_SCHEDULE).isDone() == false);
}
}

View File

@ -0,0 +1,208 @@
package com.plannaplan.services;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.Exchange;
import com.plannaplan.entities.Groups;
import com.plannaplan.entities.User;
import com.plannaplan.models.MatchData;
import com.plannaplan.repositories.CommisionRepository;
import com.plannaplan.types.UserRoles;
import com.plannaplan.types.WeekDay;
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.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class ExchangeServiceTest {
@Autowired
private AssignmentService assignmentService;
@Autowired
private GroupService groupService;
@Autowired
private UserService userService;
@Autowired
private CommisionRepository commisionRepository;
@Autowired
private ExchangeService exchangeService;
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldReturnUniqMatches() {
final User user1 = this.userService.save(
new User(null, null, "shouldReturnMatches@ExchangeRepository.test", "123454", UserRoles.STUDENT, 451));
final Groups group1 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.MONDAY, null));
final Commision commision1 = this.commisionRepository.save(new Commision(user1));
final User user2 = this.userService.save(
new User(null, null, "shouldReturnMatches@ExchangeRepository.test", "123454", UserRoles.STUDENT, 451));
final Groups group2 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.MONDAY, null));
final Commision commision2 = this.commisionRepository.save(new Commision(user2));
final Assignment assignmentUser1 = this.assignmentService.save(new Assignment(group1, commision1));
final Assignment assignmentUser2 = this.assignmentService.save(new Assignment(group2, commision2));
this.assignmentService.callAcceptAlgorythm();
this.exchangeService.save(new Exchange(assignmentUser1, group2));
this.exchangeService.save(new Exchange(assignmentUser2, group1));
final List<MatchData> uniqList = this.exchangeService.getMatches();
assertTrue(uniqList.size() == 1);
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldPerformExchange() throws Exception{
User user1 = this.userService.save(
new User(null, null, "1shouldReturnMatches@ExchangeRepository.test", "123454", UserRoles.STUDENT, 451));
final Long user1Id = user1.getId();
final Groups group1 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.MONDAY, null));
final Commision commision1 = this.commisionRepository.save(new Commision(user1));
User user2 = this.userService.save(
new User(null, null, "2shouldReturnMatches@ExchangeRepository.test", "123455", UserRoles.STUDENT, 452));
final Long user2Id = user2.getId();
final Groups group2 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.THURSDAY, null));
final Commision commision2 = this.commisionRepository.save(new Commision(user2));
User user3 = this.userService.save(
new User(null, null, "3shouldReturnMatches@ExchangeRepository.test", "123456", UserRoles.STUDENT, 453));
final Long user3Id = user3.getId();
final Groups group3 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.WEDNESDAY, null));
final Commision commision3 = this.commisionRepository.save(new Commision(user3));
User user4 = this.userService.save(
new User(null, null, "2shouldReturnMatches@ExchangeRepository.test", "123457", UserRoles.STUDENT, 455));
final Long user4Id = user4.getId();
final Groups group4 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.FRIDAY, null));
final Commision commision4 = this.commisionRepository.save(new Commision(user4));
final Assignment assignmentUser1 = this.assignmentService.save(new Assignment(group1, commision1));
final Assignment assignmentUser2 = this.assignmentService.save(new Assignment(group2, commision2));
final Assignment assignmentUser3 = this.assignmentService.save(new Assignment(group2, commision3));
final Assignment assignmentUser4 = this.assignmentService.save(new Assignment(group4, commision4));
this.assignmentService.callAcceptAlgorythm();
this.exchangeService.save(new Exchange(assignmentUser1, group2));
Thread.sleep(1000);
this.exchangeService.save(new Exchange(assignmentUser2, group1));
Thread.sleep(1000);
this.exchangeService.save(new Exchange(assignmentUser3, group1));
Thread.sleep(1000);
this.exchangeService.save(new Exchange(assignmentUser4, group3));
this.exchangeService.performExchange();
user1 = this.userService.getById(user1Id).get();
Thread.sleep(1000);
user2 = this.userService.getById(user2Id).get();
Thread.sleep(1000);
user3 = this.userService.getById(user3Id).get();
Thread.sleep(1000);
user4 = this.userService.getById(user4Id).get();
Thread.sleep(1000);
final List<Long> listGroupsOfUser1 = user1.getStudentRegisteredGrups().stream().map(Groups::getId)
.collect(Collectors.toList());
final List<Long> listGroupsOfUser2 = user2.getStudentRegisteredGrups().stream().map(Groups::getId)
.collect(Collectors.toList());
final List<Long> listGroupsOfUser3 = user3.getStudentRegisteredGrups().stream().map(Groups::getId)
.collect(Collectors.toList());
final List<Long> listGroupsOfUser4 = user4.getStudentRegisteredGrups().stream().map(Groups::getId)
.collect(Collectors.toList());
assertTrue(listGroupsOfUser1.contains(group2.getId()));
assertTrue(listGroupsOfUser2.contains(group1.getId()));
assertTrue(listGroupsOfUser3.contains(group2.getId()));
assertTrue(listGroupsOfUser4.contains(group4.getId()));
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldRemoveOutDatedExchnages() throws Exception {
User user1 = this.userService.save(
new User(null, null, "1shouldReturnMatches@ExchangeRepository.test", "123454", UserRoles.STUDENT, 451));
final Long user1Id = user1.getId();
final Groups group1 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.MONDAY, null));
final Commision commision1 = this.commisionRepository.save(new Commision(user1));
User user2 = this.userService.save(
new User(null, null, "2shouldReturnMatches@ExchangeRepository.test", "123455", UserRoles.STUDENT, 452));
final Long user2Id = user2.getId();
final Groups group2 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.THURSDAY, null));
final Commision commision2 = this.commisionRepository.save(new Commision(user2));
final Groups group3 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.THURSDAY, null));
final Groups group4 = this.groupService.save(new Groups(123, "A2-3", null, 430, WeekDay.THURSDAY, null));
final Assignment assignmentUser1 = this.assignmentService.save(new Assignment(group1, commision1));
final Assignment assignmentUser2 = this.assignmentService.save(new Assignment(group2, commision2));
this.assignmentService.callAcceptAlgorythm();
this.exchangeService.save(new Exchange(assignmentUser1, group2));
Thread.sleep(1000);
this.exchangeService.save(new Exchange(assignmentUser2, group1));
Thread.sleep(1000);
this.exchangeService.save(new Exchange(assignmentUser1, group3));
Thread.sleep(1000);
this.exchangeService.save(new Exchange(assignmentUser1, group4));
Thread.sleep(1000);
this.exchangeService.performExchange();
user1 = this.userService.getById(user1Id).get();
user2 = this.userService.getById(user2Id).get();
final List<Long> listGroupsOfUser1 = user1.getStudentRegisteredGrups().stream().map(Groups::getId)
.collect(Collectors.toList());
final List<Long> listGroupsOfUser2 = user2.getStudentRegisteredGrups().stream().map(Groups::getId)
.collect(Collectors.toList());
assertTrue(listGroupsOfUser1.contains(group2.getId()));
assertTrue(listGroupsOfUser2.contains(group1.getId()));
assertTrue(this.exchangeService.getAllExchanges().size() == 2);
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldSortExchanges() throws Exception{
final List<MatchData> listMatrix = new ArrayList<>();
final Exchange exchange1 = new Exchange(null, null);
Thread.sleep(1000);
final Exchange exchange2 = new Exchange(null, null);
Thread.sleep(1000);
final Exchange exchange3 = new Exchange(null, null);
Thread.sleep(1000);
final Exchange exchange4 = new Exchange(null, null);
Thread.sleep(1000);
listMatrix.add(new MatchData(exchange2, exchange4));
listMatrix.add(new MatchData(exchange1, exchange3));
final List<MatchData> matchDataListSorted = listMatrix.stream().sorted((m1, m2) -> -1 * m1.compare(m2)).collect(Collectors.toList());
assertTrue(listMatrix.get(0).equals(matchDataListSorted.get(1)));
assertTrue(listMatrix.get(1).equals(matchDataListSorted.get(0)));
assertTrue(matchDataListSorted.size() == 2);
}
}

View File

@ -2,6 +2,8 @@ package com.plannaplan.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@ -100,4 +102,20 @@ public class UserServiceTest {
assertTrue(user.getName() != "Tom");
}
@Test
public void shouldReturnAdminExists() {
final String email = "shouldReturnAdminExists@UserService.test";
this.userService.save(new User("AdminTom", "Smieszny", email, UserRoles.ADMIN));
assertTrue(userService.adminExists());
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldReturnNotAdminExists() {
final String email = "shouldReturnNotAdminExists@UserService.test";
this.userService.save(new User("StudentTom", "Smieszny", email, UserRoles.STUDENT));
assertTrue(userService.adminExists() == false);
}
}

View File

@ -0,0 +1,38 @@
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.io.IOException;
import java.util.concurrent.ExecutionException;
import com.plannaplan.models.UserApiResponse;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class UsosApiServiceTest {
@Autowired
private UsosApiService service;
@Test
@Ignore
public void shouldReturnPersonalData() throws IOException, InterruptedException, ExecutionException {
final UserApiResponse response = this.service.getUserData("499054");
assertTrue(response.getName().equals("Marcin"));
assertTrue(response.getSurname().equals("Woźniak"));
}
}

Binary file not shown.

Binary file not shown.

View File

@ -14,5 +14,8 @@ spring.mail.properties.mail.smtp.auth=false
spring.mail.properties.mail.smtp.starttls.enable=false
plannaplan.email = plannaplan.kontakt@gmail.com
plannaplan.apiurl = https://usosapidemo.amu.edu.pl
plannaplan.apikey=${PLANNAPLAN_CONSUMER_KEY}
plannaplan.apisecret=${PLANNAPLAN_CONSUMER_SECRET}
server.port=1285

View File

@ -1,3 +1,4 @@
#!/usr/bin/python
import webbrowser
from http.server import BaseHTTPRequestHandler, HTTPServer, SimpleHTTPRequestHandler
import urllib.parse as urlparse
@ -5,10 +6,14 @@ from urllib.parse import parse_qs
import sys
import requests as r
if len(sys.argv) > 1 :
API_ADDRESS = "http://" + sys.argv[1] + ":1285"
else:
API_ADDRESS = "http://localhost:1285"
no_browser = False
API_ADDRESS = "http://localhost:1285"
if len(sys.argv) > 1 :
if (sys.argv[1] == "no-browser" or sys.argv[2] == "no-browser"):
no_browser = True
else:
API_ADDRESS = "http://" + sys.argv[1] + ":1285"
PORT = 3000
@ -38,5 +43,6 @@ def wait_for_request(server_class=HTTPServer,
url = 'https://cas.amu.edu.pl/cas/login?service=http://localhost:' + \
str(PORT) + '&locale=pl'
webbrowser.open_new_tab(url)
if no_browser == False:
webbrowser.open_new_tab(url)
wait_for_request()

View File

@ -2,6 +2,7 @@ package com.plannaplan;
import java.io.InputStream;
import java.sql.Date;
import java.util.Random;
import com.plannaplan.models.ConfigData;
import com.plannaplan.models.TourData;
@ -30,7 +31,7 @@ public class App {
private ConfiguratorService contrl;
@Autowired
UserService userService;
private UserService userService;
@Value("${plannaplan.dev}")
private boolean isDev;
@ -52,10 +53,11 @@ public class App {
System.out.println(Logo.getInitInfo(isDev));
if (this.isDev) {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("Zajecia.xlsx");
ConfigData data = new ConfigData(
new TourData(new Date(System.currentTimeMillis()),
new Date(System.currentTimeMillis() + 86400000)),
final Random generator = new Random();
final InputStream inputStream = getClass().getClassLoader().getResourceAsStream("Zajecia.xlsx");
final ConfigData data = new ConfigData(
new TourData(new Date(System.currentTimeMillis() - 86400000),
new Date(System.currentTimeMillis())),
new TourData(new Date(System.currentTimeMillis() + 86400000),
new Date(System.currentTimeMillis() + 2 * 86400000)),
inputStream);
@ -65,6 +67,7 @@ public class App {
newuser.setEmail("tommy@st.amu.edu.pl");
newuser.setName("Tomek");
newuser.setSurname("Atomek");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
@ -72,6 +75,7 @@ public class App {
newuser.setEmail("robercik@st.amu.edu.pl");
newuser.setName("Robert");
newuser.setSurname("Głowacki");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
@ -79,6 +83,7 @@ public class App {
newuser.setEmail("mewa@st.amu.edu.pl");
newuser.setName("Poznanska");
newuser.setSurname("Mewa");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
@ -86,6 +91,7 @@ public class App {
newuser.setEmail("tkul2@st.amu.edu.pl");
newuser.setName("Tomasz");
newuser.setSurname("Kula");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
@ -93,6 +99,7 @@ public class App {
newuser.setEmail("annana@st.amu.edu.pl");
newuser.setName("Anna");
newuser.setSurname("Na");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
@ -100,6 +107,7 @@ public class App {
newuser.setEmail("mnart@st.amu.edu.pl");
newuser.setName("Marta");
newuser.setSurname("Narta");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
@ -107,6 +115,7 @@ public class App {
newuser.setEmail("zmineniane@st.amu.edu.pl");
newuser.setName("Tutaj");
newuser.setSurname("Koncza");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
@ -114,6 +123,7 @@ public class App {
newuser.setEmail("mi@st.amu.edu.pl");
newuser.setName("Mi");
newuser.setSurname("Sie");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
@ -121,11 +131,13 @@ public class App {
newuser.setEmail("pms@st.amu.edu.pl");
newuser.setName("Pomysly");
newuser.setSurname("Sad");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
newuser = new User();
newuser.setEmail("iamnull@st.amu.edu.pl");
newuser.setRanking(generator.nextInt(400) + 100);
newuser.setRole(UserRoles.STUDENT);
this.userService.save(newuser);
}

View File

@ -36,6 +36,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.ArrayList;
import java.util.HashMap;
import com.plannaplan.responses.mappers.AssignmentResponseMappers;
import com.plannaplan.responses.models.AssignmentResponse;
@ -127,7 +128,10 @@ public class CommisionController extends TokenBasedController {
if (com.isPresent()) {
List<Assignment> respone = this.assignmentService.getCommisionAssignments(com.get());
return new ResponseEntity<>(AssignmentResponseMappers.mapToResponse(respone), HttpStatus.OK);
final HashMap<Long, Integer> ammounts = this.groupServcicxe
.getTakenPlacesOfAssignments(respone);
return new ResponseEntity<>(AssignmentResponseMappers.mapToResponse(respone, ammounts),
HttpStatus.OK);
}
return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK);

View File

@ -7,11 +7,20 @@ import java.io.IOException;
import java.util.Date;
import com.plannaplan.App;
import com.plannaplan.entities.User;
import com.plannaplan.models.ConfigData;
import com.plannaplan.models.TourData;
import com.plannaplan.security.cas.CasUserIdentity;
import com.plannaplan.security.cas.CasValidationExcepiton;
import com.plannaplan.security.cas.CasValidator;
import com.plannaplan.security.cas.CustomUAMCasValidator;
import com.plannaplan.security.cas.DefaultUAMCasValidator;
import com.plannaplan.services.ConfiguratorService;
import com.plannaplan.services.UserService;
import com.plannaplan.types.UserRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@ -33,9 +42,19 @@ import io.swagger.annotations.ApiParam;
@Api(tags = { "ConfigController" }, value = "ConfigController", description = "All endpoints to configure an app")
public class ConfigController {
@Value("${plannaplan.frontendUrl}")
private String serviceUrl;
@Value("${plannaplan.dev}")
private boolean isDev;
@Autowired
private ConfiguratorService contrl;
@Autowired
private UserService userService;
@PostMapping(path = "/config", consumes = { "multipart/form-data" })
@PreAuthorize("hasRole('ROLE_ADMIN')")
@ApiOperation("Imports data to system. To call you need to provide ADMIN token")
@ -63,4 +82,63 @@ public class ConfigController {
}
}
@PostMapping(path = "/config/tours")
@PreAuthorize("hasRole('ROLE_ADMIN')")
@ApiOperation("Set tours dates. To call you need to provide ADMIN token")
public ResponseEntity<String> configToursApp(
@RequestParam("firstTourBegin") @DateTimeFormat(pattern = "dd.MM.yyyy") @ApiParam(value = "Date when first tour begin in format dd.MM.yyyy") Date firstTourBegin,
@RequestParam("firstTourEnd") @DateTimeFormat(pattern = "dd.MM.yyyy") @ApiParam(value = "Date when first tour ends in format dd.MM.yyyy") Date firstTourEnd,
@RequestParam("secondTourBegin") @DateTimeFormat(pattern = "dd.MM.yyyy") @ApiParam(value = "Date when second tour begin in format dd.MM.yyyy") Date secondTourBegin,
@RequestParam("secondTourEnd") @DateTimeFormat(pattern = "dd.MM.yyyy") @ApiParam(value = "Date when second tour ends in format dd.MM.yyyy") Date secondTourEnd) {
if (!(firstTourBegin.before(firstTourEnd)
&& (firstTourEnd.before(secondTourBegin) || firstTourEnd.equals(secondTourBegin))
&& secondTourBegin.before(secondTourEnd))) {
return new ResponseEntity<>("Bad dates", HttpStatus.BAD_REQUEST);
}
final TourData firstTour = new TourData(firstTourBegin, firstTourEnd);
final TourData secondTour = new TourData(secondTourBegin, secondTourEnd);
this.contrl.saveTours(firstTour, secondTour);
return new ResponseEntity<>("Sucess", HttpStatus.OK);
}
@PostMapping(path = "/config/courses", consumes = { "multipart/form-data" })
@PreAuthorize("hasRole('ROLE_ADMIN')")
@ApiOperation("Imports data to system. To call you need to provide ADMIN token")
public ResponseEntity<String> configAppChangeCources(
@RequestParam("file") @ApiParam(value = "file .xlsx that contains courses and groups with apoinnted rules") MultipartFile file)
{
try {
this.contrl.importCoursesStream(file.getInputStream());
return new ResponseEntity<>("Sucess", HttpStatus.OK);
} catch (IOException e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@PostMapping(path = "/admin/init")
@ApiOperation("It can be run only in the initialization of the application. It will create admin user to manage the application.")
public ResponseEntity<String> initAdmin(@RequestParam("ticket") @ApiParam(value = "Ticket for validation.") String ticket){
if (this.userService.adminExists()){
return new ResponseEntity<>("Admin had been already created.", HttpStatus.FORBIDDEN);
}
final CasValidator validator = isDev ? new DefaultUAMCasValidator(serviceUrl, ticket)
: new CustomUAMCasValidator(serviceUrl, ticket);
try {
final CasUserIdentity casUserIdentity = validator.validate();
final String usosId = casUserIdentity.getUsosId();
final String authority = casUserIdentity.getEmail();
this.userService.save(new User(null, null, authority, usosId, UserRoles.ADMIN));
return new ResponseEntity<>("Success", HttpStatus.OK);
} catch (CasValidationExcepiton e) {
return new ResponseEntity<>("CAS validation failed", HttpStatus.UNAUTHORIZED);
} catch (Exception e) {
return new ResponseEntity<>("Internal Server Error", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

View File

@ -9,7 +9,7 @@ import com.plannaplan.entities.Course;
import com.plannaplan.responses.mappers.CoursesResponseMappers;
import com.plannaplan.responses.models.CoursesDefaultResponse;
import com.plannaplan.responses.models.CoursesWithGroupsResponse;
import com.plannaplan.responses.models.GroupDefaultResponse;
import com.plannaplan.responses.models.GroupWithCapacityResponse;
import com.plannaplan.services.CourseService;
import com.plannaplan.services.GroupService;
import com.plannaplan.types.GroupType;
@ -53,16 +53,16 @@ public class CoursesController {
final List<CoursesWithGroupsResponse> response = new ArrayList<>();
courses.forEach(course -> {
final List<GroupDefaultResponse> lectures = new ArrayList<>();
final List<GroupDefaultResponse> classes = new ArrayList<>();
final List<GroupWithCapacityResponse> lectures = new ArrayList<>();
final List<GroupWithCapacityResponse> classes = new ArrayList<>();
final HashMap<Long, Integer> ammounts = this.groupService.getTakenPlaces(course.getGroups());
course.getGroups().stream().forEach(group -> {
if (group.getType() == GroupType.CLASS) {
classes.add(new GroupDefaultResponse(group, ammounts.get(group.getId())));
classes.add(new GroupWithCapacityResponse(group, ammounts.get(group.getId())));
} else {
lectures.add(new GroupDefaultResponse(group, ammounts.get(group.getId())));
lectures.add(new GroupWithCapacityResponse(group, ammounts.get(group.getId())));
}
});

View File

@ -0,0 +1,151 @@
package com.plannaplan.controllers;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import com.plannaplan.App;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Exchange;
import com.plannaplan.entities.Groups;
import com.plannaplan.entities.User;
import com.plannaplan.exceptions.UserNotFoundException;
import com.plannaplan.responses.mappers.ExchangeResponseMappers;
import com.plannaplan.responses.models.ExchangeResponse;
import com.plannaplan.services.AssignmentService;
import com.plannaplan.services.ExchangeService;
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.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@RestController
@CrossOrigin
@RequestMapping("/api/" + App.API_VERSION + "/exchanges")
@Api(tags = { "Exchange" }, value = "Exchange", description = "Endpoint to exchange with accepted assignments.")
public class ExchangeController extends TokenBasedController{
@Autowired
private GroupService groupService;
@Autowired
private AssignmentService assignmentService;
@Autowired
private ExchangeService exchangeService;
@PostMapping("/exchange")
@ApiOperation(value = "Creates exchange offer.")
public ResponseEntity<String> createExchange(
@ApiParam( value = "Json object that contains assignment to trade and desired group")
@RequestBody
Map<String, Long> exchangeRequest)
throws UserNotFoundException {
final User asker = this.getCurrentUser()
.orElseThrow(() -> new UserNotFoundException("Invalid token"));
final Long assignmentId = exchangeRequest.get("assignment");
final Long groupId = exchangeRequest.get("group");
final List<Long> ownedGroups = asker.getStudentRegisteredGrups().stream().map(Groups::getId).collect(Collectors.toList());
if(ownedGroups.contains(groupId)){
return new ResponseEntity<>("User has already got this group.", HttpStatus.BAD_REQUEST);
}
if(assignmentId == null || groupId == null ){
return new ResponseEntity<>("Some of values are missing", HttpStatus.BAD_REQUEST);
}
final Optional<Assignment> assignment = this.assignmentService.getById(assignmentId);
final Optional<Groups> group = this.groupService.getGroupById(groupId);
if(assignment.isEmpty() || group.isEmpty()){
return new ResponseEntity<>("Some of provided value does not exist.", HttpStatus.BAD_REQUEST);
}
final Assignment assignmentInstance = assignment.get();
final Groups groupInstance = group.get();
if(!(assignmentInstance.getCommision().getCommisionOwner().getId().equals(asker.getId()) && assignmentInstance.isAccepted())){
return new ResponseEntity<>("Some of problems appeared. Check if you have access to given assignment and if it is accepted or the exchange has not been already added.", HttpStatus.BAD_REQUEST);
}
this.exchangeService.save(new Exchange(assignmentInstance, groupInstance));
return new ResponseEntity<>("Success", HttpStatus.OK);
}
@DeleteMapping("/exchange/{id}")
@ApiOperation(value = "Delete exchange offer")
public ResponseEntity<String> deleteExchange(@PathVariable(name = "id", required = false) Long offerId)
throws UserNotFoundException {
final User asker = this.getCurrentUser()
.orElseThrow(() -> new UserNotFoundException("Invalid token"));
final Optional<Exchange> exchange = this.exchangeService.getById(offerId);
if(exchange.isEmpty()){
return new ResponseEntity<>("Given offer does not exist.", HttpStatus.BAD_REQUEST);
}
final Exchange exchangeToDelete = exchange.get();
if(!(exchangeToDelete.getOwnedAssignment().getCommision().getCommisionOwner().getId().equals(asker.getId()))){
return new ResponseEntity<>("You have not permission for that action.", HttpStatus.BAD_REQUEST);
}
this.exchangeService.deleteExchange(exchangeToDelete);
return new ResponseEntity<>("Success", HttpStatus.OK);
}
@GetMapping("/exchange/all")
@ApiOperation(value = "Get exchange offers")
public ResponseEntity<List<ExchangeResponse>> getExchange()
throws UserNotFoundException {
final User asker = this.getCurrentUser()
.orElseThrow(() -> new UserNotFoundException("Invalid token"));
final List<Exchange> response = exchangeService.getByUserId(asker.getId());
final List<ExchangeResponse> listOfResponses = ExchangeResponseMappers.mapToDefaultResponse(response);
return new ResponseEntity<>(listOfResponses, HttpStatus.OK);
}
@GetMapping("/exchange/{id}")
@ApiOperation(value = "Get exchange offers")
public ResponseEntity<ExchangeResponse> getExchangeById(@PathVariable(name = "id", required = false) Long offerId)
throws UserNotFoundException {
final User asker = this.getCurrentUser()
.orElseThrow(() -> new UserNotFoundException("Invalid token"));
final Optional<Exchange> exchange = this.exchangeService.getById(offerId);
if(exchange.isEmpty()){
return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
}
final Exchange exchangeInstance = exchange.get();
if(!exchangeInstance.getOwnerId().equals(asker.getId())){
return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(new ExchangeResponse(exchangeInstance), HttpStatus.OK);
}
}

View File

@ -62,7 +62,6 @@ public class TokenController {
} catch (Exception e) {
return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/token/refresh")

View File

@ -1,12 +1,14 @@
package com.plannaplan.controllers;
import java.util.List;
import java.util.Optional;
import com.plannaplan.App;
import com.plannaplan.entities.User;
import com.plannaplan.responses.mappers.UserResponseMappers;
import com.plannaplan.responses.models.UserResponse;
import com.plannaplan.services.UserService;
import com.plannaplan.types.UserRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@ -21,6 +23,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@ -51,4 +54,26 @@ public class UsersController {
final List<UserResponse> response = UserResponseMappers.mapToDefaultResponse(searches);
return new ResponseEntity<>(response, HttpStatus.OK);
}
}
@PostMapping(path = "/admin")
@PreAuthorize("hasRole('ROLE_ADMIN')")
@ApiOperation(value = "Adds new admin user.")
public ResponseEntity<String> addAdmin(@RequestParam("authority") @ApiParam(value = "USOS ID or E-mail. If user does not exist it should be USOS ID") String authority) {
final Optional<User> userResponse = this.userService.getByAuthority(authority);
final User user = userResponse.orElseGet(() -> new User(null, null, null, authority, UserRoles.ADMIN));
user.setRole(UserRoles.ADMIN);
this.userService.save(user);
return new ResponseEntity<>("Success", HttpStatus.OK);
}
@PostMapping(path = "/deanery")
@PreAuthorize("hasRole('ROLE_ADMIN')")
@ApiOperation(value = "Adds new deanery user.")
public ResponseEntity<String> addDeanery(@RequestParam("authority") @ApiParam(value = "USOS ID or E-mail. If user does not exist it should be USOS ID") String authority) {
final Optional<User> userResponse = this.userService.getByAuthority(authority);
final User user = userResponse.orElseGet(() -> new User(null, null, null, authority, UserRoles.DEANERY));
user.setRole(UserRoles.DEANERY);
this.userService.save(user);
return new ResponseEntity<>("Success", HttpStatus.OK);
}
}

View File

@ -14,6 +14,11 @@ import com.plannaplan.types.GroupType;
public class AssignmentResponseMappers {
public static final List<AssignmentResponse> mapToResponse(List<Assignment> assignments) {
return mapToResponse(assignments, null);
}
public static final List<AssignmentResponse> mapToResponse(List<Assignment> assignments,
HashMap<Long, Integer> ammounts) {
List<AssignmentResponse> response = new ArrayList<>();
HashMap<Course, List<Groups>> courses = new HashMap<>();
assignments.stream().forEach((Assignment assignment) -> {
@ -29,14 +34,23 @@ public class AssignmentResponseMappers {
final Course course = entry.getKey();
final List<Groups> courseGroups = entry.getValue();
if (courseGroups.size() == 1) {
response.add(new AssignmentResponse(course, courseGroups.get(0)));
if (ammounts != null) {
response.add(new AssignmentResponse(course, courseGroups.get(0), ammounts));
} else {
response.add(new AssignmentResponse(course, courseGroups.get(0)));
}
}
if (courseGroups.size() == 2) {
final Groups lecture = courseGroups.stream().filter(o -> o.getType() == GroupType.LECTURE).findFirst()
.get();
final Groups classes = courseGroups.stream().filter(o -> o.getType() == GroupType.CLASS).findFirst()
.get();
response.add(new AssignmentResponse(course, lecture, classes));
if (ammounts != null) {
response.add(new AssignmentResponse(course, lecture, classes, ammounts));
} else {
response.add(new AssignmentResponse(course, lecture, classes));
}
}
}

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.Exchange;
import com.plannaplan.responses.models.ExchangeResponse;
public class ExchangeResponseMappers {
public static final List<ExchangeResponse> mapToDefaultResponse(List<Exchange> exchanges) {
return exchanges.stream().filter(Objects::nonNull).map(ExchangeResponse::new).collect(Collectors.toList());
}
}

View File

@ -1,5 +1,7 @@
package com.plannaplan.responses.models;
import java.util.HashMap;
import com.plannaplan.entities.Course;
import com.plannaplan.entities.Groups;
import com.plannaplan.types.GroupType;
@ -20,11 +22,23 @@ public class AssignmentResponse {
this.classes = classes == null ? null : new GroupWithCapacityResponse(classes);
}
public AssignmentResponse(Course course, Groups lecture, Groups classes, HashMap<Long, Integer> ammounts) {
this.id = course.getId();
this.name = course.getName();
this.lecture = lecture == null ? null : new GroupWithCapacityResponse(lecture, ammounts.get(lecture.getId()));
this.classes = classes == null ? null : new GroupWithCapacityResponse(classes, ammounts.get(classes.getId()));
}
public AssignmentResponse(Course course, Groups group) {
this(course, group.getType() == GroupType.LECTURE ? group : null,
group.getType() == GroupType.CLASS ? group : null);
}
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);
}
public GroupWithCapacityResponse getLecture() {
return this.lecture;
}

View File

@ -12,32 +12,32 @@ import io.swagger.annotations.ApiModel;
@ApiModel(description = "Response shows information about groups to given course.", value = "CoursesWithGroupsResponse")
public class CoursesWithGroupsResponse extends CoursesResponse {
private List<GroupDefaultResponse> lectures = new ArrayList<>();
private List<GroupDefaultResponse> classes = new ArrayList<>();
private List<GroupWithCapacityResponse> lectures = new ArrayList<>();
private List<GroupWithCapacityResponse> classes = new ArrayList<>();
public CoursesWithGroupsResponse(Course course) {
super(course);
course.getGroups().stream().forEach(group -> {
if (group.getType() == GroupType.CLASS) {
this.classes.add(new GroupDefaultResponse(group));
this.classes.add(new GroupWithCapacityResponse(group));
} else {
this.lectures.add(new GroupDefaultResponse(group));
this.lectures.add(new GroupWithCapacityResponse(group));
}
});
}
public CoursesWithGroupsResponse(Course course, List<GroupDefaultResponse> lectures,
List<GroupDefaultResponse> classes) {
public CoursesWithGroupsResponse(Course course, List<GroupWithCapacityResponse> lectures,
List<GroupWithCapacityResponse> classes) {
super(course);
this.lectures = lectures;
this.classes = classes;
}
public List<GroupDefaultResponse> getClasses() {
public List<GroupWithCapacityResponse> getClasses() {
return this.classes;
}
public List<GroupDefaultResponse> getLectures() {
public List<GroupWithCapacityResponse> getLectures() {
return this.lectures;
}

View File

@ -0,0 +1,36 @@
package com.plannaplan.responses.models;
import com.plannaplan.entities.Exchange;
public class ExchangeResponse {
private Long id;
private GroupDefaultResponse ownedAssignment;
private GroupDefaultResponse desiredGroup;
public ExchangeResponse(Exchange exchange){
this.id = exchange.getId();
this.ownedAssignment = new GroupDefaultResponse(exchange.getOwnedAssignment().getGroup());
this.desiredGroup = new GroupDefaultResponse(exchange.getDesiredAssignment());
}
public GroupDefaultResponse getDesiredGroup() {
return desiredGroup;
}
public void setDesiredGroup(GroupDefaultResponse desiredGroup) {
this.desiredGroup = desiredGroup;
}
public GroupDefaultResponse getOwnedAssignment() {
return ownedAssignment;
}
public void setOwnedAssignment(GroupDefaultResponse ownedAssignment) {
this.ownedAssignment = ownedAssignment;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}

View File

@ -18,4 +18,7 @@ logging.level.io.swagger.models.parameters.AbstractSerializableParameter=ERROR
server.port=1285
plannaplan.dev = true
plannaplan.frontendUrl = http://localhost:3000
plannaplan.email = plannaplan.kontakt@gmail.com
plannaplan.email = plannaplan.kontakt@gmail.com
plannaplan.apiurl = https://usosapidemo.amu.edu.pl
plannaplan.apikey=${PLANNAPLAN_CONSUMER_KEY}
plannaplan.apisecret=${PLANNAPLAN_CONSUMER_SECRET}

View File

@ -20,6 +20,10 @@ server.port=1285
plannaplan.email = ${PLANNAPLAN_EMAIL}
plannaplan.dev = false
plannaplan.frontendUrl= https://wmi.plannaplan.pl
plannaplan.apiurl = https://usosapidemo.amu.edu.pl
plannaplan.apikey=${PLANNAPLAN_CONSUMER_KEY}
plannaplan.apisecret=${PLANNAPLAN_CONSUMER_SECRET}
security.require-ssl=true
server.ssl.key-store=/keys/keystore.p12
server.ssl.key-store-password=

View File

@ -4,6 +4,8 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import java.io.InputStream;
import java.sql.Date;
@ -14,12 +16,15 @@ import com.plannaplan.services.ConfiguratorService;
import com.plannaplan.services.UserService;
import com.plannaplan.types.UserRoles;
import org.junit.Ignore;
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.mock.web.MockMultipartFile;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
@ -32,6 +37,9 @@ public class ConfigControllerTest extends AbstractControllerTest {
private static final String FILE_NAME = "Zajecia.xlsx";
private static final String CONFIG_ENDPOINT = "/api/v1/configurator/config";
private static final String COURSE_ENDPOINT = "/api/v1/configurator/config/courses";
private static final String TOURS_ENDPOINT = "/api/v1/configurator/config/tours";
private static final String ADMIN_INIT_ENDPOINT = "/api/v1/configurator/admin/init";
private static final String FIRST_TOUR_START = "firstTourBegin";
private static final String FIRST_TOUR_END = "firstTourEnd";
private static final String SECOND_TOUR_START = "secondTourBegin";
@ -219,4 +227,120 @@ public class ConfigControllerTest extends AbstractControllerTest {
.andExpect(status().is4xxClientError());
}
}
@Test
@Ignore
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldCreateAdminBecouseOfEmptyDatabase() throws Exception{
// have no idea how to make this test independent from user that run this
final String ticket = "";
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
mockMvc.perform(get(ADMIN_INIT_ENDPOINT).param("ticket", ticket)).andExpect(status().isOk());
}
@Test
public void shouldFailDueToExistingAdmin() throws Exception{
this.service.save(new User(null, null, "shouldFailDueToExistingAdmin@ConfigController.Test", UserRoles.ADMIN));
final String ticket = "hfewlhfjlewhipfqwehipqwef";
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
mockMvc.perform(get(ADMIN_INIT_ENDPOINT).param("ticket", ticket)).andExpect(status().is4xxClientError());
}
@Test
public void shouldReturnOKAuthorizedForCourses() throws Exception {
final String mail = "shouldReturnOKAuthorizedForCourses@ConfigController.test";
final User usr = this.service.save(new User(null, null, mail, UserRoles.ADMIN));
final InputStream inputStream = getClass().getClassLoader().getResourceAsStream(FILE_NAME);
final MockMultipartFile file = new MockMultipartFile("file", inputStream);
final String token = this.service.login(usr).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(multipart(COURSE_ENDPOINT).file(file).header("Authorization", "Bearer " + token))
.andExpect(status().isOk());
}
@Test
public void shouldDenyForCoursesDueToWrongRole() throws Exception {
final String mail = "shouldReturnOKAuthorizedForCourses@ConfigController.test";
final User usr = this.service.save(new User(null, null, mail, UserRoles.TEST_USER));
final InputStream inputStream = getClass().getClassLoader().getResourceAsStream(FILE_NAME);
final MockMultipartFile file = new MockMultipartFile("file", inputStream);
final String token = this.service.login(usr).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(multipart(COURSE_ENDPOINT).file(file).header("Authorization", "Bearer " + token))
.andExpect(status().is4xxClientError());
}
@Test
public void shouldReturnOKAuthorizedForTours() throws Exception {
final String mail = "shouldReturnOKAuthorizedForTours@ConfigController.test";
final User usr = this.service.save(new User(null, null, mail, UserRoles.ADMIN));
final String token = this.service.login(usr).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(TOURS_ENDPOINT).param(FIRST_TOUR_START, "12.12.2020")
.param(FIRST_TOUR_END, "14.12.2020").param(SECOND_TOUR_START, "16.12.2020")
.param(SECOND_TOUR_END, "20.12.2020").header("Authorization", "Bearer " + token))
.andExpect(status().isOk());
}
@Test
public void shouldFailWithWrongSecondTour() throws Exception {
final String mail = "shouldFailToursWithWrongSecondTour@ConfigController.test";
final User usr = this.service.save(new User(null, null, mail, UserRoles.ADMIN));
final String token = this.service.login(usr).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(TOURS_ENDPOINT).param(FIRST_TOUR_START, "12.12.2020")
.param(FIRST_TOUR_END, "14.12.2020").param(SECOND_TOUR_START, "16.12.2020")
.param(SECOND_TOUR_END, "13.12.2020").header("Authorization", "Bearer " + token))
.andExpect(status().is4xxClientError());
}
@Test
public void shouldFailWithWrongFirstTour() throws Exception {
final String mail = "shouldFailWithWrongFirstTour@ConfigController.test";
final User usr = this.service.save(new User(null, null, mail, UserRoles.ADMIN));
final String token = this.service.login(usr).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(TOURS_ENDPOINT).param(FIRST_TOUR_START, "12.12.2020")
.param(FIRST_TOUR_END, "10.12.2020").param(SECOND_TOUR_START, "16.12.2020")
.param(SECOND_TOUR_END, "20.12.2020").header("Authorization", "Bearer " + token))
.andExpect(status().is4xxClientError());
}
@Test
public void shouldFailWithWrongSecondTourBegin() throws Exception {
final String mail = "shouldFailWithWrongSecondTourBegin@ConfigController.test";
final User usr = this.service.save(new User(null, null, mail, UserRoles.ADMIN));
final String token = this.service.login(usr).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(TOURS_ENDPOINT).param(FIRST_TOUR_START, "12.12.2020")
.param(FIRST_TOUR_END, "14.12.2020").param(SECOND_TOUR_START, "13.12.2020")
.param(SECOND_TOUR_END, "20.12.2020").header("Authorization", "Bearer " + token))
.andExpect(status().is4xxClientError());
}
@Test
public void shouldDenyForTours() throws Exception {
final String mail = "shouldDenyForTours@ConfigController.test";
final User usr = this.service.save(new User(null, null, mail, UserRoles.TEST_USER));
final String token = this.service.login(usr).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(TOURS_ENDPOINT).param(FIRST_TOUR_START, "12.12.2020")
.param(FIRST_TOUR_END, "14.12.2020").param(SECOND_TOUR_START, "16.12.2020")
.param(SECOND_TOUR_END, "20.12.2020").header("Authorization", "Bearer " + token))
.andExpect(status().is4xxClientError());
}
}

View File

@ -0,0 +1,294 @@
package com.plannaplan.controllers;
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.http.MediaType;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.nio.charset.Charset;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision;
import com.plannaplan.entities.Exchange;
import com.plannaplan.entities.Groups;
import com.plannaplan.entities.User;
import com.plannaplan.services.AssignmentService;
import com.plannaplan.services.CommisionService;
import com.plannaplan.services.ExchangeService;
import com.plannaplan.services.GroupService;
import com.plannaplan.services.UserService;
import com.plannaplan.types.UserRoles;
import com.plannaplan.types.WeekDay;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class ExchangeControllerTest extends AbstractControllerTest {
private final static String EXCHANGE_ENDPOINT = "/api/v1/exchanges/exchange";
private static final MediaType APPLICATION_JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON.getType(),
MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
@Autowired
private UserService userService;
@Autowired
private GroupService groupService;
@Autowired
private AssignmentService assignmentService;
@Autowired
private CommisionService commisionService;
@Autowired
private ExchangeService exchangeService;
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldGetAllUsersExchanges() throws Exception {
final User user = this.userService.save(new User(null, null,
"shouldGetAllUsersExchanges@ExchangeController.test", "11111", UserRoles.STUDENT, 320));
final String token = this.userService.login(user).getToken();
final Groups group = this.groupService.save(new Groups(215, "A2-2", null, 520, WeekDay.TUESDAY, null));
final Groups groupDesired = this.groupService.save(new Groups(216, "A2-3", null, 530, WeekDay.MONDAY, null));
final Commision commision = this.commisionService.save(new Commision(user));
final Assignment assignment = this.assignmentService.save(new Assignment(group, commision));
this.exchangeService.save(new Exchange(assignment, groupDesired));
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(get(EXCHANGE_ENDPOINT + "/all").header("Authorization", "Bearer " +
token)).andExpect(status().isOk());
}
@Test
public void shouldFailGettingNotExistingExchange() throws Exception {
final User user = this.userService.save(new User(null, null,
"shouldFailGettingNotExistingExchange@ExchangeController.test", UserRoles.STUDENT));
final String token = this.userService.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(get(EXCHANGE_ENDPOINT + "/" + user.getId()).header("Authorization", "Bearer " + token)).andExpect(status().isBadRequest());
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldGetSingleExchange() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldGetSingleExchange@ExchangeController.test", "11111", UserRoles.STUDENT, 320));
final String token = this.userService.login(user).getToken();
final Groups group = this.groupService.save(new Groups(215, "A2-2", null, 520, WeekDay.TUESDAY, null));
final Groups groupDesired = this.groupService.save(new Groups(216, "A2-3", null, 530, WeekDay.MONDAY, null));
final Commision commision = this.commisionService.save(new Commision(user));
final Assignment assignment = this.assignmentService.save(new Assignment(group, commision));
final Exchange exchange = this.exchangeService.save(new Exchange(assignment, groupDesired));
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(get(EXCHANGE_ENDPOINT + "/" + exchange.getId()).header("Authorization", "Bearer " +
token)).andExpect(status().isOk());
}
@Test
public void shouldFailGettingExchangeDueToPermission() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldFailGettingExchangeDueToPermission@ExchangeController.test", "11111", UserRoles.STUDENT, 320));
final Groups group = this.groupService.save(new Groups(215, "A2-2", null, 520, WeekDay.TUESDAY, null));
final Groups groupDesired = this.groupService.save(new Groups(216, "A2-3", null, 530, WeekDay.MONDAY, null));
final Commision commision = this.commisionService.save(new Commision(user));
final Assignment assignment = this.assignmentService.save(new Assignment(group, commision));
final Exchange exchange = this.exchangeService.save(new Exchange(assignment, groupDesired));
final User user2 = this.userService.save(new User(null, null,
"shouldFailGettingExchangeDueToPermission2@ExchangeController.test", "11112", UserRoles.STUDENT, 321));
final String token2 = this.userService.login(user2).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(EXCHANGE_ENDPOINT + "/" + exchange.getId()).header("Authorization", "Bearer " +
token2)).andExpect(status().is4xxClientError());
}
@Test
public void shouldFailPostDueToAssignmentNotFound() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldFailPostDueToAssignmentNotFound@ExchangeController.test", UserRoles.STUDENT));
final String token = this.userService.login(user).getToken();
final Groups group = this.groupService.save(new Groups(212, "A2-1", null, 420, WeekDay.WEDNESDAY, null));
MockMvc mockMvc =
MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(EXCHANGE_ENDPOINT).header("Authorization", "Bearer " +
token).contentType(APPLICATION_JSON_UTF8).content("{\"assignment\": "+ user.getId() +", \"group\": "+ group.getId() +" }")).andExpect(status().isBadRequest());
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldInsertExchange() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldInsertExchange@ExchangeController.test", "11111", UserRoles.STUDENT, 320));
final String token = this.userService.login(user).getToken();
final Groups group = this.groupService.save(new Groups(215, "A2-2", null, 520, WeekDay.TUESDAY, null));
final Groups groupDesired = this.groupService.save(new Groups(216, "A2-3", null, 530, WeekDay.MONDAY, null));
final Commision commision = this.commisionService.save(new Commision(user));
final Assignment assignment = this.assignmentService.save(new Assignment(group, commision));
this.assignmentService.callAcceptAlgorythm();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(EXCHANGE_ENDPOINT).header("Authorization", "Bearer " +
token).contentType(APPLICATION_JSON_UTF8).content("{\"assignment\": "+ assignment.getId() +", \"group\": "+ groupDesired.getId() +" }")).andExpect(status().isOk());
}
@Test
public void shouldFailInsertExchangeDueToMissingGroup() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldFailInsertExchangeDueToMissingGroup@ExchangeController.test", UserRoles.STUDENT));
final String token = this.userService.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(EXCHANGE_ENDPOINT).header("Authorization", "Bearer " +
token).contentType(APPLICATION_JSON_UTF8).content("{\"assignment\": "+ user.getId() +" }")).andExpect(status().isBadRequest());
}
@Test
public void shouldFailInsertExchangeDueToMissingAssignment() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldFailInsertExchangeDueToMissingAssignment@ExchangeController.test", UserRoles.STUDENT));
final String token = this.userService.login(user).getToken();
final Groups group = this.groupService.save(new Groups(212, "A2-1", null, 420, WeekDay.WEDNESDAY, null));
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(EXCHANGE_ENDPOINT).header("Authorization", "Bearer " +
token).contentType(APPLICATION_JSON_UTF8).content("{\"group\": "+ group.getId() +" }")).andExpect(status().isBadRequest());
}
@Test
public void shouldFailInsertExchangeDueToMissingParam() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldFailInsertExchangeDueToMissingParam@ExchangeController.test", UserRoles.STUDENT));
final String token = this.userService.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(EXCHANGE_ENDPOINT).header("Authorization", "Bearer " +
token).contentType(APPLICATION_JSON_UTF8)).andExpect(status().isBadRequest());
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldDenyExchangeDueToAssigmentOverlapping() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldDenyExchangeDueToAssigmentOverlapping@ExchangeController.test", "11111", UserRoles.STUDENT, 320));
final String token = this.userService.login(user).getToken();
final Groups group = this.groupService.save(new Groups(215, "A2-2", null, 520, WeekDay.TUESDAY, null));
final Commision commision = this.commisionService.save(new Commision(user));
final Assignment assignment = this.assignmentService.save(new Assignment(group, commision));
this.exchangeService.save(new Exchange(assignment, group));
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(EXCHANGE_ENDPOINT).header("Authorization", "Bearer " +
token).contentType(APPLICATION_JSON_UTF8).content("{\"assignment\": "+ user.getId() +", \"group\": "+ group.getId() +" }")).andExpect(status().isBadRequest());
}
@Test
public void shouldDenyPostDueToAssignmentNotAccepted() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldDenyPostDueToAssignmentNotAccepted@ExchangeController.test", UserRoles.STUDENT));
final String token = this.userService.login(user).getToken();
final Groups group = this.groupService.save(new Groups(212, "A2-1", null, 420, WeekDay.WEDNESDAY, null));
final Groups group2 = this.groupService.save(new Groups(213, "A2-2", null, 420, WeekDay.MONDAY, null));
final Commision commision = this.commisionService.save(new Commision(user));
final Assignment assignment = this.assignmentService.save(new Assignment(group,commision));
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(EXCHANGE_ENDPOINT).header("Authorization", "Bearer " +
token).contentType(APPLICATION_JSON_UTF8).content("{\"assignment\": "+ assignment.getId() +", \"group\": "+ group2.getId() +" }")).andExpect(status().isBadRequest());
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldDeleteExchange() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldDeleteExchange@ExchangeController.test", "11111", UserRoles.STUDENT, 320));
final String token = this.userService.login(user).getToken();
final Groups group = this.groupService.save(new Groups(215, "A2-2", null, 520, WeekDay.TUESDAY, null));
final Groups groupDesired = this.groupService.save(new Groups(216, "A2-3", null, 530, WeekDay.MONDAY, null));
final Commision commision = this.commisionService.save(new Commision(user));
final Assignment assignment = this.assignmentService.save(new Assignment(group, commision));
final Exchange exchange = this.exchangeService.save(new Exchange(assignment, groupDesired));
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(delete(EXCHANGE_ENDPOINT + "/" + exchange.getId()).header("Authorization", "Bearer " +
token)).andExpect(status().isOk());
}
@Test
public void shouldFailDeleteDueToWrongPermissions() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldFailDeleteDueToWrongPermissions@ExchangeController.test", "11111", UserRoles.STUDENT, 320));
final Groups group = this.groupService.save(new Groups(215, "A2-2", null, 520, WeekDay.TUESDAY, null));
final Groups groupDesired = this.groupService.save(new Groups(216, "A2-3", null, 530, WeekDay.MONDAY, null));
final Commision commision = this.commisionService.save(new Commision(user));
final Assignment assignment = this.assignmentService.save(new Assignment(group, commision));
final Exchange exchange = this.exchangeService.save(new Exchange(assignment, groupDesired));
final User user2 = this.userService.save(new User(null, null,
"shouldFailDeleteDueToWrongPermissions@ExchangeController2.test", "11112", UserRoles.STUDENT, 322));
final String token2 = this.userService.login(user2).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(get(EXCHANGE_ENDPOINT + "/" + exchange.getId()).header("Authorization", "Bearer " +
token2)).andExpect(status().isBadRequest());
}
@Test
public void shouldFailDeleteDueToMissingParam() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldFailDeleteDueToMissingParam@ExchangeController.test", UserRoles.STUDENT));
final String token = this.userService.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(delete(EXCHANGE_ENDPOINT).header("Authorization", "Bearer " + token)).andExpect(status().is4xxClientError());
}
@Test
public void shouldFailDeleteDueToExchangeNotFound() throws Exception{
final User user = this.userService.save(new User(null, null,
"shouldFailDeleteDueToExchangeNotFound@ExchangeController.test", UserRoles.STUDENT));
final String token = this.userService.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(delete(EXCHANGE_ENDPOINT + "/" + user.getId()).header("Authorization", "Bearer " +
token)).andExpect(status().isBadRequest());
}
@Test
@DirtiesContext(methodMode = MethodMode.BEFORE_METHOD)
public void shouldFailPostDueToGroupAlreadyAccepted() throws Exception{
final User user = this.userService.save(new User(null, null, "shouldFailPostDueToGroupAlreadyAccepted@ExchangeController.test", "11111", UserRoles.STUDENT, 320));
final String token = this.userService.login(user).getToken();
final Groups group = this.groupService.save(new Groups(215, "A2-2", null, 520, WeekDay.TUESDAY, null));
final Groups group2 = this.groupService.save(new Groups(216, "A2-3", null, 530, WeekDay.MONDAY, null));
final Commision commision = this.commisionService.save(new Commision(user));
final Assignment assignment = this.assignmentService.save(new Assignment(group, commision));
this.assignmentService.save(new Assignment(group2, commision));
this.assignmentService.callAcceptAlgorythm();
this.exchangeService.save(new Exchange(assignment, group2));
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(EXCHANGE_ENDPOINT).header("Authorization", "Bearer " +
token).contentType(APPLICATION_JSON_UTF8).content("{\"assignment\": "+ assignment.getId() +", \"group\": "+ group2.getId() +" }")).andExpect(status().isBadRequest());
}
}

View File

@ -14,9 +14,13 @@ import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.junit.Assert.assertTrue;
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.util.Optional;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
@ -24,6 +28,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
public class UsersControllerTest extends AbstractControllerTest {
private static final String SEARCH_ENDPOINT = "/api/v1/users/student/search";
private static final String ALL_USERS_ENDPOINT = "/api/v1/users/students";
private static final String ADD_ADMIN_ENDPOINT = "/api/v1/users/admin";
private static final String ADD_DEANERY_ENDPOINT = "/api/v1/users/deanery";
@Autowired
private UserService service;
@ -87,4 +93,117 @@ public class UsersControllerTest extends AbstractControllerTest {
.andExpect(status().is4xxClientError());
}
@Test
public void shouldDenyNewAdminWithWrongRole() throws Exception {
final String email = "shouldDenyNewAdminWithWrongRole@shouldDenyAllStudentsTryByStudent.test";
final User user = this.service.save(new User(null, null, email, UserRoles.TEST_USER));
final String token = this.service.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(ADD_ADMIN_ENDPOINT).param("authority","45611").header("Authorization", "Bearer " + token))
.andExpect(status().is4xxClientError());
}
@Test
public void shouldDenyNewAdminWithNoParams() throws Exception {
final String email = "shouldDenyNewAdminWithNoParams@shouldDenyAllStudentsTryByStudent.test";
final User user = this.service.save(new User(null, null, email, UserRoles.ADMIN));
final String token = this.service.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(ADD_ADMIN_ENDPOINT).header("Authorization", "Bearer " + token))
.andExpect(status().is4xxClientError());
}
@Test
public void shouldCreateNewAdmin() throws Exception {
final String email = "shouldCreateNewAdmin@shouldDenyAllStudentsTryByStudent.test";
final String usosId = "121321";
final User user = this.service.save(new User(null, null, email, UserRoles.ADMIN));
final String token = this.service.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(ADD_ADMIN_ENDPOINT).param("authority",usosId).header("Authorization", "Bearer " + token))
.andExpect(status().isOk());
final Optional<User> reponse = this.service.getByAuthority(usosId);
assertTrue(reponse.get().getUsosId().equals(usosId));
}
@Test
public void shouldChangeExistingUserIntoAdmin() throws Exception {
final String email = "shouldChangeExistingUserIntoAdmin@shouldDenyAllStudentsTryByStudent.test";
final String email2 = "shouldChangeExistingUserIntoAdmin2@shouldDenyAllStudentsTryByStudent.test";
final String usosId = "121327";
final User user = this.service.save(new User(null, null, email, UserRoles.ADMIN));
this.service.save(new User(null, null, email2, usosId, UserRoles.TEST_USER));
final String token = this.service.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(ADD_ADMIN_ENDPOINT).param("authority",usosId).header("Authorization", "Bearer " + token))
.andExpect(status().isOk());
final Optional<User> reponse = this.service.getByAuthority(usosId);
assertTrue(reponse.get().getUsosId().equals(usosId));
assertTrue(reponse.get().getRole().equals(UserRoles.ADMIN));
}
@Test
public void shouldDenyNewDeaneryWithWrongRole() throws Exception {
final String email = "shouldDenyNewDeaneryWithWrongRole@shouldDenyAllStudentsTryByStudent.test";
final User user = this.service.save(new User(null, null, email, UserRoles.TEST_USER));
final String token = this.service.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(ADD_DEANERY_ENDPOINT).param("authority","45611").header("Authorization", "Bearer " + token))
.andExpect(status().is4xxClientError());
}
@Test
public void shouldDenyNewDeaneryWithNoParams() throws Exception {
final String email = "shouldDenyNewDeaneryWithNoParams@shouldDenyAllStudentsTryByStudent.test";
final User user = this.service.save(new User(null, null, email, UserRoles.ADMIN));
final String token = this.service.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(ADD_DEANERY_ENDPOINT).header("Authorization", "Bearer " + token))
.andExpect(status().is4xxClientError());
}
@Test
public void shouldCreateNewDeanery() throws Exception {
final String email = "shouldCreateNewDeanery@shouldDenyAllStudentsTryByStudent.test";
final String usosId = "121322";
final User user = this.service.save(new User(null, null, email, UserRoles.ADMIN));
final String token = this.service.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(ADD_DEANERY_ENDPOINT).param("authority",usosId).header("Authorization", "Bearer " + token))
.andExpect(status().isOk());
final Optional<User> reponse = this.service.getByAuthority(usosId);
assertTrue(reponse.get().getUsosId().equals(usosId));
}
@Test
public void shouldChangeExistingUserIntoDeanery() throws Exception {
final String email = "shouldChangeExistingUserIntoDeanery@shouldDenyAllStudentsTryByStudent.test";
final String email2 = "shouldChangeExistingUserIntoDeanery2@shouldDenyAllStudentsTryByStudent.test";
final String usosId = "121328";
final User user = this.service.save(new User(null, null, email, UserRoles.ADMIN));
this.service.save(new User(null, null, email2, usosId, UserRoles.TEST_USER));
final String token = this.service.login(user).getToken();
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
mockMvc.perform(post(ADD_DEANERY_ENDPOINT).param("authority",usosId).header("Authorization", "Bearer " + token))
.andExpect(status().isOk());
final Optional<User> reponse = this.service.getByAuthority(usosId);
assertTrue(reponse.get().getUsosId().equals(usosId));
assertTrue(reponse.get().getRole().equals(UserRoles.DEANERY));
}
}