mirror of
https://github.com/marcusDenslow/terminalShop.git
synced 2026-10-25 18:08:45 +01:00
104 lines
2.9 KiB
Go
104 lines
2.9 KiB
Go
package handlers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"terminalShop/pkg/database"
|
|
"terminalShop/pkg/models"
|
|
"terminalShop/pkg/utils"
|
|
"terminalShop/pkg/validation"
|
|
)
|
|
|
|
// AuthHandler handles authentication-related requests
|
|
type AuthHandler struct{}
|
|
|
|
// NewAuthHandler creates a new auth handler
|
|
func NewAuthHandler() *AuthHandler {
|
|
return &AuthHandler{}
|
|
}
|
|
|
|
// RegisterRequest represents a user registration request
|
|
type RegisterRequest struct {
|
|
SSHPublicKey string `json:"ssh_public_key"`
|
|
SSHKeyFingerprint string `json:"ssh_key_fingerprint"`
|
|
Name string `json:"name,omitempty"` // Optional
|
|
Email string `json:"email,omitempty"` // Optional
|
|
}
|
|
|
|
// RegisterWithSSHKey registers a new user with their SSH public key
|
|
// No username required - following terminal.shop pattern
|
|
func (h *AuthHandler) RegisterWithSSHKey(w http.ResponseWriter, r *http.Request) {
|
|
db := database.GetDB()
|
|
|
|
var req RegisterRequest
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
utils.RespondError(w, http.StatusBadRequest, "INVALID_JSON", "invalid request body", nil)
|
|
return
|
|
}
|
|
|
|
// Validate required fields
|
|
errors := make(validation.ProductErrors)
|
|
if req.SSHPublicKey == "" {
|
|
errors["ssh_public_key"] = "SSH public key is required"
|
|
}
|
|
|
|
if req.SSHKeyFingerprint == "" {
|
|
errors["ssh_key_fingerprint"] = "SSH key fingerprint is required"
|
|
}
|
|
|
|
if errors.HasErrors() {
|
|
utils.RespondError(w, http.StatusBadRequest, "VALIDATION_ERROR", "validation failed", map[string]interface{}{
|
|
"errors": errors,
|
|
})
|
|
return
|
|
}
|
|
|
|
// Check if SSH key is already registered
|
|
var existing models.User
|
|
err := db.Where("ssh_key_fingerprint = ?", req.SSHKeyFingerprint).First(&existing).Error
|
|
if err == nil {
|
|
utils.RespondError(w, http.StatusConflict, "SSH_KEY_REGISTERED", "SSH key already registered", nil)
|
|
return
|
|
}
|
|
|
|
// Create new user (no username required!)
|
|
user := models.User{
|
|
SSHPublicKey: req.SSHPublicKey,
|
|
SSHKeyFingerprint: req.SSHKeyFingerprint,
|
|
Name: req.Name,
|
|
Email: req.Email,
|
|
}
|
|
|
|
if err := db.Create(&user).Error; err != nil {
|
|
utils.RespondError(w, http.StatusInternalServerError, "DATABASE_ERROR", "failed to create user", nil)
|
|
return
|
|
}
|
|
|
|
utils.RespondSuccess(w, http.StatusCreated, map[string]interface{}{
|
|
"user": user.ToPublic(),
|
|
})
|
|
}
|
|
|
|
// GetUserBySSHKey retrieves a user by their SSH key fingerprint
|
|
func (h *AuthHandler) GetUserBySSHKey(w http.ResponseWriter, r *http.Request) {
|
|
db := database.GetDB()
|
|
|
|
fingerprint := r.URL.Query().Get("fingerprint")
|
|
if fingerprint == "" {
|
|
utils.RespondError(w, http.StatusBadRequest, "MISSING_FINGERPRINT", "fingerprint query parameter is required", nil)
|
|
return
|
|
}
|
|
|
|
var user models.User
|
|
err := db.Where("ssh_key_fingerprint = ?", fingerprint).First(&user).Error
|
|
if err != nil {
|
|
utils.RespondError(w, http.StatusNotFound, "USER_NOT_FOUND", "user not found", nil)
|
|
return
|
|
}
|
|
|
|
utils.RespondSuccess(w, http.StatusOK, map[string]interface{}{
|
|
"user": user.ToPublic(),
|
|
})
|
|
}
|