From 2d7f57714b3b95f27c3159f02b33e17b816f7178 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 2 Jul 2025 17:30:28 +0200 Subject: dashboard: add send_email method The API method can be used to send a raw email on behalf of the GAE instance. --- dashboard/app/api.go | 17 +++++++++++++++++ dashboard/dashapi/dashapi.go | 13 +++++++++++++ 2 files changed, 30 insertions(+) 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 -- cgit mrf-deployment