From dfa34fc5d3e22fd4e119036def29da6eabd41cb3 Mon Sep 17 00:00:00 2001 From: Oleks Date: Sat, 16 May 2026 00:38:54 +0300 Subject: [PATCH] feat(milestone_events): publish from milestone-counter choke points (service layer to avoid models->services import cycle) --- routers/api/v1/repo/milestone.go | 3 +++ routers/web/repo/milestone.go | 9 ++++++++- services/issue/issue.go | 9 +++++++++ services/issue/milestone.go | 10 ++++++++++ services/issue/status.go | 9 +++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/routers/api/v1/repo/milestone.go b/routers/api/v1/repo/milestone.go index 2cd91b7caf..51bad106a3 100644 --- a/routers/api/v1/repo/milestone.go +++ b/routers/api/v1/repo/milestone.go @@ -17,6 +17,7 @@ import ( "code.gitea.io/gitea/routers/common" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/convert" + milestone_events "code.gitea.io/gitea/services/milestone_events" ) // ListMilestones list milestones for a repository @@ -230,6 +231,7 @@ func EditMilestone(ctx *context.APIContext) { ctx.APIErrorInternal(err) return } + milestone_events.PublishMilestoneProgress(ctx, milestone.ID) ctx.JSON(http.StatusOK, convert.ToAPIMilestone(milestone)) } @@ -269,6 +271,7 @@ func DeleteMilestone(ctx *context.APIContext) { ctx.APIErrorInternal(err) return } + milestone_events.PublishMilestoneDeleted(ctx, ctx.Repo.Repository.ID, m.ID) ctx.Status(http.StatusNoContent) } diff --git a/routers/web/repo/milestone.go b/routers/web/repo/milestone.go index 759b9910d8..32214a4e75 100644 --- a/routers/web/repo/milestone.go +++ b/routers/web/repo/milestone.go @@ -19,6 +19,7 @@ import ( "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/forms" "code.gitea.io/gitea/services/issue" + milestone_events "code.gitea.io/gitea/services/milestone_events" "xorm.io/builder" ) @@ -195,6 +196,8 @@ func EditMilestonePost(ctx *context.Context) { return } + milestone_events.PublishMilestoneProgress(ctx, m.ID) + ctx.Flash.Success(ctx.Tr("repo.milestones.edit_success", m.Name)) ctx.Redirect(ctx.Repo.RepoLink + "/milestones") } @@ -221,14 +224,18 @@ func ChangeMilestoneStatus(ctx *context.Context) { } return } + milestone_events.PublishMilestoneProgress(ctx, id) ctx.JSONRedirect(ctx.Repo.RepoLink + "/milestones?state=" + url.QueryEscape(ctx.PathParam("action"))) } // DeleteMilestone delete a milestone func DeleteMilestone(ctx *context.Context) { - if err := issues_model.DeleteMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, ctx.FormInt64("id")); err != nil { + repoID := ctx.Repo.Repository.ID + milestoneID := ctx.FormInt64("id") + if err := issues_model.DeleteMilestoneByRepoID(ctx, repoID, milestoneID); err != nil { ctx.Flash.Error("DeleteMilestoneByRepoID: " + err.Error()) } else { + milestone_events.PublishMilestoneDeleted(ctx, repoID, milestoneID) ctx.Flash.Success(ctx.Tr("repo.milestones.deletion_success")) } diff --git a/services/issue/issue.go b/services/issue/issue.go index 2bece1c7bb..d2613b5ff3 100644 --- a/services/issue/issue.go +++ b/services/issue/issue.go @@ -19,6 +19,7 @@ import ( "code.gitea.io/gitea/modules/gitrepo" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/storage" + milestone_events "code.gitea.io/gitea/services/milestone_events" notify_service "code.gitea.io/gitea/services/notify" ) @@ -57,6 +58,10 @@ func NewIssue(ctx context.Context, repo *repo_model.Repository, issue *issues_mo return err } + if issue.MilestoneID > 0 { + milestone_events.PublishMilestoneProgress(ctx, issue.MilestoneID) + } + notify_service.NewIssue(ctx, issue, mentions) if len(issue.Labels) > 0 { notify_service.IssueChangeLabels(ctx, issue.Poster, issue, issue.Labels, nil) @@ -160,6 +165,10 @@ func DeleteIssue(ctx context.Context, doer *user_model.User, issue *issues_model } } + if issue.MilestoneID > 0 { + milestone_events.PublishMilestoneProgress(ctx, issue.MilestoneID) + } + notify_service.DeleteIssue(ctx, doer, issue) return nil diff --git a/services/issue/milestone.go b/services/issue/milestone.go index 05aefad752..b12b83037c 100644 --- a/services/issue/milestone.go +++ b/services/issue/milestone.go @@ -11,6 +11,7 @@ import ( "code.gitea.io/gitea/models/db" issues_model "code.gitea.io/gitea/models/issues" user_model "code.gitea.io/gitea/models/user" + milestone_events "code.gitea.io/gitea/services/milestone_events" notify_service "code.gitea.io/gitea/services/notify" ) @@ -75,6 +76,15 @@ func ChangeMilestoneAssign(ctx context.Context, issue *issues_model.Issue, doer return err } + // Both the previous and the new milestone may have had their issue + // counters move; publish progress for each affected milestone. + if oldMilestoneID > 0 { + milestone_events.PublishMilestoneProgress(ctx, oldMilestoneID) + } + if issue.MilestoneID > 0 && issue.MilestoneID != oldMilestoneID { + milestone_events.PublishMilestoneProgress(ctx, issue.MilestoneID) + } + notify_service.IssueChangeMilestone(ctx, doer, issue, oldMilestoneID) return nil } diff --git a/services/issue/status.go b/services/issue/status.go index fa59df93ba..e9325de110 100644 --- a/services/issue/status.go +++ b/services/issue/status.go @@ -10,6 +10,7 @@ import ( issues_model "code.gitea.io/gitea/models/issues" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/log" + milestone_events "code.gitea.io/gitea/services/milestone_events" notify_service "code.gitea.io/gitea/services/notify" ) @@ -34,6 +35,10 @@ func CloseIssue(ctx context.Context, issue *issues_model.Issue, doer *user_model return err } + if issue.MilestoneID > 0 { + milestone_events.PublishMilestoneProgress(ctx, issue.MilestoneID) + } + notify_service.IssueChangeStatus(ctx, doer, commitID, issue, comment, true) return nil @@ -47,6 +52,10 @@ func ReopenIssue(ctx context.Context, issue *issues_model.Issue, doer *user_mode return err } + if issue.MilestoneID > 0 { + milestone_events.PublishMilestoneProgress(ctx, issue.MilestoneID) + } + notify_service.IssueChangeStatus(ctx, doer, commitID, issue, comment, false) return nil