From c4a16e3e9ab8addc20b80d44239dba235f66af1e Mon Sep 17 00:00:00 2001 From: Pascal Bleser Date: Thu, 18 Sep 2025 19:15:44 +0200 Subject: [PATCH] refactor(groupware): just use a function for the attachment picker Minor: be more Go idiomatic: just use a function to pick the attachment from an Email's attachment list instead of using an interface with multiple iplementation structs. --- .../pkg/groupware/groupware_api_messages.go | 81 +++++-------------- 1 file changed, 20 insertions(+), 61 deletions(-) diff --git a/services/groupware/pkg/groupware/groupware_api_messages.go b/services/groupware/pkg/groupware/groupware_api_messages.go index 3130ddb093..9ecdb09ff0 100644 --- a/services/groupware/pkg/groupware/groupware_api_messages.go +++ b/services/groupware/pkg/groupware/groupware_api_messages.go @@ -162,78 +162,31 @@ func (g *Groupware) GetEmailsById(w http.ResponseWriter, r *http.Request) { }) } -type attachmentPicker interface { - pick(parts []jmap.EmailBodyPart) *jmap.EmailBodyPart -} - -type partIdAttachmentPicker struct { - partId string -} - -var _ attachmentPicker = partIdAttachmentPicker{} - -func (p partIdAttachmentPicker) pick(parts []jmap.EmailBodyPart) *jmap.EmailBodyPart { - for _, part := range parts { - if part.PartId == p.partId { - return &part - } - } - return nil -} - -type nameAttachmentPicker struct { - name string -} - -var _ attachmentPicker = nameAttachmentPicker{} - -func (p nameAttachmentPicker) pick(parts []jmap.EmailBodyPart) *jmap.EmailBodyPart { - for _, part := range parts { - if part.Name == p.name { - return &part - } - } - return nil -} - -type blobIdAttachmentPicker struct { - blobId string -} - -var _ attachmentPicker = blobIdAttachmentPicker{} - -func (p blobIdAttachmentPicker) pick(parts []jmap.EmailBodyPart) *jmap.EmailBodyPart { - for _, part := range parts { - if part.BlobId == p.blobId { - return &part - } - } - return nil -} - func (g *Groupware) GetEmailAttachments(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, UriParamEmailId) contextAppender := func(l zerolog.Context) zerolog.Context { return l } q := r.URL.Query() - var picker attachmentPicker = nil + var attachmentSelector func(jmap.EmailBodyPart) bool = nil if q.Has(QueryParamPartId) { - str := q.Get(QueryParamPartId) - picker = partIdAttachmentPicker{partId: str} - contextAppender = func(l zerolog.Context) zerolog.Context { return l.Str(QueryParamPartId, log.SafeString(str)) } + partId := q.Get(QueryParamPartId) + attachmentSelector = func(part jmap.EmailBodyPart) bool { return part.PartId == partId } + contextAppender = func(l zerolog.Context) zerolog.Context { return l.Str(QueryParamPartId, log.SafeString(partId)) } } if q.Has(QueryParamAttachmentName) { - str := q.Get(QueryParamAttachmentName) - picker = nameAttachmentPicker{name: str} - contextAppender = func(l zerolog.Context) zerolog.Context { return l.Str(QueryParamAttachmentName, log.SafeString(str)) } + name := q.Get(QueryParamAttachmentName) + attachmentSelector = func(part jmap.EmailBodyPart) bool { return part.Name == name } + contextAppender = func(l zerolog.Context) zerolog.Context { return l.Str(QueryParamAttachmentName, log.SafeString(name)) } } if q.Has(QueryParamAttachmentBlobId) { - str := q.Get(QueryParamAttachmentBlobId) - picker = blobIdAttachmentPicker{blobId: str} - contextAppender = func(l zerolog.Context) zerolog.Context { return l.Str(QueryParamAttachmentBlobId, log.SafeString(str)) } + blobId := q.Get(QueryParamAttachmentBlobId) + attachmentSelector = func(part jmap.EmailBodyPart) bool { return part.BlobId == blobId } + contextAppender = func(l zerolog.Context) zerolog.Context { + return l.Str(QueryParamAttachmentBlobId, log.SafeString(blobId)) + } } - if picker == nil { + if attachmentSelector == nil { g.respond(w, r, func(req Request) Response { accountId, err := req.GetAccountIdForMail() if err != nil { @@ -275,7 +228,13 @@ func (g *Groupware) GetEmailAttachments(w http.ResponseWriter, r *http.Request) } email := emails.Emails[0] - attachment := picker.pick(email.Attachments) + var attachment *jmap.EmailBodyPart = nil + for _, part := range email.Attachments { + if attachmentSelector(part) { + attachment = &part + break + } + } if attachment == nil { return nil }