Use GhostUser if needed for TrackedTimes (#22021)

When getting tracked times out of the db and loading their attributes
handle not exist errors in a nicer way. (Also prevent an NPE.)

Fix #22006

Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
zeripath 2022-12-04 17:48:18 +00:00 committed by GitHub
parent 84d2a820e5
commit ea86c2b56a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 28 deletions

View file

@ -5,6 +5,7 @@ package issues
import ( import (
"context" "context"
"errors"
"time" "time"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
@ -46,33 +47,41 @@ func (t *TrackedTime) LoadAttributes() (err error) {
} }
func (t *TrackedTime) loadAttributes(ctx context.Context) (err error) { func (t *TrackedTime) loadAttributes(ctx context.Context) (err error) {
// Load the issue
if t.Issue == nil { if t.Issue == nil {
t.Issue, err = GetIssueByID(ctx, t.IssueID) t.Issue, err = GetIssueByID(ctx, t.IssueID)
if err != nil { if err != nil && !errors.Is(err, util.ErrNotExist) {
return return err
} }
}
// Now load the repo for the issue (which we may have just loaded)
if t.Issue != nil {
err = t.Issue.LoadRepo(ctx) err = t.Issue.LoadRepo(ctx)
if err != nil { if err != nil && !errors.Is(err, util.ErrNotExist) {
return return err
} }
} }
// Load the user
if t.User == nil { if t.User == nil {
t.User, err = user_model.GetUserByID(ctx, t.UserID) t.User, err = user_model.GetUserByID(ctx, t.UserID)
if err != nil { if err != nil {
return if !errors.Is(err, util.ErrNotExist) {
}
}
return err return err
} }
t.User = user_model.NewGhostUser()
}
}
return nil
}
// LoadAttributes load Issue, User // LoadAttributes load Issue, User
func (tl TrackedTimeList) LoadAttributes() (err error) { func (tl TrackedTimeList) LoadAttributes() error {
for _, t := range tl { for _, t := range tl {
if err = t.LoadAttributes(); err != nil { if err := t.LoadAttributes(); err != nil {
return err return err
} }
} }
return err return nil
} }
// FindTrackedTimesOptions represent the filters for tracked times. If an ID is 0 it will be ignored. // FindTrackedTimesOptions represent the filters for tracked times. If an ID is 0 it will be ignored.

View file

@ -113,7 +113,6 @@ func ToTrackedTime(ctx context.Context, t *issues_model.TrackedTime) (apiT *api.
ID: t.ID, ID: t.ID,
IssueID: t.IssueID, IssueID: t.IssueID,
UserID: t.UserID, UserID: t.UserID,
UserName: t.User.Name,
Time: t.Time, Time: t.Time,
Created: t.Created, Created: t.Created,
} }