package main import ( "database/sql" "encoding/json" "fmt" "log" "net/http" "os" "github.com/gorilla/handlers" _ "github.com/mattn/go-sqlite3" ) type User struct { ID int `json:"id"` Email string `json:"email"` Password string `json:"password"` } var db *sql.DB func initDB() { var err error dbFile := "users.db" db, err = sql.Open("sqlite3", dbFile) if err != nil { log.Fatal("Ошибка подключения к базе данных:", err) } createTableQuery := ` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT NOT NULL UNIQUE, password TEXT NOT NULL );` _, err = db.Exec(createTableQuery) if err != nil { log.Fatal("Ошибка при создании таблицы:", err) } fmt.Println("База данных готова к работе.") } func registerHandler(w http.ResponseWriter, r *http.Request) { log.Printf("Received request with method: %s", r.Method) if r.Method != http.MethodPost { http.Error(w, "Метод не поддерживается", http.StatusMethodNotAllowed) return } var user User if err := json.NewDecoder(r.Body).Decode(&user); err != nil { http.Error(w, "Ошибка обработки JSON", http.StatusBadRequest) return } if user.Email == "" || user.Password == "" { http.Error(w, "Email и пароль обязательны", http.StatusBadRequest) return } insertQuery := `INSERT INTO users (email, password) VALUES (?, ?)` _, err := db.Exec(insertQuery, user.Email, user.Password) if err != nil { http.Error(w, "Ошибка записи в базу данных", http.StatusInternalServerError) fmt.Println("Ошибка:", err) return } w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(map[string]string{"message": "Пользователь успешно зарегистрирован", "email": user.Email}) } func loginHandler(w http.ResponseWriter, r *http.Request) { log.Printf("Received request with method: %s", r.Method) if r.Method != http.MethodPost { http.Error(w, "Метод не поддерживается", http.StatusMethodNotAllowed) return } var user User if err := json.NewDecoder(r.Body).Decode(&user); err != nil { http.Error(w, "Ошибка обработки JSON", http.StatusBadRequest) return } if user.Email == "" || user.Password == "" { http.Error(w, "Email и пароль обязательны", http.StatusBadRequest) return } query := `SELECT id, email, password FROM users WHERE email = ? AND password = ?` var dbUser User err := db.QueryRow(query, user.Email, user.Password).Scan(&dbUser.ID, &dbUser.Email, &dbUser.Password) if err != nil { if err == sql.ErrNoRows { http.Error(w, "Неверные учетные данные", http.StatusUnauthorized) } else { http.Error(w, "Ошибка при проверке учетных данных", http.StatusInternalServerError) } return } w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(map[string]string{"message": "Вход успешен", "email": dbUser.Email}) } func getUsersHandler(w http.ResponseWriter, r *http.Request) { log.Printf("Received request with method: %s", r.Method) if r.Method != http.MethodGet { http.Error(w, "Метод не поддерживается", http.StatusMethodNotAllowed) return } rows, err := db.Query(`SELECT id, email, password FROM users`) if err != nil { http.Error(w, "Ошибка чтения из базы данных", http.StatusInternalServerError) return } defer rows.Close() var users []User for rows.Next() { var user User if err := rows.Scan(&user.ID, &user.Email, &user.Password); err != nil { http.Error(w, "Ошибка обработки данных", http.StatusInternalServerError) return } users = append(users, user) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(users) } func main() { initDB() defer db.Close() // Setup CORS cors := handlers.CORS( handlers.AllowedOrigins([]string{"*"}), handlers.AllowedMethods([]string{"GET", "POST"}), handlers.AllowedHeaders([]string{"Content-Type"}), ) // Register handlers http.HandleFunc("/api/register", registerHandler) http.HandleFunc("/api/login", loginHandler) http.HandleFunc("/api/users", getUsersHandler) // Start server with CORS middleware port := os.Getenv("PORT") if port == "" { port = "8080" } fmt.Println("Go-сервер запущен на порту", port) log.Fatal(http.ListenAndServe(":"+port, cors(http.DefaultServeMux))) }