Skip to content

Commit a4e678e

Browse files
authored
EVA-4054 Add call home end point and notify secondary emails on submission upload (#34)
1 parent 2c2208e commit a4e678e

File tree

11 files changed

+402
-16
lines changed

11 files changed

+402
-16
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package uk.ac.ebi.eva.submission.controller.callhome;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import org.springframework.http.ResponseEntity;
5+
import org.springframework.web.bind.annotation.PostMapping;
6+
import org.springframework.web.bind.annotation.RequestBody;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RestController;
9+
import uk.ac.ebi.eva.submission.service.CallHomeService;
10+
11+
@RestController
12+
@RequestMapping("/v1/call-home")
13+
public class CallHomeController {
14+
private final CallHomeService callHomeService;
15+
16+
public CallHomeController(CallHomeService callHomeService) {
17+
this.callHomeService = callHomeService;
18+
}
19+
20+
@PostMapping("/events")
21+
public ResponseEntity<Void> ingest(@RequestBody JsonNode callHomeEventJson) {
22+
callHomeService.registerCallHomeEvent(callHomeEventJson);
23+
return ResponseEntity.ok().build();
24+
}
25+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package uk.ac.ebi.eva.submission.entity;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
5+
import javax.persistence.Column;
6+
import javax.persistence.Entity;
7+
import javax.persistence.GeneratedValue;
8+
import javax.persistence.GenerationType;
9+
import javax.persistence.Id;
10+
import javax.persistence.Table;
11+
import java.time.LocalDateTime;
12+
13+
@Entity
14+
@Table(schema = "eva_submissions", name = "call_home_event")
15+
public class CallHomeEventEntity {
16+
17+
@Id
18+
@GeneratedValue(strategy = GenerationType.IDENTITY)
19+
private Long id;
20+
21+
@Column(name = "deployment_id")
22+
private String deploymentId;
23+
24+
@Column(name = "run_id")
25+
private String runId;
26+
27+
@Column(name = "event_type")
28+
private String eventType;
29+
30+
@Column(name = "cli_version")
31+
private String cliVersion;
32+
33+
@Column(name = "created_at")
34+
private LocalDateTime createdAt;
35+
36+
@Column(name = "runtime_seconds")
37+
private Integer runtimeSeconds;
38+
39+
@Column(name = "executor")
40+
private String executor;
41+
42+
@Column(name = "tasks")
43+
private String tasks;
44+
45+
@Column(name = "raw_payload", columnDefinition = "jsonb", nullable = false)
46+
private JsonNode rawPayload;
47+
48+
public CallHomeEventEntity() {
49+
}
50+
51+
public Long getId() {
52+
return id;
53+
}
54+
55+
public String getDeploymentId() {
56+
return deploymentId;
57+
}
58+
59+
public void setDeploymentId(String deploymentId) {
60+
this.deploymentId = deploymentId;
61+
}
62+
63+
public String getRunId() {
64+
return runId;
65+
}
66+
67+
public void setRunId(String runId) {
68+
this.runId = runId;
69+
}
70+
71+
public String getEventType() {
72+
return eventType;
73+
}
74+
75+
public void setEventType(String eventType) {
76+
this.eventType = eventType;
77+
}
78+
79+
public String getCliVersion() {
80+
return cliVersion;
81+
}
82+
83+
public void setCliVersion(String cliVersion) {
84+
this.cliVersion = cliVersion;
85+
}
86+
87+
public LocalDateTime getCreatedAt() {
88+
return createdAt;
89+
}
90+
91+
public void setCreatedAt(LocalDateTime createdAt) {
92+
this.createdAt = createdAt;
93+
}
94+
95+
public Integer getRuntimeSeconds() {
96+
return runtimeSeconds;
97+
}
98+
99+
public void setRuntimeSeconds(Integer runtimeSeconds) {
100+
this.runtimeSeconds = runtimeSeconds;
101+
}
102+
103+
public String getExecutor() {
104+
return executor;
105+
}
106+
107+
public void setExecutor(String executor) {
108+
this.executor = executor;
109+
}
110+
111+
public String getTasks() {
112+
return tasks;
113+
}
114+
115+
public void setTasks(String tasks) {
116+
this.tasks = tasks;
117+
}
118+
119+
public JsonNode getRawPayload() {
120+
return rawPayload;
121+
}
122+
123+
public void setRawPayload(JsonNode rawPayload) {
124+
this.rawPayload = rawPayload;
125+
}
126+
}
127+

src/main/java/uk/ac/ebi/eva/submission/entity/SubmissionAccount.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import javax.persistence.Id;
99
import javax.persistence.Table;
1010
import javax.persistence.UniqueConstraint;
11+
import java.util.ArrayList;
1112
import java.util.List;
1213
import java.util.Objects;
1314

@@ -54,6 +55,7 @@ public SubmissionAccount(String userId, String loginType, String firstName, Stri
5455
this.firstName = firstName != null ? firstName : "";
5556
this.lastName = lastName != null ? lastName : "";
5657
this.primaryEmail = primaryEmail;
58+
this.secondaryEmails = new ArrayList<>();
5759
}
5860

5961
public SubmissionAccount(String userId, String loginType, String firstName, String lastName, String primaryEmail,
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package uk.ac.ebi.eva.submission.repository;
2+
3+
import org.springframework.data.repository.CrudRepository;
4+
import uk.ac.ebi.eva.submission.entity.CallHomeEventEntity;
5+
6+
public interface CallHomeEventRepository extends CrudRepository<CallHomeEventEntity, Long> {
7+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package uk.ac.ebi.eva.submission.service;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
6+
import org.springframework.stereotype.Service;
7+
import uk.ac.ebi.eva.submission.entity.CallHomeEventEntity;
8+
import uk.ac.ebi.eva.submission.repository.CallHomeEventRepository;
9+
10+
import java.time.LocalDateTime;
11+
12+
@Service
13+
public class CallHomeService {
14+
private final CallHomeEventRepository callHomeEventRepository;
15+
16+
private static final ObjectMapper MAPPER = new ObjectMapper()
17+
.registerModule(new JavaTimeModule());
18+
19+
public CallHomeService(CallHomeEventRepository callHomeEventRepository) {
20+
this.callHomeEventRepository = callHomeEventRepository;
21+
}
22+
23+
public void registerCallHomeEvent(JsonNode callHomeEventJson) {
24+
CallHomeEventEntity callHomeEventEntity = getCallHomeEventEntity(callHomeEventJson);
25+
callHomeEventRepository.save(callHomeEventEntity);
26+
}
27+
28+
private CallHomeEventEntity getCallHomeEventEntity(JsonNode callHomeEventJson) {
29+
CallHomeEventEntity callHomeEventEntity = new CallHomeEventEntity();
30+
31+
callHomeEventEntity.setDeploymentId(get(callHomeEventJson, "deploymentId", String.class));
32+
callHomeEventEntity.setRunId(get(callHomeEventJson, "runId", String.class));
33+
callHomeEventEntity.setEventType(get(callHomeEventJson, "eventType", String.class));
34+
callHomeEventEntity.setCliVersion(get(callHomeEventJson, "cliVersion", String.class));
35+
callHomeEventEntity.setCreatedAt(get(callHomeEventJson, "createdAt", LocalDateTime.class));
36+
callHomeEventEntity.setRuntimeSeconds(get(callHomeEventJson, "runtimeSeconds", Integer.class));
37+
callHomeEventEntity.setExecutor(get(callHomeEventJson, "executor", String.class));
38+
callHomeEventEntity.setTasks(get(callHomeEventJson, "tasks", String.class));
39+
callHomeEventEntity.setRawPayload(callHomeEventJson);
40+
41+
return callHomeEventEntity;
42+
}
43+
44+
private <T> T get(JsonNode node, String field, Class<T> type) {
45+
if (node == null || field == null) {
46+
return null;
47+
}
48+
49+
JsonNode v = node.get(field);
50+
if (v == null || v.isNull()) {
51+
return null;
52+
}
53+
54+
try {
55+
return MAPPER.convertValue(v, type);
56+
} catch (IllegalArgumentException e) {
57+
return null;
58+
}
59+
}
60+
61+
}

src/main/java/uk/ac/ebi/eva/submission/service/SubmissionService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,11 @@ public void sendMailNotificationToUserForStatusUpdate(SubmissionAccount submissi
297297
String projectTitle, SubmissionStatus submissionStatus,
298298
boolean needConsentStatement, boolean deprecatedVersion, boolean success) {
299299
String sendTo = submissionAccount.getPrimaryEmail();
300+
List<String> sendCC = submissionAccount.getSecondaryEmails();
300301
String subject = emailHelper.getSubjectForSubmissionStatusUpdate(submissionStatus, success);
301302
String body = emailHelper.getTextForSubmissionStatusUpdate(submissionAccount, submissionId, projectTitle,
302303
submissionStatus, needConsentStatement, deprecatedVersion, success);
303-
mailSender.sendEmail(emailHelper.getEvaHelpdeskEmail(), sendTo, subject, body);
304+
mailSender.sendEmail(emailHelper.getEvaHelpdeskEmail(), sendTo, sendCC, subject, body);
304305
}
305306

306307
public void sendMailNotificationToEVAHelpdeskForSubmissionUploaded(SubmissionAccount submissionAccount,

src/main/java/uk/ac/ebi/eva/submission/util/EmailNotificationHelper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ public String getTextForEVAHelpdeskSubmissionUploaded(SubmissionAccount submissi
9494
.addLineBreak()
9595
.addText("User Name: " + getUserNameFromSubmissionAccountOrDefault(submissionAccount, "Not Set"))
9696
.addLineBreak()
97-
.addText("User Email: " + submissionAccount.getPrimaryEmail())
97+
.addText("User Primary Email: " + submissionAccount.getPrimaryEmail())
98+
.addLineBreak()
99+
.addText("User Secondary Emails: " + String.join(", ", submissionAccount.getSecondaryEmails()))
98100
.addGap(2)
99101
.build();
100102

src/main/java/uk/ac/ebi/eva/submission/util/MailSender.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
import javax.mail.MessagingException;
1111
import javax.mail.internet.MimeMessage;
12+
import java.util.Collections;
13+
import java.util.List;
1214

1315
@Component
1416
public class MailSender {
@@ -26,11 +28,18 @@ public void sendEmail(String to, String subject, String body) {
2628
}
2729

2830
public void sendEmail(String from, String to, String subject, String body) {
31+
sendEmail(from, to, Collections.emptyList(), subject, body);
32+
}
33+
34+
public void sendEmail(String from, String to, List<String> ccList, String subject, String body) {
2935
MimeMessage message = javaMailSender.createMimeMessage();
3036
MimeMessageHelper helper = new MimeMessageHelper(message);
3137
try {
3238
helper.setFrom(from);
3339
helper.setTo(to);
40+
if (ccList != null && !ccList.isEmpty()) {
41+
helper.setCc(ccList.toArray(new String[0]));
42+
}
3443
helper.setSubject(subject);
3544
helper.setText(body, true);
3645
javaMailSender.send(message);

0 commit comments

Comments
 (0)