Skip to content

Commit

Permalink
Fixed session error and simplified PetPic API some more
Browse files Browse the repository at this point in the history
  • Loading branch information
p0t4t0sandwich committed Apr 19, 2024
1 parent 5e96890 commit e4267a2
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 102 deletions.
4 changes: 3 additions & 1 deletion middleware/middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,9 @@ func RequestLoggerMiddleware(next http.Handler) http.Handler {
// Auth - Authenticate requests
func Auth(next http.HandlerFunc) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
sessService := auth.NewSessionService(auth.NewSessionStore(database.GetDB("neuralnexus")))
db := database.GetDB("neuralnexus")
rdb := database.GetRedis()
sessService := auth.NewSessionService(auth.NewSessionStore(db, rdb))

authHeader := r.Header.Get("Authorization")
if authHeader == "" {
Expand Down
5 changes: 3 additions & 2 deletions modules/auth/routes/authroutes.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ import (
// ApplyRoutes applies the auth routes
func ApplyRoutes(mux *http.ServeMux) *http.ServeMux {
db := database.GetDB("neuralnexus")
rdb := database.GetRedis()
acctStore := auth.NewAccountStore(db)
sessStore := auth.NewSessionStore(db)
sessStore := auth.NewSessionStore(db, rdb)
alstore := accountlinking.NewStore(db)

mux.HandleFunc("POST /api/v1/auth/login", LoginHandler(acctStore, sessStore))
Expand Down Expand Up @@ -68,7 +69,7 @@ func LoginHandler(as auth.AccountStore, ss auth.SessionStore) http.HandlerFunc {
// LogoutHandler handles the logout route
func LogoutHandler(ss auth.SessionStore) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
session := r.Context().Value(mw.SessionKey).(auth.Session)
session := r.Context().Value(mw.SessionKey).(*auth.Session)
ss.DeleteSessionFromCache(session.ID)
responses.SendAndEncodeStruct(w, r, http.StatusOK, session)
ss.DeleteSessionInDB(session.ID)
Expand Down
59 changes: 17 additions & 42 deletions modules/auth/sessionsstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import (
"log"
"time"

"github.com/NeuralNexusDev/neuralnexus-api/modules/database"
"github.com/google/uuid"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/redis/go-redis/v9"
)

// CREATE TABLE sessions (
Expand All @@ -34,28 +34,26 @@ type SessionStore interface {

// sessStore - SessionStore implementation
type sessStore struct {
db *pgxpool.Pool
db *pgxpool.Pool
rdb *redis.Client
}

// NewSessionStore - Create a new session store
func NewSessionStore(db *pgxpool.Pool) SessionStore {
func NewSessionStore(db *pgxpool.Pool, rdb *redis.Client) SessionStore {
return &sessStore{
db: db,
db: db,
rdb: rdb,
}
}

// AddSessionToDB creates a session and inserts it into the database
func (s *sessStore) AddSessionToDB(session *Session) (*Session, error) {
db := database.GetDB("neuralnexus")
defer db.Close()
defer s.ClearExpiredSessions()

_, err := db.Exec(context.Background(),
_, err := s.db.Exec(context.Background(),
"INSERT INTO sessions (session_id, user_id, permissions, iat, lua, exp) VALUES ($1, $2, $3, $4, $5, $6)",
session.ID, session.UserID, session.Permissions, session.IssuedAt, session.LastUsedAt, session.ExpiresAt,
)

defer s.ClearExpiredSessions()

if err != nil {
return nil, err
}
Expand All @@ -64,17 +62,14 @@ func (s *sessStore) AddSessionToDB(session *Session) (*Session, error) {

// GetSessionFromDB gets a session by ID
func (s *sessStore) GetSessionFromDB(id uuid.UUID) (*Session, error) {
db := database.GetDB("neuralnexus")
defer db.Close()
defer s.ClearExpiredSessions()

var session *Session
rows, err := db.Query(context.Background(), "SELECT * FROM sessions WHERE session_id = $1", id)
rows, err := s.db.Query(context.Background(), "SELECT * FROM sessions WHERE session_id = $1", id)
if err != nil {
return nil, err
}

defer s.ClearExpiredSessions()

session, err = pgx.CollectExactlyOneRow(rows, pgx.RowToAddrOfStructByName[Session])
if err != nil {
return nil, err
Expand All @@ -84,13 +79,9 @@ func (s *sessStore) GetSessionFromDB(id uuid.UUID) (*Session, error) {

// DeleteSessionInDB deletes a session by ID
func (s *sessStore) DeleteSessionInDB(id uuid.UUID) (*Session, error) {
db := database.GetDB("neuralnexus")
defer db.Close()

_, err := db.Exec(context.Background(), "DELETE FROM sessions WHERE session_id = $1", id)

defer s.ClearExpiredSessions()

_, err := s.db.Exec(context.Background(), "DELETE FROM sessions WHERE session_id = $1", id)
if err != nil {
return nil, err
}
Expand All @@ -99,16 +90,12 @@ func (s *sessStore) DeleteSessionInDB(id uuid.UUID) (*Session, error) {

// UpdateSessionInDB updates a session
func (s *sessStore) UpdateSessionInDB(session *Session) (*Session, error) {
db := database.GetDB("neuralnexus")
defer db.Close()
defer s.ClearExpiredSessions()

_, err := db.Exec(context.Background(),
_, err := s.db.Exec(context.Background(),
"UPDATE sessions SET user_id = $2, permissions = $3, iat = $4, lua = $5, exp = $6 WHERE session_id = $1",
session.ID, session.UserID, session.Permissions, session.IssuedAt, session.LastUsedAt, session.ExpiresAt,
)

defer s.ClearExpiredSessions()

if err != nil {
return nil, err
}
Expand All @@ -117,10 +104,7 @@ func (s *sessStore) UpdateSessionInDB(session *Session) (*Session, error) {

// Clear expired sessions
func (s *sessStore) ClearExpiredSessions() {
db := database.GetDB("neuralnexus")
defer db.Close()

_, err := db.Exec(context.Background(), "DELETE FROM sessions WHERE exp < $1 AND exp != 0", time.Now().Unix())
_, err := s.db.Exec(context.Background(), "DELETE FROM sessions WHERE exp < $1 AND exp != 0", time.Now().Unix())
if err != nil {
log.Println("Unable to clear expired sessions:")
log.Println(err)
Expand All @@ -131,15 +115,12 @@ func (s *sessStore) ClearExpiredSessions() {

// AddSessionToCache adds a session to the cache
func (s *sessStore) AddSessionToCache(session *Session) (*Session, error) {
rdb := database.GetRedis()
defer rdb.Close()

stringSession, err := json.Marshal(session)
if err != nil {
return nil, err
}

_, err = rdb.Set(context.Background(), session.ID.String(), stringSession, time.Until(time.Unix(session.ExpiresAt, 0))).Result()
_, err = s.rdb.Set(context.Background(), session.ID.String(), stringSession, time.Until(time.Unix(session.ExpiresAt, 0))).Result()
if err != nil {
return nil, err
}
Expand All @@ -148,11 +129,8 @@ func (s *sessStore) AddSessionToCache(session *Session) (*Session, error) {

// GetSessionFromCache gets a session from the cache
func (s *sessStore) GetSessionFromCache(id uuid.UUID) (*Session, error) {
rdb := database.GetRedis()
defer rdb.Close()

var session Session
stringSession, err := rdb.Get(context.Background(), id.String()).Result()
stringSession, err := s.rdb.Get(context.Background(), id.String()).Result()
if err != nil {
return nil, err
}
Expand All @@ -166,10 +144,7 @@ func (s *sessStore) GetSessionFromCache(id uuid.UUID) (*Session, error) {

// DeleteSessionFromCache deletes a session from the cache
func (s *sessStore) DeleteSessionFromCache(id uuid.UUID) (*Session, error) {
rdb := database.GetRedis()
defer rdb.Close()

_, err := rdb.Del(context.Background(), id.String()).Result()
_, err := s.rdb.Del(context.Background(), id.String()).Result()
if err != nil {
return nil, err
}
Expand Down
10 changes: 5 additions & 5 deletions modules/bee_name_generator/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func GetBeeNameHandler(s BNGStore) http.HandlerFunc {
// UploadBeeNameHandler Upload a bee name
func UploadBeeNameHandler(s BNGStore) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
session := r.Context().Value(mw.SessionKey).(auth.Session)
session := r.Context().Value(mw.SessionKey).(*auth.Session)
if !session.HasPermission(auth.ScopeAdminBeeNameGenerator) {
responses.SendAndEncodeForbidden(w, r, "You do not have permission to upload bee names")
return
Expand All @@ -66,7 +66,7 @@ func UploadBeeNameHandler(s BNGStore) http.HandlerFunc {
// DeleteBeeName Delete a bee name
func DeleteBeeNameHandler(s BNGStore) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
session := r.Context().Value(mw.SessionKey).(auth.Session)
session := r.Context().Value(mw.SessionKey).(*auth.Session)
if !session.HasPermission(auth.ScopeAdminBeeNameGenerator) {
responses.SendAndEncodeForbidden(w, r, "You do not have permission to delete bee names")
return
Expand Down Expand Up @@ -110,7 +110,7 @@ func SubmitBeeNameHandler(s BNGStore) http.HandlerFunc {
// GetBeeNameSuggestions Get a list of bee name suggestions
func GetBeeNameSuggestionsHandler(s BNGStore) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
session := r.Context().Value(mw.SessionKey).(auth.Session)
session := r.Context().Value(mw.SessionKey).(*auth.Session)
if !session.HasPermission(auth.ScopeAdminBeeNameGenerator) {
responses.SendAndEncodeForbidden(w, r, "You do not have permission to get bee name suggestions")
return
Expand Down Expand Up @@ -143,7 +143,7 @@ func GetBeeNameSuggestionsHandler(s BNGStore) http.HandlerFunc {
// AcceptBeeNameSuggestionHandler Accept a bee name suggestion
func AcceptBeeNameSuggestionHandler(s BNGStore) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
session := r.Context().Value(mw.SessionKey).(auth.Session)
session := r.Context().Value(mw.SessionKey).(*auth.Session)
if !session.HasPermission(auth.ScopeAdminBeeNameGenerator) {
responses.SendAndEncodeForbidden(w, r, "You do not have permission to accept bee name suggestions")
return
Expand All @@ -168,7 +168,7 @@ func AcceptBeeNameSuggestionHandler(s BNGStore) http.HandlerFunc {
// RejectBeeNameSuggestionHandler Reject a bee name suggestion
func RejectBeeNameSuggestionHandler(s BNGStore) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
session := r.Context().Value(mw.SessionKey).(auth.Session)
session := r.Context().Value(mw.SessionKey).(*auth.Session)
if !session.HasPermission(auth.ScopeAdminBeeNameGenerator) {
responses.SendAndEncodeForbidden(w, r, "You do not have permission to reject bee name suggestions")
return
Expand Down
22 changes: 11 additions & 11 deletions modules/pet_pictures/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func CreatePetHandler(s PetPicService) http.HandlerFunc {
return
}

petResponse, err := s.DB().CreatePet(petName)
petResponse, err := s.GetStore().CreatePet(petName)
if err != nil {
log.Println("[Error]: Unable to create pet:\n\t", err)
responses.SendAndEncodeInternalServerError(w, r, "Unable to create pet (pet may already exist)")
Expand Down Expand Up @@ -85,7 +85,7 @@ func GetPetHandler(s PetPicService) http.HandlerFunc {
return
}

pet, err := s.DB().GetPet(petID)
pet, err := s.GetStore().GetPet(petID)
if err != nil {
log.Println("[Error]: Unable to get pet:\n\t", err)
responses.SendAndEncodeNotFound(w, r, "Pet not found")
Expand All @@ -98,7 +98,7 @@ func GetPetHandler(s PetPicService) http.HandlerFunc {
// UpdatePetHandler - Update a pet
func UpdatePetHandler(s PetPicService) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var pet Pet
var pet *Pet
err := responses.DecodeStruct(r, &pet)
if err != nil {
responses.SendAndEncodeBadRequest(w, r, "Invalid input, unable to parse body")
Expand All @@ -111,7 +111,7 @@ func UpdatePetHandler(s PetPicService) http.HandlerFunc {
return
}

_, err = s.DB().UpdatePet(pet)
_, err = s.GetStore().UpdatePet(pet)
if err != nil {
log.Println("[Error]: Unable to update pet:\n\t", err)
responses.SendAndEncodeInternalServerError(w, r, "Unable to update pet")
Expand All @@ -137,7 +137,7 @@ func GetRandPetPictureByNameHandler(s PetPicService) http.HandlerFunc {
return
}

petPicture, err := s.DB().GetRandPetPictureByName(petName)
petPicture, err := s.GetStore().GetRandPetPictureByName(petName)
if err != nil {
log.Println("[Error]: Unable to get random pet picture:\n\t", err)
responses.SendAndEncodeNotFound(w, r, "Unable to get random pet picture")
Expand All @@ -163,7 +163,7 @@ func GetPetPictureHandler(s PetPicService) http.HandlerFunc {
return
}

petPicture, err := s.DB().GetPetPicture(petPictureID)
petPicture, err := s.GetStore().GetPetPicture(petPictureID)
if err != nil {
log.Println("[Error]: Unable to get pet picture:\n\t", err)
responses.SendAndEncodeNotFound(w, r, "Unable to get pet picture")
Expand All @@ -183,7 +183,7 @@ func UpdatePetPictureHandler(s PetPicService) http.HandlerFunc {
return
}

pet, err := s.DB().GetPet(petPicture.PrimarySubject)
pet, err := s.GetStore().GetPet(petPicture.PrimarySubject)
if err != nil {
log.Println("[Error]: Unable to get pet:\n\t", err)
responses.SendAndEncodeNotFound(w, r, "Unable to get pet")
Expand All @@ -196,7 +196,7 @@ func UpdatePetPictureHandler(s PetPicService) http.HandlerFunc {
return
}

_, err = s.DB().UpdatePetPicture(petPicture)
_, err = s.GetStore().UpdatePetPicture(petPicture)
if err != nil {
log.Println("[Error]: Unable to update pet picture:\n\t", err)
responses.SendAndEncodeInternalServerError(w, r, "Unable to update pet picture")
Expand All @@ -222,14 +222,14 @@ func DeletePetPictureHandler(s PetPicService) http.HandlerFunc {
return
}

petPicture, err := s.DB().GetPetPicture(petPictureID)
petPicture, err := s.GetStore().GetPetPicture(petPictureID)
if err != nil {
log.Println("[Error]: Unable to get pet picture:\n\t", err)
responses.SendAndEncodeNotFound(w, r, "Unable to get pet picture")
return
}

pet, err := s.DB().GetPet(petPicture.PrimarySubject)
pet, err := s.GetStore().GetPet(petPicture.PrimarySubject)
if err != nil {
log.Println("[Error]: Unable to get pet:\n\t", err)
responses.SendAndEncodeNotFound(w, r, "Unable to get pet")
Expand All @@ -242,7 +242,7 @@ func DeletePetPictureHandler(s PetPicService) http.HandlerFunc {
return
}

_, err = s.DB().DeletePetPicture(petPictureID)
_, err = s.GetStore().DeletePetPicture(petPictureID)
if err != nil {
log.Println("[Error]: Unable to delete pet picture:\n\t", err)
responses.SendAndEncodeInternalServerError(w, r, "Unable to delete pet picture")
Expand Down
Loading

0 comments on commit e4267a2

Please sign in to comment.