Skip to content

Commit

Permalink
PP-893: keep a history of latest seven day averages
Browse files Browse the repository at this point in the history
  • Loading branch information
ubhaller committed Mar 11, 2021
1 parent 6b341c6 commit f4b1b4f
Show file tree
Hide file tree
Showing 19 changed files with 415 additions and 13 deletions.
17 changes: 17 additions & 0 deletions docker-compose/stack.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
version: '3.1'

services:

dpppt-additionalinfo_db:
image: postgres:11
restart: always
environment:
POSTGRES_PASSWORD: dpppt
POSTGRES_DB: dpppt-additionalinfo
POSTGRES_USER: dpppt
ports:
- "5432:5432"
volumes:
- dpppt-additionalinfo_db_data:/var/lib/postgresql/data
volumes:
dpppt-additionalinfo_db_data:
25 changes: 25 additions & 0 deletions dpppt-additionalinfo-backend/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,31 @@
<version>1.65</version>
</dependency>

<!-- database -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.14</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cloud-connectors</artifactId>
<version>2.0.7.RELEASE</version>
</dependency>
</dependencies>

<dependencyManagement>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,27 @@
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemReader;
import org.dpppt.additionalinfo.backend.ws.controller.DppptAdditionalInfoController;
import org.dpppt.additionalinfo.backend.ws.data.HistoryDataService;
import org.dpppt.additionalinfo.backend.ws.data.JdbcHistoryDataServiceImpl;
import org.dpppt.additionalinfo.backend.ws.statistics.MockStatisticClient;
import org.dpppt.additionalinfo.backend.ws.statistics.SplunkStatisticClient;
import org.dpppt.additionalinfo.backend.ws.statistics.StatisticClient;
import org.dpppt.backend.shared.interceptor.HeaderInjector;
import org.dpppt.backend.shared.security.filter.ResponseWrapperFilter;
import org.flywaydb.core.Flyway;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

Expand Down Expand Up @@ -95,7 +100,14 @@ public abstract class WSBaseConfig implements WebMvcConfigurer {

abstract String getSplunkpassword();

public abstract DataSource dataSource();

public abstract Flyway flyway();

public abstract String getDbType();

@Bean
@DependsOn({"flyway"})
@ConditionalOnProperty(
prefix = "ws.statistics.splunk",
name = {
Expand All @@ -105,9 +117,10 @@ public abstract class WSBaseConfig implements WebMvcConfigurer {
"positivetestcount.query",
"covidCodesEnteredAfterXDaysOnsetOfSymptoms.query"
})
public SplunkStatisticClient splunkStatisticsClient() {
public SplunkStatisticClient splunkStatisticsClient(HistoryDataService historyDataService) {
logger.info("Creating Splunk statistics client");
return new SplunkStatisticClient(
historyDataService,
splunkUrl,
getSplunkUsername(),
getSplunkpassword(),
Expand All @@ -121,13 +134,19 @@ public SplunkStatisticClient splunkStatisticsClient() {
}

@Bean
@DependsOn({"flyway"})
@ConditionalOnMissingBean
public StatisticClient mockStatisticsClient() {
public StatisticClient mockStatisticsClient(HistoryDataService historyDataService) {
logger.info("Creating Mock statistics client");
return new MockStatisticClient();
return new MockStatisticClient(historyDataService);
}

@Bean
public HistoryDataService historyDataService(DataSource dataSource) {
return new JdbcHistoryDataServiceImpl(dataSource);
}

@Bean()
public DppptAdditionalInfoController dppptAdditionalInfoController(
StatisticClient statisticClient) {
return new DppptAdditionalInfoController(statisticClient, cacheControl);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

@Configuration
@Profile("cloud-abn")
public class WSCloudAbnConfig extends WSBaseConfig {
public class WSCloudAbnConfig extends WSCloudBaseConfig {

@Value("${vcap.services.ecdsa_cs_abn.credentials.privateKey}")
private String privateKey;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Copyright (c) 2020 Ubique Innovation AG <https://www.ubique.ch>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* SPDX-License-Identifier: MPL-2.0
*/

package org.dpppt.additionalinfo.backend.ws.config;

import java.util.Map;
import javax.sql.DataSource;
import org.flywaydb.core.Flyway;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.CloudFactory;
import org.springframework.cloud.service.PooledServiceConnectorConfig.PoolConfig;
import org.springframework.cloud.service.relational.DataSourceConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public abstract class WSCloudBaseConfig extends WSBaseConfig {

abstract String getPublicKey();

abstract String getPrivateKey();

@Value("${datasource.maximumPoolSize:5}")
int dataSourceMaximumPoolSize;

@Value("${datasource.connectionTimeout:30000}")
int dataSourceConnectionTimeout;

@Value("${datasource.leakDetectionThreshold:0}")
int dataSourceLeakDetectionThreshold;

@Bean
@Override
public DataSource dataSource() {
PoolConfig poolConfig =
new PoolConfig(dataSourceMaximumPoolSize, dataSourceConnectionTimeout);
DataSourceConfig dbConfig =
new DataSourceConfig(
poolConfig,
null,
null,
Map.of("leakDetectionThreshold", dataSourceLeakDetectionThreshold));
CloudFactory factory = new CloudFactory();
return factory.getCloud().getSingletonServiceConnector(DataSource.class, dbConfig);
}

@Bean("flyway")
@Override
public Flyway flyway() {
Flyway flyWay =
Flyway.configure()
.dataSource(dataSource())
.locations("classpath:/db/migration/pgsql_cluster")
.load();
flyWay.migrate();
return flyWay;
}

@Override
public String getDbType() {
return "pgsql";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

@Configuration
@Profile("cloud-dev")
public class WSCloudDevConfig extends WSBaseConfig {
public class WSCloudDevConfig extends WSCloudBaseConfig {

@Value("${vcap.services.ecdsa_cs_dev.credentials.privateKey}")
private String privateKey;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

@Configuration
@Profile("cloud-prod")
public class WSCloudProdConfig extends WSBaseConfig {
public class WSCloudProdConfig extends WSCloudBaseConfig {

@Value("${vcap.services.ecdsa_cs_prod.credentials.privateKey}")
private String privateKey;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

@Configuration
@Profile("cloud-test")
public class WSCloudTestConfig extends WSBaseConfig {
public class WSCloudTestConfig extends WSCloudBaseConfig {

@Value("${vcap.services.ecdsa_cs_test.credentials.privateKey}")
private String privateKey;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,87 @@

package org.dpppt.additionalinfo.backend.ws.config;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.util.Base64;
import java.util.Properties;
import javax.sql.DataSource;
import org.flywaydb.core.Flyway;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile("dev")
public class WSDevConfig extends WSBaseConfig {

@Value("${datasource.username}")
String dataSourceUser;

@Value("${datasource.password}")
String dataSourcePassword;

@Value("${datasource.url}")
String dataSourceUrl;

@Value("${datasource.driverClassName}")
String dataSourceDriver;

@Value("${datasource.failFast}")
String dataSourceFailFast;

@Value("${datasource.maximumPoolSize}")
String dataSourceMaximumPoolSize;

@Value("${datasource.maxLifetime}")
String dataSourceMaxLifetime;

@Value("${datasource.idleTimeout}")
String dataSourceIdleTimeout;

@Value("${datasource.connectionTimeout}")
String dataSourceConnectionTimeout;

@Value("${ws.ecdsa.credentials.privateKey:}")
private String privateKey;

@Value("${ws.ecdsa.credentials.publicKey:}")
public String publicKey;

@Bean(destroyMethod = "close")
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
Properties props = new Properties();
props.put("url", dataSourceUrl);
props.put("user", dataSourceUser);
props.put("password", dataSourcePassword);
config.setDataSourceProperties(props);
config.setDataSourceClassName(dataSourceDriver);
config.setMaximumPoolSize(Integer.parseInt(dataSourceMaximumPoolSize));
config.setMaxLifetime(Integer.parseInt(dataSourceMaxLifetime));
config.setIdleTimeout(Integer.parseInt(dataSourceIdleTimeout));
config.setConnectionTimeout(Integer.parseInt(dataSourceConnectionTimeout));
return new HikariDataSource(config);
}

@Bean("flyway")
@Override
public Flyway flyway() {
Flyway flyWay =
Flyway.configure()
.dataSource(dataSource())
.locations("classpath:/db/migration/pgsql")
.load();
flyWay.migrate();
return flyWay;
}

@Override
public String getDbType() {
return "pgsql";
}

@Override
String getPrivateKey() {
return new String(Base64.getDecoder().decode(privateKey));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright (c) 2020 Ubique Innovation AG <https://www.ubique.ch>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* SPDX-License-Identifier: MPL-2.0
*/

package org.dpppt.additionalinfo.backend.ws.data;

import java.time.LocalDate;

public interface HistoryDataService {

/**
* upserts the latest seven day average for the given day
*
* @param latestSevenDayAvg
* @param day
*/
void upsertLatestSevenDayAvgForDay(Integer latestSevenDayAvg, LocalDate day);

/**
* returns the latest seven day average for the given day
* @param day
* @return
*/
Integer findLatestSevenDayAvgForDay(LocalDate day);
}
Loading

0 comments on commit f4b1b4f

Please sign in to comment.