Christopher James Hayward
1 year ago
9 changed files with 150 additions and 178 deletions
-
27cmd/server/main.go
-
9go.mod
-
29go.sum
-
7server/models/password_token.go
-
10server/models/session.go
-
10server/models/user.go
-
110server/server.go
-
60server/token_db.go
-
62server/user_db.go
@ -0,0 +1,7 @@ |
|||||
|
package models |
||||
|
|
||||
|
type PasswordToken struct { |
||||
|
Token string |
||||
|
Expires int64 |
||||
|
UserID uint |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
package models |
||||
|
|
||||
|
import "gorm.io/gorm" |
||||
|
|
||||
|
type Session struct { |
||||
|
gorm.Model |
||||
|
Token string |
||||
|
Expires int64 |
||||
|
UserID uint |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
package models |
||||
|
|
||||
|
import "gorm.io/gorm" |
||||
|
|
||||
|
type User struct { |
||||
|
gorm.Model |
||||
|
Email string |
||||
|
Password string |
||||
|
Sessions []Session |
||||
|
} |
@ -1,60 +0,0 @@ |
|||||
package server |
|
||||
|
|
||||
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 |
|
||||
} |
|
@ -1,62 +0,0 @@ |
|||||
package server |
|
||||
|
|
||||
import "errors" |
|
||||
|
|
||||
type User struct { |
|
||||
ID int64 |
|
||||
Email string |
|
||||
Password string |
|
||||
} |
|
||||
|
|
||||
type UserDB interface { |
|
||||
FindByID(id int64) (*User, error) |
|
||||
FindByEmail(email string) (*User, error) |
|
||||
Save(*User) error |
|
||||
} |
|
||||
|
|
||||
type inMemoryUserDB struct { |
|
||||
UserDB |
|
||||
nextID int64 |
|
||||
users []*User |
|
||||
} |
|
||||
|
|
||||
func newInMemoryUserDB() *inMemoryUserDB { |
|
||||
return &inMemoryUserDB{ |
|
||||
nextID: 1, |
|
||||
users: make([]*User, 0), |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
func (m *inMemoryUserDB) FindByID(id int64) (*User, error) { |
|
||||
for _, u := range m.users { |
|
||||
if u.ID == id { |
|
||||
return u, nil |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
return nil, errors.New("User not found.") |
|
||||
} |
|
||||
|
|
||||
func (m *inMemoryUserDB) FindByEmail(email string) (*User, error) { |
|
||||
for _, u := range m.users { |
|
||||
if u.Email == email { |
|
||||
return u, nil |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
return nil, errors.New("User not found.") |
|
||||
} |
|
||||
|
|
||||
func (m *inMemoryUserDB) Save(user *User) error { |
|
||||
for i, u := range m.users { |
|
||||
if u.ID == user.ID || u.Email == user.Email { |
|
||||
m.users[i] = user |
|
||||
return nil |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
user.ID = m.nextID |
|
||||
m.users = append(m.users, user) |
|
||||
m.nextID++ |
|
||||
return nil |
|
||||
} |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue