155 lines
3.5 KiB
Go
155 lines
3.5 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"path"
|
|
"strconv"
|
|
|
|
"srs.epita.fr/fic-server/libfic"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func declareEventsRoutes(router *gin.RouterGroup) {
|
|
router.GET("/events", getEvents)
|
|
router.GET("/events.json", getLastEvents)
|
|
router.POST("/events", newEvent)
|
|
router.DELETE("/events", clearEvents)
|
|
|
|
apiEventsRoutes := router.Group("/events/:evid")
|
|
apiEventsRoutes.Use(EventHandler)
|
|
apiEventsRoutes.GET("", showEvent)
|
|
apiEventsRoutes.PUT("", updateEvent)
|
|
apiEventsRoutes.DELETE("", deleteEvent)
|
|
}
|
|
|
|
func EventHandler(c *gin.Context) {
|
|
evid, err := strconv.ParseInt(string(c.Params.ByName("evid")), 10, 64)
|
|
if err != nil {
|
|
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": "Invalid event identifier"})
|
|
return
|
|
}
|
|
|
|
event, err := fic.GetEvent(evid)
|
|
if err != nil {
|
|
c.AbortWithStatusJSON(http.StatusNotFound, gin.H{"errmsg": "Event not found"})
|
|
return
|
|
}
|
|
|
|
c.Set("event", event)
|
|
|
|
c.Next()
|
|
}
|
|
|
|
func genEventsFile() error {
|
|
if evts, err := fic.GetLastEvents(); err != nil {
|
|
return err
|
|
} else if j, err := json.Marshal(evts); err != nil {
|
|
return err
|
|
} else if err := ioutil.WriteFile(path.Join(TeamsDir, "events.json"), j, 0666); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func getEvents(c *gin.Context) {
|
|
evts, err := fic.GetEvents()
|
|
if err != nil {
|
|
log.Println("Unable to GetEvents:", err.Error())
|
|
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "Unable to retrieve events list"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, evts)
|
|
}
|
|
|
|
func getLastEvents(c *gin.Context) {
|
|
evts, err := fic.GetLastEvents()
|
|
|
|
if err != nil {
|
|
log.Println("Unable to GetLastEvents:", err.Error())
|
|
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "Unable to retrieve last events list"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, evts)
|
|
}
|
|
|
|
func newEvent(c *gin.Context) {
|
|
var ue fic.Event
|
|
err := c.ShouldBindJSON(&ue)
|
|
if err != nil {
|
|
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()})
|
|
return
|
|
}
|
|
|
|
event, err := fic.NewEvent(ue.Text, ue.Kind)
|
|
if err != nil {
|
|
log.Printf("Unable to newEvent: %s", err.Error())
|
|
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "An error occurs during event creation."})
|
|
return
|
|
}
|
|
|
|
genEventsFile()
|
|
|
|
c.JSON(http.StatusOK, event)
|
|
}
|
|
|
|
func clearEvents(c *gin.Context) {
|
|
nb, err := fic.ClearEvents()
|
|
if err != nil {
|
|
log.Printf("Unable to clearEvent: %s", err.Error())
|
|
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "An error occurs during event clearing."})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, nb)
|
|
}
|
|
|
|
func showEvent(c *gin.Context) {
|
|
event := c.MustGet("event").(*fic.Event)
|
|
c.JSON(http.StatusOK, event)
|
|
}
|
|
|
|
func updateEvent(c *gin.Context) {
|
|
event := c.MustGet("event").(*fic.Event)
|
|
|
|
var ue fic.Event
|
|
err := c.ShouldBindJSON(&ue)
|
|
if err != nil {
|
|
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()})
|
|
return
|
|
}
|
|
|
|
ue.Id = event.Id
|
|
|
|
if _, err := ue.Update(); err != nil {
|
|
log.Printf("Unable to updateEvent: %s", err.Error())
|
|
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "An error occurs during event update."})
|
|
return
|
|
}
|
|
|
|
genEventsFile()
|
|
|
|
c.JSON(http.StatusOK, ue)
|
|
}
|
|
|
|
func deleteEvent(c *gin.Context) {
|
|
event := c.MustGet("event").(*fic.Event)
|
|
|
|
_, err := event.Delete()
|
|
if err != nil {
|
|
log.Printf("Unable to deleteEvent: %s", err.Error())
|
|
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "An error occurs during event deletion."})
|
|
return
|
|
}
|
|
|
|
genEventsFile()
|
|
|
|
c.JSON(http.StatusOK, true)
|
|
}
|