From 1e2ef7296b7e77f0a425adaf1dddf4a8402e6b39 Mon Sep 17 00:00:00 2001 From: Vojtech Knaisl Date: Wed, 16 Oct 2019 18:06:08 +0200 Subject: [PATCH] Upgrade User Management --- .../adminpanel/AdminPanelApplication.java | 6 +- .../exception/ExceptionControllerAdvice.java | 47 +++++++ .../adminpanel/api/dto/error/ErrorDTO.java | 51 +++++++ .../database/fixtures/DummyDataLoader.java | 64 +++++++++ .../data/ApplicationFixtures.java} | 129 +----------------- .../fixtures/data/InstanceFixtures.java | 65 +++++++++ .../fixtures/data/ServerFixtures.java | 32 +++++ .../database/fixtures/data/UserFixtures.java | 41 ++++++ 8 files changed, 305 insertions(+), 130 deletions(-) create mode 100644 src/main/java/nl/dtls/adminpanel/api/controller/exception/ExceptionControllerAdvice.java create mode 100644 src/main/java/nl/dtls/adminpanel/api/dto/error/ErrorDTO.java create mode 100644 src/main/java/nl/dtls/adminpanel/database/fixtures/DummyDataLoader.java rename src/main/java/nl/dtls/adminpanel/database/{DevelopmentDummyDataLoader.java => fixtures/data/ApplicationFixtures.java} (52%) create mode 100644 src/main/java/nl/dtls/adminpanel/database/fixtures/data/InstanceFixtures.java create mode 100644 src/main/java/nl/dtls/adminpanel/database/fixtures/data/ServerFixtures.java create mode 100644 src/main/java/nl/dtls/adminpanel/database/fixtures/data/UserFixtures.java diff --git a/src/main/java/nl/dtls/adminpanel/AdminPanelApplication.java b/src/main/java/nl/dtls/adminpanel/AdminPanelApplication.java index 1c6ddf5..bf8f974 100644 --- a/src/main/java/nl/dtls/adminpanel/AdminPanelApplication.java +++ b/src/main/java/nl/dtls/adminpanel/AdminPanelApplication.java @@ -2,7 +2,7 @@ import static org.springframework.core.env.Profiles.of; -import nl.dtls.adminpanel.database.DevelopmentDummyDataLoader; +import nl.dtls.adminpanel.database.fixtures.DummyDataLoader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; @@ -14,7 +14,7 @@ public class AdminPanelApplication implements ApplicationRunner { @Autowired - private DevelopmentDummyDataLoader developmentDummyDataLoader; + private DummyDataLoader dummyDataLoader; @Autowired private Environment environment; @@ -30,7 +30,7 @@ public static void main(String[] args) { @Override public void run(ApplicationArguments args) { if (environment.acceptsProfiles(of(Profiles.DEVELOPMENT))) { - developmentDummyDataLoader.load(); + dummyDataLoader.load(); } } } diff --git a/src/main/java/nl/dtls/adminpanel/api/controller/exception/ExceptionControllerAdvice.java b/src/main/java/nl/dtls/adminpanel/api/controller/exception/ExceptionControllerAdvice.java new file mode 100644 index 0000000..56e0ec2 --- /dev/null +++ b/src/main/java/nl/dtls/adminpanel/api/controller/exception/ExceptionControllerAdvice.java @@ -0,0 +1,47 @@ +package nl.dtls.adminpanel.api.controller.exception; + +import javax.servlet.http.HttpServletResponse; +import nl.dtls.adminpanel.api.dto.error.ErrorDTO; +import nl.dtls.adminpanel.entity.exception.ResourceNotFoundException; +import nl.dtls.adminpanel.entity.exception.ValidationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.CredentialsExpiredException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ControllerAdvice +public class ExceptionControllerAdvice { + + private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionControllerAdvice.class); + + @ExceptionHandler({ValidationException.class}) + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ResponseBody + public ErrorDTO handleBadRequest(Exception e, HttpServletResponse response) { + LOGGER.error(e.getMessage()); + return new ErrorDTO(HttpStatus.BAD_REQUEST, e.getMessage()); + } + + @ExceptionHandler({BadCredentialsException.class, CredentialsExpiredException.class}) + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ResponseBody + public ErrorDTO handleUnauthorized(Exception e, HttpServletResponse response) { + LOGGER.error(e.getMessage()); + return new ErrorDTO(HttpStatus.UNAUTHORIZED, e.getMessage()); + } + + @ExceptionHandler(ResourceNotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + @ResponseBody + public ErrorDTO handleResourceNotFound(ResourceNotFoundException e, + HttpServletResponse response) { + LOGGER.error(e.getMessage()); + return new ErrorDTO(HttpStatus.NOT_FOUND, e.getMessage()); + } + +} diff --git a/src/main/java/nl/dtls/adminpanel/api/dto/error/ErrorDTO.java b/src/main/java/nl/dtls/adminpanel/api/dto/error/ErrorDTO.java new file mode 100644 index 0000000..12f3b0e --- /dev/null +++ b/src/main/java/nl/dtls/adminpanel/api/dto/error/ErrorDTO.java @@ -0,0 +1,51 @@ +package nl.dtls.adminpanel.api.dto.error; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Date; +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.http.HttpStatus; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class ErrorDTO { + + @JsonProperty + private long timestamp; + + @JsonProperty + private int status; + + @JsonProperty + private String error; + + @JsonProperty() + @JsonInclude(value = JsonInclude.Include.NON_NULL) + private Map errors; + + @JsonProperty + private String message; + + @JsonProperty + private String path; + + public ErrorDTO(HttpStatus status, String message, Map errors) { + this.timestamp = new Date().getTime(); + this.status = status.value(); + this.error = status.getReasonPhrase(); + this.message = message; + this.errors = errors; + } + + public ErrorDTO(HttpStatus status, String message) { + this(status, message, null); + } + + +} \ No newline at end of file diff --git a/src/main/java/nl/dtls/adminpanel/database/fixtures/DummyDataLoader.java b/src/main/java/nl/dtls/adminpanel/database/fixtures/DummyDataLoader.java new file mode 100644 index 0000000..b17431b --- /dev/null +++ b/src/main/java/nl/dtls/adminpanel/database/fixtures/DummyDataLoader.java @@ -0,0 +1,64 @@ +package nl.dtls.adminpanel.database.fixtures; + +import nl.dtls.adminpanel.database.fixtures.data.ApplicationFixtures; +import nl.dtls.adminpanel.database.fixtures.data.InstanceFixtures; +import nl.dtls.adminpanel.database.fixtures.data.ServerFixtures; +import nl.dtls.adminpanel.database.fixtures.data.UserFixtures; +import nl.dtls.adminpanel.database.repository.ApplicationRepository; +import nl.dtls.adminpanel.database.repository.InstanceRepository; +import nl.dtls.adminpanel.database.repository.ServerRepository; +import nl.dtls.adminpanel.database.repository.UserRepository; +import nl.dtls.adminpanel.entity.Application; +import nl.dtls.adminpanel.entity.Server; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class DummyDataLoader { + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserFixtures userFixtures; + + @Autowired + private ServerRepository serverRepository; + + @Autowired + private ServerFixtures serverFixtures; + + @Autowired + private InstanceRepository instanceRepository; + + @Autowired + private InstanceFixtures instanceFixtures; + + @Autowired + private ApplicationRepository applicationRepository; + + @Autowired + private ApplicationFixtures applicationFixtures; + + @Autowired + private PasswordEncoder passwordEncoder; + + public void load() { + userRepository.deleteAll(); + userRepository.save(userFixtures.albert()); + userRepository.save(userFixtures.nikola()); + + applicationRepository.deleteAll(); + Application fdpApplication = applicationFixtures.fdpApplication(); + applicationRepository.save(fdpApplication); + + serverRepository.deleteAll(); + Server fdpServer = serverFixtures.fdpServer(); + serverRepository.save(fdpServer); + + instanceRepository.deleteAll(); + instanceRepository.save(instanceFixtures.stagingFdpInstance(fdpApplication, fdpServer)); + } + +} diff --git a/src/main/java/nl/dtls/adminpanel/database/DevelopmentDummyDataLoader.java b/src/main/java/nl/dtls/adminpanel/database/fixtures/data/ApplicationFixtures.java similarity index 52% rename from src/main/java/nl/dtls/adminpanel/database/DevelopmentDummyDataLoader.java rename to src/main/java/nl/dtls/adminpanel/database/fixtures/data/ApplicationFixtures.java index ee8ff20..330422b 100644 --- a/src/main/java/nl/dtls/adminpanel/database/DevelopmentDummyDataLoader.java +++ b/src/main/java/nl/dtls/adminpanel/database/fixtures/data/ApplicationFixtures.java @@ -1,81 +1,12 @@ -package nl.dtls.adminpanel.database; +package nl.dtls.adminpanel.database.fixtures.data; import java.util.ArrayList; -import java.util.HashMap; -import nl.dtls.adminpanel.database.repository.ApplicationRepository; -import nl.dtls.adminpanel.database.repository.InstanceRepository; -import nl.dtls.adminpanel.database.repository.ServerRepository; -import nl.dtls.adminpanel.database.repository.UserRepository; import nl.dtls.adminpanel.entity.Application; -import nl.dtls.adminpanel.entity.Instance; -import nl.dtls.adminpanel.entity.Server; import nl.dtls.adminpanel.entity.Template; -import nl.dtls.adminpanel.entity.User; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @Service -public class DevelopmentDummyDataLoader { - - @Value("${dummy.server.username:}") - private String serverUsername; - - @Value("${dummy.server.hostname:}") - private String serverHostname; - - @Value("${dummy.server.privateKey:}") - private String serverPrivateKey; - - @Value("${dummy.server.publicKey:}") - private String serverPublicKey; - - @Value("${dummy.instance.url:}") - private String instanceUrl; - - @Value("${dummy.instance.jwtSecret:}") - private String instanceJwtSecret; - - @Autowired - private UserRepository userRepository; - - @Autowired - private ServerRepository serverRepository; - - @Autowired - private InstanceRepository instanceRepository; - - @Autowired - private ApplicationRepository applicationRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - public void load() { - userRepository.deleteAll(); - userRepository.save(admin()); - - applicationRepository.deleteAll(); - Application fdpApplication = fdpApplication(); - applicationRepository.save(fdpApplication); - - serverRepository.deleteAll(); - Server fdpServer = fdpServer(); - serverRepository.save(fdpServer); - - instanceRepository.deleteAll(); - instanceRepository.save(stagingFdpInstance(fdpApplication, fdpServer)); - } - - public User admin() { - return new User( - "7e64818d-6276-46fb-8bb1-732e6e09f7e9", - "Admin", - "admin@example.com", - passwordEncoder.encode("password") - ); - } +public class ApplicationFixtures { public Application fdpApplication() { return new Application( @@ -183,60 +114,4 @@ public Application fdpApplication() { }}); } - public Server fdpServer() { - return new Server( - "166c48ba-64d9-473a-8b59-7c1fdbb901f0", - "FDP Server", - serverUsername, - serverHostname, - serverPrivateKey, - serverPublicKey); - } - - public Instance stagingFdpInstance(Application fdpApplication, - Server fdpServer) { - return new Instance( - "6f29daa8-1c43-49c3-9d1b-dc422e333d1e", - "FDP Staging Instance", - instanceUrl, - "/tmp/fdp-test", - new HashMap<>() {{ - put("server_image", "fairdata/fairdatapoint:develop"); - put("server_port", "81"); - put("jwt_secret", instanceJwtSecret); - put("repository_type", 1); - put("repository_agraph_url", "http://localhost:10035/repositories/fdp"); - put("repository_agraph_username", "user"); - put("repository_agraph_password", "password"); - put("repository_graphDb_url", "http://localhost:7200"); - put("repository_graphDb_repository", "test"); - put("repository_blazegraph_url", "http://localhost:8079/blazegraph"); - put("repository_blazegraph_repository", "fdp"); - put("repository_native_dir", "/tmp/fdp-store/"); - put("metadata_rootSpecs", - "https://www.purl.org/fairtools/fdp/schema/0.1/fdpMetadata"); - put("metadata_catalogSpecs", - "https://www.purl.org/fairtools/fdp/schema/0.1/catalogMetadata"); - put("metadata_datasetSpecs", - "https://www.purl.org/fairtools/fdp/schema/0.1/datasetMetadata"); - put("metadata_distributionSpecs", - "https://www.purl.org/fairtools/fdp/schema/0.1/distributionMetadata"); - put("metadata_publisherURI", "http://localhost"); - put("metadata_publisherName", "localhost"); - put("metadata_language", "http://id.loc.gov/vocabulary/iso639-1/en"); - put("metadata_license", "http://rdflicense.appspot.com/rdflicense/cc-by-nc-nd3.0"); - put("metadata_accessRightsDescription", "This resource has no access restriction"); - put("fairSearch_fdpSubmitUrl", "http://localhost:8080/fse/submitFdp"); - put("pidSystem_type", 1); - put("pidSystem_purl_baseUrl", "http://purl.org/YOUR-PURL-DOMAIN/fdp"); - put("scss_customizations", "$color-primary: red"); - put("scss_extra", "body { background: pink; }"); - }}, - new HashMap<>() {{ -// put("logo.png", new ObjectId("5d9dcdea7c889a377583cfef")); - }}, - fdpApplication, - fdpServer); - } - } diff --git a/src/main/java/nl/dtls/adminpanel/database/fixtures/data/InstanceFixtures.java b/src/main/java/nl/dtls/adminpanel/database/fixtures/data/InstanceFixtures.java new file mode 100644 index 0000000..67fe572 --- /dev/null +++ b/src/main/java/nl/dtls/adminpanel/database/fixtures/data/InstanceFixtures.java @@ -0,0 +1,65 @@ +package nl.dtls.adminpanel.database.fixtures.data; + +import java.util.HashMap; +import nl.dtls.adminpanel.entity.Application; +import nl.dtls.adminpanel.entity.Instance; +import nl.dtls.adminpanel.entity.Server; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class InstanceFixtures { + + @Value("${dummy.instance.url:}") + private String instanceUrl; + + @Value("${dummy.instance.jwtSecret:}") + private String instanceJwtSecret; + + public Instance stagingFdpInstance(Application fdpApplication, + Server fdpServer) { + return new Instance( + "6f29daa8-1c43-49c3-9d1b-dc422e333d1e", + "FDP Staging Instance", + instanceUrl, + "/tmp/fdp-test", + new HashMap<>() {{ + put("server_image", "fairdata/fairdatapoint:develop"); + put("server_port", "81"); + put("jwt_secret", instanceJwtSecret); + put("repository_type", 1); + put("repository_agraph_url", "http://localhost:10035/repositories/fdp"); + put("repository_agraph_username", "user"); + put("repository_agraph_password", "password"); + put("repository_graphDb_url", "http://localhost:7200"); + put("repository_graphDb_repository", "test"); + put("repository_blazegraph_url", "http://localhost:8079/blazegraph"); + put("repository_blazegraph_repository", "fdp"); + put("repository_native_dir", "/tmp/fdp-store/"); + put("metadata_rootSpecs", + "https://www.purl.org/fairtools/fdp/schema/0.1/fdpMetadata"); + put("metadata_catalogSpecs", + "https://www.purl.org/fairtools/fdp/schema/0.1/catalogMetadata"); + put("metadata_datasetSpecs", + "https://www.purl.org/fairtools/fdp/schema/0.1/datasetMetadata"); + put("metadata_distributionSpecs", + "https://www.purl.org/fairtools/fdp/schema/0.1/distributionMetadata"); + put("metadata_publisherURI", "http://localhost"); + put("metadata_publisherName", "localhost"); + put("metadata_language", "http://id.loc.gov/vocabulary/iso639-1/en"); + put("metadata_license", "http://rdflicense.appspot.com/rdflicense/cc-by-nc-nd3.0"); + put("metadata_accessRightsDescription", "This resource has no access restriction"); + put("fairSearch_fdpSubmitUrl", "http://localhost:8080/fse/submitFdp"); + put("pidSystem_type", 1); + put("pidSystem_purl_baseUrl", "http://purl.org/YOUR-PURL-DOMAIN/fdp"); + put("scss_customizations", "$color-primary: red"); + put("scss_extra", "body { background: pink; }"); + }}, + new HashMap<>() {{ +// put("logo.png", new ObjectId("5d9dcdea7c889a377583cfef")); + }}, + fdpApplication, + fdpServer); + } + +} diff --git a/src/main/java/nl/dtls/adminpanel/database/fixtures/data/ServerFixtures.java b/src/main/java/nl/dtls/adminpanel/database/fixtures/data/ServerFixtures.java new file mode 100644 index 0000000..5666b2a --- /dev/null +++ b/src/main/java/nl/dtls/adminpanel/database/fixtures/data/ServerFixtures.java @@ -0,0 +1,32 @@ +package nl.dtls.adminpanel.database.fixtures.data; + +import nl.dtls.adminpanel.entity.Server; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class ServerFixtures { + + @Value("${dummy.server.username:}") + private String serverUsername; + + @Value("${dummy.server.hostname:}") + private String serverHostname; + + @Value("${dummy.server.privateKey:}") + private String serverPrivateKey; + + @Value("${dummy.server.publicKey:}") + private String serverPublicKey; + + public Server fdpServer() { + return new Server( + "166c48ba-64d9-473a-8b59-7c1fdbb901f0", + "FDP Server", + serverUsername, + serverHostname, + serverPrivateKey, + serverPublicKey); + } + +} diff --git a/src/main/java/nl/dtls/adminpanel/database/fixtures/data/UserFixtures.java b/src/main/java/nl/dtls/adminpanel/database/fixtures/data/UserFixtures.java new file mode 100644 index 0000000..816d1af --- /dev/null +++ b/src/main/java/nl/dtls/adminpanel/database/fixtures/data/UserFixtures.java @@ -0,0 +1,41 @@ +package nl.dtls.adminpanel.database.fixtures.data; + +import nl.dtls.adminpanel.entity.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class UserFixtures { + + @Autowired + private PasswordEncoder passwordEncoder; + + public User albert() { + return new User( + "7e64818d-6276-46fb-8bb1-732e6e09f7e9", + "Albert Einstein", + "albert.einstein@example.com", + passwordEncoder.encode("password") + ); + } + + public User nikola() { + return new User( + "b5b92c69-5ed9-4054-954d-0121c29b6800", + "Nikola Tesla", + "nikola.tesla@example.com", + passwordEncoder.encode("password") + ); + } + + public User isaac() { + return new User( + "8d1a4c06-bb0e-4d03-a01f-14fa49bbc152", + "Isaac Newton", + "isaac.newton@example.com", + passwordEncoder.encode("password") + ); + } + +}