api: add HTTP handlers and router for endpoints

This commit is contained in:
admin 2026-04-08 14:49:27 +02:00
parent e2d6fd7d02
commit 0de298687c
3 changed files with 131 additions and 1 deletions

58
api/handler.go Normal file
View File

@ -0,0 +1,58 @@
package api
import (
"encoding/base64"
"fmt"
"io"
"net/http"
"VerifactuMidAPI/internal/cert"
"VerifactuMidAPI/internal/config"
"VerifactuMidAPI/internal/crypto"
)
type Handler struct {
cfg *config.Config
cert *cert.Storage
crypto *crypto.KeyPair
}
func New(cfg *config.Config, certStorage *cert.Storage, keyPair *crypto.KeyPair) *Handler {
return &Handler{
cfg: cfg,
cert: certStorage,
crypto: keyPair,
}
}
func (h *Handler) GetPublicKey(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
return
}
pubPEM, err := h.crypto.PublicKeyPEM()
if err != nil {
http.Error(w, "failed to get public key", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(fmt.Sprintf(`{"public_key":"%s"}`, base64.StdEncoding.EncodeToString(pubPEM))))
}
func (h *Handler) RegisterCert(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
return
}
body, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "failed to read body", http.StatusBadRequest)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write(body)
}

28
api/router.go Normal file
View File

@ -0,0 +1,28 @@
package api
import (
"net/http"
)
func (h *Handler) RegisterRoutes(mux *http.ServeMux) {
mux.HandleFunc("/api/v1/auth/public-key", h.GetPublicKey)
mux.HandleFunc("/api/v1/auth/register", h.RegisterCert)
mux.HandleFunc("/api/v1/facturas", h.HandleFacturas)
mux.HandleFunc("/api/v1/facturas/anular", h.HandleFacturasAnular)
mux.HandleFunc("/api/v1/health", h.HealthCheck)
}
func (h *Handler) HealthCheck(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"status":"ok"}`))
}
func (h *Handler) HandleFacturas(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"endpoint":"facturas","status":"not implemented"}`))
}
func (h *Handler) HandleFacturasAnular(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"endpoint":"facturas/anular","status":"not implemented"}`))
}

46
main.go
View File

@ -1,3 +1,47 @@
package main package main
func main() {} import (
"fmt"
"log"
"net/http"
"os"
"VerifactuMidAPI/api"
"VerifactuMidAPI/internal/cert"
"VerifactuMidAPI/internal/config"
"VerifactuMidAPI/internal/crypto"
)
func main() {
cfg, err := config.Load("config.yml")
if err != nil {
log.Fatalf("loading config: %v", err)
}
certStorage := cert.NewStorage(cfg.Certificates.StoragePath)
if err := certStorage.Init(); err != nil {
log.Fatalf("initializing cert storage: %v", err)
}
keyPair, err := crypto.LoadOrCreateKeyPair(cfg.Crypto.KeysPath)
if err != nil {
log.Fatalf("loading/creating key pair: %v", err)
}
handler := api.New(cfg, certStorage, keyPair)
mux := http.NewServeMux()
handler.RegisterRoutes(mux)
addr := fmt.Sprintf(":%d", cfg.Server.Port)
log.Printf("Starting server on %s", addr)
if err := http.ListenAndServe(addr, mux); err != nil {
log.Fatalf("server error: %v", err)
}
}
func init() {
if _, err := os.Stat("config.yml"); os.IsNotExist(err) {
log.Println("Warning: config.yml not found, using defaults")
}
}