0
0
mirror of https://github.com/go-gitea/gitea.git synced 2026-06-29 20:46:36 +02:00

fix ctx and doer

This commit is contained in:
wxiaoguang 2026-02-22 13:30:48 +08:00
parent 500445c170
commit fb5a42bb92
4 changed files with 59 additions and 51 deletions

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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)
}
}