diff --git a/pom.xml b/pom.xml
index bb91dec3..c416412e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,6 +31,12 @@
spring-boot-starter-data-mongodb
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
io.springfox
springfox-boot-starter
@@ -97,6 +103,14 @@
org.springframework.boot
spring-boot-maven-plugin
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+
+
+
org.jacoco
diff --git a/src/main/java/de/filefighter/rest/RestApplication.java b/src/main/java/de/filefighter/rest/RestApplication.java
index fd2b4bc4..6566a452 100644
--- a/src/main/java/de/filefighter/rest/RestApplication.java
+++ b/src/main/java/de/filefighter/rest/RestApplication.java
@@ -1,11 +1,14 @@
package de.filefighter.rest;
+import de.filefighter.rest.configuration.FileFighterProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
+@EnableConfigurationProperties(FileFighterProperties.class)
public class RestApplication {
public static void main(String[] args) {
SpringApplication.run(RestApplication.class, args);
diff --git a/src/main/java/de/filefighter/rest/configuration/FileFighterProperties.java b/src/main/java/de/filefighter/rest/configuration/FileFighterProperties.java
new file mode 100644
index 00000000..f542503a
--- /dev/null
+++ b/src/main/java/de/filefighter/rest/configuration/FileFighterProperties.java
@@ -0,0 +1,32 @@
+package de.filefighter.rest.configuration;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties(prefix = "filefighter")
+public class FileFighterProperties {
+
+ /**
+ * Version String.
+ */
+ private String version = "undefined";
+ private String date = "undefined";
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getDate() {
+ return date;
+ }
+
+ public void setDate(String date) {
+ this.date = date;
+ }
+}
diff --git a/src/main/java/de/filefighter/rest/configuration/PrepareDataBase.java b/src/main/java/de/filefighter/rest/configuration/PrepareDataBase.java
index 270f4cd0..aded0377 100644
--- a/src/main/java/de/filefighter/rest/configuration/PrepareDataBase.java
+++ b/src/main/java/de/filefighter/rest/configuration/PrepareDataBase.java
@@ -24,6 +24,12 @@ public class PrepareDataBase {
@Value("${server.port}")
int serverPort;
+ @Value("${filefighter.version}")
+ String version;
+
+ @Value("${filefighter.date}")
+ String date;
+
private static final Logger LOG = LoggerFactory.getLogger(PrepareDataBase.class);
@Bean
@@ -39,7 +45,7 @@ CommandLineRunner veryImportantFileFighterStartScript() {
System.out.println(" | _| | | | | | __/ | _| | | | (_| | | | | | | |_ | __/ | | ");
System.out.println(" |_| |_| |_| \\___| |_| |_| \\__, | |_| |_| \\__| \\___| |_| ");
System.out.println(" |___/ ");
- System.out.println(" Version 0.2 Last updated at 03.11.20 ");
+ System.out.println(" Version v"+version+" Last updated at "+date+" ");
System.out.println(" Developed by Gimleux, Valentin, Open-Schnick. ");
System.out.println(" Development Blog: https://filefighter.github.io ");
System.out.println(" The code can be found at: https://www.github.com/filefighter ");
diff --git a/src/main/java/de/filefighter/rest/configuration/SwaggerConfiguration.java b/src/main/java/de/filefighter/rest/configuration/SwaggerConfiguration.java
index 139599e3..511022df 100644
--- a/src/main/java/de/filefighter/rest/configuration/SwaggerConfiguration.java
+++ b/src/main/java/de/filefighter/rest/configuration/SwaggerConfiguration.java
@@ -1,5 +1,6 @@
package de.filefighter.rest.configuration;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.RequestHandlerSelectors;
@@ -15,6 +16,9 @@
@EnableSwagger2
public class SwaggerConfiguration {
+ @Value("${filefighter.version}")
+ String version;
+
@Bean
public Docket swaggerConfig() {
return new Docket(DocumentationType.SWAGGER_2)
@@ -28,7 +32,7 @@ private ApiInfo apiInfo() {
return new ApiInfo(
"FileFighter REST",
"REST-API of the FileFighter application.",
- "0.2",
+ version,
null,
new Contact("FileFighter Dev-Team", "https://github.com/filefighter/", "filefighter@t-online.de"),
"MIT License",
diff --git a/src/main/java/de/filefighter/rest/domain/health/business/SystemHealthBusinessService.java b/src/main/java/de/filefighter/rest/domain/health/business/SystemHealthBusinessService.java
index 314bc04e..3e88c62d 100644
--- a/src/main/java/de/filefighter/rest/domain/health/business/SystemHealthBusinessService.java
+++ b/src/main/java/de/filefighter/rest/domain/health/business/SystemHealthBusinessService.java
@@ -1,7 +1,10 @@
package de.filefighter.rest.domain.health.business;
import de.filefighter.rest.domain.health.data.SystemHealth;
+import de.filefighter.rest.domain.health.data.SystemHealth.DataIntegrity;
+import de.filefighter.rest.domain.token.business.AccessTokenBusinessService;
import de.filefighter.rest.domain.user.business.UserBusinessService;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.time.Instant;
@@ -10,10 +13,15 @@
public class SystemHealthBusinessService {
private final UserBusinessService userBusinessService;
+ private final AccessTokenBusinessService accessTokenBusinessService;
private final long serverStartedAt;
- public SystemHealthBusinessService(UserBusinessService userBusinessService) {
+ @Value("${filefighter.version}")
+ String version;
+
+ public SystemHealthBusinessService(UserBusinessService userBusinessService, AccessTokenBusinessService accessTokenBusinessService) {
this.userBusinessService = userBusinessService;
+ this.accessTokenBusinessService = accessTokenBusinessService;
this.serverStartedAt = this.getCurrentEpochSeconds();
}
@@ -22,9 +30,23 @@ public SystemHealth getCurrentSystemHealthInfo(){
return SystemHealth.builder()
.uptimeInSeconds(currentEpoch - serverStartedAt)
.userCount(userBusinessService.getUserCount())
+ .dataIntegrity(calculateDataIntegrity())
+ .version("v"+this.version)
.build();
}
+ private DataIntegrity calculateDataIntegrity() {
+ long userCount = userBusinessService.getUserCount();
+ long accessTokenCount = accessTokenBusinessService.getAccessTokenCount();
+
+ // Risk / Unstable Cases.
+ if(userCount < accessTokenCount){
+ return DataIntegrity.POSSIBLE_RISK;
+ }
+
+ return DataIntegrity.STABLE;
+ }
+
public long getCurrentEpochSeconds(){
return Instant.now().getEpochSecond();
}
diff --git a/src/main/java/de/filefighter/rest/domain/health/data/SystemHealth.java b/src/main/java/de/filefighter/rest/domain/health/data/SystemHealth.java
index e98ada97..879ca524 100644
--- a/src/main/java/de/filefighter/rest/domain/health/data/SystemHealth.java
+++ b/src/main/java/de/filefighter/rest/domain/health/data/SystemHealth.java
@@ -12,4 +12,10 @@
public class SystemHealth {
private final long uptimeInSeconds;
private final long userCount;
+ private final DataIntegrity dataIntegrity;
+ private final String version;
+
+ public enum DataIntegrity {
+ STABLE, POSSIBLE_RISK, UNSTABLE
+ }
}
diff --git a/src/main/java/de/filefighter/rest/domain/token/business/AccessTokenBusinessService.java b/src/main/java/de/filefighter/rest/domain/token/business/AccessTokenBusinessService.java
index 667cf5cc..d5fe5e74 100644
--- a/src/main/java/de/filefighter/rest/domain/token/business/AccessTokenBusinessService.java
+++ b/src/main/java/de/filefighter/rest/domain/token/business/AccessTokenBusinessService.java
@@ -80,13 +80,18 @@ public AccessToken findAccessTokenByValue(String accessTokenValue) {
return accessTokenDtoService.createDto(accessTokenEntity);
}
- public String generateRandomTokenValue() {
- return UUID.randomUUID().toString();
- }
public String checkBearerHeader(String accessTokenValue) {
if (!accessTokenValue.matches("^" + AUTHORIZATION_BEARER_PREFIX + "[^\\s](.*)$"))
throw new RequestDidntMeetFormalRequirementsException("Header does not contain '" + AUTHORIZATION_BEARER_PREFIX + "', or format is invalid.");
return accessTokenValue.split(AUTHORIZATION_BEARER_PREFIX)[1];
}
+
+ public String generateRandomTokenValue() {
+ return UUID.randomUUID().toString();
+ }
+
+ public long getAccessTokenCount() {
+ return accessTokenRepository.count();
+ }
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 4b2c0ad8..decf2f2a 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,9 +1,11 @@
server.servlet.context-path=/
server.port=8080
server.error.whitelabel.enabled=false
-
#-------------------MONGO---------------
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=filefighter
spring.data.mongodb.host=localhost
-spring.data.mongodb.port=27017
\ No newline at end of file
+spring.data.mongodb.port=27017
+#-------------------Custom------------------
+filefighter.version=0.0.3
+filefighter.date=11.11.2020
\ No newline at end of file
diff --git a/src/main/resources/filefighter.png b/src/main/resources/filefighter.png
deleted file mode 100644
index b492fc18..00000000
Binary files a/src/main/resources/filefighter.png and /dev/null differ
diff --git a/src/main/resources/rest.png b/src/main/resources/rest.png
deleted file mode 100644
index 05053188..00000000
Binary files a/src/main/resources/rest.png and /dev/null differ
diff --git a/src/test/java/de/filefighter/rest/domain/health/business/SystemHealthBusinessServiceUnitTest.java b/src/test/java/de/filefighter/rest/domain/health/business/SystemHealthBusinessServiceUnitTest.java
index 9e0b7d0d..0a4b6835 100644
--- a/src/test/java/de/filefighter/rest/domain/health/business/SystemHealthBusinessServiceUnitTest.java
+++ b/src/test/java/de/filefighter/rest/domain/health/business/SystemHealthBusinessServiceUnitTest.java
@@ -1,6 +1,8 @@
package de.filefighter.rest.domain.health.business;
import de.filefighter.rest.domain.health.data.SystemHealth;
+import de.filefighter.rest.domain.health.data.SystemHealth.DataIntegrity;
+import de.filefighter.rest.domain.token.business.AccessTokenBusinessService;
import de.filefighter.rest.domain.user.business.UserBusinessService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -15,11 +17,12 @@
class SystemHealthBusinessServiceUnitTest {
private final UserBusinessService userBusinessServiceMock = mock(UserBusinessService.class);
+ private final AccessTokenBusinessService accessTokenBusinessServiceMock = mock(AccessTokenBusinessService.class);
private SystemHealthBusinessService systemHealthBusinessService;
@BeforeEach
void setUp() {
- systemHealthBusinessService = new SystemHealthBusinessService(userBusinessServiceMock);
+ systemHealthBusinessService = new SystemHealthBusinessService(userBusinessServiceMock, accessTokenBusinessServiceMock);
}
@Test
@@ -40,4 +43,31 @@ void getCurrentEpochSecondsReturnsEpochSeconds() {
long epochSeconds = systemHealthBusinessService.getCurrentEpochSeconds();
assertEquals(expectedSeconds, epochSeconds);
}
+
+ @Test
+ void calculateDataIntegrityReturnsStable(){
+ when(userBusinessServiceMock.getUserCount()).thenReturn(2L);
+ when(accessTokenBusinessServiceMock.getAccessTokenCount()).thenReturn(2L);
+
+ DataIntegrity dataIntegrity = DataIntegrity.STABLE;
+ DataIntegrity actual = systemHealthBusinessService.getCurrentSystemHealthInfo().getDataIntegrity();
+ assertEquals(dataIntegrity, actual);
+
+ when(userBusinessServiceMock.getUserCount()).thenReturn(3L);
+ when(accessTokenBusinessServiceMock.getAccessTokenCount()).thenReturn(2L);
+
+ dataIntegrity = DataIntegrity.STABLE;
+ actual = systemHealthBusinessService.getCurrentSystemHealthInfo().getDataIntegrity();
+ assertEquals(dataIntegrity, actual);
+ }
+
+ @Test
+ void calculateDataIntegrityReturnsRisk(){
+ when(userBusinessServiceMock.getUserCount()).thenReturn(2L);
+ when(accessTokenBusinessServiceMock.getAccessTokenCount()).thenReturn(3L);
+
+ DataIntegrity dataIntegrity = DataIntegrity.POSSIBLE_RISK;
+ DataIntegrity actual = systemHealthBusinessService.getCurrentSystemHealthInfo().getDataIntegrity();
+ assertEquals(dataIntegrity, actual);
+ }
}
\ No newline at end of file