Skip to content
This repository has been archived by the owner on Apr 12, 2020. It is now read-only.

Commit

Permalink
added cron job for deleting expired secrets. fix #2
Browse files Browse the repository at this point in the history
  • Loading branch information
aardbol committed Jun 1, 2019
1 parent 5e548d0 commit 9dc221e
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 5 deletions.
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,12 @@
<version>0.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>3.1.6</version>
<scope>test</scope>
</dependency>
<!--<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/click/wheredoi/secretshareapi/ScheduledTasks.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright (c) 2019 Isaak Malik <[email protected]>
*
* Licensed as open source under the EUROPEAN UNION PUBLIC LICENCE v. 1.2
* See LICENSE, LICENTIE or for other translations: https://joinup.ec.europa.eu/collection/eupl/eupl-text-11-12
*/

package click.wheredoi.secretshareapi;

import click.wheredoi.secretshareapi.service.SecretService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {
private final Logger logger = LoggerFactory.getLogger(getClass());

private final SecretService secretService;

public ScheduledTasks(SecretService secretService) {
this.secretService = secretService;
}

// Each hour
@Scheduled(cron = "0 0 * * * *")
public void cronDeleteExpiredSecrets() {
secretService.deleteExpiredSecrets();
logger.info("Cron job cronDeleteExpiredSecrets() has been executed");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class SecretshareapiApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import click.wheredoi.secretshareapi.model.Secret;
import click.wheredoi.secretshareapi.repo.SecretRepository;
import com.aventrix.jnanoid.jnanoid.NanoIdUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
Expand All @@ -21,9 +23,8 @@

@Service
public class SecretService {

private final Logger logger = LoggerFactory.getLogger(getClass());
private final SecretRepository secretRepository;

private final AccessService accessService;

public SecretService(SecretRepository secretRepository, AccessService accessService) {
Expand Down Expand Up @@ -69,10 +70,12 @@ public Secret getSecret(String id, HttpServletRequest request) {
}

/**
* Delete expired, should be triggered by a cron job or so
* TODO: implement automation
* Delete expired, is automatically executed by cronDeleteExpiredSecrets()
*
* @see click.wheredoi.secretshareapi.ScheduledTasks
*/
public void deleteExpiredSecrets() {
secretRepository.deleteExpired();
logger.info("deleteExpiredSecrets(): expired secrets have been deleted");
}
}
1 change: 1 addition & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ spring.jpa.properties.javax.persistence.validation.mode=none
spring.jackson.serialization.indent_output=true
spring.servlet.multipart.max-request-size=5MB
logging.level.click.wheredoi=warn
logging.file=secretshare.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright (c) 2019 Isaak Malik <[email protected]>
*
* Licensed as open source under the EUROPEAN UNION PUBLIC LICENCE v. 1.2
* See LICENSE, LICENTIE or for other translations: https://joinup.ec.europa.eu/collection/eupl/eupl-text-11-12
*/

package click.wheredoi.secretshareapi;

import click.wheredoi.secretshareapi.service.SecretService;
import org.awaitility.Duration;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

import static org.awaitility.Awaitility.await;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.verify;

// Disabled because not possible to test the one hour cron job immediately
@Disabled
class ScheduledTasksTest {
@Mock
private ScheduledTasks tasks;

@Mock
private SecretService secretService;

@BeforeEach
void setup() {
MockitoAnnotations.initMocks(this);
}

@Test
void testCronDeleteExpiredSecrets() {
Mockito.doNothing().when(secretService).deleteExpiredSecrets();

await().atMost(Duration.FIVE_SECONDS).untilAsserted(() ->
verify(tasks, atLeast(1)).cronDeleteExpiredSecrets());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

import javax.servlet.http.HttpServletRequest;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
Expand Down Expand Up @@ -73,6 +74,7 @@ void setUp() {
accessRecord.setIp("127.0.0.1");
accessRecord.setId(1);
accessRecord.setSecret(secret.getId());
accessRecord.setTime(new Timestamp(System.currentTimeMillis()));
Set<AccessRecord> accessRecords = new HashSet<>();
accessRecords.add(accessRecord);
secret.setAccessRecords(accessRecords);
Expand Down Expand Up @@ -127,13 +129,17 @@ void createSecretReturnsSecret() throws Exception {
@Test
void getSecretShouldReturnSecretAndAccessRecords() throws Exception {
Mockito.when(secretService.getSecret(Mockito.eq(nanoId), Mockito.any(HttpServletRequest.class))).thenReturn(secret);
AccessRecord accessRecord = new ArrayList<>(secret.getAccessRecords()).get(0);

mockMvc.perform(get("/" + nanoId).contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id", equalTo(nanoId)))
.andExpect(jsonPath("$.data", equalTo(secret.getData())))
.andExpect(jsonPath("$.expires", equalTo(secret.getExpires().getTime())))
.andExpect(jsonPath("$.accessRecords[0].secret", equalTo(secret.getId())));
.andExpect(jsonPath("$.accessRecords[0].secret").doesNotExist())
.andExpect(jsonPath("$.accessRecords[0].id").doesNotExist())
.andExpect(jsonPath("$.accessRecords[0].ip").value(accessRecord.getIp()))
.andExpect(jsonPath("$.accessRecords[0].time").value(accessRecord.getTime().getTime()));
}

@Test
Expand Down

0 comments on commit 9dc221e

Please sign in to comment.