aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2025-07-02 17:30:28 +0200
committerAleksandr Nogikh <nogikh@google.com>2025-07-03 09:04:38 +0000
commit2d7f57714b3b95f27c3159f02b33e17b816f7178 (patch)
tree9eef9952542c01446eed2d48cab78f3ecd40b27e
parenta0492970c27ad81d0f085e54c30e779f2468c74e (diff)
dashboard: add send_email method
The API method can be used to send a raw email on behalf of the GAE instance.
-rw-r--r--dashboard/app/api.go17
-rw-r--r--dashboard/dashapi/dashapi.go13
2 files changed, 30 insertions, 0 deletions
diff --git a/dashboard/app/api.go b/dashboard/app/api.go
index 52e33dbb0..cd1a51db7 100644
--- a/dashboard/app/api.go
+++ b/dashboard/app/api.go
@@ -36,6 +36,7 @@ import (
"google.golang.org/appengine/v2"
db "google.golang.org/appengine/v2/datastore"
"google.golang.org/appengine/v2/log"
+ aemail "google.golang.org/appengine/v2/mail"
"google.golang.org/appengine/v2/user"
)
@@ -57,6 +58,7 @@ var apiHandlers = map[string]APIHandler{
"load_full_bug": apiLoadFullBug,
"save_discussion": apiSaveDiscussion,
"create_upload_url": apiCreateUploadURL,
+ "send_email": apiSendEmail,
"save_coverage": gcsPayloadHandler(apiSaveCoverage),
"upload_build": nsHandler(apiUploadBuild),
"builder_poll": nsHandler(apiBuilderPoll),
@@ -1929,6 +1931,21 @@ func apiCreateUploadURL(c context.Context, payload io.Reader) (interface{}, erro
return fmt.Sprintf("%s/%s.upload", bucket, uuid.New().String()), nil
}
+func apiSendEmail(c context.Context, payload io.Reader) (interface{}, error) {
+ req := new(dashapi.SendEmailReq)
+ if err := json.NewDecoder(payload).Decode(req); err != nil {
+ return nil, fmt.Errorf("failed to unmarshal request: %w", err)
+ }
+ return nil, sendEmail(c, &aemail.Message{
+ Sender: req.Sender,
+ ReplyTo: req.InReplyTo,
+ To: req.To,
+ Cc: req.Cc,
+ Subject: req.Subject,
+ Body: req.Body,
+ })
+}
+
// apiSaveCoverage reads jsonl data from payload and stores it to coveragedb.
// First payload jsonl line is a coveragedb.HistoryRecord (w/o session and time).
// Second+ records are coveragedb.JSONLWrapper.
diff --git a/dashboard/dashapi/dashapi.go b/dashboard/dashapi/dashapi.go
index 317fcb5a2..1f9dec94d 100644
--- a/dashboard/dashapi/dashapi.go
+++ b/dashboard/dashapi/dashapi.go
@@ -885,6 +885,19 @@ func (dash *Dashboard) UpdateReport(req *UpdateReportReq) error {
return dash.Query("update_report", req, nil)
}
+type SendEmailReq struct {
+ Sender string
+ To []string
+ Cc []string
+ Subject string
+ InReplyTo string
+ Body string
+}
+
+func (dash *Dashboard) SendEmail(req *SendEmailReq) error {
+ return dash.Query("send_email", req, nil)
+}
+
type (
BugStatus int
BugStatusReason string