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) } }