WIP for #3. Creation of entirely new tasks is possible and works as expected. The only remaining issue is the merging of existing tasks.
122 lines
3.7 KiB
Go
122 lines
3.7 KiB
Go
package gitea
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"gitea.yves-biener.de/yves-biener/gitwarrior/internal/taskwarrior"
|
|
)
|
|
|
|
type Milestone struct {
|
|
Id uint `json:"id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
State string `json:"state"`
|
|
Open_issues uint `json:"open_issues"`
|
|
Closed_issues uint `json:"closed_issues"`
|
|
Created_at time.Time `json:"created_at"`
|
|
Updated_at time.Time `json:"updated_at"`
|
|
Due_on time.Time `json:"due_on"`
|
|
Closed_at time.Time `json:"closed_at"`
|
|
}
|
|
|
|
func (milestone *Milestone) IntoTask(repository Repository) (task taskwarrior.Task) {
|
|
task = taskwarrior.NewTask(
|
|
milestone.Title,
|
|
repository.Name,
|
|
milestone.Id,
|
|
taskwarrior.MILESTONE,
|
|
)
|
|
task.Due = taskwarrior.GoTimeToTaskTime(milestone.Due_on)
|
|
task.Entry = taskwarrior.GoTimeToTaskTime(milestone.Created_at)
|
|
task.Modified = taskwarrior.GoTimeToTaskTime(milestone.Updated_at)
|
|
task.AppendComment(milestone.Description, milestone.Updated_at)
|
|
return
|
|
}
|
|
|
|
// TODO: implement merge for milestone tasks
|
|
func (milestone *Milestone) MergeTask(task taskwarrior.Task) taskwarrior.Task {
|
|
return task
|
|
}
|
|
|
|
func (gitea *Gitea) GetMilestones(repo Repository) ([]Milestone, error) {
|
|
url := fmt.Sprintf("%s/repos/%s/milestones?state=all", gitea.Url(), repo.Full_name)
|
|
response, err := http.Get(url)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer response.Body.Close()
|
|
var data []Milestone
|
|
decoder := json.NewDecoder(response.Body)
|
|
// NOTE: remove this if I do not want to store everything from the json result in the struct
|
|
decoder.DisallowUnknownFields() // remain if every field shall be extracted
|
|
if err = decoder.Decode(&data); err != nil {
|
|
return nil, err
|
|
}
|
|
return data, nil
|
|
}
|
|
|
|
func (gitea *Gitea) GetMilestone(repo Repository, id uint) (Milestone, error) {
|
|
url := fmt.Sprintf("%s/repos/%s/milestones/%d", gitea.Url(), repo.Full_name, id)
|
|
response, err := http.Get(url)
|
|
var milestone Milestone
|
|
if err != nil {
|
|
return milestone, err
|
|
}
|
|
defer response.Body.Close()
|
|
decoder := json.NewDecoder(response.Body)
|
|
// NOTE: remove this if I do not want to store everything from the json result in the struct
|
|
decoder.DisallowUnknownFields() // remain if every field shall be extracted
|
|
if err = decoder.Decode(&milestone); err != nil {
|
|
return milestone, err
|
|
}
|
|
return milestone, nil
|
|
}
|
|
|
|
func (gitea *Gitea) UpdateMilestone(repo Repository, milestone Milestone) error {
|
|
url := fmt.Sprintf("%s/repos/%s/milestones/%d", gitea.Url(), repo.Full_name, milestone.Id)
|
|
var payload map[string]interface{}
|
|
payload["description"] = milestone.Description
|
|
payload["due_on"] = milestone.Due_on
|
|
payload["state"] = milestone.State
|
|
payload["title"] = milestone.Title
|
|
json, err := json.Marshal(&payload)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = http.NewRequest(http.MethodPatch, url, bytes.NewBuffer(json))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (gitea *Gitea) NewMilestone(repo Repository, milestone Milestone) (Milestone, error) {
|
|
url := fmt.Sprintf("%s/repos/%s/milestones", gitea.Url(), repo.Full_name)
|
|
payload, err := json.Marshal(&map[string]interface{}{
|
|
"description": milestone.Description,
|
|
"due_on": milestone.Due_on,
|
|
"state": milestone.State,
|
|
"title": milestone.Title,
|
|
})
|
|
var res Milestone
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
response, err := http.Post(url, "application/json", bytes.NewBuffer(payload))
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
defer response.Body.Close()
|
|
decoder := json.NewDecoder(response.Body)
|
|
// NOTE: remove this if I do not want to stare everything from the json result in the struct
|
|
decoder.DisallowUnknownFields() // remain if every field shall be extracted
|
|
if err = decoder.Decode(&res); err != nil {
|
|
return res, err
|
|
}
|
|
return res, nil
|
|
}
|