From a7c8605dc77eb587ddeffe87d4af73a428318f98 Mon Sep 17 00:00:00 2001 From: selva Date: Mon, 19 Nov 2018 15:43:45 +0000 Subject: [PATCH 01/16] created seperate dbs for staging and prod --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 304f5c4..75577d6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -6,8 +6,8 @@ pipeline { } environment { stagingPostgresDbUrl = credentials('STAGINGPROPERTYREGISTRYDBURL') - fallBackPostgresDbUrl = credentials('STAGINGPROPERTYREGISTRYDBURL') - productionPostgresDbUrl = credentials('STAGINGPROPERTYREGISTRYDBURL') + fallBackPostgresDbUrl = credentials('FALLBACKPROPERTYREGISTRYDBURL') + productionPostgresDbUrl = credentials('PRODUCTIONPROPERTYREGISTRYDBURL') postgresDBUserName = credentials('POSTGRESDBUSERNAME') postgresDBPassword = credentials('POSTGRESDBPASSWORD') tomcatCredentials = credentials('TOMCATCREDENTIALS') From fbf8c52955bc3633306282b46c76f976f43c0177 Mon Sep 17 00:00:00 2001 From: selva Date: Tue, 20 Nov 2018 11:15:20 +0000 Subject: [PATCH 02/16] updated dev url --- Jenkinsfile | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 75577d6..6ad0405 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,4 +1,7 @@ pipeline { + triggers { + cron(env.BRANCH_NAME == 'master'? 'H 10 * * *' : '') + } agent { docker { image 'maven:3.5.2-jdk-8' @@ -22,7 +25,7 @@ pipeline { stages { stage('Default Build pointing to Staging DB') { steps { - sh "mvn clean package -DskipTests -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword}" + sh "mvn clean package -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword}" } } stage('Build For FallBack And Production') { @@ -46,7 +49,7 @@ pipeline { } steps { echo 'Deploying to Staging' - sh "curl --upload-file staging/target/amp-t2d-property-registry-*.war 'http://'${tomcatCredentials}'@'${stagingHost}':8080/manager/text/deploy?path=/registry&update=true' | grep 'OK - Deployed application at context path '" + sh "curl --upload-file staging/target/amp-t2d-property-registry-*.war 'http://'${tomcatCredentials}'@'${stagingHost}':8080/manager/text/deploy?path=/dev/registry&update=true' | grep 'OK - Deployed application at context path '" } } stage('Deploy To FallBack And Production') { @@ -64,4 +67,17 @@ pipeline { } } } + post { + failure { + echo "Test failed" + mail(bcc: '', + body: "Run ${JOB_NAME}-#${BUILD_NUMBER} failed.\n\ + To get more details, visit the build results page:${BUILD_URL}", + cc: '', + from: 'amp-dev@ebi.ac.uk', + replyTo: '', + subject: "${JOB_NAME} ${BUILD_NUMBER} failed", + to: 'amp-dev@ebi.ac.uk') + } + } } From 74ae46c0e9132dcb58a6545d938c98d41752f955 Mon Sep 17 00:00:00 2001 From: selva Date: Tue, 20 Nov 2018 13:59:46 +0000 Subject: [PATCH 03/16] updated fallback to prod db --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6ad0405..64dddbe 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -9,7 +9,7 @@ pipeline { } environment { stagingPostgresDbUrl = credentials('STAGINGPROPERTYREGISTRYDBURL') - fallBackPostgresDbUrl = credentials('FALLBACKPROPERTYREGISTRYDBURL') + fallBackPostgresDbUrl = credentials('PRODUCTIONPROPERTYREGISTRYDBURL') productionPostgresDbUrl = credentials('PRODUCTIONPROPERTYREGISTRYDBURL') postgresDBUserName = credentials('POSTGRESDBUSERNAME') postgresDBPassword = credentials('POSTGRESDBPASSWORD') From 171a3926f5d3f56f8037d8572d68fe1d2d56cdd3 Mon Sep 17 00:00:00 2001 From: selva Date: Tue, 20 Nov 2018 16:04:54 +0000 Subject: [PATCH 04/16] removed post and trigger --- Jenkinsfile | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 64dddbe..0831319 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,7 +1,4 @@ pipeline { - triggers { - cron(env.BRANCH_NAME == 'master'? 'H 10 * * *' : '') - } agent { docker { image 'maven:3.5.2-jdk-8' @@ -25,7 +22,7 @@ pipeline { stages { stage('Default Build pointing to Staging DB') { steps { - sh "mvn clean package -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword}" + sh "mvn clean package -DskipTests -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword}" } } stage('Build For FallBack And Production') { @@ -67,17 +64,4 @@ pipeline { } } } - post { - failure { - echo "Test failed" - mail(bcc: '', - body: "Run ${JOB_NAME}-#${BUILD_NUMBER} failed.\n\ - To get more details, visit the build results page:${BUILD_URL}", - cc: '', - from: 'amp-dev@ebi.ac.uk', - replyTo: '', - subject: "${JOB_NAME} ${BUILD_NUMBER} failed", - to: 'amp-dev@ebi.ac.uk') - } - } } From 71953b1d8f4808f0d28bbb31935ae24b5d60b789 Mon Sep 17 00:00:00 2001 From: selva Date: Wed, 21 Nov 2018 11:22:56 +0000 Subject: [PATCH 05/16] Auto Email Notification of Registry property updates --- Jenkinsfile | 7 +- pom.xml | 4 + .../entities/EntityEventListener.java | 54 +++++++++++ .../registry/entities/EntityIdentifier.java | 24 +++++ .../ampt2d/registry/entities/Phenotype.java | 8 +- .../ampt2d/registry/entities/Property.java | 7 +- .../registry/service/mail/MailService.java | 49 ++++++++++ .../ac/ebi/ampt2d/registry/util/BeanUtil.java | 38 ++++++++ src/main/resources/application.properties | 13 ++- ...opertyRegistryServiceApplicationTests.java | 10 +- .../RegistryUpdateNotificationTest.java | 91 +++++++++++++++++++ 11 files changed, 296 insertions(+), 9 deletions(-) create mode 100644 src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityEventListener.java create mode 100644 src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityIdentifier.java create mode 100644 src/main/java/uk/ac/ebi/ampt2d/registry/service/mail/MailService.java create mode 100644 src/main/java/uk/ac/ebi/ampt2d/registry/util/BeanUtil.java create mode 100644 src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationTest.java diff --git a/Jenkinsfile b/Jenkinsfile index 0831319..243fe27 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,6 +14,7 @@ pipeline { stagingHost = credentials('STAGINGHOST') fallbackHost = credentials('FALLBACKHOST') productionHost = credentials('PRODUCTIONHOST') + smtpHost = credentials('SMTPHOST') } parameters { booleanParam(name: 'DeployToStaging' , defaultValue: false , description: '') @@ -22,7 +23,7 @@ pipeline { stages { stage('Default Build pointing to Staging DB') { steps { - sh "mvn clean package -DskipTests -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword}" + sh "mvn clean package -DskipTests -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost}" } } stage('Build For FallBack And Production') { @@ -33,9 +34,9 @@ pipeline { } steps { echo 'Build pointing to FallBack DB' - sh "mvn clean package -DskipTests -DbuildDirectory=fallback/target -Dampt2d-property-registry-db.url=${fallBackPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword}" + sh "mvn clean package -DskipTests -DbuildDirectory=fallback/target -Dampt2d-property-registry-db.url=${fallBackPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost}" echo 'Build pointing to Production DB' - sh "mvn clean package -DskipTests -DbuildDirectory=production/target -Dampt2d-property-registry-db.url=${productionPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword}" + sh "mvn clean package -DskipTests -DbuildDirectory=production/target -Dampt2d-property-registry-db.url=${productionPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost}" } } stage('Deploy To Staging') { diff --git a/pom.xml b/pom.xml index 0a48a1c..560a63c 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-mail + org.springframework.boot spring-boot-starter-data-jpa diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityEventListener.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityEventListener.java new file mode 100644 index 0000000..d3b34f0 --- /dev/null +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityEventListener.java @@ -0,0 +1,54 @@ +/* + * + * Copyright 2018 EMBL - European Bioinformatics Institute + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package uk.ac.ebi.ampt2d.registry.entities; + +import uk.ac.ebi.ampt2d.registry.util.BeanUtil; +import uk.ac.ebi.ampt2d.registry.service.mail.MailService; + +import javax.persistence.PostPersist; +import javax.persistence.PostRemove; +import javax.persistence.PostUpdate; + +public class EntityEventListener { + + private enum Event { + CREATED, + UPDATED, + REMOVED + } + + @PostPersist + public void onPersistEntity(EntityIdentifier entity) { + sendNotification(entity, Event.CREATED); + } + + @PostUpdate + public void onUpdateEntity(EntityIdentifier entity) { + sendNotification(entity, Event.UPDATED); + } + + @PostRemove + public void onRemoveEntity(EntityIdentifier entity) { + sendNotification(entity, Event.REMOVED); + } + + private void sendNotification(EntityIdentifier entity, Event event) { + BeanUtil.getBean(MailService.class).send(entity.getClass().getSimpleName() + " " + entity.getId() + " " + event); + } + +} diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityIdentifier.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityIdentifier.java new file mode 100644 index 0000000..ad6d442 --- /dev/null +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityIdentifier.java @@ -0,0 +1,24 @@ +/* + * + * Copyright 2018 EMBL - European Bioinformatics Institute + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package uk.ac.ebi.ampt2d.registry.entities; + +public interface EntityIdentifier { + + ENTITY_ID getId(); + +} \ No newline at end of file diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java index 1597565..091a5a4 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java @@ -34,8 +34,8 @@ import java.time.ZonedDateTime; @Entity -@EntityListeners(AuditingEntityListener.class) -public class Phenotype { +@EntityListeners({AuditingEntityListener.class,EntityEventListener.class}) +public class Phenotype implements EntityIdentifier{ public enum Group { @@ -68,4 +68,8 @@ public enum Group { @LastModifiedDate private ZonedDateTime lastModifiedDate; + + public String getId() { + return id; + } } diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java index c3f492b..5c99915 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java @@ -35,8 +35,8 @@ import java.time.ZonedDateTime; @Entity -@EntityListeners(AuditingEntityListener.class) -public class Property { +@EntityListeners({AuditingEntityListener.class,EntityEventListener.class}) +public class Property implements EntityIdentifier{ public enum Type { @@ -102,4 +102,7 @@ public enum Meaning { @LastModifiedDate private ZonedDateTime lastModifiedDate; + public String getId() { + return id; + } } \ No newline at end of file diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/service/mail/MailService.java b/src/main/java/uk/ac/ebi/ampt2d/registry/service/mail/MailService.java new file mode 100644 index 0000000..9a69fca --- /dev/null +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/service/mail/MailService.java @@ -0,0 +1,49 @@ +/* + * + * Copyright 2018 EMBL - European Bioinformatics Institute + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package uk.ac.ebi.ampt2d.registry.service.mail; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +@Service +public class MailService { + + @Autowired + private JavaMailSender javaMailSender; + + @Value("${mail.to}") + private String to; + + @Value("${mail.from}") + private String from; + + @Value("${mail.subject}") + private String subject; + + public void send(String text) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(to); + message.setFrom(from); + message.setSubject(subject); + message.setText(text); + javaMailSender.send(message); + } +} \ No newline at end of file diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/util/BeanUtil.java b/src/main/java/uk/ac/ebi/ampt2d/registry/util/BeanUtil.java new file mode 100644 index 0000000..6e87eef --- /dev/null +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/util/BeanUtil.java @@ -0,0 +1,38 @@ +/* + * + * Copyright 2018 EMBL - European Bioinformatics Institute + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package uk.ac.ebi.ampt2d.registry.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Service; + +@Service +public class BeanUtil implements ApplicationContextAware { + + private static ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } + + public static T getBean(Class beanClass) { + return context.getBean(beanClass); + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f63ef0a..66f1250 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,4 +21,15 @@ security.enabled=true security.oauth2.resource.userInfoUri=https://www.googleapis.com/userinfo/v2/me security.oauth2.resource.filter-order=3 -registry.protocols=https +spring.mail.host=@smtp-host@ +spring.mail.port=587 +spring.mail.test-connection=false +spring.mail.properties.mail.smtp.auth=false +spring.mail.properties.mail.smtp.ssl.enable=false + +mail.from=amp-dev@ebi.ac.uk +mail.to=amp-dev@ebi.ac.uk +mail.subject=AMP-T2D Registry Update + + +registry.protocols=https \ No newline at end of file diff --git a/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java b/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java index bc979ab..c7f86d8 100644 --- a/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java +++ b/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java @@ -23,12 +23,16 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import uk.ac.ebi.ampt2d.registry.repositories.PhenotypeRepository; import uk.ac.ebi.ampt2d.registry.repositories.PropertyRepository; +import uk.ac.ebi.ampt2d.registry.service.mail.MailService; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doNothing; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; @@ -54,8 +58,12 @@ public class PropertyRegistryServiceApplicationTests { @Autowired private PropertyRepository propertyRepository; + @MockBean + private MailService mailService; + @Before - public void deleteAllBeforeTests() throws Exception { + public void setUp() throws Exception { + doNothing().when(mailService).send(anyString()); phenotypeRepository.deleteAll(); propertyRepository.deleteAll(); } diff --git a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationTest.java b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationTest.java new file mode 100644 index 0000000..8e6a923 --- /dev/null +++ b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationTest.java @@ -0,0 +1,91 @@ +/* + * + * Copyright 2018 EMBL - European Bioinformatics Institute + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package uk.ac.ebi.ampt2d.registry; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import uk.ac.ebi.ampt2d.registry.service.mail.MailService; + +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class RegistryUpdateNotificationTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private MailService mailService; + + @Before + public void setUp() throws Exception { + doNothing().when(mailService).send(anyString()); + } + + @Test + public void testPhenotypeEvent() throws Exception { + String phenotypeContent = "{\"id\":\"BMI\"," + "\"phenotypeGroup\":\"ANTHROPOMETRIC\"}"; + mockMvc.perform(post("/phenotypes").content(phenotypeContent)) + .andExpect(status().isCreated()); + verify(mailService, times(1)).send("Phenotype BMI CREATED"); + + mockMvc.perform(patch("/phenotypes/BMI").content("{\"phenotypeGroup\":\"RENAL\"}")) + .andExpect(status().is2xxSuccessful()); + verify(mailService, times(1)).send("Phenotype BMI UPDATED"); + + mockMvc.perform(delete("/phenotypes/BMI")) + .andExpect(status().isNoContent()); + verify(mailService, times(1)).send("Phenotype BMI REMOVED"); + } + + @Test + public void testPropertyEvent() throws Exception { + String propertiesContent = "{\"id\":\"AF\"," + + "\"type\":\"FLOAT\"," + + "\"meaning\":\"NONE\"," + + "\"description\":\"AF\"}"; + mockMvc.perform(post("/properties").content(propertiesContent)) + .andExpect(status().isCreated()); + verify(mailService, times(1)).send("Property AF CREATED"); + + mockMvc.perform(patch("/properties/AF").content("{\"description\":\"Allele Freq\"}")) + .andExpect(status().is2xxSuccessful()); + verify(mailService, times(1)).send("Property AF UPDATED"); + + mockMvc.perform(delete("/properties/AF")) + .andExpect(status().isNoContent()); + verify(mailService, times(1)).send("Property AF REMOVED"); + } + +} From c82623ad50db8ab150bf6145a3138865e188877e Mon Sep 17 00:00:00 2001 From: selva Date: Wed, 28 Nov 2018 15:48:28 +0000 Subject: [PATCH 06/16] changes suggested by zl --- .../exceptionhandling/ExceptionHandlers.java | 44 +++++++++++++++++ .../registry/service/mail/MailService.java | 17 ++++--- .../RegistryUpdateNotificationFailure.java | 48 +++++++++++++++++++ .../RegistryUpdateNotificationTest.java | 3 ++ src/test/resources/application.properties | 11 ++++- 5 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 src/main/java/uk/ac/ebi/ampt2d/registry/exceptionhandling/ExceptionHandlers.java create mode 100644 src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/exceptionhandling/ExceptionHandlers.java b/src/main/java/uk/ac/ebi/ampt2d/registry/exceptionhandling/ExceptionHandlers.java new file mode 100644 index 0000000..68c521a --- /dev/null +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/exceptionhandling/ExceptionHandlers.java @@ -0,0 +1,44 @@ +/* + * + * Copyright 2018 EMBL - European Bioinformatics Institute + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package uk.ac.ebi.ampt2d.registry.exceptionhandling; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.mail.MailSendException; +import org.springframework.transaction.TransactionSystemException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import java.util.logging.Level; +import java.util.logging.Logger; + +@ControllerAdvice +public class ExceptionHandlers { + + private static final Logger exceptionLogger = Logger.getLogger(ExceptionHandlers.class.getSimpleName()); + + @ExceptionHandler(value = TransactionSystemException.class) + public ResponseEntity handleMailSendException(TransactionSystemException ex) { + if (ex.getOriginalException().getCause().getClass().equals(MailSendException.class)) { + exceptionLogger.log(Level.SEVERE, ex.getOriginalException().getCause().getMessage()); + return new ResponseEntity("Mail send exception, please contact amp-dev@ebi.ac.uk", HttpStatus + .INTERNAL_SERVER_ERROR); + } + throw ex; + } +} diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/service/mail/MailService.java b/src/main/java/uk/ac/ebi/ampt2d/registry/service/mail/MailService.java index 9a69fca..37f9dc8 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/service/mail/MailService.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/service/mail/MailService.java @@ -29,6 +29,9 @@ public class MailService { @Autowired private JavaMailSender javaMailSender; + @Value("${mail.notify:false}") + private Boolean nofify; + @Value("${mail.to}") private String to; @@ -39,11 +42,13 @@ public class MailService { private String subject; public void send(String text) { - SimpleMailMessage message = new SimpleMailMessage(); - message.setTo(to); - message.setFrom(from); - message.setSubject(subject); - message.setText(text); - javaMailSender.send(message); + if (nofify == true) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(to); + message.setFrom(from); + message.setSubject(subject); + message.setText(text); + javaMailSender.send(message); + } } } \ No newline at end of file diff --git a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java new file mode 100644 index 0000000..5b9457b --- /dev/null +++ b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java @@ -0,0 +1,48 @@ +/* + * + * Copyright 2018 EMBL - European Bioinformatics Institute + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package uk.ac.ebi.ampt2d.registry; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@SpringBootTest(properties = {"mail.notify=true", "spring.mail.host=invalid_host"}) +@AutoConfigureMockMvc +public class RegistryUpdateNotificationFailure { + + @Autowired + private MockMvc mockMvc; + + @Test + public void testPhenotypeEvent() throws Exception { + String phenotypeContent = "{\"id\":\"BMI\"," + "\"phenotypeGroup\":\"ANTHROPOMETRIC\"}"; + mockMvc.perform(post("/phenotypes").content(phenotypeContent)) + .andExpect(status().isInternalServerError()) + .andExpect(content().string("Mail send exception, please contact amp-dev@ebi.ac.uk")); + } + +} diff --git a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationTest.java b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationTest.java index 8e6a923..7585bee 100644 --- a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationTest.java +++ b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationTest.java @@ -24,6 +24,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import uk.ac.ebi.ampt2d.registry.service.mail.MailService; @@ -32,6 +33,7 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_CLASS; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -40,6 +42,7 @@ @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc +@DirtiesContext(classMode = BEFORE_CLASS) public class RegistryUpdateNotificationTest { @Autowired diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index c2ba5d6..cbc7d80 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -11,4 +11,13 @@ management.endpoint.health.show-details=always endpoints.health.sensitive=false registry.protocols=http -spring.jpa.hibernate.ddl-auto=none \ No newline at end of file +spring.jpa.hibernate.ddl-auto=none + +spring.mail.port=587 +spring.mail.test-connection=false +spring.mail.properties.mail.smtp.auth=false +spring.mail.properties.mail.smtp.ssl.enable=false + +mail.from=amp-dev@ebi.ac.uk +mail.to=amp-dev@ebi.ac.uk +mail.subject=AMP-T2D Registry Update \ No newline at end of file From 01299d8675572776f479a22c79c76dae18eaf625 Mon Sep 17 00:00:00 2001 From: selva Date: Wed, 28 Nov 2018 15:53:53 +0000 Subject: [PATCH 07/16] IdentifiableEntity --- .../ebi/ampt2d/registry/entities/EntityEventListener.java | 8 ++++---- .../{EntityIdentifier.java => IdentifiableEntity.java} | 2 +- .../uk/ac/ebi/ampt2d/registry/entities/Phenotype.java | 2 +- .../java/uk/ac/ebi/ampt2d/registry/entities/Property.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/uk/ac/ebi/ampt2d/registry/entities/{EntityIdentifier.java => IdentifiableEntity.java} (93%) diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityEventListener.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityEventListener.java index d3b34f0..0a6fe67 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityEventListener.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityEventListener.java @@ -33,21 +33,21 @@ private enum Event { } @PostPersist - public void onPersistEntity(EntityIdentifier entity) { + public void onPersistEntity(IdentifiableEntity entity) { sendNotification(entity, Event.CREATED); } @PostUpdate - public void onUpdateEntity(EntityIdentifier entity) { + public void onUpdateEntity(IdentifiableEntity entity) { sendNotification(entity, Event.UPDATED); } @PostRemove - public void onRemoveEntity(EntityIdentifier entity) { + public void onRemoveEntity(IdentifiableEntity entity) { sendNotification(entity, Event.REMOVED); } - private void sendNotification(EntityIdentifier entity, Event event) { + private void sendNotification(IdentifiableEntity entity, Event event) { BeanUtil.getBean(MailService.class).send(entity.getClass().getSimpleName() + " " + entity.getId() + " " + event); } diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityIdentifier.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/IdentifiableEntity.java similarity index 93% rename from src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityIdentifier.java rename to src/main/java/uk/ac/ebi/ampt2d/registry/entities/IdentifiableEntity.java index ad6d442..885e185 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/EntityIdentifier.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/IdentifiableEntity.java @@ -17,7 +17,7 @@ */ package uk.ac.ebi.ampt2d.registry.entities; -public interface EntityIdentifier { +public interface IdentifiableEntity { ENTITY_ID getId(); diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java index 091a5a4..f25b472 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java @@ -35,7 +35,7 @@ @Entity @EntityListeners({AuditingEntityListener.class,EntityEventListener.class}) -public class Phenotype implements EntityIdentifier{ +public class Phenotype implements IdentifiableEntity { public enum Group { diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java index 5c99915..68423a3 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java @@ -36,7 +36,7 @@ @Entity @EntityListeners({AuditingEntityListener.class,EntityEventListener.class}) -public class Property implements EntityIdentifier{ +public class Property implements IdentifiableEntity { public enum Type { From c8db218173b024a97cfeca2193920310d4fe1fd4 Mon Sep 17 00:00:00 2001 From: selva Date: Thu, 29 Nov 2018 11:13:54 +0000 Subject: [PATCH 08/16] test correction --- .../registry/PropertyRegistryServiceApplicationTests.java | 6 +++++- .../registry/RegistryUpdateNotificationFailure.java | 5 +++++ src/test/resources/application.properties | 8 +++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java b/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java index c7f86d8..36f5862 100644 --- a/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java +++ b/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java @@ -24,6 +24,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; @@ -33,6 +34,8 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doNothing; +import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_CLASS; +import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_CLASS; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; @@ -42,8 +45,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringRunner.class) -@SpringBootTest(properties = "security.enabled=true") +@SpringBootTest(properties = {"security.enabled=true","spring.jpa.hibernate.ddl-auto=none"}) @AutoConfigureMockMvc +@DirtiesContext(classMode = AFTER_CLASS) public class PropertyRegistryServiceApplicationTests { @Autowired diff --git a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java index 5b9457b..fc94fdb 100644 --- a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java +++ b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java @@ -22,9 +22,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import javax.transaction.Transactional; + +import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_CLASS; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -32,6 +36,7 @@ @RunWith(SpringRunner.class) @SpringBootTest(properties = {"mail.notify=true", "spring.mail.host=invalid_host"}) @AutoConfigureMockMvc +@DirtiesContext(classMode = BEFORE_CLASS) public class RegistryUpdateNotificationFailure { @Autowired diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index cbc7d80..594aa4a 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -11,7 +11,7 @@ management.endpoint.health.show-details=always endpoints.health.sensitive=false registry.protocols=http -spring.jpa.hibernate.ddl-auto=none +spring.jpa.hibernate.ddl-auto=create spring.mail.port=587 spring.mail.test-connection=false @@ -19,5 +19,7 @@ spring.mail.properties.mail.smtp.auth=false spring.mail.properties.mail.smtp.ssl.enable=false mail.from=amp-dev@ebi.ac.uk -mail.to=amp-dev@ebi.ac.uk -mail.subject=AMP-T2D Registry Update \ No newline at end of file +mail.to=selva@ebi.ac.uk +mail.subject=AMP-T2D Registry Update + +security.enabled=false \ No newline at end of file From 9f98db371865becb8c647e3c082d3897ebc262ba Mon Sep 17 00:00:00 2001 From: selva Date: Thu, 29 Nov 2018 11:16:49 +0000 Subject: [PATCH 09/16] removed unused import --- .../ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java index fc94fdb..6cf214e 100644 --- a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java +++ b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java @@ -26,8 +26,6 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; -import javax.transaction.Transactional; - import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_CLASS; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; From 6ee9f66ad3ace5e70355feed138564b819daa7d4 Mon Sep 17 00:00:00 2001 From: selva Date: Thu, 29 Nov 2018 11:18:03 +0000 Subject: [PATCH 10/16] indentation --- src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java index f25b472..856567c 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Phenotype.java @@ -34,7 +34,7 @@ import java.time.ZonedDateTime; @Entity -@EntityListeners({AuditingEntityListener.class,EntityEventListener.class}) +@EntityListeners({AuditingEntityListener.class, EntityEventListener.class}) public class Phenotype implements IdentifiableEntity { public enum Group { From 53565f6c79f4df4daa29167f5968951d5f172748 Mon Sep 17 00:00:00 2001 From: selva Date: Thu, 29 Nov 2018 12:00:09 +0000 Subject: [PATCH 11/16] changes suggested by cyenyxe --- Jenkinsfile | 9 +++++---- .../uk/ac/ebi/ampt2d/registry/entities/Property.java | 2 +- .../registry/exceptionhandling/ExceptionHandlers.java | 8 ++++++-- src/main/resources/application.properties | 5 ++--- .../registry/RegistryUpdateNotificationFailure.java | 2 +- src/test/resources/application.properties | 4 ++-- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 243fe27..f19120f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -15,6 +15,7 @@ pipeline { fallbackHost = credentials('FALLBACKHOST') productionHost = credentials('PRODUCTIONHOST') smtpHost = credentials('SMTPHOST') + ampt2dEmaiId = credentials('AMPT2DEMAILID') } parameters { booleanParam(name: 'DeployToStaging' , defaultValue: false , description: '') @@ -23,7 +24,7 @@ pipeline { stages { stage('Default Build pointing to Staging DB') { steps { - sh "mvn clean package -DskipTests -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost}" + sh "mvn clean package -DskipTests -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost} -Damp-t2d-email-id=${ampt2dEmaiId}" } } stage('Build For FallBack And Production') { @@ -34,9 +35,9 @@ pipeline { } steps { echo 'Build pointing to FallBack DB' - sh "mvn clean package -DskipTests -DbuildDirectory=fallback/target -Dampt2d-property-registry-db.url=${fallBackPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost}" + sh "mvn clean package -DskipTests -DbuildDirectory=fallback/target -Dampt2d-property-registry-db.url=${fallBackPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost} -Damp-t2d-email-id=${ampt2dEmaiId}" echo 'Build pointing to Production DB' - sh "mvn clean package -DskipTests -DbuildDirectory=production/target -Dampt2d-property-registry-db.url=${productionPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost}" + sh "mvn clean package -DskipTests -DbuildDirectory=production/target -Dampt2d-property-registry-db.url=${productionPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost} -Damp-t2d-email-id=${ampt2dEmaiId}" } } stage('Deploy To Staging') { @@ -47,7 +48,7 @@ pipeline { } steps { echo 'Deploying to Staging' - sh "curl --upload-file staging/target/amp-t2d-property-registry-*.war 'http://'${tomcatCredentials}'@'${stagingHost}':8080/manager/text/deploy?path=/dev/registry&update=true' | grep 'OK - Deployed application at context path '" + sh "curl --upload-file staging/target/amp-t2d-property-registry-*.war 'http://'${tomcatCredentials}'@'${stagingHost}':8080/manager/text/deploy?path=/registry&update=true' | grep 'OK - Deployed application at context path '" } } stage('Deploy To FallBack And Production') { diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java index 68423a3..78c1004 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/Property.java @@ -35,7 +35,7 @@ import java.time.ZonedDateTime; @Entity -@EntityListeners({AuditingEntityListener.class,EntityEventListener.class}) +@EntityListeners({AuditingEntityListener.class, EntityEventListener.class}) public class Property implements IdentifiableEntity { public enum Type { diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/exceptionhandling/ExceptionHandlers.java b/src/main/java/uk/ac/ebi/ampt2d/registry/exceptionhandling/ExceptionHandlers.java index 68c521a..fe17e65 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/exceptionhandling/ExceptionHandlers.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/exceptionhandling/ExceptionHandlers.java @@ -17,6 +17,7 @@ */ package uk.ac.ebi.ampt2d.registry.exceptionhandling; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.mail.MailSendException; @@ -32,12 +33,15 @@ public class ExceptionHandlers { private static final Logger exceptionLogger = Logger.getLogger(ExceptionHandlers.class.getSimpleName()); + @Value("${mail.from}") + private String mailFrom; + @ExceptionHandler(value = TransactionSystemException.class) public ResponseEntity handleMailSendException(TransactionSystemException ex) { if (ex.getOriginalException().getCause().getClass().equals(MailSendException.class)) { exceptionLogger.log(Level.SEVERE, ex.getOriginalException().getCause().getMessage()); - return new ResponseEntity("Mail send exception, please contact amp-dev@ebi.ac.uk", HttpStatus - .INTERNAL_SERVER_ERROR); + return new ResponseEntity("An automated email could not be sent, please contact " + mailFrom, + HttpStatus.INTERNAL_SERVER_ERROR); } throw ex; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 66f1250..8494936 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -27,9 +27,8 @@ spring.mail.test-connection=false spring.mail.properties.mail.smtp.auth=false spring.mail.properties.mail.smtp.ssl.enable=false -mail.from=amp-dev@ebi.ac.uk -mail.to=amp-dev@ebi.ac.uk +mail.from=@amp-t2d-email-id@ +mail.to=@amp-t2d-email-id@ mail.subject=AMP-T2D Registry Update - registry.protocols=https \ No newline at end of file diff --git a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java index 6cf214e..056be3c 100644 --- a/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java +++ b/src/test/java/uk/ac/ebi/ampt2d/registry/RegistryUpdateNotificationFailure.java @@ -45,7 +45,7 @@ public void testPhenotypeEvent() throws Exception { String phenotypeContent = "{\"id\":\"BMI\"," + "\"phenotypeGroup\":\"ANTHROPOMETRIC\"}"; mockMvc.perform(post("/phenotypes").content(phenotypeContent)) .andExpect(status().isInternalServerError()) - .andExpect(content().string("Mail send exception, please contact amp-dev@ebi.ac.uk")); + .andExpect(content().string("An automated email could not be sent, please contact user@domain")); } } diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 594aa4a..95d207a 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -18,8 +18,8 @@ spring.mail.test-connection=false spring.mail.properties.mail.smtp.auth=false spring.mail.properties.mail.smtp.ssl.enable=false -mail.from=amp-dev@ebi.ac.uk -mail.to=selva@ebi.ac.uk +mail.from=user@domain +mail.to=user@domain mail.subject=AMP-T2D Registry Update security.enabled=false \ No newline at end of file From c85f8a062325f6b4fb7cb7c837419b25fe09cb72 Mon Sep 17 00:00:00 2001 From: selva Date: Thu, 29 Nov 2018 12:03:08 +0000 Subject: [PATCH 12/16] indendation --- .../registry/PropertyRegistryServiceApplicationTests.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java b/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java index 36f5862..9b933bd 100644 --- a/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java +++ b/src/test/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplicationTests.java @@ -35,7 +35,6 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doNothing; import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_CLASS; -import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_CLASS; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; @@ -45,7 +44,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringRunner.class) -@SpringBootTest(properties = {"security.enabled=true","spring.jpa.hibernate.ddl-auto=none"}) +@SpringBootTest(properties = {"security.enabled=true", "spring.jpa.hibernate.ddl-auto=none"}) @AutoConfigureMockMvc @DirtiesContext(classMode = AFTER_CLASS) public class PropertyRegistryServiceApplicationTests { @@ -314,7 +313,7 @@ public void testAuthorization() throws Exception { mockMvc.perform(put("/phenotypes/BMI").with(oAuthHelper.bearerToken("testAdmin@gmail.com")) .content("{\"phenotypeGroup\": \"GLYCEMIC\"}")).andExpect(status().isNoContent()); mockMvc.perform(delete("/properties/CALL_RATE").with(oAuthHelper.bearerToken("testUser@gmail.com"))) - .andExpect(status().isForbidden()); + .andExpect(status().isForbidden()); mockMvc.perform(delete("/properties/CALL_RATE").with(oAuthHelper.bearerToken("testEditor@gmail.com"))) .andExpect(status().isNoContent()); From 37f723b9c1c6a9bc1fd0b9f26fd0d7abd70a292d Mon Sep 17 00:00:00 2001 From: selva Date: Thu, 29 Nov 2018 13:38:01 +0000 Subject: [PATCH 13/16] typo --- Jenkinsfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index f19120f..10264ee 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -15,7 +15,7 @@ pipeline { fallbackHost = credentials('FALLBACKHOST') productionHost = credentials('PRODUCTIONHOST') smtpHost = credentials('SMTPHOST') - ampt2dEmaiId = credentials('AMPT2DEMAILID') + ampt2dEmailId = credentials('AMPT2DEMAILID') } parameters { booleanParam(name: 'DeployToStaging' , defaultValue: false , description: '') @@ -24,7 +24,7 @@ pipeline { stages { stage('Default Build pointing to Staging DB') { steps { - sh "mvn clean package -DskipTests -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost} -Damp-t2d-email-id=${ampt2dEmaiId}" + sh "mvn clean package -DskipTests -DbuildDirectory=staging/target -Dampt2d-property-registry-db.url=${stagingPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost} -Damp-t2d-email-id=${ampt2dEmailId}" } } stage('Build For FallBack And Production') { @@ -35,9 +35,9 @@ pipeline { } steps { echo 'Build pointing to FallBack DB' - sh "mvn clean package -DskipTests -DbuildDirectory=fallback/target -Dampt2d-property-registry-db.url=${fallBackPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost} -Damp-t2d-email-id=${ampt2dEmaiId}" + sh "mvn clean package -DskipTests -DbuildDirectory=fallback/target -Dampt2d-property-registry-db.url=${fallBackPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost} -Damp-t2d-email-id=${ampt2dEmailId}" echo 'Build pointing to Production DB' - sh "mvn clean package -DskipTests -DbuildDirectory=production/target -Dampt2d-property-registry-db.url=${productionPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost} -Damp-t2d-email-id=${ampt2dEmaiId}" + sh "mvn clean package -DskipTests -DbuildDirectory=production/target -Dampt2d-property-registry-db.url=${productionPostgresDbUrl} -Dampt2d-property-registry-db.username=${postgresDBUserName} -Dampt2d-property-registry-db.password=${postgresDBPassword} -Dsmtp-host=${smtpHost} -Damp-t2d-email-id=${ampt2dEmailId}" } } stage('Deploy To Staging') { From 7993bf0ca3ee39f273dfefbdb44c7b52ce816dd3 Mon Sep 17 00:00:00 2001 From: selva Date: Thu, 29 Nov 2018 16:24:17 +0000 Subject: [PATCH 14/16] change context path to dev --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 10264ee..5494a31 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -48,7 +48,7 @@ pipeline { } steps { echo 'Deploying to Staging' - sh "curl --upload-file staging/target/amp-t2d-property-registry-*.war 'http://'${tomcatCredentials}'@'${stagingHost}':8080/manager/text/deploy?path=/registry&update=true' | grep 'OK - Deployed application at context path '" + sh "curl --upload-file staging/target/amp-t2d-property-registry-*.war 'http://'${tomcatCredentials}'@'${stagingHost}':8080/manager/text/deploy?path=/dev/registry&update=true' | grep 'OK - Deployed application at context path '" } } stage('Deploy To FallBack And Production') { From c3838d3318849e7a470cc5970f6df3e565e2c2cc Mon Sep 17 00:00:00 2001 From: Sreenidhi Iyangar Date: Wed, 9 Jan 2019 14:49:39 +0000 Subject: [PATCH 15/16] fix for user in postgresql --- src/main/java/uk/ac/ebi/ampt2d/registry/entities/User.java | 2 +- src/main/resources/data.sql | 6 +++--- src/main/resources/schema.sql | 2 +- src/test/resources/data.sql | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/User.java b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/User.java index 855e3aa..f9a5554 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/entities/User.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/entities/User.java @@ -24,7 +24,7 @@ import javax.persistence.Enumerated; import javax.persistence.Id; -@Entity +@Entity(name = "users") public class User { public enum Role { diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index d7771b8..dbd440c 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,3 +1,3 @@ -insert into user VALUES ('selva@ebi.ac.uk','ROLE_ADMIN'); -insert into user VALUES ('zl@ebi.ac.uk','ROLE_ADMIN'); -insert into user VALUES ('iyangar@ebi.ac.uk','ROLE_ADMIN'); \ No newline at end of file +insert into users VALUES ('selva@ebi.ac.uk','ROLE_ADMIN'); +insert into users VALUES ('zl@ebi.ac.uk','ROLE_ADMIN'); +insert into users VALUES ('iyangar@ebi.ac.uk','ROLE_ADMIN'); \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 3cfb9c8..05f5de8 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -14,7 +14,7 @@ CREATE TABLE IF NOT EXISTS property ( type VARCHAR(255) NOT NULL, PRIMARY KEY (id) ); -CREATE TABLE IF NOT EXISTS user ( +CREATE TABLE IF NOT EXISTS users ( email VARCHAR(255) NOT NULL, role VARCHAR(255), PRIMARY KEY (email) diff --git a/src/test/resources/data.sql b/src/test/resources/data.sql index fc75d76..1252d7d 100644 --- a/src/test/resources/data.sql +++ b/src/test/resources/data.sql @@ -1,3 +1,3 @@ -insert into user VALUES ('testEditor@gmail.com','ROLE_EDITOR'); -insert into user VALUES ('testUser@gmail.com','ROLE_USER'); -insert into user VALUES ('testAdmin@gmail.com','ROLE_ADMIN'); \ No newline at end of file +insert into users VALUES ('testEditor@gmail.com','ROLE_EDITOR'); +insert into users VALUES ('testUser@gmail.com','ROLE_USER'); +insert into users VALUES ('testAdmin@gmail.com','ROLE_ADMIN'); \ No newline at end of file From b04e5cd04f42885a642e9e974187fe478635ade8 Mon Sep 17 00:00:00 2001 From: Sreenidhi Iyangar Date: Wed, 9 Jan 2019 15:10:12 +0000 Subject: [PATCH 16/16] file to be removed --- pom.xml | 4 ++-- .../PropertyRegistryServiceApplication.java | 10 +++++----- src/main/resources/application.properties | 20 ++++++++++--------- src/main/resources/data.sql | 3 --- 4 files changed, 18 insertions(+), 19 deletions(-) delete mode 100644 src/main/resources/data.sql diff --git a/pom.xml b/pom.xml index 560a63c..6c4cc2b 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,7 @@ com.h2database h2 - test + diff --git a/src/main/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplication.java b/src/main/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplication.java index 6218e79..857dc77 100644 --- a/src/main/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplication.java +++ b/src/main/java/uk/ac/ebi/ampt2d/registry/PropertyRegistryServiceApplication.java @@ -23,14 +23,14 @@ import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication -public class PropertyRegistryServiceApplication extends SpringBootServletInitializer { +public class PropertyRegistryServiceApplication {//extends SpringBootServletInitializer { public static void main(String[] args) throws Exception { SpringApplication.run(PropertyRegistryServiceApplication.class, args); } - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(PropertyRegistryServiceApplication.class); - } +// @Override +// protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { +// return application.sources(PropertyRegistryServiceApplication.class); +// } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8494936..4606d31 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,14 +10,14 @@ management.context-path=/actuator management.endpoint.health.show-details=always endpoints.health.sensitive=false -spring.datasource.url=@ampt2d-property-registry-db.url@ -spring.datasource.username=@ampt2d-property-registry-db.username@ -spring.datasource.password=@ampt2d-property-registry-db.password@ -spring.jpa.hibernate.ddl-auto=none -spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL94Dialect -spring.jpa.generate-ddl=true - -security.enabled=true +#spring.datasource.url=@ampt2d-property-registry-db.url@ +#spring.datasource.username=@ampt2d-property-registry-db.username@ +#spring.datasource.password=@ampt2d-property-registry-db.password@ +#spring.jpa.hibernate.ddl-auto=none +#spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL94Dialect +#spring.jpa.generate-ddl=true +# +#security.enabled=true security.oauth2.resource.userInfoUri=https://www.googleapis.com/userinfo/v2/me security.oauth2.resource.filter-order=3 @@ -31,4 +31,6 @@ mail.from=@amp-t2d-email-id@ mail.to=@amp-t2d-email-id@ mail.subject=AMP-T2D Registry Update -registry.protocols=https \ No newline at end of file +#registry.protocols=https +server.port=8090 +security.enabled=false \ No newline at end of file diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql deleted file mode 100644 index dbd440c..0000000 --- a/src/main/resources/data.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into users VALUES ('selva@ebi.ac.uk','ROLE_ADMIN'); -insert into users VALUES ('zl@ebi.ac.uk','ROLE_ADMIN'); -insert into users VALUES ('iyangar@ebi.ac.uk','ROLE_ADMIN'); \ No newline at end of file