Files
go_test_app/main.go
2026-03-29 21:06:28 +00:00

123 lines
3.7 KiB
Go

package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"golang.org/x/crypto/bcrypt"
)
const (
nocoURL = "https://nocodb.shaiheprjct.ru/api/v2/tables/mqvqd88xe01rxap/records"
apiToken = "eVqxLwbUQRLQHQ3g44js9vfLHvIdWhllLZwKfW25"
)
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
func main() {
http.HandleFunc("/", homePage)
http.HandleFunc("/register", registerHandler)
http.HandleFunc("/login", loginHandler)
log.Println("✅ Сервер запускается на порту :9000")
if err := http.ListenAndServe(":9000", nil); err != nil {
log.Fatalf("❌ Ошибка запуска сервера: %v", err)
}
}
func registerHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
username := r.FormValue("username")
password := r.FormValue("password")
log.Printf("--> Регистрация пользователя: %s", username)
hash, _ := bcrypt.GenerateFromPassword([]byte(password), 10)
jsonData, _ := json.Marshal(map[string]string{
"username": username,
"password": string(hash),
})
req, _ := http.NewRequest("POST", nocoURL, bytes.NewBuffer(jsonData))
req.Header.Set("xc-token", apiToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Printf("❌ Ошибка запроса к NocoDB: %v", err)
http.Error(w, err.Error(), 500)
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
log.Printf("<-- Ответ NocoDB (Статус %d): %s", resp.StatusCode, string(body))
if resp.StatusCode < 300 {
fmt.Fprint(w, "Регистрация успешна!")
} else {
http.Error(w, "NocoDB error: "+string(body), 500)
}
}
}
func loginHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
user := r.FormValue("username")
pass := r.FormValue("password")
log.Printf("--> Попытка входа: %s", user)
// Поиск в NocoDB
searchURL := fmt.Sprintf("%s?where=(username,eq,%s)", nocoURL, user)
req, _ := http.NewRequest("GET", searchURL, nil)
req.Header.Set("xc-token", apiToken)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Printf("❌ Ошибка при поиске пользователя: %v", err)
http.Error(w, err.Error(), 500)
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
log.Printf("<-- Ответ NocoDB (Логин): %s", string(body))
var result struct {
List []User `json:"list"`
}
if err := json.Unmarshal(body, &result); err != nil {
log.Printf("❌ Ошибка парсинга JSON: %v", err)
http.Error(w, "Ошибка данных", 500)
return
}
if len(result.List) > 0 {
err := bcrypt.CompareHashAndPassword([]byte(result.List[0].Password), []byte(pass))
if err == nil {
log.Printf("✅ Пользователь %s успешно вошел", user)
fmt.Fprintf(w, "Добро пожаловать, %s!", user)
return
}
}
log.Printf("⚠️ Неудачная попытка входа для: %s", user)
fmt.Fprint(w, "Ошибка авторизации")
}
}
func homePage(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprint(w, `<h2>Личный кабинет</h2>
<form action="/register" method="POST"><input name="username" placeholder="Логин"><input name="password" type="password"><button>Регистрация</button></form>
<hr>
<form action="/login" method="POST"><input name="username" placeholder="Логин"><input name="password" type="password"><button>Вход</button></form>`)
}