package main import ( "errors" "time" ) type Token struct { UserID int64 Token string Expires *time.Time } type TokenDB interface { FindByUserID(id int64) (*Token, error) FindByToken(token string) (*Token, error) Save(token *Token) error } type inMemoryTokenDB struct { tokens []*Token } func newInMemoryTokenDB() *inMemoryTokenDB { return &inMemoryTokenDB{ tokens: make([]*Token, 0), } } func (m *inMemoryTokenDB) FindByUserID(id int64) (*Token, error) { for _, t := range m.tokens { if t.UserID == id { return t, nil } } return nil, errors.New("Token not found.") } func (m *inMemoryTokenDB) FindByToken(token string) (*Token, error) { for _, t := range m.tokens { if t.Token == token { return t, nil } } return nil, errors.New("Token not found.") } func (m *inMemoryTokenDB) Save(token *Token) error { for i, t := range m.tokens { if t.UserID == token.UserID || t.Token == token.Token { m.tokens[i] = token return nil } } m.tokens = append(m.tokens, token) return nil }