@@ -3,6 +3,7 @@ package redmine
33import (
44 "encoding/json"
55 "errors"
6+ "net/http"
67 "strconv"
78 "strings"
89)
@@ -27,6 +28,50 @@ type User struct {
2728 CustomFields []* CustomField `json:"custom_fields,omitempty"`
2829}
2930
31+ type UsersFilter struct {
32+ Filter
33+ }
34+
35+ func NewUsersFilter () * UsersFilter {
36+ return & UsersFilter {Filter {}}
37+ }
38+
39+ const (
40+ UserStatusAll string = ""
41+ UserStatusActive string = "1"
42+ UserStatusRegistered string = "2"
43+ UserStatusLocked string = "3"
44+ )
45+
46+ func (usf * UsersFilter ) Status (status string ) {
47+ usf .AddPair ("status" , status )
48+ }
49+
50+ func (usf * UsersFilter ) Name (name string ) {
51+ usf .AddPair ("name" , name )
52+ }
53+
54+ func (usf * UsersFilter ) GroupId (groupId int ) {
55+ usf .AddPair ("group_id" , strconv .Itoa (groupId ))
56+ }
57+
58+ type UserByIdFilter struct {
59+ Filter
60+ }
61+
62+ func NewUserByIdFilter () * UserByIdFilter {
63+ return & UserByIdFilter {Filter {}}
64+ }
65+
66+ const (
67+ UserIncludeMemberships string = "memberships"
68+ UserIncludeGroups string = "groups"
69+ )
70+
71+ func (uif * UserByIdFilter ) Include (include string ) {
72+ uif .AddPair ("include" , include )
73+ }
74+
3075func (c * Client ) Users () ([]User , error ) {
3176 res , err := c .Get (c .endpoint + "/users.json?key=" + c .apikey + c .getPaginationClause ())
3277 if err != nil {
@@ -51,6 +96,39 @@ func (c *Client) Users() ([]User, error) {
5196 return r .Users , nil
5297}
5398
99+ func (c * Client ) UsersWithFilter (filter * UsersFilter ) ([]User , error ) {
100+ uri , err := c .URLWithFilter ("/users.json" , filter .Filter )
101+ if err != nil {
102+ return nil , err
103+ }
104+ req , err := http .NewRequest ("GET" , uri , nil )
105+ if err != nil {
106+ return nil , err
107+ }
108+ req .Header .Add ("X-Redmine-API-Key" , c .apikey )
109+ res , err := c .Do (req )
110+ if err != nil {
111+ return nil , err
112+ }
113+ defer res .Body .Close ()
114+
115+ decoder := json .NewDecoder (res .Body )
116+ var r usersResult
117+ if res .StatusCode != 200 {
118+ var er errorsResult
119+ err = decoder .Decode (& er )
120+ if err == nil {
121+ err = errors .New (strings .Join (er .Errors , "\n " ))
122+ }
123+ } else {
124+ err = decoder .Decode (& r )
125+ }
126+ if err != nil {
127+ return nil , err
128+ }
129+ return r .Users , nil
130+ }
131+
54132func (c * Client ) User (id int ) (* User , error ) {
55133 res , err := c .Get (c .endpoint + "/users/" + strconv .Itoa (id ) + ".json?key=" + c .apikey )
56134 if err != nil {
@@ -74,3 +152,37 @@ func (c *Client) User(id int) (*User, error) {
74152 }
75153 return & r .User , nil
76154}
155+
156+ func (c * Client ) UserByIdAndFilter (id int , filter * UserByIdFilter ) (* User , error ) {
157+ uri , err := c .URLWithFilter ("/users/" + strconv .Itoa (id )+ ".json" , filter .Filter )
158+ if err != nil {
159+ return nil , err
160+ }
161+
162+ req , err := http .NewRequest ("GET" , uri , nil )
163+ if err != nil {
164+ return nil , err
165+ }
166+ req .Header .Add ("X-Redmine-API-Key" , c .apikey )
167+ res , err := c .Do (req )
168+ if err != nil {
169+ return nil , err
170+ }
171+ defer res .Body .Close ()
172+
173+ decoder := json .NewDecoder (res .Body )
174+ var r userResult
175+ if res .StatusCode != 200 {
176+ var er errorsResult
177+ err = decoder .Decode (& er )
178+ if err == nil {
179+ err = errors .New (strings .Join (er .Errors , "\n " ))
180+ }
181+ } else {
182+ err = decoder .Decode (& r )
183+ }
184+ if err != nil {
185+ return nil , err
186+ }
187+ return & r .User , nil
188+ }
0 commit comments