Merge branch '19092-upload-crunchstat_summary-to-pypi'
[arvados-dev.git] / lib / redmine / releases.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package redmine
6
7 import (
8         "encoding/json"
9         "fmt"
10         "net/url"
11         "strconv"
12         "strings"
13 )
14
15 //map[string]interface {}{
16 /*  "release":map[string]interface {}{
17         "description":interface {}(nil),
18         "id":64,
19         "name":"Arvados 2.3.7",
20         "planned_velocity":interface {}(nil),
21         "project":map[string]interface {}{
22                 "id":36,
23                 "name":"Arvados"},
24         "release_end_date":"2021-12-24",
25         "release_start_date":"2021-11-26",
26         "sharing":"hierarchy",
27         "status":"open"}
28 } */
29 type Release struct {
30         ID               int     `json:"id,omitempty"`
31         Name             string  `json:"name,omitempty"`
32         Description      string  `json:"description,omitempty"`
33         Sharing          string  `json:"sharing,omitempty"`
34         ReleaseStartDate string  `json:"release_start_date,omitempty"`
35         ReleaseEndDate   string  `json:"release_end_date,omitempty"`
36         PlannedVelocity  string  `json:"planned_velocity,omitempty"`
37         Status           string  `json:"status,omitempty"`
38         ProjectID        int     `json:"project_id,omitempty"`
39         Project          *IDName `json:"project,omitempty"`
40 }
41
42 type releaseWrapper struct {
43         Release Release `json:"release"`
44 }
45
46 // FindReleaseByName retrieves a redmine Release object by name
47 func (c *Client) FindReleaseByName(project, name string) (*Release, error) {
48         // This api call only returns the first matching release object. There is no unique index on release names.
49         res, err := c.Get("/rb/release/" + strings.ToLower(project) + "/find_by_name.json?name=" + url.QueryEscape(name))
50         if err != nil {
51                 return nil, err
52         }
53         defer res.Body.Close()
54
55         if res.StatusCode == 404 {
56                 return nil, fmt.Errorf("Missing API call /rb/release/project_id/find_by_name.json")
57         }
58         var r releaseWrapper
59         err = responseHelper(res, &r, 200)
60         if err != nil {
61                 return nil, err
62         }
63         if r.Release.ID == 0 {
64                 return nil, nil
65         }
66         return &r.Release, nil
67 }
68
69 // FindReleaseByName retrieves a redmine Release object by name
70 func (c *Client) GetRelease(ID int) (*Release, error) {
71         // This api call only returns the first matching release object. There is no unique index on release names.
72         res, err := c.Get("/rb/release/" + strconv.Itoa(ID) + ".json")
73         if err != nil {
74                 return nil, err
75         }
76         defer res.Body.Close()
77
78         if res.StatusCode == 404 {
79                 return nil, fmt.Errorf("Not found")
80         }
81         var r releaseWrapper
82         err = responseHelper(res, &r, 200)
83         if err != nil {
84                 return nil, err
85         }
86         if r.Release.ID == 0 {
87                 return nil, nil
88         }
89         return &r.Release, nil
90 }
91
92 func (c *Client) CreateRelease(release Release) (*Release, error) {
93         var rr releaseWrapper
94         rr.Release = release
95         s, err := json.Marshal(rr)
96         if err != nil {
97                 return nil, err
98         }
99         res, err := c.Post("/rb/release/"+strings.ToLower(release.Project.Name)+"/new.json", string(s))
100         if err != nil {
101                 return nil, err
102         }
103         defer res.Body.Close()
104
105         var r releaseWrapper
106         err = responseHelper(res, &r, 201)
107         if err != nil {
108                 return nil, err
109         }
110         return &r.Release, nil
111 }