Skip to content

Commit ad7f798

Browse files
committed
add some APIs.
1 parent d630ad3 commit ad7f798

File tree

3 files changed

+371
-0
lines changed

3 files changed

+371
-0
lines changed

godmine/main.go

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,79 @@ func listProjects() {
464464
}
465465
}
466466

467+
func showMembership(id int) {
468+
config := getConfig()
469+
c := redmine.NewClient(config.Endpoint, config.Apikey)
470+
membership, err := c.Membership(id)
471+
if err != nil {
472+
fatal("Failed to show membership: %s\n", err)
473+
}
474+
475+
fmt.Printf(`
476+
Id: %d
477+
Project: %s
478+
User: %s
479+
Role: `[1:],
480+
membership.Id,
481+
membership.Project.Name,
482+
membership.User.Name)
483+
for i, role := range membership.Roles {
484+
if i != 0 {
485+
fmt.Print(", ")
486+
}
487+
fmt.Printf(role.Name)
488+
}
489+
fmt.Println()
490+
}
491+
492+
func listMemberships(projectId int) {
493+
config := getConfig()
494+
c := redmine.NewClient(config.Endpoint, config.Apikey)
495+
memberships, err := c.Memberships(projectId)
496+
if err != nil {
497+
fatal("Failed to list memberships: %s\n", err)
498+
}
499+
for _, i := range memberships {
500+
fmt.Printf("%4d: %s\n", i.Id, i.User.Name)
501+
}
502+
}
503+
504+
func showUser(id int) {
505+
config := getConfig()
506+
c := redmine.NewClient(config.Endpoint, config.Apikey)
507+
user, err := c.User(id)
508+
if err != nil {
509+
fatal("Failed to show user: %s\n", err)
510+
}
511+
512+
fmt.Printf(`
513+
Id: %d
514+
Login: %s
515+
Firstname: %s
516+
Lastname: %s
517+
Mail: %s
518+
CreatedOn: %s
519+
`[1:],
520+
user.Id,
521+
user.Login,
522+
user.Firstname,
523+
user.Lastname,
524+
user.Mail,
525+
user.CreatedOn)
526+
}
527+
528+
func listUsers() {
529+
config := getConfig()
530+
c := redmine.NewClient(config.Endpoint, config.Apikey)
531+
users, err := c.Users()
532+
if err != nil {
533+
fatal("Failed to list users: %s\n", err)
534+
}
535+
for _, i := range users {
536+
fmt.Printf("%4d: %s\n", i.Id, i.Login)
537+
}
538+
}
539+
467540
func usage() {
468541
fmt.Println(`gotmine <command> <subcommand> [arguments]
469542
@@ -649,6 +722,52 @@ func main() {
649722
default:
650723
usage()
651724
}
725+
case "m", "membership":
726+
switch os.Args[2] {
727+
case "s", "show":
728+
if len(os.Args) == 4 {
729+
id, err := strconv.Atoi(os.Args[3])
730+
if err != nil {
731+
fatal("Invalid membership id: %s\n", err)
732+
}
733+
showMembership(id)
734+
} else {
735+
usage()
736+
}
737+
break
738+
case "l", "list":
739+
if len(os.Args) == 4 {
740+
projectId, err := strconv.Atoi(os.Args[3])
741+
if err != nil {
742+
fatal("Invalid project id: %s\n", err)
743+
}
744+
listMemberships(projectId)
745+
} else {
746+
usage()
747+
}
748+
break
749+
default:
750+
usage()
751+
}
752+
case "u", "user":
753+
switch os.Args[2] {
754+
case "s", "show":
755+
if len(os.Args) == 4 {
756+
id, err := strconv.Atoi(os.Args[3])
757+
if err != nil {
758+
fatal("Invalid user id: %s\n", err)
759+
}
760+
showUser(id)
761+
} else {
762+
usage()
763+
}
764+
break
765+
case "l", "list":
766+
listUsers()
767+
break
768+
default:
769+
usage()
770+
}
652771
default:
653772
usage()
654773
}

membership.go

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
package redmine
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"net/http"
7+
"strconv"
8+
"strings"
9+
)
10+
11+
type membershipsResult struct {
12+
Memberships []Membership `json:"memberships"`
13+
}
14+
15+
type membershipResult struct {
16+
Membership Membership `json:"membership"`
17+
}
18+
19+
type membershipRequest struct {
20+
Membership Membership `json:"membership"`
21+
}
22+
23+
type Membership struct {
24+
Id int `json:"id"`
25+
Project IdName `json:"project"`
26+
User IdName `json:"user"`
27+
Roles []IdName `json:"roles"`
28+
}
29+
30+
func (c *client) Memberships(projectId int) ([]Membership, error) {
31+
res, err := http.Get(c.endpoint + "/projects/" + strconv.Itoa(projectId) + "/memberships.json?key=" + c.apikey)
32+
if err != nil {
33+
return nil, err
34+
}
35+
defer res.Body.Close()
36+
37+
decoder := json.NewDecoder(res.Body)
38+
var r membershipsResult
39+
if res.StatusCode == 404 {
40+
return nil, errors.New("Not Found")
41+
}
42+
if res.StatusCode != 200 {
43+
var er errorsResult
44+
err = decoder.Decode(&er)
45+
if err == nil {
46+
err = errors.New(strings.Join(er.Errors, "\n"))
47+
}
48+
} else {
49+
err = decoder.Decode(&r)
50+
}
51+
if err != nil {
52+
return nil, err
53+
}
54+
return r.Memberships, nil
55+
}
56+
57+
func (c *client) Membership(id int) (*Membership, error) {
58+
res, err := http.Get(c.endpoint + "/memberships/" + strconv.Itoa(id) + ".json?key=" + c.apikey)
59+
if err != nil {
60+
return nil, err
61+
}
62+
defer res.Body.Close()
63+
64+
decoder := json.NewDecoder(res.Body)
65+
var r membershipResult
66+
if res.StatusCode == 404 {
67+
return nil, errors.New("Not Found")
68+
}
69+
if res.StatusCode != 200 {
70+
var er errorsResult
71+
err = decoder.Decode(&er)
72+
if err == nil {
73+
err = errors.New(strings.Join(er.Errors, "\n"))
74+
}
75+
} else {
76+
err = decoder.Decode(&r)
77+
}
78+
if err != nil {
79+
return nil, err
80+
}
81+
return &r.Membership, nil
82+
}
83+
84+
func (c *client) CreateMembership(membership Membership) (*Membership, error) {
85+
var ir membershipRequest
86+
ir.Membership = membership
87+
s, err := json.Marshal(ir)
88+
if err != nil {
89+
return nil, err
90+
}
91+
req, err := http.NewRequest("POST", c.endpoint+"/memberships.json?key="+c.apikey, strings.NewReader(string(s)))
92+
if err != nil {
93+
return nil, err
94+
}
95+
req.Header.Set("Content-Type", "application/json")
96+
res, err := http.DefaultClient.Do(req)
97+
if err != nil {
98+
return nil, err
99+
}
100+
defer res.Body.Close()
101+
102+
decoder := json.NewDecoder(res.Body)
103+
var r membershipRequest
104+
if res.StatusCode != 201 {
105+
var er errorsResult
106+
err = decoder.Decode(&er)
107+
if err == nil {
108+
err = errors.New(strings.Join(er.Errors, "\n"))
109+
}
110+
} else {
111+
err = decoder.Decode(&r)
112+
}
113+
if err != nil {
114+
return nil, err
115+
}
116+
return &r.Membership, nil
117+
}
118+
119+
func (c *client) UpdateMembership(membership Membership) error {
120+
var ir membershipRequest
121+
ir.Membership = membership
122+
s, err := json.Marshal(ir)
123+
if err != nil {
124+
return err
125+
}
126+
req, err := http.NewRequest("PUT", c.endpoint+"/memberships/"+strconv.Itoa(membership.Id)+".json?key="+c.apikey, strings.NewReader(string(s)))
127+
if err != nil {
128+
return err
129+
}
130+
req.Header.Set("Content-Type", "application/json")
131+
res, err := http.DefaultClient.Do(req)
132+
if res.StatusCode == 404 {
133+
return errors.New("Not Found")
134+
}
135+
if err != nil {
136+
return err
137+
}
138+
defer res.Body.Close()
139+
140+
if res.StatusCode != 200 {
141+
decoder := json.NewDecoder(res.Body)
142+
var er errorsResult
143+
err = decoder.Decode(&er)
144+
if err == nil {
145+
err = errors.New(strings.Join(er.Errors, "\n"))
146+
}
147+
}
148+
if err != nil {
149+
return err
150+
}
151+
return err
152+
}
153+
154+
func (c *client) DeleteMembership(id int) error {
155+
req, err := http.NewRequest("DELETE", c.endpoint+"/memberships/"+strconv.Itoa(id)+".json?key="+c.apikey, strings.NewReader(""))
156+
if err != nil {
157+
return err
158+
}
159+
req.Header.Set("Content-Type", "application/json")
160+
res, err := http.DefaultClient.Do(req)
161+
if res.StatusCode == 404 {
162+
return errors.New("Not Found")
163+
}
164+
if err != nil {
165+
return err
166+
}
167+
defer res.Body.Close()
168+
169+
decoder := json.NewDecoder(res.Body)
170+
if res.StatusCode != 200 {
171+
var er errorsResult
172+
err = decoder.Decode(&er)
173+
if err == nil {
174+
err = errors.New(strings.Join(er.Errors, "\n"))
175+
}
176+
}
177+
return err
178+
}

user.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package redmine
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"net/http"
7+
"strconv"
8+
"strings"
9+
)
10+
11+
type userResult struct {
12+
User User `json:"user"`
13+
}
14+
15+
type usersResult struct {
16+
Users []User `json:"users"`
17+
}
18+
19+
type User struct {
20+
Id int `json:"id"`
21+
Login string `json:"login"`
22+
Firstname string `json:"firstname"`
23+
Lastname string `json:"lastname"`
24+
Mail string `json:"mail"`
25+
CreatedOn string `json:"created_on"`
26+
}
27+
28+
func (c *client) Users() ([]User, error) {
29+
res, err := http.Get(c.endpoint + "/users.json?key=" + c.apikey)
30+
if err != nil {
31+
return nil, err
32+
}
33+
defer res.Body.Close()
34+
35+
decoder := json.NewDecoder(res.Body)
36+
var r usersResult
37+
if res.StatusCode != 200 {
38+
var er errorsResult
39+
err = decoder.Decode(&er)
40+
if err == nil {
41+
err = errors.New(strings.Join(er.Errors, "\n"))
42+
}
43+
} else {
44+
err = decoder.Decode(&r)
45+
}
46+
if err != nil {
47+
return nil, err
48+
}
49+
return r.Users, nil
50+
}
51+
52+
func (c *client) User(id int) (*User, error) {
53+
res, err := http.Get(c.endpoint + "/users/" + strconv.Itoa(id) + ".json?key=" + c.apikey)
54+
if err != nil {
55+
return nil, err
56+
}
57+
defer res.Body.Close()
58+
59+
decoder := json.NewDecoder(res.Body)
60+
var r userResult
61+
if res.StatusCode != 200 {
62+
var er errorsResult
63+
err = decoder.Decode(&er)
64+
if err == nil {
65+
err = errors.New(strings.Join(er.Errors, "\n"))
66+
}
67+
} else {
68+
err = decoder.Decode(&r)
69+
}
70+
if err != nil {
71+
return nil, err
72+
}
73+
return &r.User, nil
74+
}

0 commit comments

Comments
 (0)