Skip to content

Commit f292614

Browse files
authored
Merge pull request #44 from phoops/master
Added 'user API' filters.
2 parents 0ad680c + 77f4947 commit f292614

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

user.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package redmine
33
import (
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+
3075
func (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+
54132
func (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

Comments
 (0)