From 97ffcbdaa4ddeae14d76abf7c4b115d5a938b6b4 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Sun, 15 Jun 2025 18:09:26 +0200 Subject: [PATCH] feat: sessions endpoints --- internal/admin/sessions.go | 89 ++++++++++++++++++++++++++++++++++++++ internal/types/session.go | 29 +++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 internal/admin/sessions.go create mode 100644 internal/types/session.go diff --git a/internal/admin/sessions.go b/internal/admin/sessions.go new file mode 100644 index 0000000..bd7226f --- /dev/null +++ b/internal/admin/sessions.go @@ -0,0 +1,89 @@ +package admin + +import ( + "encoding/json" + "log" + "net/http" + "strconv" + + "gitea.local/admin/hspguard/internal/repository" + "gitea.local/admin/hspguard/internal/types" + "gitea.local/admin/hspguard/internal/web" +) + +type GetSessionsParams struct { + Limit int32 `json:"limit"` + Offset int32 `json:"offset"` + // TODO: More filtering possibilities like onlyActive, expired, not-expired etc. +} + +func (h *AdminHandler) GetUserSessions(w http.ResponseWriter, r *http.Request) { + q := r.URL.Query() + + params := GetSessionsParams{} + + if limit, err := strconv.Atoi(q.Get("limit")); err == nil { + params.Limit = int32(limit) + } + + if offset, err := strconv.Atoi(q.Get("offset")); err == nil { + params.Offset = int32(offset) + } + + sessions, err := h.repo.GetUserSessions(r.Context(), repository.GetUserSessionsParams{ + Limit: params.Limit, + Offset: params.Offset, + }) + if err != nil { + log.Println("ERR: Failed to read user sessions from db:", err) + web.Error(w, "failed to retrieve sessions", http.StatusInternalServerError) + return + } + + var mapped []*types.UserSessionDTO + + for _, session := range sessions { + mapped = append(mapped, types.NewUserSessionDTO(&session)) + } + + if err := json.NewEncoder(w).Encode(mapped); err != nil { + log.Println("ERR: Failed to encode sessions in response:", err) + web.Error(w, "failed to encode sessions", http.StatusInternalServerError) + return + } +} + +func (h *AdminHandler) GetServiceSessions(w http.ResponseWriter, r *http.Request) { + q := r.URL.Query() + + params := GetSessionsParams{} + + if limit, err := strconv.Atoi(q.Get("limit")); err == nil { + params.Limit = int32(limit) + } + + if offset, err := strconv.Atoi(q.Get("offset")); err == nil { + params.Offset = int32(offset) + } + + sessions, err := h.repo.GetServiceSessions(r.Context(), repository.GetServiceSessionsParams{ + Limit: params.Limit, + Offset: params.Offset, + }) + if err != nil { + log.Println("ERR: Failed to read api sessions from db:", err) + web.Error(w, "failed to retrieve sessions", http.StatusInternalServerError) + return + } + + var mapped []*types.ServiceSessionDTO + + for _, session := range sessions { + mapped = append(mapped, types.NewServiceSessionDTO(&session)) + } + + if err := json.NewEncoder(w).Encode(sessions); err != nil { + log.Println("ERR: Failed to encode sessions in response:", err) + web.Error(w, "failed to encode sessions", http.StatusInternalServerError) + } +} diff --git a/internal/types/session.go b/internal/types/session.go new file mode 100644 index 0000000..26649c3 --- /dev/null +++ b/internal/types/session.go @@ -0,0 +1,29 @@ +package types + +import "gitea.local/admin/hspguard/internal/repository" + +type ServiceSessionDTO struct { + User UserDTO `json:"user"` + ApiService ApiServiceDTO `json:"api_service"` + repository.ServiceSession +} + +func NewServiceSessionDTO(row *repository.GetServiceSessionsRow) *ServiceSessionDTO { + return &ServiceSessionDTO{ + User: NewUserDTO(&row.User), + ApiService: NewApiServiceDTO(row.ApiService), + ServiceSession: row.ServiceSession, + } +} + +type UserSessionDTO struct { + User UserDTO `json:"user"` + repository.UserSession +} + +func NewUserSessionDTO(row *repository.GetUserSessionsRow) *UserSessionDTO { + return &UserSessionDTO{ + User: NewUserDTO(&row.User), + UserSession: row.UserSession, + } +}