Basic functionality

This commit is contained in:
Henri Burau
2024-06-05 18:01:08 +02:00
parent 17f878f088
commit 72dce76e2b
41 changed files with 1568 additions and 176 deletions

52
routes/auth.go Normal file
View File

@ -0,0 +1,52 @@
package routes
import (
"net/http"
"time"
"gitea.henriburau.de/haw-lan/cod4watcher/services"
"gitea.henriburau.de/haw-lan/cod4watcher/views/auth"
)
func (s *Server) HandleLogin(w http.ResponseWriter, r *http.Request) error {
return Render(w, r, auth.LoginForm(auth.LoginFormValues{}, map[string]string{}))
}
func (s *Server) HandleSignin(w http.ResponseWriter, r *http.Request) error {
r.ParseForm()
creds := services.Credentials{
Username: r.FormValue("username"),
Password: r.FormValue("password"),
}
token, expiresIn, err := services.Signin(creds)
if err != nil {
errors := map[string]string{
"username": "username or password incorrect" + err.Error(),
"password": "username or password incorrect" + err.Error(),
}
return Render(w, r, auth.LoginForm(auth.LoginFormValues{
Username: creds.Username,
Password: creds.Password,
}, errors))
}
http.SetCookie(w, &http.Cookie{
Name: "session_token",
Value: token,
Expires: expiresIn,
})
return hxRedirect(w, r, "/")
}
func (s *Server) HandleLogout(w http.ResponseWriter, r *http.Request) error {
http.SetCookie(w, &http.Cookie{
Name: "session_token",
Value: "",
Expires: time.Time{},
})
return hxRedirect(w, r, "/")
}

62
routes/auth_middleware.go Normal file
View File

@ -0,0 +1,62 @@
package routes
import (
"context"
"log/slog"
"net/http"
"gitea.henriburau.de/haw-lan/cod4watcher/services"
"gitea.henriburau.de/haw-lan/cod4watcher/views"
)
func OnlyAuthenticatedMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
session, err := getSession(r)
if err != nil {
slog.Error("failed to optain session", "err", err)
}
if session != nil {
next.ServeHTTP(w, r)
}
w.WriteHeader(http.StatusUnauthorized)
})
}
func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
session, err := getSession(r)
if err != nil {
slog.Error("error getting token", "err", err)
}
username := ""
if session != nil {
username = session.Username
}
ctx := context.WithValue(r.Context(), views.AuthContext, username)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
func getSession(r *http.Request) (*services.Session, error) {
c, err := r.Cookie("session_token")
if err != nil {
return nil, err
}
sessionToken := c.Value
session, err := services.GetSession(sessionToken)
if err != nil {
return nil, err
}
if session.IsExpired() {
services.RemoveSession(sessionToken)
return nil, nil
}
return session, nil
}

View File

@ -7,6 +7,7 @@ import (
"gitea.henriburau.de/haw-lan/cod4watcher/models"
"gitea.henriburau.de/haw-lan/cod4watcher/views/capture"
"gitea.henriburau.de/haw-lan/cod4watcher/views/components"
"github.com/go-chi/chi"
)
@ -22,7 +23,52 @@ func (s *Server) HandleCapture(w http.ResponseWriter, r *http.Request) error {
return err
}
return Render(w, r, capture.Capture(foundCapture))
return Render(w, r, capture.Capture(foundCapture, *foundCapture.MapScores.BuildTable()))
}
func (s *Server) HandleCaptureTable(w http.ResponseWriter, r *http.Request) error {
captureString := chi.URLParam(r, "captureID")
captureID, err := strconv.ParseInt(captureString, 10, 64)
if err != nil {
return err
}
foundCapture, err := s.cs.GetCaptureById(r.Context(), captureID)
if err != nil {
return err
}
return Render(w, r, components.CaptureTable(*foundCapture.MapScores.BuildTable()))
}
func (s *Server) HandleCaptureStart(w http.ResponseWriter, r *http.Request) error {
captureString := chi.URLParam(r, "captureID")
captureID, err := strconv.ParseInt(captureString, 10, 64)
if err != nil {
return err
}
err = s.cs.StartCapture(r.Context(), captureID)
if err != nil {
return err
}
return hxRedirect(w, r, "/")
}
func (s *Server) HandleCaptureStop(w http.ResponseWriter, r *http.Request) error {
captureString := chi.URLParam(r, "captureID")
captureID, err := strconv.ParseInt(captureString, 10, 64)
if err != nil {
return err
}
err = s.cs.StopCapture(r.Context(), captureID)
if err != nil {
return err
}
return hxRedirect(w, r, "/")
}
func (s *Server) HandleCaptureDelete(w http.ResponseWriter, r *http.Request) error {
@ -58,7 +104,7 @@ func (s *Server) HandleCaptureCreate(w http.ResponseWriter, r *http.Request) err
Start: time.Now(),
}
_, err := s.cs.GetServerStatus(r.Context(), newCapture)
_, err := s.c4s.GetServerStatus(newCapture.Host, newCapture.Port)
if err != nil {
errors["host"] = err.Error()
errors["port"] = err.Error()

17
routes/cod4server.go Normal file
View File

@ -0,0 +1,17 @@
package routes
import (
"net/http"
"gitea.henriburau.de/haw-lan/cod4watcher/views/cod4server"
)
func (s *Server) HandleServerStatus(w http.ResponseWriter, r *http.Request) error {
status, err := s.c4s.GetServerStatus(r.URL.Query().Get("host"), r.URL.Query().Get("port"))
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return err
}
return Render(w, r, cod4server.ServerStatus(status))
}

View File

@ -3,17 +3,24 @@ package routes
import (
"net/http"
"gitea.henriburau.de/haw-lan/cod4watcher/models"
"gitea.henriburau.de/haw-lan/cod4watcher/views"
"gitea.henriburau.de/haw-lan/cod4watcher/views/home"
"github.com/davecgh/go-spew/spew"
)
func (s *Server) HandleHome(w http.ResponseWriter, r *http.Request) error {
captureList, err := s.cs.GetActiveCapures(r.Context())
var captureList []models.Capture
var err error
if views.Username(r.Context()) != "" {
captureList, err = s.cs.GetCaptures(r.Context())
} else {
captureList, err = s.cs.GetActiveCapures(r.Context())
}
if err != nil {
return err
}
spew.Dump(r.Context())
return Render(w, r, home.Index(captureList))
}

View File

@ -19,12 +19,13 @@ func Make(h HTTPHandler) http.HandlerFunc {
}
type Server struct {
cs *services.CaptureService
cs *services.CaptureService
c4s *services.CoD4Service
}
func NewServer(cs *services.CaptureService) *Server {
func NewServer(cs *services.CaptureService, c4s *services.CoD4Service) *Server {
return &Server{
cs,
cs, c4s,
}
}