2018-01-17 00:21:32 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"srs.epita.fr/fic-server/libfic"
|
|
|
|
|
|
|
|
"github.com/julienschmidt/httprouter"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
// Tasks
|
|
|
|
router.GET("/api/claims/", apiHandler(getClaims))
|
|
|
|
router.POST("/api/claims/", apiHandler(newClaim))
|
|
|
|
router.DELETE("/api/claims/", apiHandler(clearClaims))
|
|
|
|
|
|
|
|
router.GET("/api/claims/:cid", apiHandler(claimHandler(showClaim)))
|
|
|
|
router.PUT("/api/claims/:cid", apiHandler(claimHandler(updateClaim)))
|
|
|
|
router.POST("/api/claims/:cid", apiHandler(claimHandler(addClaimDescription)))
|
|
|
|
router.DELETE("/api/claims/:cid", apiHandler(claimHandler(deleteClaim)))
|
|
|
|
|
|
|
|
// Assignees
|
|
|
|
router.GET("/api/claims-assignees/", apiHandler(getAssignees))
|
|
|
|
router.POST("/api/claims-assignees/", apiHandler(newAssignee))
|
|
|
|
|
|
|
|
router.GET("/api/claims-assignees/:aid", apiHandler(claimAssigneeHandler(showClaimAssignee)))
|
|
|
|
router.PUT("/api/claims-assignees/:aid", apiHandler(claimAssigneeHandler(updateClaimAssignee)))
|
|
|
|
router.DELETE("/api/claims-assignees/:aid", apiHandler(claimAssigneeHandler(deleteClaimAssignee)))
|
|
|
|
}
|
|
|
|
|
|
|
|
func getClaims(_ httprouter.Params, _ []byte) (interface{}, error) {
|
|
|
|
return fic.GetClaims()
|
|
|
|
}
|
|
|
|
|
|
|
|
type ClaimExported struct {
|
|
|
|
Id int64 `json:"id"`
|
|
|
|
Subject string `json:"subject"`
|
|
|
|
IdTeam *int64 `json:"id_team"`
|
|
|
|
Team *fic.Team `json:"team"`
|
|
|
|
IdAssignee *int64 `json:"id_assignee"`
|
|
|
|
Assignee *fic.ClaimAssignee `json:"assignee"`
|
|
|
|
Creation time.Time `json:"creation"`
|
|
|
|
LastUpdate time.Time `json:"last_update"`
|
|
|
|
State string `json:"state"`
|
|
|
|
Priority string `json:"priority"`
|
|
|
|
Descriptions []fic.ClaimDescription `json:"descriptions"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func showClaim(claim fic.Claim, _ []byte) (interface{}, error) {
|
|
|
|
var e ClaimExported
|
|
|
|
var err error
|
|
|
|
if e.Team, err = claim.GetTeam(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if e.Assignee, err = claim.GetAssignee(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if e.Descriptions, err = claim.GetDescriptions(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
e.LastUpdate = e.Creation
|
|
|
|
for _, d := range e.Descriptions {
|
|
|
|
if d.Date.After(e.LastUpdate) {
|
|
|
|
e.LastUpdate = d.Date
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
e.Id = claim.Id
|
|
|
|
e.IdAssignee = claim.IdAssignee
|
|
|
|
e.IdTeam = claim.IdTeam
|
|
|
|
e.Subject = claim.Subject
|
|
|
|
e.Creation = claim.Creation
|
|
|
|
e.State = claim.State
|
|
|
|
e.Priority = claim.Priority
|
|
|
|
return e, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type ClaimUploaded struct {
|
|
|
|
Subject string `json:"subject"`
|
2018-01-21 13:18:26 +00:00
|
|
|
Team *int64 `json:"id_team"`
|
2018-01-17 00:21:32 +00:00
|
|
|
Assignee *int64 `json:"id_assignee"`
|
|
|
|
Priority string `json:"priority"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func newClaim(_ httprouter.Params, body []byte) (interface{}, error) {
|
|
|
|
var uc ClaimUploaded
|
|
|
|
if err := json.Unmarshal(body, &uc); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
var t *fic.Team
|
|
|
|
if uc.Team != nil {
|
|
|
|
if team, err := fic.GetTeam(*uc.Team); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
t = &team
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
t = nil
|
|
|
|
}
|
|
|
|
|
|
|
|
var a *fic.ClaimAssignee
|
|
|
|
if uc.Assignee != nil {
|
|
|
|
if assignee, err := fic.GetAssignee(*uc.Assignee); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
a = &assignee
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
a = nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return fic.NewClaim(uc.Subject, t, a, uc.Priority)
|
|
|
|
}
|
|
|
|
|
|
|
|
func clearClaims(_ httprouter.Params, _ []byte) (interface{}, error) {
|
|
|
|
return fic.ClearClaims()
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func addClaimDescription(claim fic.Claim, body []byte) (interface{}, error) {
|
|
|
|
var ud fic.ClaimDescription
|
|
|
|
if err := json.Unmarshal(body, &ud); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if assignee, err := fic.GetAssignee(ud.IdAssignee); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
return claim.AddDescription(ud.Content, assignee)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func updateClaim(claim fic.Claim, body []byte) (interface{}, error) {
|
|
|
|
var uc fic.Claim
|
|
|
|
if err := json.Unmarshal(body, &uc); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
uc.Id = claim.Id
|
|
|
|
|
|
|
|
if _, err := uc.Update(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
return uc, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func deleteClaim(claim fic.Claim, _ []byte) (interface{}, error) {
|
|
|
|
return claim.Delete()
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func getAssignees(_ httprouter.Params, _ []byte) (interface{}, error) {
|
|
|
|
return fic.GetAssignees()
|
|
|
|
}
|
|
|
|
|
|
|
|
func showClaimAssignee(assignee fic.ClaimAssignee, _ []byte) (interface{}, error) {
|
|
|
|
return assignee, nil
|
|
|
|
}
|
|
|
|
func newAssignee(_ httprouter.Params, body []byte) (interface{}, error) {
|
|
|
|
var ua fic.ClaimAssignee
|
|
|
|
if err := json.Unmarshal(body, &ua); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return fic.NewClaimAssignee(ua.Name)
|
|
|
|
}
|
|
|
|
|
|
|
|
func updateClaimAssignee(assignee fic.ClaimAssignee, body []byte) (interface{}, error) {
|
|
|
|
var ua fic.ClaimAssignee
|
|
|
|
if err := json.Unmarshal(body, &ua); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
ua.Id = assignee.Id
|
|
|
|
|
|
|
|
if _, err := ua.Update(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
|
|
|
return ua, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func deleteClaimAssignee(assignee fic.ClaimAssignee, _ []byte) (interface{}, error) {
|
|
|
|
return assignee.Delete()
|
|
|
|
}
|