admin: new interface to manage claims
This commit is contained in:
parent
3932bba83d
commit
1eef71923a
10 changed files with 791 additions and 0 deletions
189
admin/api/claim.go
Normal file
189
admin/api/claim.go
Normal file
|
@ -0,0 +1,189 @@
|
|||
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"`
|
||||
Team *int `json:"id_team"`
|
||||
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()
|
||||
}
|
|
@ -248,6 +248,30 @@ func eventHandler(f func(fic.Event,[]byte) (interface{}, error)) func (httproute
|
|||
}
|
||||
}
|
||||
|
||||
func claimHandler(f func(fic.Claim,[]byte) (interface{}, error)) func (httprouter.Params,[]byte) (interface{}, error) {
|
||||
return func (ps httprouter.Params, body []byte) (interface{}, error) {
|
||||
if cid, err := strconv.Atoi(string(ps.ByName("cid"))); err != nil {
|
||||
return nil, err
|
||||
} else if claim, err := fic.GetClaim(cid); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return f(claim, body)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func claimAssigneeHandler(f func(fic.ClaimAssignee,[]byte) (interface{}, error)) func (httprouter.Params,[]byte) (interface{}, error) {
|
||||
return func (ps httprouter.Params, body []byte) (interface{}, error) {
|
||||
if aid, err := strconv.Atoi(string(ps.ByName("aid"))); err != nil {
|
||||
return nil, err
|
||||
} else if assignee, err := fic.GetAssignee(int64(aid)); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return f(assignee, body)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func fileHandler(f func(fic.EFile,[]byte) (interface{}, error)) func (httprouter.Params,[]byte) (interface{}, error) {
|
||||
return func (ps httprouter.Params, body []byte) (interface{}, error) {
|
||||
if fileid, err := strconv.Atoi(string(ps.ByName("fileid"))); err != nil {
|
||||
|
|
Reference in a new issue