From 53accc3e3faa8d4cc81353b9cad9f43657466b1e Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Mon, 21 Sep 2026 11:02:36 +0800 Subject: [PATCH] fix: hydrate meeting note file uploader --- internal/httpapi/payload.go | 2 +- internal/httpapi/payload_userid_test.go | 22 +++++++++++++++ internal/store/mysql.go | 36 +++++++++++++++++++++++++ internal/store/types.go | 9 ++++--- 4 files changed, 64 insertions(+), 5 deletions(-) diff --git a/internal/httpapi/payload.go b/internal/httpapi/payload.go index 151c488..abad099 100644 --- a/internal/httpapi/payload.go +++ b/internal/httpapi/payload.go @@ -335,7 +335,7 @@ func meetingNoteFilePayload(file store.MeetingNoteFile, viewer int64) map[string "preview_mode": file.PreviewMode, "preview_file_id": file.PreviewFileID, "uploader_user_id": formatUserID(file.UploaderID), - "uploader": userSummary(file.UploaderID, store.UserSummary{}), + "uploader": userSummary(file.UploaderID, file.Uploader), "version": file.Version, "permissions": map[string]any{ "can_preview": file.Status == "active", diff --git a/internal/httpapi/payload_userid_test.go b/internal/httpapi/payload_userid_test.go index 8ec942a..b815e4d 100644 --- a/internal/httpapi/payload_userid_test.go +++ b/internal/httpapi/payload_userid_test.go @@ -115,6 +115,28 @@ func TestMeetingNoteFilePayloadKeepsOriginalNameAndExtension(t *testing.T) { } } +func TestMeetingNoteFilePayloadUsesUploaderSummary(t *testing.T) { + now := time.Date(2026, 9, 17, 12, 0, 0, 0, time.UTC) + payload := meetingNoteFilePayload(store.MeetingNoteFile{ + NoteFileID: "mnote_1", + UploaderID: 1573637795346386944, + Uploader: store.UserSummary{ + UserID: 1573637795346386944, + DisplayName: "jcharles3", + }, + Status: "active", + CreatedAt: now, + UpdatedAt: now, + }, 1573637795346386944) + uploader, ok := payload["uploader"].(map[string]any) + if !ok { + t.Fatalf("uploader=%#v", payload["uploader"]) + } + if uploader["display_name"] != "jcharles3" { + t.Fatalf("uploader.display_name=%v, want jcharles3", uploader["display_name"]) + } +} + func assertNoNumericUserIDs(t *testing.T, value any) { t.Helper() switch typed := value.(type) { diff --git a/internal/store/mysql.go b/internal/store/mysql.go index c1ed036..97b9dc5 100644 --- a/internal/store/mysql.go +++ b/internal/store/mysql.go @@ -622,6 +622,9 @@ func (s *Store) MeetingNoteFiles(ctx context.Context, userID int64, meetingID st FROM im_meeting_note_files WHERE meeting_id=? AND status='active' ORDER BY id DESC`, meetingID); err != nil { return nil, err } + if err := s.hydrateMeetingNoteFilesUploaders(ctx, files); err != nil { + return nil, err + } return files, nil } @@ -1327,9 +1330,42 @@ func (s *Store) meetingNoteFile(ctx context.Context, meetingID, noteFileID strin } return nil, err } + if err := s.hydrateMeetingNoteFileUploader(ctx, &file); err != nil { + return nil, err + } return &file, nil } +func (s *Store) hydrateMeetingNoteFileUploader(ctx context.Context, file *MeetingNoteFile) error { + if file == nil { + return nil + } + summaries, err := s.UserSummaries(ctx, []int64{file.UploaderID}) + if err != nil { + return err + } + file.Uploader = summaryOrDefault(file.UploaderID, summaries) + return nil +} + +func (s *Store) hydrateMeetingNoteFilesUploaders(ctx context.Context, files []MeetingNoteFile) error { + if len(files) == 0 { + return nil + } + userIDs := make([]int64, 0, len(files)) + for _, file := range files { + userIDs = append(userIDs, file.UploaderID) + } + summaries, err := s.UserSummaries(ctx, userIDs) + if err != nil { + return err + } + for i := range files { + files[i].Uploader = summaryOrDefault(files[i].UploaderID, summaries) + } + return nil +} + func meetingVisible(meeting Meeting, userID int64) bool { if meeting.OrganizerID == userID || meeting.RecorderID == userID { return true diff --git a/internal/store/types.go b/internal/store/types.go index 475a560..e0d1216 100644 --- a/internal/store/types.go +++ b/internal/store/types.go @@ -148,10 +148,11 @@ type MeetingParticipant struct { } type MeetingNoteFile struct { - NoteFileID string `db:"note_file_id"` - MeetingID string `db:"meeting_id"` - FileID string `db:"file_id"` - UploaderID int64 `db:"uploader_id"` + NoteFileID string `db:"note_file_id"` + MeetingID string `db:"meeting_id"` + FileID string `db:"file_id"` + UploaderID int64 `db:"uploader_id"` + Uploader UserSummary FileName string `db:"file_name"` MIMEType string `db:"mime_type"` FileSize int64 `db:"file_size"`