From fb5a42bb92c3b449bae93a8f21cc5c19d9a7e634 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sun, 22 Feb 2026 13:30:48 +0800 Subject: [PATCH] fix ctx and doer --- models/issues/comment.go | 83 +++++++++++++------------- models/user/user.go | 6 ++ models/user/user_system.go | 2 + services/projects/workflow_notifier.go | 19 +++--- 4 files changed, 59 insertions(+), 51 deletions(-) diff --git a/models/issues/comment.go b/models/issues/comment.go index 60883f1a46..cb1747baf0 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -241,12 +241,6 @@ const ( SpecialDoerNameProjectWorkflow SpecialDoerNameType = "PROJECT_WORKFLOW" ) -type ProjectWorkflowCommentMeta struct { - ProjectTitle string - ProjectWorkflowID int64 - ProjectWorkflowEvent project_model.WorkflowEvent -} - // CommentMetaData stores metadata for a comment, these data will not be changed once inserted into database type CommentMetaData struct { ProjectColumnID int64 `json:"project_column_id,omitempty"` @@ -259,18 +253,25 @@ type CommentMetaData struct { SpecialDoerName SpecialDoerNameType `json:"special_doer_name,omitempty"` // e.g. "CODEOWNERS" for CODEOWNERS-triggered review requests } -type commentMetaDataKey struct{} - -func WithProjectWorkflowCommentMeta(ctx context.Context, meta ProjectWorkflowCommentMeta) context.Context { - if meta.ProjectWorkflowID == 0 { - return ctx - } - return context.WithValue(ctx, commentMetaDataKey{}, meta) +type projectWorkflowDoer struct { + projectTitle string + projectWorkflowID int64 + projectWorkflowEvent project_model.WorkflowEvent } -func getProjectWorkflowCommentMeta(ctx context.Context) (ProjectWorkflowCommentMeta, bool) { - meta, ok := ctx.Value(commentMetaDataKey{}).(ProjectWorkflowCommentMeta) - return meta, ok +func (p projectWorkflowDoer) GetDoerUserID() int64 { + return -1 +} + +func NewProjectWorkflowDoer(title string, workflowID int64, workflowEvent project_model.WorkflowEvent) *user_model.User { + return &user_model.User{ + ID: -1, + ExtDoerData: &projectWorkflowDoer{ + projectTitle: title, + projectWorkflowID: workflowID, + projectWorkflowEvent: workflowEvent, + }, + } } // Comment represents a comment in commit and issue page. @@ -836,6 +837,31 @@ func (c *Comment) TimelineRequestedReviewTr(locale translation.Locale, createdSt return locale.Tr("repo.issues.review.add_review_request", teamName, createdStr) } +func buildCreateCommentMetaData(ctx context.Context, opts *CreateCommentOptions) (commentMetaData *CommentMetaData) { + makeCommentMetaData := func() { + if commentMetaData == nil { + commentMetaData = &CommentMetaData{} + } + } + if opts.ProjectColumnTitle != "" { + makeCommentMetaData() + commentMetaData.ProjectColumnID = opts.ProjectColumnID + commentMetaData.ProjectColumnTitle = opts.ProjectColumnTitle + commentMetaData.ProjectTitle = opts.ProjectTitle + } + if opts.SpecialDoerName != "" { + makeCommentMetaData() + commentMetaData.SpecialDoerName = opts.SpecialDoerName + } + if extDoer, ok := opts.Doer.ExtDoerData.(projectWorkflowDoer); ok { + makeCommentMetaData() + commentMetaData.ProjectWorkflowID = extDoer.projectWorkflowID + commentMetaData.ProjectWorkflowEvent = extDoer.projectWorkflowEvent + commentMetaData.ProjectTitle = extDoer.projectTitle + } + return commentMetaData +} + // CreateComment creates comment with context func CreateComment(ctx context.Context, opts *CreateCommentOptions) (_ *Comment, err error) { return db.WithTx2(ctx, func(ctx context.Context) (*Comment, error) { @@ -844,29 +870,6 @@ func CreateComment(ctx context.Context, opts *CreateCommentOptions) (_ *Comment, LabelID = opts.Label.ID } - var commentMetaData *CommentMetaData - if opts.ProjectColumnTitle != "" { - commentMetaData = &CommentMetaData{ - ProjectColumnID: opts.ProjectColumnID, - ProjectColumnTitle: opts.ProjectColumnTitle, - ProjectTitle: opts.ProjectTitle, - } - } - if opts.SpecialDoerName != "" { - commentMetaData = &CommentMetaData{ - SpecialDoerName: opts.SpecialDoerName, - } - } - if workflowMeta, ok := getProjectWorkflowCommentMeta(ctx); ok { - if commentMetaData == nil { - commentMetaData = &CommentMetaData{} - } - commentMetaData.ProjectWorkflowID = workflowMeta.ProjectWorkflowID - commentMetaData.ProjectWorkflowEvent = workflowMeta.ProjectWorkflowEvent - commentMetaData.ProjectTitle = workflowMeta.ProjectTitle - commentMetaData.SpecialDoerName = SpecialDoerNameProjectWorkflow - } - comment := &Comment{ Type: opts.Type, PosterID: opts.Doer.ID, @@ -900,7 +903,7 @@ func CreateComment(ctx context.Context, opts *CreateCommentOptions) (_ *Comment, RefIsPull: opts.RefIsPull, IsForcePush: opts.IsForcePush, Invalidated: opts.Invalidated, - CommentMetaData: commentMetaData, + CommentMetaData: buildCreateCommentMetaData(ctx, opts), } if err = db.Insert(ctx, comment); err != nil { return nil, err diff --git a/models/user/user.go b/models/user/user.go index f8e8b5c64a..44a2669f76 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -77,6 +77,10 @@ const ( EmailNotificationsAndYourOwn = "andyourown" ) +type ExtDoerData interface { + GetDoerUserID() int64 +} + // User represents the object of individual and member of organization. type User struct { ID int64 `xorm:"pk autoincr"` @@ -151,6 +155,8 @@ type User struct { DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"` Theme string `xorm:"NOT NULL DEFAULT ''"` KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` + + ExtDoerData ExtDoerData } // Meta defines the meta information of a user, to be stored in the K/V table diff --git a/models/user/user_system.go b/models/user/user_system.go index cf4306df25..d2544f100d 100644 --- a/models/user/user_system.go +++ b/models/user/user_system.go @@ -57,12 +57,14 @@ func NewActionsUser() *User { func NewActionsUserWithTaskID(id int64) *User { u := NewActionsUser() // LoginName is for only internal usage in this case, so it can be moved to other fields in the future + // TODO: refactor to u.ExtDoerData u.LoginSource = -1 u.LoginName = "@" + ActionsUserName + "/" + strconv.FormatInt(id, 10) return u } func GetActionsUserTaskID(u *User) (int64, bool) { + // TODO: refactor to u.ExtDoerData if u == nil || u.ID != ActionsUserID { return 0, false } diff --git a/services/projects/workflow_notifier.go b/services/projects/workflow_notifier.go index a77fcd6940..d3b46996ae 100644 --- a/services/projects/workflow_notifier.go +++ b/services/projects/workflow_notifier.go @@ -348,16 +348,13 @@ func executeWorkflowActions(ctx context.Context, workflow *project_model.Workflo if err := workflow.LoadProject(ctx); err != nil { log.Error("LoadProject: %v", err) } - title := "" + + title := "(untitled project)" if workflow.Project != nil { title = workflow.Project.Title } - workflowCtx := issues_model.WithProjectWorkflowCommentMeta(ctx, issues_model.ProjectWorkflowCommentMeta{ - ProjectTitle: title, - ProjectWorkflowID: workflow.ID, - ProjectWorkflowEvent: workflow.WorkflowEvent, - }) - doer := user_model.NewGhostUser() + + doer := issues_model.NewProjectWorkflowDoer(title, workflow.ID, workflow.WorkflowEvent) var toAddedLabels, toRemovedLabels []*issues_model.Label for _, action := range workflow.WorkflowActions { @@ -373,7 +370,7 @@ func executeWorkflowActions(ctx context.Context, workflow *project_model.Workflo log.Error("GetColumnByIDAndProjectID: %v", err) continue } - if err := MoveIssueToAnotherColumn(workflowCtx, doer, issue, column); err != nil { + if err := MoveIssueToAnotherColumn(ctx, doer, issue, column); err != nil { log.Error("MoveIssueToAnotherColumn: %v", err) continue } @@ -404,14 +401,14 @@ func executeWorkflowActions(ctx context.Context, workflow *project_model.Workflo case project_model.WorkflowActionTypeIssueState: if strings.EqualFold(action.Value, "reopen") { if issue.IsClosed { - if err := issue_service.ReopenIssue(workflowCtx, issue, doer, ""); err != nil { + if err := issue_service.ReopenIssue(ctx, issue, doer, ""); err != nil { log.Error("ReopenIssue: %v", err) continue } } } else if strings.EqualFold(action.Value, "close") { if !issue.IsClosed { - if err := issue_service.CloseIssue(workflowCtx, issue, doer, ""); err != nil { + if err := issue_service.CloseIssue(ctx, issue, doer, ""); err != nil { log.Error("CloseIssue: %v", err) continue } @@ -423,7 +420,7 @@ func executeWorkflowActions(ctx context.Context, workflow *project_model.Workflo } if len(toAddedLabels)+len(toRemovedLabels) > 0 { - if err := issue_service.AddRemoveLabels(workflowCtx, issue, doer, toAddedLabels, toRemovedLabels); err != nil { + if err := issue_service.AddRemoveLabels(ctx, issue, doer, toAddedLabels, toRemovedLabels); err != nil { log.Error("AddRemoveLabels: %v", err) } }