Use gin-gonic instead of httprouter
This commit is contained in:
parent
7c719d9fd5
commit
a203cdc36a
22 changed files with 1668 additions and 1392 deletions
338
direct.go
338
direct.go
|
@ -4,11 +4,10 @@ import (
|
|||
"context"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/julienschmidt/httprouter"
|
||||
"github.com/gin-gonic/gin"
|
||||
"nhooyr.io/websocket"
|
||||
"nhooyr.io/websocket/wsjson"
|
||||
)
|
||||
|
@ -21,15 +20,18 @@ var (
|
|||
WSAdminMutex = sync.RWMutex{}
|
||||
)
|
||||
|
||||
func init() {
|
||||
router.GET("/api/surveys/:sid/ws", rawAuthHandler(SurveyWS, loggedUser))
|
||||
router.GET("/api/surveys/:sid/ws-admin", rawAuthHandler(SurveyWSAdmin, adminRestricted))
|
||||
func declareAPIAuthDirectRoutes(router *gin.RouterGroup) {
|
||||
router.GET("/ws", SurveyWS)
|
||||
}
|
||||
|
||||
router.GET("/api/surveys/:sid/ws/stats", apiHandler(surveyHandler(func(s Survey, body []byte) HTTPResponse {
|
||||
return APIResponse{
|
||||
WSSurveyStats(s.Id),
|
||||
}
|
||||
}), adminRestricted))
|
||||
func declareAPIAdminDirectRoutes(router *gin.RouterGroup) {
|
||||
router.GET("/ws-admin", SurveyWSAdmin)
|
||||
|
||||
router.GET("/ws/stats", func(c *gin.Context) {
|
||||
s := c.MustGet("survey").(*Survey)
|
||||
|
||||
c.JSON(http.StatusOK, WSSurveyStats(s.Id))
|
||||
})
|
||||
}
|
||||
|
||||
func WSSurveyStats(sid int64) map[string]interface{} {
|
||||
|
@ -104,35 +106,32 @@ func msgCurrentState(survey *Survey) (msg WSMessage) {
|
|||
return
|
||||
}
|
||||
|
||||
func SurveyWS(w http.ResponseWriter, r *http.Request, ps httprouter.Params, u *User, body []byte) {
|
||||
if sid, err := strconv.Atoi(string(ps.ByName("sid"))); err != nil {
|
||||
http.Error(w, "{\"errmsg\": \"Invalid survey identifier\"}", http.StatusBadRequest)
|
||||
func SurveyWS(c *gin.Context) {
|
||||
u := c.MustGet("LoggedUser").(*User)
|
||||
survey := c.MustGet("survey").(*Survey)
|
||||
|
||||
if survey.Direct == nil {
|
||||
c.AbortWithStatusJSON(http.StatusPaymentRequired, gin.H{"errmsg": "Not a live survey"})
|
||||
return
|
||||
} else if survey, err := getSurvey(sid); err != nil {
|
||||
http.Error(w, "{\"errmsg\": \"Survey not found\"}", http.StatusNotFound)
|
||||
return
|
||||
} else if survey.Direct == nil {
|
||||
http.Error(w, "{\"errmsg\": \"Not a direct survey\"}", http.StatusBadRequest)
|
||||
return
|
||||
} else {
|
||||
ws, err := websocket.Accept(w, r, nil)
|
||||
if err != nil {
|
||||
log.Fatal("error get connection", err)
|
||||
}
|
||||
|
||||
log.Println(u.Login, "is now connected to WS", sid)
|
||||
|
||||
c := make(chan WSMessage, 1)
|
||||
|
||||
WSClientsMutex.Lock()
|
||||
defer WSClientsMutex.Unlock()
|
||||
WSClients[survey.Id] = append(WSClients[survey.Id], WSClient{ws, c, u, survey.Id})
|
||||
|
||||
// Send current state
|
||||
c <- msgCurrentState(&survey)
|
||||
|
||||
go SurveyWS_run(ws, c, survey.Id, u)
|
||||
}
|
||||
|
||||
ws, err := websocket.Accept(c.Writer, c.Request, nil)
|
||||
if err != nil {
|
||||
log.Fatal("error get connection", err)
|
||||
}
|
||||
|
||||
log.Println(u.Login, "is now connected to WS", survey.Id)
|
||||
|
||||
ch := make(chan WSMessage, 1)
|
||||
|
||||
WSClientsMutex.Lock()
|
||||
defer WSClientsMutex.Unlock()
|
||||
WSClients[survey.Id] = append(WSClients[survey.Id], WSClient{ws, ch, u, survey.Id})
|
||||
|
||||
// Send current state
|
||||
ch <- msgCurrentState(survey)
|
||||
|
||||
go SurveyWS_run(ws, ch, survey.Id, u)
|
||||
}
|
||||
|
||||
func WSWriteAll(message WSMessage) {
|
||||
|
@ -230,159 +229,156 @@ loopadmin:
|
|||
log.Println(u.Login, "admin disconnected")
|
||||
}
|
||||
|
||||
func SurveyWSAdmin(w http.ResponseWriter, r *http.Request, ps httprouter.Params, u *User, body []byte) {
|
||||
if sid, err := strconv.Atoi(string(ps.ByName("sid"))); err != nil {
|
||||
http.Error(w, "{\"errmsg\": \"Invalid survey identifier\"}", http.StatusBadRequest)
|
||||
func SurveyWSAdmin(c *gin.Context) {
|
||||
u := c.MustGet("LoggedUser").(*User)
|
||||
survey := c.MustGet("survey").(*Survey)
|
||||
|
||||
if survey.Direct == nil {
|
||||
c.AbortWithStatusJSON(http.StatusPaymentRequired, gin.H{"errmsg": "Not a live survey"})
|
||||
return
|
||||
} else if survey, err := getSurvey(sid); err != nil {
|
||||
http.Error(w, "{\"errmsg\": \"Survey not found\"}", http.StatusNotFound)
|
||||
return
|
||||
} else if survey.Direct == nil {
|
||||
http.Error(w, "{\"errmsg\": \"Not a direct survey\"}", http.StatusBadRequest)
|
||||
return
|
||||
} else {
|
||||
ws, err := websocket.Accept(w, r, nil)
|
||||
if err != nil {
|
||||
log.Fatal("error get connection", err)
|
||||
}
|
||||
}
|
||||
|
||||
log.Println(u.Login, "is now connected to WS-admin", sid)
|
||||
ws, err := websocket.Accept(c.Writer, c.Request, nil)
|
||||
if err != nil {
|
||||
log.Fatal("error get connection", err)
|
||||
}
|
||||
|
||||
c := make(chan WSMessage, 2)
|
||||
log.Println(u.Login, "is now connected to WS-admin", survey.Id)
|
||||
|
||||
WSAdminMutex.Lock()
|
||||
defer WSAdminMutex.Unlock()
|
||||
WSAdmin = append(WSAdmin, WSClient{ws, c, u, survey.Id})
|
||||
ch := make(chan WSMessage, 2)
|
||||
|
||||
// Send current state
|
||||
c <- msgCurrentState(&survey)
|
||||
WSAdminMutex.Lock()
|
||||
defer WSAdminMutex.Unlock()
|
||||
WSAdmin = append(WSAdmin, WSClient{ws, ch, u, survey.Id})
|
||||
|
||||
go SurveyWSAdmin_run(r.Context(), ws, c, survey.Id, u)
|
||||
go func(c chan WSMessage, sid int) {
|
||||
var v WSMessage
|
||||
var err error
|
||||
for {
|
||||
err = wsjson.Read(context.Background(), ws, &v)
|
||||
if err != nil {
|
||||
log.Println("Error when receiving message:", err)
|
||||
close(c)
|
||||
break
|
||||
// Send current state
|
||||
ch <- msgCurrentState(survey)
|
||||
|
||||
go SurveyWSAdmin_run(c.Request.Context(), ws, ch, survey.Id, u)
|
||||
go func(c chan WSMessage, sid int) {
|
||||
var v WSMessage
|
||||
var err error
|
||||
for {
|
||||
err = wsjson.Read(context.Background(), ws, &v)
|
||||
if err != nil {
|
||||
log.Println("Error when receiving message:", err)
|
||||
close(c)
|
||||
break
|
||||
}
|
||||
|
||||
if v.Action == "new_question" && v.QuestionId != nil {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else {
|
||||
if v.Timer > 0 {
|
||||
if *survey.Direct != 0 {
|
||||
var z int64 = 0
|
||||
survey.Direct = &z
|
||||
survey.Update()
|
||||
}
|
||||
go func() {
|
||||
time.Sleep(time.Duration(OffsetQuestionTimer+v.Timer) * time.Millisecond)
|
||||
survey.WSWriteAll(WSMessage{Action: "pause"})
|
||||
WSAdminWriteAll(WSMessage{Action: "pause", SurveyId: &survey.Id})
|
||||
}()
|
||||
} else {
|
||||
survey.Direct = v.QuestionId
|
||||
}
|
||||
_, err = survey.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to update survey:", err)
|
||||
}
|
||||
|
||||
survey.WSWriteAll(v)
|
||||
v.SurveyId = &survey.Id
|
||||
WSAdminWriteAll(v)
|
||||
}
|
||||
} else if v.Action == "pause" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else {
|
||||
var u int64 = 0
|
||||
survey.Direct = &u
|
||||
_, err = survey.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to update survey:", err)
|
||||
}
|
||||
|
||||
if v.Action == "new_question" && v.QuestionId != nil {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else {
|
||||
if v.Timer > 0 {
|
||||
if *survey.Direct != 0 {
|
||||
var z int64 = 0
|
||||
survey.Direct = &z
|
||||
survey.Update()
|
||||
}
|
||||
go func() {
|
||||
time.Sleep(time.Duration(OffsetQuestionTimer+v.Timer) * time.Millisecond)
|
||||
survey.WSWriteAll(WSMessage{Action: "pause"})
|
||||
WSAdminWriteAll(WSMessage{Action: "pause", SurveyId: &survey.Id})
|
||||
}()
|
||||
survey.WSWriteAll(v)
|
||||
v.SurveyId = &survey.Id
|
||||
WSAdminWriteAll(v)
|
||||
}
|
||||
} else if v.Action == "end" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else {
|
||||
survey.Direct = nil
|
||||
_, err = survey.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to update survey:", err)
|
||||
}
|
||||
|
||||
survey.WSCloseAll("Fin du live")
|
||||
v.SurveyId = &survey.Id
|
||||
WSAdminWriteAll(v)
|
||||
}
|
||||
} else if v.Action == "get_stats" {
|
||||
err = wsjson.Write(context.Background(), ws, WSMessage{Action: "stats", Stats: WSSurveyStats(int64(sid))})
|
||||
} else if v.Action == "get_responses" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else if questions, err := survey.GetQuestions(); err != nil {
|
||||
log.Println("Unable to retrieve questions:", err)
|
||||
} else {
|
||||
for _, q := range questions {
|
||||
if responses, err := q.GetResponses(); err != nil {
|
||||
log.Println("Unable to retrieve questions:", err)
|
||||
} else {
|
||||
survey.Direct = v.QuestionId
|
||||
}
|
||||
_, err = survey.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to update survey:", err)
|
||||
}
|
||||
|
||||
survey.WSWriteAll(v)
|
||||
v.SurveyId = &survey.Id
|
||||
WSAdminWriteAll(v)
|
||||
}
|
||||
} else if v.Action == "pause" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else {
|
||||
var u int64 = 0
|
||||
survey.Direct = &u
|
||||
_, err = survey.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to update survey:", err)
|
||||
}
|
||||
|
||||
survey.WSWriteAll(v)
|
||||
v.SurveyId = &survey.Id
|
||||
WSAdminWriteAll(v)
|
||||
}
|
||||
} else if v.Action == "end" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else {
|
||||
survey.Direct = nil
|
||||
_, err = survey.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to update survey:", err)
|
||||
}
|
||||
|
||||
survey.WSCloseAll("Fin du live")
|
||||
v.SurveyId = &survey.Id
|
||||
WSAdminWriteAll(v)
|
||||
}
|
||||
} else if v.Action == "get_stats" {
|
||||
err = wsjson.Write(context.Background(), ws, WSMessage{Action: "stats", Stats: WSSurveyStats(int64(sid))})
|
||||
} else if v.Action == "get_responses" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else if questions, err := survey.GetQuestions(); err != nil {
|
||||
log.Println("Unable to retrieve questions:", err)
|
||||
} else {
|
||||
for _, q := range questions {
|
||||
if responses, err := q.GetResponses(); err != nil {
|
||||
log.Println("Unable to retrieve questions:", err)
|
||||
} else {
|
||||
for _, r := range responses {
|
||||
wsjson.Write(context.Background(), ws, WSMessage{Action: "new_response", UserId: &r.IdUser, QuestionId: &q.Id, Response: r.Answer})
|
||||
}
|
||||
for _, r := range responses {
|
||||
wsjson.Write(context.Background(), ws, WSMessage{Action: "new_response", UserId: &r.IdUser, QuestionId: &q.Id, Response: r.Answer})
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if v.Action == "get_asks" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else if asks, err := survey.GetAsks(v.Response == ""); err != nil {
|
||||
log.Println("Unable to retrieve asks:", err)
|
||||
} else {
|
||||
for _, a := range asks {
|
||||
wsjson.Write(context.Background(), ws, WSMessage{Action: "new_ask", UserId: &a.IdUser, QuestionId: &a.Id, Response: a.Content})
|
||||
}
|
||||
}
|
||||
} else if v.Action == "get_asks" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else if asks, err := survey.GetAsks(v.Response == ""); err != nil {
|
||||
log.Println("Unable to retrieve asks:", err)
|
||||
} else {
|
||||
for _, a := range asks {
|
||||
wsjson.Write(context.Background(), ws, WSMessage{Action: "new_ask", UserId: &a.IdUser, QuestionId: &a.Id, Response: a.Content})
|
||||
}
|
||||
} else if v.Action == "mark_answered" && v.QuestionId != nil {
|
||||
if asks, err := GetAsk(int(*v.QuestionId)); err != nil {
|
||||
log.Println("Unable to retrieve ask:", err)
|
||||
} else {
|
||||
asks.Answered = true
|
||||
err = asks.Update()
|
||||
}
|
||||
} else if v.Action == "mark_answered" && v.QuestionId != nil {
|
||||
if asks, err := GetAsk(int(*v.QuestionId)); err != nil {
|
||||
log.Println("Unable to retrieve ask:", err)
|
||||
} else {
|
||||
asks.Answered = true
|
||||
err = asks.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to update:", err)
|
||||
}
|
||||
}
|
||||
} else if v.Action == "mark_answered" && v.Response == "all" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else if asks, err := survey.GetAsks(v.Response == ""); err != nil {
|
||||
log.Println("Unable to retrieve asks:", err)
|
||||
} else {
|
||||
for _, ask := range asks {
|
||||
ask.Answered = true
|
||||
err = ask.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to update:", err)
|
||||
}
|
||||
}
|
||||
} else if v.Action == "mark_answered" && v.Response == "all" {
|
||||
if survey, err := getSurvey(sid); err != nil {
|
||||
log.Println("Unable to retrieve survey:", err)
|
||||
} else if asks, err := survey.GetAsks(v.Response == ""); err != nil {
|
||||
log.Println("Unable to retrieve asks:", err)
|
||||
} else {
|
||||
for _, ask := range asks {
|
||||
ask.Answered = true
|
||||
err = ask.Update()
|
||||
if err != nil {
|
||||
log.Println("Unable to update:", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log.Println("Unknown admin action:", v.Action)
|
||||
}
|
||||
} else {
|
||||
log.Println("Unknown admin action:", v.Action)
|
||||
}
|
||||
}(c, sid)
|
||||
}
|
||||
}
|
||||
}(ch, int(survey.Id))
|
||||
}
|
||||
|
||||
func WSAdminWriteAll(message WSMessage) {
|
||||
|
|
Reference in a new issue