From 3f4914d260d44a30d1ce0c7f8d288115a06038d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Mon, 16 Nov 2020 22:48:20 +0100 Subject: [PATCH] REST API control. --- internal/api/room/control.go | 55 ++++++++++++++++++++++++++++++++++++ internal/api/room/handler.go | 5 ++++ 2 files changed, 60 insertions(+) diff --git a/internal/api/room/control.go b/internal/api/room/control.go index 01912655..7fc76281 100644 --- a/internal/api/room/control.go +++ b/internal/api/room/control.go @@ -1 +1,56 @@ package room + +import ( + "net/http" + + "demodesk/neko/internal/types/event" + "demodesk/neko/internal/types/message" + "demodesk/neko/internal/utils" + "demodesk/neko/internal/http/auth" +) + +func (h *RoomHandler) ControlRequest(w http.ResponseWriter, r *http.Request) { + session := auth.GetSession(r) + if session.IsHost() { + utils.HttpBadRequest(w, "User is already host.") + return + } + + host := h.sessions.GetHost() + if host != nil { + utils.HttpBadRequest(w, "There is already a host.") + return + } + + h.sessions.SetHost(session) + + if err := h.sessions.Broadcast( + message.Control{ + Event: event.CONTROL_LOCKED, + ID: session.ID(), + }, nil); err != nil { + h.logger.Warn().Err(err).Msgf("broadcasting event %s has failed", event.CONTROL_LOCKED) + } + + utils.HttpSuccess(w) +} + +func (h *RoomHandler) ControlRelease(w http.ResponseWriter, r *http.Request) { + session := auth.GetSession(r) + if !session.IsHost() { + utils.HttpBadRequest(w, "User is not the host.") + return + } + + h.sessions.ClearHost() + + if err := h.sessions.Broadcast( + message.Control{ + Event: event.CONTROL_RELEASE, + ID: session.ID(), + }, nil); err != nil { + h.logger.Warn().Err(err).Msgf("broadcasting event %s has failed", event.CONTROL_RELEASE) + } + + utils.HttpSuccess(w) +} diff --git a/internal/api/room/handler.go b/internal/api/room/handler.go index e01c43f3..294ff1ac 100644 --- a/internal/api/room/handler.go +++ b/internal/api/room/handler.go @@ -46,4 +46,9 @@ func (h *RoomHandler) Route(r chi.Router) { r.Get("/", h.ClipboardRead) r.Post("/", h.ClipboardWrite) }) + + r.Route("/control", func(r chi.Router) { + r.Post("/request", h.ControlRequest) + r.Post("/release", h.ControlRelease) + }) }