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