diff --git a/go.mod b/go.mod index 7056015..7a9d0f4 100644 --- a/go.mod +++ b/go.mod @@ -10,4 +10,5 @@ require ( github.com/gorilla/csrf v1.7.1 // indirect github.com/jmoiron/sqlx v1.3.4 // indirect github.com/lib/pq v1.10.2 // indirect + golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect ) diff --git a/go.sum b/go.sum index bb48cb2..a0498ac 100644 --- a/go.sum +++ b/go.sum @@ -33,5 +33,13 @@ github.com/ogier/pflag v0.0.1 h1:RW6JSWSu/RkSatfcLtogGfFgpim5p7ARQ10ECk5O750= github.com/ogier/pflag v0.0.1/go.mod h1:zkFki7tvTa0tafRvTBIZTvzYyAu6kQhPZFnshFFPE+g= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/goddit.go b/goddit.go index edb8ff5..b6ba6b1 100644 --- a/goddit.go +++ b/goddit.go @@ -25,6 +25,11 @@ type Comment struct { Votes int `db:"votes"` } +type User struct { + ID uuid.UUID `db:"id"` + Username string `db:"username"` + Password string `db:"password"` +} type ThreadStore interface { Thread(id uuid.UUID) (Thread, error) Threads() ([]Thread, error) @@ -50,8 +55,17 @@ type CommentStore interface { DeleteComment(id uuid.UUID) error } +type UserStore interface { + User(id uuid.UUID) (User, error) + UserByUsername(username string) (User, error) + CreateUser(u *User) error + UpdateUser(u *User) error + DeleteUser(id uuid.UUID) error +} + type Store interface { ThreadStore PostStore CommentStore + UserStore } diff --git a/migrations/3_create_users_table.down.sql b/migrations/3_create_users_table.down.sql new file mode 100644 index 0000000..441087a --- /dev/null +++ b/migrations/3_create_users_table.down.sql @@ -0,0 +1 @@ +DROP TABLE users; \ No newline at end of file diff --git a/migrations/3_create_users_table.up.sql b/migrations/3_create_users_table.up.sql new file mode 100644 index 0000000..2cafcd8 --- /dev/null +++ b/migrations/3_create_users_table.up.sql @@ -0,0 +1,5 @@ +CREATE TABLE users ( + id UUID PRIMARY KEY, + username TEXT NOT NULL UNIQUE, + password TEXT NOT NULL +); \ No newline at end of file diff --git a/postgres/store.go b/postgres/store.go index 980e87a..ce4f946 100644 --- a/postgres/store.go +++ b/postgres/store.go @@ -20,6 +20,7 @@ func NewStore(dataSourceName string) (*Store, error) { ThreadStore: &ThreadStore{DB: db}, PostStore: &PostStore{DB: db}, CommentStore: &CommentStore{DB: db}, + UserStore: &UserStore{DB: db}, }, nil } @@ -27,4 +28,5 @@ type Store struct { *ThreadStore *PostStore *CommentStore + *UserStore } diff --git a/postgres/user_store.go b/postgres/user_store.go new file mode 100644 index 0000000..f4b5af9 --- /dev/null +++ b/postgres/user_store.go @@ -0,0 +1,64 @@ +package postgres + +import ( + "fmt" + + "git.snrd.de/Spaenny/goddit" + "github.com/google/uuid" + "github.com/jmoiron/sqlx" +) + +type UserStore struct { + *sqlx.DB +} + +func (s *UserStore) User(id uuid.UUID) (goddit.User, error) { + var u goddit.User + if err := s.Get(&u, `SELECT * FROM users WHERE id = $1`, id); err != nil { + return goddit.User{}, fmt.Errorf("error getting user: %w", err) + } + return u, nil +} + +func (s *UserStore) UserByUsername(username string) (goddit.User, error) { + var u goddit.User + if err := s.Get(&u, `SELECT * FROM users WHERE username = $1`, username); err != nil { + return goddit.User{}, fmt.Errorf("error getting user: %w", err) + } + return u, nil +} + +func (s *UserStore) Users() ([]goddit.User, error) { + var uu []goddit.User + if err := s.Select(&uu, `SELECT * FROM users`); err != nil { + return []goddit.User{}, fmt.Errorf("error getting users: %w", err) + } + return uu, nil +} + +func (s *UserStore) CreateUser(u *goddit.User) error { + if err := s.Get(u, `INSERT INTO users VALUES($1, $2, $3) RETURNING *`, + u.ID, + u.Username, + u.Password); err != nil { + return fmt.Errorf("error creating user: %w", err) + } + return nil +} + +func (s *UserStore) UpdateUser(u *goddit.User) error { + if err := s.Get(u, `UPDATE INTO users SET username = $1, password = $2 WHERE id = $3) RETURNING *`, + u.Username, + u.Password, + u.ID); err != nil { + return fmt.Errorf("error updating user: %w", err) + } + return nil +} + +func (s *UserStore) DeleteUser(id uuid.UUID) error { + if _, err := s.Exec(`DELETE FROM users WHERE id = $1`, id); err != nil { + return fmt.Errorf("error deleteing user: %w", err) + } + return nil +} diff --git a/templates/layout.html b/templates/layout.html index ba989cb..311ca59 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -12,6 +12,8 @@