@@ -41,6 +41,10 @@ func ListTrackedTimes(ctx *context.APIContext) {
41
41
// type: integer
42
42
// format: int64
43
43
// required: true
44
+ // - name: user
45
+ // in: query
46
+ // description: optional filter by user (available for issue managers)
47
+ // type: string
44
48
// - name: since
45
49
// in: query
46
50
// description: Only show times updated after the given time. This is a timestamp in RFC 3339 format
@@ -85,13 +89,34 @@ func ListTrackedTimes(ctx *context.APIContext) {
85
89
IssueID : issue .ID ,
86
90
}
87
91
92
+ qUser := strings .Trim (ctx .Query ("user" ), " " )
93
+ if qUser != "" {
94
+ user , err := models .GetUserByName (qUser )
95
+ if models .IsErrUserNotExist (err ) {
96
+ ctx .Error (http .StatusNotFound , "User does not exist" , err )
97
+ } else if err != nil {
98
+ ctx .Error (http .StatusInternalServerError , "GetUserByName" , err )
99
+ return
100
+ }
101
+ opts .UserID = user .ID
102
+ }
103
+
88
104
if opts .CreatedBeforeUnix , opts .CreatedAfterUnix , err = utils .GetQueryBeforeSince (ctx ); err != nil {
89
105
ctx .Error (http .StatusUnprocessableEntity , "GetQueryBeforeSince" , err )
90
106
return
91
107
}
92
108
93
- if ! ctx .IsUserRepoAdmin () && ! ctx .User .IsAdmin {
94
- opts .UserID = ctx .User .ID
109
+ cantSetUser := ! ctx .User .IsAdmin &&
110
+ opts .UserID != ctx .User .ID &&
111
+ ! ctx .IsUserRepoWriter ([]models.UnitType {models .UnitTypeIssues })
112
+
113
+ if cantSetUser {
114
+ if opts .UserID == 0 {
115
+ opts .UserID = ctx .User .ID
116
+ } else {
117
+ ctx .Error (http .StatusForbidden , "" , fmt .Errorf ("query by user not allowed; not enough rights" ))
118
+ return
119
+ }
95
120
}
96
121
97
122
trackedTimes , err := models .GetTrackedTimes (opts )
@@ -394,12 +419,7 @@ func ListTrackedTimesByUser(ctx *context.APIContext) {
394
419
}
395
420
396
421
if ! ctx .IsUserRepoAdmin () && ! ctx .User .IsAdmin && ctx .User .ID != user .ID {
397
- ctx .Error (http .StatusForbidden , "" , fmt .Errorf ("query user not allowed not enouth rights" ))
398
- return
399
- }
400
-
401
- if ! ctx .IsUserRepoAdmin () && ! ctx .User .IsAdmin && ctx .User .ID != user .ID {
402
- ctx .Error (http .StatusForbidden , "" , fmt .Errorf ("query user not allowed not enouth rights" ))
422
+ ctx .Error (http .StatusForbidden , "" , fmt .Errorf ("query by user not allowed; not enough rights" ))
403
423
return
404
424
}
405
425
@@ -440,7 +460,7 @@ func ListTrackedTimesByRepository(ctx *context.APIContext) {
440
460
// required: true
441
461
// - name: user
442
462
// in: query
443
- // description: optional filter by user
463
+ // description: optional filter by user (available for issue managers)
444
464
// type: string
445
465
// - name: since
446
466
// in: query
@@ -482,7 +502,9 @@ func ListTrackedTimesByRepository(ctx *context.APIContext) {
482
502
qUser := strings .Trim (ctx .Query ("user" ), " " )
483
503
if qUser != "" {
484
504
user , err := models .GetUserByName (qUser )
485
- if err != nil {
505
+ if models .IsErrUserNotExist (err ) {
506
+ ctx .Error (http .StatusNotFound , "User does not exist" , err )
507
+ } else if err != nil {
486
508
ctx .Error (http .StatusInternalServerError , "GetUserByName" , err )
487
509
return
488
510
}
@@ -495,7 +517,11 @@ func ListTrackedTimesByRepository(ctx *context.APIContext) {
495
517
return
496
518
}
497
519
498
- if ! ctx .IsUserRepoAdmin () && ! ctx .User .IsAdmin {
520
+ cantSetUser := ! ctx .User .IsAdmin &&
521
+ opts .UserID != ctx .User .ID &&
522
+ ! ctx .IsUserRepoWriter ([]models.UnitType {models .UnitTypeIssues })
523
+
524
+ if cantSetUser {
499
525
if opts .UserID == 0 {
500
526
opts .UserID = ctx .User .ID
501
527
} else {
0 commit comments