From 8bbdf829f33f92dcbbb2f31be1a761d61dd29752 Mon Sep 17 00:00:00 2001 From: linoil Date: Sun, 4 Jan 2026 22:10:02 +0800 Subject: [PATCH 1/8] build: upgrade summer to 64ca449 for new logic --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 8268bf51..39f39bc5 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.2 toolchain go1.24.3 require ( - github.com/NYCU-SDC/summer v1.0.0-test + github.com/NYCU-SDC/summer v1.0.0-test.0.20260104132755-64ca4493a968 github.com/brianvoe/gofakeit/v7 v7.7.3 github.com/go-playground/validator/v10 v10.26.0 github.com/golang-jwt/jwt/v5 v5.2.2 diff --git a/go.sum b/go.sum index 5def46c7..7a461629 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYCU-SDC/summer v1.0.0-test h1:ezpNgVKD62dFXLZ8dL/o+Ii4Qh0KM/EZNeivknGV/V4= github.com/NYCU-SDC/summer v1.0.0-test/go.mod h1:v4hv+B6ePNcEItb8oaVQRyN6hvlpj9cgwGoCgD1izyc= +github.com/NYCU-SDC/summer v1.0.0-test.0.20260104132755-64ca4493a968 h1:7g2FejFQsHhjiVWmZAuqbHTR6L2o2UFhcHG6iledKn8= +github.com/NYCU-SDC/summer v1.0.0-test.0.20260104132755-64ca4493a968/go.mod h1:v4hv+B6ePNcEItb8oaVQRyN6hvlpj9cgwGoCgD1izyc= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/brianvoe/gofakeit/v7 v7.7.3 h1:RWOATEGpJ5EVg2nN8nlaEyaV/aB4d6c3GqYrbqQekss= From c4371539e4c5e94647dc04e4172b391ed65b203b Mon Sep 17 00:00:00 2001 From: linoil Date: Sun, 4 Jan 2026 22:14:21 +0800 Subject: [PATCH 2/8] refactor: align middleware with updated summer --- internal/trace/middleware.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/trace/middleware.go b/internal/trace/middleware.go index 75f7f73d..2b12c75b 100644 --- a/internal/trace/middleware.go +++ b/internal/trace/middleware.go @@ -20,7 +20,7 @@ func NewMiddleware(logger *zap.Logger, debug bool) *Middleware { } func (m Middleware) TraceMiddleware(next http.HandlerFunc) http.HandlerFunc { - return traceutil.TraceMiddleware(next, m.logger) + return traceutil.TraceMiddleware(next, m.logger, m.debug) } func (m Middleware) RecoverMiddleware(next http.HandlerFunc) http.HandlerFunc { From 62439a711a778c7e3d6cb1d3aaa471e388eeaeb4 Mon Sep 17 00:00:00 2001 From: linoil Date: Sun, 4 Jan 2026 22:35:24 +0800 Subject: [PATCH 3/8] feat: apply database and business logic flow logging best practices to form and publish --- internal/distribute/service.go | 40 ++++++++------- internal/form/service.go | 71 +++++++++++++++++++++++--- internal/inbox/service.go | 42 +++++++++++++--- internal/publish/service.go | 91 ++++++++++++++++++++++++---------- internal/unit/member.go | 26 ++++++---- 5 files changed, 201 insertions(+), 69 deletions(-) diff --git a/internal/distribute/service.go b/internal/distribute/service.go index bbed1915..b3a30bee 100644 --- a/internal/distribute/service.go +++ b/internal/distribute/service.go @@ -1,11 +1,11 @@ package distribute import ( - "NYCU-SDC/core-system-backend/internal" - "NYCU-SDC/core-system-backend/internal/user" "context" + "fmt" + + "NYCU-SDC/core-system-backend/internal/user" - databaseutil "github.com/NYCU-SDC/summer/pkg/database" logutil "github.com/NYCU-SDC/summer/pkg/log" "github.com/google/uuid" "go.opentelemetry.io/otel" @@ -36,18 +36,14 @@ func NewService(logger *zap.Logger, store UnitStore) *Service { func (s *Service) GetOrgRecipients(ctx context.Context, orgID uuid.UUID) ([]uuid.UUID, error) { traceCtx, span := s.tracer.Start(ctx, "GetOrgRecipients") defer span.End() - logger := internal.WithContext(traceCtx, s.logger) recipients, err := s.store.ListMembers(traceCtx, orgID) if err != nil { - return nil, err + wrappedErr := fmt.Errorf("failed to fetch org members: %w", err) + span.RecordError(wrappedErr) + return nil, wrappedErr } - logger.Debug("Organization recipients resolved", - zap.String("org_id", orgID.String()), - zap.Int("recipients_count", len(recipients)), - ) - ids := make([]uuid.UUID, 0, len(recipients)) for _, r := range recipients { ids = append(ids, r.ID) @@ -57,23 +53,32 @@ func (s *Service) GetOrgRecipients(ctx context.Context, orgID uuid.UUID) ([]uuid } func (s *Service) GetRecipients(ctx context.Context, unitIDs []uuid.UUID) ([]uuid.UUID, error) { - ctx, span := s.tracer.Start(ctx, "GetRecipients") + methodName := "GetRecipients" + ctx, span := s.tracer.Start(ctx, methodName) defer span.End() logger := logutil.WithContext(ctx, s.logger) + tracker := logutil.StartMethod(ctx, logger, methodName, map[string]interface{}{ + "unitIDs": len(unitIDs), + }) + all := make([]uuid.UUID, 0) memberMap, err := s.store.ListUnitsMembers(ctx, unitIDs) if err != nil { - err = databaseutil.WrapDBError(err, logger, "list units members") - span.RecordError(err) - return nil, err + wrappedErr := fmt.Errorf("failed to fetch unit members: %w", err) + span.RecordError(wrappedErr) + return nil, wrappedErr } for _, ms := range memberMap { all = append(all, ms...) } + logger.Debug("Processing recipients calculation", + zap.Int("raw_total_count", len(all)), + ) + seen := make(map[uuid.UUID]struct{}, len(all)) uniq := make([]uuid.UUID, 0, len(all)) for _, id := range all { @@ -84,10 +89,9 @@ func (s *Service) GetRecipients(ctx context.Context, unitIDs []uuid.UUID) ([]uui uniq = append(uniq, id) } - logger.Debug("Recipients resolved", - zap.Int("unit_count", len(unitIDs)), - zap.Int("unique_recipients", len(uniq)), - ) + tracker.Complete(map[string]interface{}{ + "recipients_count": len(uniq), + }) return uniq, nil } diff --git a/internal/form/service.go b/internal/form/service.go index 5c05c0b4..81666138 100644 --- a/internal/form/service.go +++ b/internal/form/service.go @@ -48,6 +48,15 @@ func (s *Service) Create(ctx context.Context, req Request, unitID uuid.UUID, use deadline = pgtype.Timestamptz{Valid: false} } + dbParams := map[string]interface{}{ + "title": req.Title, + "description": req.Description, + "preview_message": req.PreviewMessage, + "unit_id": unitID.String(), + "last_editor": userID.String(), + } + tracker := logutil.StartDBOperation(ctx, logger, "Create", dbParams) + newForm, err := s.queries.Create(ctx, CreateParams{ Title: req.Title, Description: pgtype.Text{String: req.Description, Valid: true}, @@ -57,11 +66,13 @@ func (s *Service) Create(ctx context.Context, req Request, unitID uuid.UUID, use Deadline: deadline, }) if err != nil { - err = databaseutil.WrapDBError(err, logger, "create form") + err = databaseutil.WrapDBErrorWithTracker(err, tracker, "create form") span.RecordError(err) return CreateRow{}, err } + tracker.SuccessWrite(newForm.ID.String()) + return newForm, nil } @@ -77,6 +88,15 @@ func (s *Service) Update(ctx context.Context, id uuid.UUID, request Request, use deadline = pgtype.Timestamptz{Valid: false} } + dbParams := map[string]interface{}{ + "id": id.String(), + "title": request.Title, + "description": request.Description, + "preview_message": request.PreviewMessage, + "last_editor": userID.String(), + } + tracker := logutil.StartDBOperation(ctx, logger, "Update", dbParams) + updatedForm, err := s.queries.Update(ctx, UpdateParams{ ID: id, Title: request.Title, @@ -86,11 +106,13 @@ func (s *Service) Update(ctx context.Context, id uuid.UUID, request Request, use Deadline: deadline, }) if err != nil { - err = databaseutil.WrapDBError(err, logger, "update form") + err = databaseutil.WrapDBErrorWithTracker(err, tracker, "update form") span.RecordError(err) return UpdateRow{}, err } + tracker.SuccessWrite(id.String()) + return updatedForm, nil } @@ -99,28 +121,41 @@ func (s *Service) Delete(ctx context.Context, id uuid.UUID) error { defer span.End() logger := logutil.WithContext(ctx, s.logger) + dbParams := map[string]interface{}{ + "id": id.String(), + } + tracker := logutil.StartDBOperation(ctx, logger, "Delete", dbParams) + err := s.queries.Delete(ctx, id) if err != nil { - err = databaseutil.WrapDBError(err, logger, "delete form") + err = databaseutil.WrapDBErrorWithTracker(err, tracker, "delete form") span.RecordError(err) return err } + tracker.SuccessWrite(id.String()) return nil } func (s *Service) GetByID(ctx context.Context, id uuid.UUID) (GetByIDRow, error) { - ctx, span := s.tracer.Start(ctx, "GetFormByID") + ctx, span := s.tracer.Start(ctx, "GetByID") defer span.End() logger := logutil.WithContext(ctx, s.logger) + dbParams := map[string]interface{}{ + "id": id.String(), + } + tracker := logutil.StartDBOperation(ctx, logger, "GetByID", dbParams) + currentForm, err := s.queries.GetByID(ctx, id) if err != nil { - err = databaseutil.WrapDBError(err, logger, "get form by id") + err = databaseutil.WrapDBErrorWithTracker(err, tracker, "get form by id") span.RecordError(err) return GetByIDRow{}, err } + tracker.SuccessRead(1, id.String()) + return currentForm, nil } @@ -129,13 +164,17 @@ func (s *Service) List(ctx context.Context) ([]ListRow, error) { defer span.End() logger := logutil.WithContext(ctx, s.logger) + tracker := logutil.StartDBOperation(ctx, logger, "List", nil) + forms, err := s.queries.List(ctx) if err != nil { - err = databaseutil.WrapDBError(err, logger, "list forms") + err = databaseutil.WrapDBErrorWithTracker(err, tracker, "list forms") span.RecordError(err) return []ListRow{}, err } + tracker.SuccessRead(len(forms), "") + return forms, nil } @@ -144,13 +183,20 @@ func (s *Service) ListByUnit(ctx context.Context, unitID uuid.UUID) ([]ListByUni defer span.End() logger := logutil.WithContext(ctx, s.logger) + dbParams := map[string]interface{}{ + "unit_id": unitID.String(), + } + tracker := logutil.StartDBOperation(ctx, logger, "ListByUnit", dbParams) + forms, err := s.queries.ListByUnit(ctx, pgtype.UUID{Bytes: unitID, Valid: true}) if err != nil { - err = databaseutil.WrapDBError(err, logger, "list forms by unit") + err = databaseutil.WrapDBErrorWithTracker(err, tracker, "list forms by unit") span.RecordError(err) return []ListByUnitRow{}, err } + tracker.SuccessRead(len(forms), unitID.String()) + return forms, nil } @@ -159,16 +205,25 @@ func (s *Service) SetStatus(ctx context.Context, id uuid.UUID, status Status, us defer span.End() logger := logutil.WithContext(ctx, s.logger) + dbParams := map[string]interface{}{ + "id": id.String(), + "status": string(status), + "last_editor": userID.String(), + } + tracker := logutil.StartDBOperation(ctx, logger, "SetStatus", dbParams) + updated, err := s.queries.SetStatus(ctx, SetStatusParams{ ID: id, Status: status, LastEditor: userID, }) if err != nil { - err = databaseutil.WrapDBError(err, logger, "set form status") + err = databaseutil.WrapDBErrorWithTracker(err, tracker, "set form status") span.RecordError(err) return Form{}, err } + tracker.SuccessWrite(id.String()) + return updated, nil } diff --git a/internal/inbox/service.go b/internal/inbox/service.go index 7adef882..31a65fc4 100644 --- a/internal/inbox/service.go +++ b/internal/inbox/service.go @@ -45,31 +45,61 @@ func (s *Service) Create(ctx context.Context, contentType ContentType, contentID defer span.End() logger := logutil.WithContext(traceCtx, s.logger) + serviceName := "Create" + + entryParams := map[string]interface{}{ + "content_type": contentType, + "content_id": contentID.String(), + "posted_by": postByUnitID.String(), + "recipient_count": len(userIDs), + } + tracker := logutil.StartMethod(traceCtx, logger, serviceName, entryParams) + + dbParamsMsg := map[string]interface{}{ + "type": contentType, + "content_id": contentID.String(), + "posted_by": postByUnitID.String(), + } + dbOpMsg := "CreateMessage" + msgDBTracker := logutil.StartDBOperation(traceCtx, logger, dbOpMsg, dbParamsMsg) + message, err := s.queries.CreateMessage(traceCtx, CreateMessageParams{ Type: contentType, ContentID: contentID, PostedBy: postByUnitID, }) + if err != nil { - err = databaseutil.WrapDBError(err, logger, "create inbox message") + err = databaseutil.WrapDBErrorWithTracker(err, msgDBTracker, "create inbox message") span.RecordError(err) return uuid.Nil, err } + msgDBTracker.SuccessWrite(message.ID.String()) + + dbParamsBulk := map[string]interface{}{ + "user_ids": userIDs, + "message_id": message.ID.String(), + } + dbOpBulk := "CreateUserInboxBulk" + bulkDBTracker := logutil.StartDBOperation(traceCtx, logger, dbOpBulk, dbParamsBulk) _, err = s.queries.CreateUserInboxBulk(traceCtx, CreateUserInboxBulkParams{ UserIds: userIDs, MessageID: message.ID, }) + if err != nil { - err = databaseutil.WrapDBError(err, logger, "create user inbox messages in bulk") + err = databaseutil.WrapDBErrorWithTracker(err, bulkDBTracker, "create user inbox messages in bulk") span.RecordError(err) return uuid.Nil, err } - logger.Info("Created inbox message", - zap.String("message_id", message.ID.String()), - zap.Int("recipients", len(userIDs)), - ) + bulkDBTracker.SuccessWriteBulk(len(userIDs)) + + tracker.Complete(map[string]interface{}{ + "message_id": message.ID.String(), + "recipient_count": len(userIDs), + }) return message.ID, nil } diff --git a/internal/publish/service.go b/internal/publish/service.go index b198ba7d..3b082e47 100644 --- a/internal/publish/service.go +++ b/internal/publish/service.go @@ -1,11 +1,12 @@ package publish import ( + "context" + "fmt" + "NYCU-SDC/core-system-backend/internal" "NYCU-SDC/core-system-backend/internal/inbox" - "context" - databaseutil "github.com/NYCU-SDC/summer/pkg/database" logutil "github.com/NYCU-SDC/summer/pkg/log" "NYCU-SDC/core-system-backend/internal/form" @@ -59,49 +60,82 @@ func NewService( } func (s *Service) GetRecipients(ctx context.Context, selection Selection) ([]uuid.UUID, error) { - ctx, span := s.tracer.Start(ctx, "GetRecipients") + methodName := "GetRecipients" + ctx, span := s.tracer.Start(ctx, methodName) defer span.End() logger := logutil.WithContext(ctx, s.logger) + tracker := logutil.StartMethod(ctx, logger, methodName, map[string]interface{}{ + "selection": selection, + }, + ) + var users []uuid.UUID if selection.OrgID != uuid.Nil { orgUsers, err := s.distributor.GetOrgRecipients(ctx, selection.OrgID) if err != nil { - err = databaseutil.WrapDBError(err, logger, "getting org recipients") - span.RecordError(err) - return nil, err + wrappedErr := fmt.Errorf("failed to resolve org recipients: %w", err) + span.RecordError(wrappedErr) + return nil, wrappedErr } + + logger.Debug("Retrieved org recipients", + zap.String("org_id", selection.OrgID.String()), + zap.Int("recipient_count", len(orgUsers)), + ) users = append(users, orgUsers...) } else if len(selection.UnitIDs) > 0 { unitUsers, err := s.distributor.GetRecipients(ctx, selection.UnitIDs) if err != nil { - err = databaseutil.WrapDBError(err, logger, "getting unit recipients") - span.RecordError(err) - return nil, err + wrappedErr := fmt.Errorf("failed to resolve unit recipients: %w", err) + span.RecordError(wrappedErr) + return nil, wrappedErr } + + logger.Debug("Retrieved unit recipients", + zap.Int("unit_count", len(selection.UnitIDs)), + zap.Int("recipient_count", len(unitUsers)), + ) users = append(users, unitUsers...) } // can add some verify method here + tracker.Complete(map[string]interface{}{ + "recipient_count": len(users), + }) + return users, nil } // PublishForm not Publish is because maybe we will publish something else in future func (s *Service) PublishForm(ctx context.Context, formID uuid.UUID, unitIDs []uuid.UUID, editor uuid.UUID) error { - ctx, span := s.tracer.Start(ctx, "PublishForm") + methodName := "PublishForm" + ctx, span := s.tracer.Start(ctx, methodName) defer span.End() logger := logutil.WithContext(ctx, s.logger) + params := map[string]interface{}{ + "form_id": formID.String(), + "editor": editor.String(), + "unit_ids_count": len(unitIDs), + } + tracker := logutil.StartMethod(ctx, logger, methodName, params) + // check form existence and status targetForm, err := s.store.GetByID(ctx, formID) if err != nil { - err = databaseutil.WrapDBError(err, logger, "getting form by id") - span.RecordError(err) - return err + wrappedErr := fmt.Errorf("failed to retrieve target form: %w", err) + span.RecordError(wrappedErr) + return wrappedErr } if targetForm.Status != form.StatusDraft { + logger.Warn("Form is not in draft status", + zap.String("form_id", formID.String()), + zap.String("current_status", string(targetForm.Status)), + zap.String("expected_status", string(form.StatusDraft)), + ) err = internal.ErrFormNotDraft span.RecordError(err) return err @@ -109,9 +143,9 @@ func (s *Service) PublishForm(ctx context.Context, formID uuid.UUID, unitIDs []u _, err = s.store.SetStatus(ctx, formID, form.StatusPublished, editor) if err != nil { - err = databaseutil.WrapDBError(err, logger, "setting form status = published") - span.RecordError(err) - return err + wrappedErr := fmt.Errorf("failed to update form status: %w", err) + span.RecordError(wrappedErr) + return wrappedErr } unitID, err := uuid.Parse(targetForm.UnitID.String()) @@ -125,21 +159,26 @@ func (s *Service) PublishForm(ctx context.Context, formID uuid.UUID, unitIDs []u UnitIDs: unitIDs, }) if err != nil { - span.RecordError(err) - return err + wrappedErr := fmt.Errorf("failed to calculate recipient list: %w", err) + span.RecordError(wrappedErr) + return wrappedErr } + logger.Debug("Recipients retrieved for form publish", + zap.String("form_id", formID.String()), + zap.Int("recipient_count", len(recipientIDs)), + zap.Int("unit_count", len(unitIDs)), + ) + _, err = s.inbox.Create(ctx, inbox.ContentTypeForm, formID, recipientIDs, unitID) if err != nil { - err = databaseutil.WrapDBError(err, logger, "creating inbox messages for published form") - span.RecordError(err) - return err + wrappedErr := fmt.Errorf("failed to dispatch inbox notifications: %w", err) + span.RecordError(wrappedErr) + return wrappedErr } - logger.Info("Form published", - zap.String("form_id", formID.String()), - zap.Int("recipients", len(unitIDs)), - zap.String("editor", editor.String()), - ) + tracker.Complete(map[string]interface{}{ + "recipient_count": len(recipientIDs), + }) return nil } diff --git a/internal/unit/member.go b/internal/unit/member.go index 3a20a99d..b7fba8bf 100644 --- a/internal/unit/member.go +++ b/internal/unit/member.go @@ -42,12 +42,18 @@ func (s *Service) ListMembers(ctx context.Context, id uuid.UUID) ([]user.Profile defer span.End() logger := logutil.WithContext(traceCtx, s.logger) + dbParams := map[string]interface{}{ + "id": id, + } + tracker := logutil.StartDBOperation(traceCtx, logger, "ListMembers", dbParams) + members, err := s.queries.ListMembers(traceCtx, id) if err != nil { - err = databaseutil.WrapDBError(err, logger, "list members") + err = databaseutil.WrapDBErrorWithTracker(err, tracker, "list members") span.RecordError(err) return nil, err } + tracker.SuccessRead(len(members), id.String()) if members == nil { members = []ListMembersRow{} @@ -64,11 +70,6 @@ func (s *Service) ListMembers(ctx context.Context, id uuid.UUID) ([]user.Profile }) } - logger.Info("Listed unit members", - zap.String("id", id.String()), - zap.Int("count", len(profiles)), - ) - return profiles, nil } @@ -83,21 +84,24 @@ func (s *Service) ListUnitsMembers(ctx context.Context, unitIDs []uuid.UUID) (ma return membersMap, nil } + dbParams := map[string]interface{}{ + "unit_ids": unitIDs, + } + tracker := logutil.StartDBOperation(traceCtx, logger, "ListUnitsMembers", dbParams) + rows, err := s.queries.ListUnitsMembers(traceCtx, unitIDs) if err != nil { - err = databaseutil.WrapDBError(err, logger, "list multiple unit members") + err = databaseutil.WrapDBErrorWithTracker(err, tracker, "list multiple unit members") span.RecordError(err) return nil, err } + tracker.SuccessRead(len(rows), "") + for _, row := range rows { membersMap[row.UnitID] = append(membersMap[row.UnitID], row.MemberID) } - logger.Info("Listed multiple unit members", - zap.Int("unit_count", len(membersMap)), - zap.String("unit_ids", fmt.Sprintf("%v", unitIDs))) - return membersMap, nil } From 4d2cc025ed9b4685f57b8ee4e1b85ad92cf89c46 Mon Sep 17 00:00:00 2001 From: linoil Date: Mon, 19 Jan 2026 18:03:15 +0800 Subject: [PATCH 4/8] feat: remove redundant business logic logging --- internal/publish/service.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/internal/publish/service.go b/internal/publish/service.go index 3b082e47..dd4f197c 100644 --- a/internal/publish/service.go +++ b/internal/publish/service.go @@ -79,10 +79,6 @@ func (s *Service) GetRecipients(ctx context.Context, selection Selection) ([]uui return nil, wrappedErr } - logger.Debug("Retrieved org recipients", - zap.String("org_id", selection.OrgID.String()), - zap.Int("recipient_count", len(orgUsers)), - ) users = append(users, orgUsers...) } else if len(selection.UnitIDs) > 0 { unitUsers, err := s.distributor.GetRecipients(ctx, selection.UnitIDs) @@ -92,10 +88,6 @@ func (s *Service) GetRecipients(ctx context.Context, selection Selection) ([]uui return nil, wrappedErr } - logger.Debug("Retrieved unit recipients", - zap.Int("unit_count", len(selection.UnitIDs)), - zap.Int("recipient_count", len(unitUsers)), - ) users = append(users, unitUsers...) } @@ -164,12 +156,6 @@ func (s *Service) PublishForm(ctx context.Context, formID uuid.UUID, unitIDs []u return wrappedErr } - logger.Debug("Recipients retrieved for form publish", - zap.String("form_id", formID.String()), - zap.Int("recipient_count", len(recipientIDs)), - zap.Int("unit_count", len(unitIDs)), - ) - _, err = s.inbox.Create(ctx, inbox.ContentTypeForm, formID, recipientIDs, unitID) if err != nil { wrappedErr := fmt.Errorf("failed to dispatch inbox notifications: %w", err) From 657f724b441acb3e864b4fbeab890d73a2cdbb44 Mon Sep 17 00:00:00 2001 From: linoil Date: Sat, 24 Jan 2026 08:14:32 +0800 Subject: [PATCH 5/8] refactor: pass complete method parameters to logutil.StartMethod --- internal/distribute/service.go | 2 +- internal/publish/service.go | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/internal/distribute/service.go b/internal/distribute/service.go index b3a30bee..3274561b 100644 --- a/internal/distribute/service.go +++ b/internal/distribute/service.go @@ -59,7 +59,7 @@ func (s *Service) GetRecipients(ctx context.Context, unitIDs []uuid.UUID) ([]uui logger := logutil.WithContext(ctx, s.logger) tracker := logutil.StartMethod(ctx, logger, methodName, map[string]interface{}{ - "unitIDs": len(unitIDs), + "unit_ids": unitIDs, }) all := make([]uuid.UUID, 0) diff --git a/internal/publish/service.go b/internal/publish/service.go index dd4f197c..2f9073ad 100644 --- a/internal/publish/service.go +++ b/internal/publish/service.go @@ -107,12 +107,11 @@ func (s *Service) PublishForm(ctx context.Context, formID uuid.UUID, unitIDs []u defer span.End() logger := logutil.WithContext(ctx, s.logger) - params := map[string]interface{}{ - "form_id": formID.String(), - "editor": editor.String(), - "unit_ids_count": len(unitIDs), - } - tracker := logutil.StartMethod(ctx, logger, methodName, params) + tracker := logutil.StartMethod(ctx, logger, methodName, map[string]interface{}{ + "form_id": formID.String(), + "editor": editor.String(), + "unit_ids": unitIDs, + }) // check form existence and status targetForm, err := s.store.GetByID(ctx, formID) From 6927b2c723b8cf18072eec9b17605d1316b2ffc3 Mon Sep 17 00:00:00 2001 From: linoil Date: Sat, 24 Jan 2026 08:18:04 +0800 Subject: [PATCH 6/8] build: update summer to 18cc2af --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 39f39bc5..94ce7497 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.2 toolchain go1.24.3 require ( - github.com/NYCU-SDC/summer v1.0.0-test.0.20260104132755-64ca4493a968 + github.com/NYCU-SDC/summer v1.0.0-test.0.20260124001003-18cc2af41c9b github.com/brianvoe/gofakeit/v7 v7.7.3 github.com/go-playground/validator/v10 v10.26.0 github.com/golang-jwt/jwt/v5 v5.2.2 From d3cba1b67632d96bb74dedaf9ef92c6b17627127 Mon Sep 17 00:00:00 2001 From: linoil Date: Sat, 24 Jan 2026 08:34:43 +0800 Subject: [PATCH 7/8] chore: update go.sum --- go.sum | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.sum b/go.sum index 7a461629..9ce2a810 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYCU-SDC/summer v1.0.0-test h1:ezpNgVKD62dFXLZ8dL/o+Ii4Qh0KM/EZNeivknGV/V4= github.com/NYCU-SDC/summer v1.0.0-test/go.mod h1:v4hv+B6ePNcEItb8oaVQRyN6hvlpj9cgwGoCgD1izyc= -github.com/NYCU-SDC/summer v1.0.0-test.0.20260104132755-64ca4493a968 h1:7g2FejFQsHhjiVWmZAuqbHTR6L2o2UFhcHG6iledKn8= -github.com/NYCU-SDC/summer v1.0.0-test.0.20260104132755-64ca4493a968/go.mod h1:v4hv+B6ePNcEItb8oaVQRyN6hvlpj9cgwGoCgD1izyc= +github.com/NYCU-SDC/summer v1.0.0-test.0.20260124001003-18cc2af41c9b h1:RYMzN9ueotWNXvjhcdUwTh0PxjeXZ/YlK+ouIQ0+sh0= +github.com/NYCU-SDC/summer v1.0.0-test.0.20260124001003-18cc2af41c9b/go.mod h1:v4hv+B6ePNcEItb8oaVQRyN6hvlpj9cgwGoCgD1izyc= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/brianvoe/gofakeit/v7 v7.7.3 h1:RWOATEGpJ5EVg2nN8nlaEyaV/aB4d6c3GqYrbqQekss= From 22c860531c3a8bb560b9f5641b59852918c25b65 Mon Sep 17 00:00:00 2001 From: linoil Date: Sat, 24 Jan 2026 11:58:23 +0800 Subject: [PATCH 8/8] build: update summer version to 99432ce --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 94ce7497..8bc09f14 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.2 toolchain go1.24.3 require ( - github.com/NYCU-SDC/summer v1.0.0-test.0.20260124001003-18cc2af41c9b + github.com/NYCU-SDC/summer v1.0.0-test.0.20260124035608-99432ce125c2 github.com/brianvoe/gofakeit/v7 v7.7.3 github.com/go-playground/validator/v10 v10.26.0 github.com/golang-jwt/jwt/v5 v5.2.2 diff --git a/go.sum b/go.sum index 9ce2a810..6ac1e687 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYCU-SDC/summer v1.0.0-test h1:ezpNgVKD62dFXLZ8dL/o+Ii4Qh0KM/EZNeivknGV/V4= github.com/NYCU-SDC/summer v1.0.0-test/go.mod h1:v4hv+B6ePNcEItb8oaVQRyN6hvlpj9cgwGoCgD1izyc= -github.com/NYCU-SDC/summer v1.0.0-test.0.20260124001003-18cc2af41c9b h1:RYMzN9ueotWNXvjhcdUwTh0PxjeXZ/YlK+ouIQ0+sh0= -github.com/NYCU-SDC/summer v1.0.0-test.0.20260124001003-18cc2af41c9b/go.mod h1:v4hv+B6ePNcEItb8oaVQRyN6hvlpj9cgwGoCgD1izyc= +github.com/NYCU-SDC/summer v1.0.0-test.0.20260124035608-99432ce125c2 h1:xGXxZ81gCWjLGBslQT4MvWqrFSXV3Y2ILQvkYgM4Haw= +github.com/NYCU-SDC/summer v1.0.0-test.0.20260124035608-99432ce125c2/go.mod h1:v4hv+B6ePNcEItb8oaVQRyN6hvlpj9cgwGoCgD1izyc= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/brianvoe/gofakeit/v7 v7.7.3 h1:RWOATEGpJ5EVg2nN8nlaEyaV/aB4d6c3GqYrbqQekss=