Skip to content
This repository was archived by the owner on Apr 5, 2024. It is now read-only.

Commit 683a14d

Browse files
committed
FF-89 implemented logic, fixed cucumber tests.
1 parent f735a83 commit 683a14d

34 files changed

+566
-104
lines changed

src/main/java/de/filefighter/rest/configuration/PrepareDataBase.java

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,52 @@
11
package de.filefighter.rest.configuration;
22

33
import de.filefighter.rest.domain.filesystem.data.persistance.FileSystemRepository;
4+
import de.filefighter.rest.domain.token.business.AccessTokenBusinessService;
5+
import de.filefighter.rest.domain.token.data.persistance.AccessTokenEntity;
46
import de.filefighter.rest.domain.token.data.persistance.AccessTokenRepository;
57
import de.filefighter.rest.domain.user.data.persistance.UserEntity;
68
import de.filefighter.rest.domain.user.data.persistance.UserRepository;
79
import org.slf4j.Logger;
810
import org.slf4j.LoggerFactory;
11+
import org.springframework.beans.factory.annotation.Value;
912
import org.springframework.boot.CommandLineRunner;
1013
import org.springframework.context.annotation.Bean;
1114
import org.springframework.context.annotation.Configuration;
1215
import org.springframework.context.annotation.Profile;
1316

17+
import java.time.Instant;
18+
1419
@Configuration
1520
public class PrepareDataBase {
1621

22+
@Value("${server.port}")
23+
int serverPort;
24+
1725
private static final Logger LOG = LoggerFactory.getLogger(PrepareDataBase.class);
1826

27+
@Bean
28+
CommandLineRunner veryImportantFileFighterStartScript() {
29+
return args -> {
30+
System.out.println();
31+
System.out.println("-------------------------------< REST API >-------------------------------");
32+
System.out.println();
33+
System.out.println(" _____ _ _ _____ _ _ _ ");
34+
System.out.println(" | ___| (_) | | ___ | ___| (_) __ _ | |__ | |_ ___ _ __ ");
35+
System.out.println(" | |_ | | | | / _ \\ | |_ | | / _ | | '_ \\ | __| / _ \\ | '__|");
36+
System.out.println(" | _| | | | | | __/ | _| | | | (_| | | | | | | |_ | __/ | | ");
37+
System.out.println(" |_| |_| |_| \\___| |_| |_| \\__, | |_| |_| \\__| \\___| |_| ");
38+
System.out.println(" |___/ ");
39+
System.out.println(" Version 0.2 Last updated at 03.11.20 ");
40+
System.out.println(" Developed by Gimleux, Valentin, Open-Schnick. ");
41+
System.out.println(" Development Blog: https://filefighter.github.io ");
42+
System.out.println(" The code can be found at: https://www.github.com/filefighter ");
43+
System.out.println(" Running on http://localhost:"+serverPort);
44+
System.out.println();
45+
System.out.println("-------------------------------< REST API >-------------------------------");
46+
System.out.println();
47+
};
48+
}
49+
1950
@Bean
2051
CommandLineRunner cleanDataBase(UserRepository userRepository, FileSystemRepository fileSystemRepository, AccessTokenRepository accessTokenRepository) {
2152

@@ -56,21 +87,43 @@ CommandLineRunner initUserDataBaseDev(UserRepository repository) {
5687
LOG.info("Preloading default users: " +
5788
repository.save(UserEntity
5889
.builder()
59-
.userId(0L)
90+
.userId(0)
6091
.username("user")
6192
.password("1234")
62-
.refreshToken("refreshToken1234")
93+
.refreshToken("rft1234")
6394
.groupIds(new long[]{0})
6495
.build()) +
6596
repository.save(UserEntity
6697
.builder()
67-
.userId(0L)
98+
.userId(1)
6899
.username("user1")
69100
.password("12345")
70-
.refreshToken("refreshToken1234")
71-
.groupIds(new long[]{0})
101+
.refreshToken("rft")
102+
.groupIds(new long[]{-1})
72103
.build()));
73104
LOG.info("Inserting Users" + (repository.findAll().size() == 2 ? " was successful." : " failed."));
74105
};
75106
}
107+
108+
@Bean
109+
@Profile("dev")
110+
CommandLineRunner initAccessTokenDataBaseDev(AccessTokenRepository repository) {
111+
112+
return args -> {
113+
LOG.info("Preloading default tokens: " +
114+
repository.save(AccessTokenEntity
115+
.builder()
116+
.userId(0)
117+
.value("token")
118+
.validUntil(Instant.now().getEpochSecond() + AccessTokenBusinessService.ACCESS_TOKEN_DURATION_IN_SECONDS)
119+
.build()) +
120+
repository.save(AccessTokenEntity
121+
.builder()
122+
.userId(1)
123+
.value("token1234")
124+
.validUntil(Instant.now().getEpochSecond() + AccessTokenBusinessService.ACCESS_TOKEN_DURATION_IN_SECONDS)
125+
.build()));
126+
LOG.info("Inserting token" + (repository.findAll().size() == 2 ? " was successful." : " failed."));
127+
};
128+
}
76129
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package de.filefighter.rest.domain.common;
2+
3+
public interface DtoServiceInterface<D,E> {
4+
D createDto(E entity);
5+
E findEntity(D dto);
6+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package de.filefighter.rest.domain.common;
2+
3+
public class Utils {
4+
5+
public static boolean stringIsValid(String s){
6+
return !(null == s || s.isEmpty() || s.isBlank());
7+
}
8+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,80 @@
11
package de.filefighter.rest.domain.token.business;
22

3+
import de.filefighter.rest.domain.token.data.dto.AccessToken;
4+
import de.filefighter.rest.domain.token.data.persistance.AccessTokenEntity;
5+
import de.filefighter.rest.domain.token.data.persistance.AccessTokenRepository;
6+
import de.filefighter.rest.domain.token.exceptions.AccessTokenNotFoundException;
7+
import de.filefighter.rest.domain.user.data.dto.User;
8+
import de.filefighter.rest.domain.user.exceptions.UserNotAuthenticatedException;
39
import org.springframework.stereotype.Service;
410

11+
import java.time.Instant;
12+
import java.util.UUID;
13+
14+
import static de.filefighter.rest.configuration.RestConfiguration.AUTHORIZATION_BASIC_PREFIX;
15+
import static de.filefighter.rest.configuration.RestConfiguration.AUTHORIZATION_BEARER_PREFIX;
16+
import static de.filefighter.rest.domain.common.Utils.stringIsValid;
17+
518
@Service
619
public class AccessTokenBusinessService {
20+
21+
private final AccessTokenRepository accessTokenRepository;
22+
private final AccessTokenDtoService accessTokenDtoService;
23+
724
public static final long ACCESS_TOKEN_DURATION_IN_SECONDS = 3600L;
25+
public static final long ACCESS_TOKEN_SAFETY_MARGIN = 5L;
26+
27+
public AccessTokenBusinessService(AccessTokenRepository accessTokenRepository, AccessTokenDtoService accessTokenDtoService) {
28+
this.accessTokenRepository = accessTokenRepository;
29+
this.accessTokenDtoService = accessTokenDtoService;
30+
}
31+
32+
public AccessToken getValidAccessTokenForUser(User user) {
33+
AccessTokenEntity accessTokenEntity = accessTokenRepository.findByUserId(user.getId());
34+
long currentTimeSeconds = Instant.now().getEpochSecond();
35+
36+
if (null == accessTokenEntity) {
37+
accessTokenEntity = AccessTokenEntity
38+
.builder()
39+
.validUntil(currentTimeSeconds + ACCESS_TOKEN_DURATION_IN_SECONDS)
40+
.value(this.generateRandomTokenValue())
41+
.userId(user.getId())
42+
.build();
43+
accessTokenEntity = accessTokenRepository.save(accessTokenEntity);
44+
} else {
45+
if (currentTimeSeconds + ACCESS_TOKEN_SAFETY_MARGIN > accessTokenEntity.getValidUntil()) {
46+
accessTokenRepository.delete(accessTokenEntity);
47+
accessTokenEntity = AccessTokenEntity
48+
.builder()
49+
.validUntil(currentTimeSeconds + ACCESS_TOKEN_DURATION_IN_SECONDS)
50+
.value(this.generateRandomTokenValue())
51+
.userId(user.getId())
52+
.build();
53+
accessTokenEntity = accessTokenRepository.save(accessTokenEntity);
54+
}
55+
}
56+
57+
return accessTokenDtoService.createDto(accessTokenEntity);
58+
}
59+
60+
public AccessToken findAccessTokenByValueAndUserId(String accessTokenValue, long userId) {
61+
if (!stringIsValid(accessTokenValue))
62+
throw new IllegalArgumentException("AccessTokenValue was not valid.");
63+
64+
AccessTokenEntity accessTokenEntity = accessTokenRepository.findByUserIdAndValue(userId, accessTokenValue);
65+
if (null == accessTokenEntity)
66+
throw new UserNotAuthenticatedException(userId);
67+
68+
return accessTokenDtoService.createDto(accessTokenEntity);
69+
}
70+
71+
public String generateRandomTokenValue() {
72+
return UUID.randomUUID().toString();
73+
}
74+
75+
public String checkBearerHeader(String accessTokenValue) {
76+
if (!accessTokenValue.matches("^" + AUTHORIZATION_BEARER_PREFIX + "(.*)$"))
77+
throw new UserNotAuthenticatedException("Header does not contain '" + AUTHORIZATION_BEARER_PREFIX + "', or format is invalid.");
78+
return accessTokenValue.split(AUTHORIZATION_BEARER_PREFIX)[1];
79+
}
880
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package de.filefighter.rest.domain.token.business;
2+
3+
import de.filefighter.rest.domain.common.DtoServiceInterface;
4+
import de.filefighter.rest.domain.token.data.dto.AccessToken;
5+
import de.filefighter.rest.domain.token.data.persistance.AccessTokenEntity;
6+
import de.filefighter.rest.domain.token.data.persistance.AccessTokenRepository;
7+
import de.filefighter.rest.domain.token.exceptions.AccessTokenNotFoundException;
8+
import org.springframework.stereotype.Service;
9+
10+
@Service
11+
public class AccessTokenDtoService implements DtoServiceInterface<AccessToken, AccessTokenEntity> {
12+
13+
private final AccessTokenRepository accessTokenRepository;
14+
15+
public AccessTokenDtoService(AccessTokenRepository accessTokenRepository) {
16+
this.accessTokenRepository = accessTokenRepository;
17+
}
18+
19+
@Override
20+
public AccessToken createDto(AccessTokenEntity entity) {
21+
return AccessToken
22+
.builder()
23+
.token(entity.getValue())
24+
.userId(entity.getUserId())
25+
.validUntil(entity.getValidUntil())
26+
.build();
27+
}
28+
29+
@Override
30+
public AccessTokenEntity findEntity(AccessToken dto) {
31+
AccessTokenEntity accessTokenEntity = accessTokenRepository.findByValue(dto.getToken());
32+
if (null == accessTokenEntity)
33+
throw new AccessTokenNotFoundException("AccessTokenEntity does not exist for AccessToken: "+ dto);
34+
35+
return accessTokenEntity;
36+
}
37+
}

src/main/java/de/filefighter/rest/domain/token/data/persistance/AccessTokenEntity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ public class AccessTokenEntity {
1515
private String value;
1616
private long userId;
1717
private long validUntil;
18-
18+
1919
}

src/main/java/de/filefighter/rest/domain/token/data/persistance/AccessTokenRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
public interface AccessTokenRepository extends MongoRepository<AccessTokenEntity, String> {
88
AccessTokenEntity findByUserId(long userId);
99
AccessTokenEntity findByValue(String value);
10-
void deleteByUserId(long userId);
10+
AccessTokenEntity findByUserIdAndValue(long userId, String value);
1111
}

src/main/java/de/filefighter/rest/domain/token/exceptions/TokenNotFoundAdvise.java renamed to src/main/java/de/filefighter/rest/domain/token/exceptions/AccessTokenNotFoundAdvise.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
import org.springframework.web.bind.annotation.ResponseStatus;
1212

1313
@ControllerAdvice
14-
public class TokenNotFoundAdvise {
14+
public class AccessTokenNotFoundAdvise {
1515
@ResponseBody
16-
@ExceptionHandler(TokenNotFoundException.class)
16+
@ExceptionHandler(AccessTokenNotFoundException.class)
1717
@ResponseStatus(HttpStatus.BAD_REQUEST)
1818

19-
ResponseEntity<ServerResponse> tokenNotFoundAdvise(TokenNotFoundException ex) {
19+
ResponseEntity<ServerResponse> tokenNotFoundAdvise(AccessTokenNotFoundException ex) {
2020
LoggerFactory.getLogger(UserAlreadyExistsAdvise.class).warn(ex.getMessage());
21-
return new ResponseEntity<>(new ServerResponse("Denied", ex.getMessage()), HttpStatus.BAD_REQUEST);
21+
return new ResponseEntity<>(new ServerResponse("denied", ex.getMessage()), HttpStatus.BAD_REQUEST);
2222
}
2323
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package de.filefighter.rest.domain.token.exceptions;
2+
3+
public class AccessTokenNotFoundException extends RuntimeException {
4+
5+
public AccessTokenNotFoundException(String reason) {
6+
super(reason);
7+
}
8+
}

src/main/java/de/filefighter/rest/domain/token/exceptions/TokenNotFoundException.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)