diff --git a/pkg/models/project.go b/pkg/models/project.go index 019afe792..a799d1815 100644 --- a/pkg/models/project.go +++ b/pkg/models/project.go @@ -1217,13 +1217,9 @@ func UpdateProject(s *xorm.Session, project *Project, auth web.Auth, updateProje return err } - doer, err := GetUserOrLinkShareUser(s, auth) - if err != nil { - return err - } events.DispatchOnCommit(s, &ProjectUpdatedEvent{ Project: project, - Doer: doer, + Doer: doerFromAuth(auth), }) l, err := GetProjectSimpleByID(s, project.ID) @@ -1452,13 +1448,9 @@ func (p *Project) Delete(s *xorm.Session, a web.Auth) (err error) { return } - doer, err := GetUserOrLinkShareUser(s, a) - if err != nil { - return err - } events.DispatchOnCommit(s, &ProjectDeletedEvent{ Project: fullProject, - Doer: doer, + Doer: doerFromAuth(a), }) childProjects := []*Project{} diff --git a/pkg/models/project_team.go b/pkg/models/project_team.go index 4f3ed9c42..e3571906c 100644 --- a/pkg/models/project_team.go +++ b/pkg/models/project_team.go @@ -109,14 +109,10 @@ func (tl *TeamProject) Create(s *xorm.Session, a web.Auth) (err error) { return err } - doer, err := GetUserOrLinkShareUser(s, a) - if err != nil { - return err - } events.DispatchOnCommit(s, &ProjectSharedWithTeamEvent{ Project: l, Team: team, - Doer: doer, + Doer: doerFromAuth(a), }) err = updateProjectLastUpdated(s, l) diff --git a/pkg/models/project_users.go b/pkg/models/project_users.go index 1470dd1bb..41254ac1d 100644 --- a/pkg/models/project_users.go +++ b/pkg/models/project_users.go @@ -115,14 +115,10 @@ func (lu *ProjectUser) Create(s *xorm.Session, a web.Auth) (err error) { return err } - doer, err := GetUserOrLinkShareUser(s, a) - if err != nil { - return err - } events.DispatchOnCommit(s, &ProjectSharedWithUserEvent{ Project: l, User: u, - Doer: doer, + Doer: doerFromAuth(a), }) err = updateProjectLastUpdated(s, l) diff --git a/pkg/models/teams.go b/pkg/models/teams.go index e1ac8887c..6f73dc3ae 100644 --- a/pkg/models/teams.go +++ b/pkg/models/teams.go @@ -360,13 +360,9 @@ func (t *Team) Delete(s *xorm.Session, a web.Auth) (err error) { return } - doer, err := GetUserOrLinkShareUser(s, a) - if err != nil { - return err - } events.DispatchOnCommit(s, &TeamDeletedEvent{ Team: t, - Doer: doer, + Doer: doerFromAuth(a), }) return nil } diff --git a/pkg/models/users.go b/pkg/models/users.go index da2b7af97..51b6ede2a 100644 --- a/pkg/models/users.go +++ b/pkg/models/users.go @@ -22,6 +22,20 @@ import ( "xorm.io/xorm" ) +// doerFromAuth converts the authenticated principal into a user for event +// payloads without re-fetching it. A re-fetch would fail its status check in +// flows acting on behalf of disabled accounts (e.g. user deletion), and the +// event only needs the principal as it authenticated. +func doerFromAuth(a web.Auth) *user.User { + if u, is := a.(*user.User); is { + return u + } + if share, is := a.(*LinkSharing); is { + return share.toUser() + } + return &user.User{ID: a.GetID()} +} + // GetUserOrLinkShareUser returns either a user or a link share disguised as a user. func GetUserOrLinkShareUser(s *xorm.Session, a web.Auth) (uu *user.User, err error) { if u, is := a.(*user.User); is {