diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2025-07-02 17:30:28 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2025-07-03 09:04:38 +0000 |
| commit | 2d7f57714b3b95f27c3159f02b33e17b816f7178 (patch) | |
| tree | 9eef9952542c01446eed2d48cab78f3ecd40b27e | |
| parent | a0492970c27ad81d0f085e54c30e779f2468c74e (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.go | 17 | ||||
| -rw-r--r-- | dashboard/dashapi/dashapi.go | 13 |
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 |
