generated from tsivinsky/go-template
94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"image-storage/model"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
"golang.org/x/crypto/bcrypt"
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
func main() {
|
|
db, err := sqlx.Connect("sqlite", "./db/sqlite.db")
|
|
if err != nil {
|
|
log.Fatalf("failed to connect to db: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
srv := NewServer(":5000")
|
|
|
|
srv.Handle("POST /api/auth/register", func(w http.ResponseWriter, r *http.Request) error {
|
|
var body struct {
|
|
Email string `json:"email"`
|
|
Password string `json:"password"`
|
|
}
|
|
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
|
|
srv.Error(w, "empty body", err, 400)
|
|
return nil
|
|
}
|
|
|
|
if body.Email == "" || body.Password == "" {
|
|
srv.Error(w, "email or password missing", nil, 400)
|
|
return nil
|
|
}
|
|
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(body.Password), 10)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to generate password hash: %v", err)
|
|
}
|
|
|
|
user := &model.User{
|
|
Email: body.Email,
|
|
Password: string(hash),
|
|
}
|
|
|
|
if err := user.Create(db); err != nil {
|
|
srv.Error(w, "failed to create user", err, 400)
|
|
return nil
|
|
}
|
|
|
|
if err := user.FindByID(db); err != nil {
|
|
return fmt.Errorf("failed to populate user object after creating it: %v", err)
|
|
}
|
|
|
|
return srv.JSON(w, user, 201)
|
|
})
|
|
|
|
srv.Handle("POST /api/auth/login", func(w http.ResponseWriter, r *http.Request) error {
|
|
var body struct {
|
|
Email string `json:"email"`
|
|
Password string `json:"password"`
|
|
}
|
|
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
|
|
srv.Error(w, "empty body", err, 400)
|
|
return nil
|
|
}
|
|
|
|
if body.Email == "" || body.Password == "" {
|
|
srv.Error(w, "email or password missing", nil, 400)
|
|
return nil
|
|
}
|
|
|
|
user := &model.User{Email: body.Email}
|
|
if err := user.FindByEmail(db); err != nil {
|
|
srv.Error(w, "user not found", err, 404)
|
|
return nil
|
|
}
|
|
|
|
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(body.Password)); err != nil {
|
|
srv.Error(w, "invalid password", nil, 400)
|
|
return nil
|
|
}
|
|
|
|
return srv.JSON(w, user, 200)
|
|
})
|
|
|
|
if err := srv.ListenAndServe(); err != nil {
|
|
log.Fatalf("failed to start http server: %v", err)
|
|
}
|
|
}
|