You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
1.0 KiB

1 year ago
  1. package server
  2. import (
  3. "errors"
  4. "time"
  5. )
  6. type Token struct {
  7. UserID int64
  8. Token string
  9. Expires *time.Time
  10. }
  11. type TokenDB interface {
  12. FindByUserID(id int64) (*Token, error)
  13. FindByToken(token string) (*Token, error)
  14. Save(token *Token) error
  15. }
  16. type inMemoryTokenDB struct {
  17. tokens []*Token
  18. }
  19. func newInMemoryTokenDB() *inMemoryTokenDB {
  20. return &inMemoryTokenDB{
  21. tokens: make([]*Token, 0),
  22. }
  23. }
  24. func (m *inMemoryTokenDB) FindByUserID(id int64) (*Token, error) {
  25. for _, t := range m.tokens {
  26. if t.UserID == id {
  27. return t, nil
  28. }
  29. }
  30. return nil, errors.New("Token not found.")
  31. }
  32. func (m *inMemoryTokenDB) FindByToken(token string) (*Token, error) {
  33. for _, t := range m.tokens {
  34. if t.Token == token {
  35. return t, nil
  36. }
  37. }
  38. return nil, errors.New("Token not found.")
  39. }
  40. func (m *inMemoryTokenDB) Save(token *Token) error {
  41. for i, t := range m.tokens {
  42. if t.UserID == token.UserID || t.Token == token.Token {
  43. m.tokens[i] = token
  44. return nil
  45. }
  46. }
  47. m.tokens = append(m.tokens, token)
  48. return nil
  49. }