Add table and model to persist user login sessions.

This commit is contained in:
Patrick Fairbank
2019-08-19 19:59:44 -07:00
parent 9569c04912
commit 3fca52b424
4 changed files with 100 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
-- +goose Up
CREATE TABLE user_sessions (
id INTEGER PRIMARY KEY,
token VARCHAR(255),
username VARCHAR(255),
createdat DATETIME
);
CREATE UNIQUE INDEX token ON user_sessions(token);
-- +goose Down
DROP TABLE user_sessions;

View File

@@ -37,6 +37,7 @@ type Database struct {
sponsorSlideMap *modl.DbMap
scheduleBlockMap *modl.DbMap
awardMap *modl.DbMap
userSessionMap *modl.DbMap
}
// Opens the SQLite database at the given path, creating it if it doesn't exist, and runs any pending
@@ -128,6 +129,9 @@ func (database *Database) mapTables() {
database.awardMap = modl.NewDbMap(database.db, dialect)
database.awardMap.AddTableWithName(Award{}, "awards").SetKeys(true, "Id")
database.userSessionMap = modl.NewDbMap(database.db, dialect)
database.userSessionMap.AddTableWithName(UserSession{}, "user_sessions").SetKeys(true, "Id")
}
func serializeHelper(target *string, source interface{}) error {

38
model/user_session.go Normal file
View File

@@ -0,0 +1,38 @@
// Copyright 2019 Team 254. All Rights Reserved.
// Author: pat@patfairbank.com (Patrick Fairbank)
//
// Model and datastore CRUD methods for a user login session.
package model
import "time"
type UserSession struct {
Id int
Token string
Username string
CreatedAt time.Time
}
func (database *Database) CreateUserSession(session *UserSession) error {
return database.userSessionMap.Insert(session)
}
func (database *Database) GetUserSessionByToken(token string) (*UserSession, error) {
session := new(UserSession)
err := database.userSessionMap.SelectOne(session, "SELECT * FROM user_sessions WHERE token = ?", token)
if err != nil && err.Error() == "sql: no rows in result set" {
session = nil
err = nil
}
return session, err
}
func (database *Database) DeleteUserSession(session *UserSession) error {
_, err := database.userSessionMap.Delete(session)
return err
}
func (database *Database) TruncateUserSessions() error {
return database.userSessionMap.TruncateTables()
}

View File

@@ -0,0 +1,47 @@
// Copyright 2019 Team 254. All Rights Reserved.
// Author: pat@patfairbank.com (Patrick Fairbank)
package model
import (
"github.com/stretchr/testify/assert"
"testing"
"time"
)
func TestGetNonexistentUserSession(t *testing.T) {
db := setupTestDb(t)
session, err := db.GetUserSessionByToken("blorpy")
assert.Nil(t, err)
assert.Nil(t, session)
}
func TestUserSessionCrud(t *testing.T) {
db := setupTestDb(t)
session := UserSession{0, "token1", "Bertha", time.Now()}
err := db.CreateUserSession(&session)
assert.Nil(t, err)
session2, err := db.GetUserSessionByToken("token1")
assert.Nil(t, err)
assert.Equal(t, session.Token, session2.Token)
assert.Equal(t, session.Username, session2.Username)
assert.True(t, session.CreatedAt.Equal(session2.CreatedAt))
db.DeleteUserSession(&session)
session2, err = db.GetUserSessionByToken("token1")
assert.Nil(t, err)
assert.Nil(t, session2)
}
func TestTruncateUserSessions(t *testing.T) {
db := setupTestDb(t)
session := UserSession{0, "token1", "Bertha", time.Now()}
db.CreateUserSession(&session)
db.TruncateUserSessions()
session2, err := db.GetUserSessionByToken("token1")
assert.Nil(t, err)
assert.Nil(t, session2)
}