Add user signup
This commit is contained in:
parent
8a69b1a82c
commit
0518c0e360
|
@ -1,9 +1,9 @@
|
|||
CREATE TABLE IF NOT EXISTS users (
|
||||
user_id int NOT NULL AUTO_INCREMENT,
|
||||
username varchar(255) NOT NULL,
|
||||
username varchar(255) NOT NULL UNIQUE,
|
||||
password varchar(255) NOT NULL,
|
||||
root_path varchar(512) NOT NULL,
|
||||
admin boolean,
|
||||
root_path varchar(512),
|
||||
admin boolean NOT NULL DEFAULT 0,
|
||||
|
||||
PRIMARY KEY (user_id)
|
||||
);
|
||||
|
|
|
@ -9,4 +9,5 @@ require (
|
|||
github.com/joho/godotenv v1.3.0
|
||||
github.com/lib/pq v1.3.0
|
||||
github.com/vektah/gqlparser v1.2.0
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
|
||||
)
|
||||
|
|
|
@ -43,6 +43,7 @@ github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e/go.mod h1:/HUd
|
|||
github.com/vektah/gqlparser v1.2.0 h1:ntkSCX7F5ZJKl+HIVnmLaO269MruasVpNiMOjX9kgo0=
|
||||
github.com/vektah/gqlparser v1.2.0/go.mod h1:bkVf0FX+Stjg/MHnm8mEyubuaArhNEqfQhF+OTiAL74=
|
||||
github.com/viktorstrate/photoview v0.0.0-20200119220544-691e4c7dc433 h1:n6jGnDctC9HI7B1rnc5ATQPYaaxQaJtS8bI6oI0QV34=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
type User struct {
|
||||
User_id int
|
||||
Username string
|
||||
Password string
|
||||
Root_path *string
|
||||
Admin bool
|
||||
}
|
||||
|
||||
var UserInvalidCredentialsError = errors.New("invalid credentials")
|
||||
|
||||
func NewUserFromRow(row *sql.Row) (*User, error) {
|
||||
user := User{}
|
||||
|
||||
row.Scan(&user.User_id, &user.Username, &user.Password, &user.Root_path, &user.Admin)
|
||||
|
||||
return &user, nil
|
||||
}
|
||||
|
||||
func AuthorizeUser(database *sql.DB, username string, password string) (*User, error) {
|
||||
row := database.QueryRow("SELECT * FROM users WHERE username = ?", username)
|
||||
if row == nil {
|
||||
return nil, UserInvalidCredentialsError
|
||||
}
|
||||
|
||||
user, err := NewUserFromRow(row)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
|
||||
if err == bcrypt.ErrMismatchedHashAndPassword {
|
||||
return nil, UserInvalidCredentialsError
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func RegisterUser(database *sql.DB, username string, password string) (*User, error) {
|
||||
hashedPassBytes, err := bcrypt.GenerateFromPassword([]byte(password), 12)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
hashedPass := string(hashedPassBytes)
|
||||
|
||||
if _, err := database.Query("INSERT INTO users (username, password) VALUES (?, ?)", username, hashedPass); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
row := database.QueryRow("SELECT * FROM users WHERE username = ?", username)
|
||||
if row == nil {
|
||||
return nil, UserInvalidCredentialsError
|
||||
}
|
||||
|
||||
user, err := NewUserFromRow(row)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return user, nil
|
||||
}
|
|
@ -18,13 +18,6 @@ func (r *Resolver) Query() QueryResolver {
|
|||
|
||||
type mutationResolver struct{ *Resolver }
|
||||
|
||||
func (r *mutationResolver) AuthorizeUser(ctx context.Context, username string, password string) (*AuthorizeResult, error) {
|
||||
panic("not implemented")
|
||||
}
|
||||
func (r *mutationResolver) RegisterUser(ctx context.Context, username string, password string) (*AuthorizeResult, error) {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
type queryResolver struct{ *Resolver }
|
||||
|
||||
func (r *queryResolver) Users(ctx context.Context) ([]*User, error) {
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/viktorstrate/photoview/api/graphql/models"
|
||||
)
|
||||
|
||||
func (r *mutationResolver) AuthorizeUser(ctx context.Context, username string, password string) (*AuthorizeResult, error) {
|
||||
user, err := models.AuthorizeUser(r.Database, username, password)
|
||||
if err != nil {
|
||||
return &AuthorizeResult{
|
||||
Success: false,
|
||||
Status: err.Error(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
token := fmt.Sprintf("token:%d", user.User_id)
|
||||
|
||||
return &AuthorizeResult{
|
||||
Success: true,
|
||||
Status: "ok",
|
||||
Token: &token,
|
||||
}, nil
|
||||
}
|
||||
func (r *mutationResolver) RegisterUser(ctx context.Context, username string, password string) (*AuthorizeResult, error) {
|
||||
user, err := models.RegisterUser(r.Database, username, password)
|
||||
if err != nil {
|
||||
return &AuthorizeResult{
|
||||
Success: false,
|
||||
Status: err.Error(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
token := fmt.Sprintf("token:%d", user.User_id)
|
||||
|
||||
return &AuthorizeResult{
|
||||
Success: true,
|
||||
Status: "ok",
|
||||
Token: &token,
|
||||
}, nil
|
||||
}
|
Loading…
Reference in New Issue