Files
uPortal2/backend/internal/rest/handler_sessions.go
T

85 lines
2.0 KiB
Go
Raw Normal View History

2026-10-21 13:17:44 +03:00
package rest
import (
"net/http"
"time"
"goAuth/internal/auth"
)
type sessionResponse struct {
Token string `json:"token"`
Address string `json:"address"`
Device string `json:"device"`
CreatedAt time.Time `json:"createdAt"`
ExpiresAt time.Time `json:"expiresAt"`
IsLong bool `json:"isLong"`
Current bool `json:"current"`
}
func (h *Handler) listSessions(w http.ResponseWriter, r *http.Request) {
u := userFromRequest(r)
current := sessionFromRequest(r)
limit, offset := pagination(r)
sessions, err := h.sessions.Sessions(r.Context(), u, limit, offset)
if err != nil {
h.fail(w, err)
return
}
result := make([]sessionResponse, 0, len(sessions))
for _, session := range sessions {
result = append(result, newSessionResponse(session, current))
}
writeJson(w, http.StatusOK, result)
}
func (h *Handler) signoutSession(w http.ResponseWriter, r *http.Request) {
u := userFromRequest(r)
token := r.PathValue("token")
session, err := h.sessions.SessionByToken(r.Context(), token)
if err != nil || session.UserId != u.Id {
writeError(w, http.StatusNotFound, "session not found")
return
}
if err := h.sessions.DeleteSession(r.Context(), session); err != nil {
h.fail(w, err)
return
}
if current := sessionFromRequest(r); current.Token == token {
auth.SignoutCleanup(w, h.cfg.Cookies.SessionName, h.cfg.Cookies.Secure)
h.refreshCsrf(w)
}
writeNoContent(w)
}
func (h *Handler) signoutAll(w http.ResponseWriter, r *http.Request) {
u := userFromRequest(r)
if err := h.sessions.DeleteSessions(r.Context(), u); err != nil {
h.fail(w, err)
return
}
auth.SignoutCleanup(w, h.cfg.Cookies.SessionName, h.cfg.Cookies.Secure)
h.refreshCsrf(w)
writeNoContent(w)
}
func newSessionResponse(session, current *auth.Session) sessionResponse {
return sessionResponse{
Token: session.Token,
Address: session.Address,
Device: session.Device,
CreatedAt: session.CreatedAt,
ExpiresAt: session.ExpiresAt,
IsLong: session.IsLong,
Current: current != nil && current.Token == session.Token,
}
}