100 lines
2.3 KiB
Go
100 lines
2.3 KiB
Go
|
|
package api
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"net/http"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"go-faker/generator"
|
||
|
|
"go-faker/types"
|
||
|
|
)
|
||
|
|
|
||
|
|
type Handler struct {
|
||
|
|
faker *generator.Faker
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewHandler(seed string) *Handler {
|
||
|
|
return &Handler{
|
||
|
|
faker: generator.New(seed),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) Generate(w http.ResponseWriter, r *http.Request) {
|
||
|
|
if r.Method != http.MethodPost {
|
||
|
|
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
var req types.GenerateRequest
|
||
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||
|
|
http.Error(w, "Invalid request body: "+err.Error(), http.StatusBadRequest)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
defer r.Body.Close()
|
||
|
|
|
||
|
|
if req.Count <= 0 || req.Count > 100000 {
|
||
|
|
http.Error(w, "Count must be between 1 and 100000", http.StatusBadRequest)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
if req.Seed == "" {
|
||
|
|
req.Seed = time.Now().UTC().Format(time.RFC3339Nano)
|
||
|
|
}
|
||
|
|
|
||
|
|
faker := generator.New(req.Seed)
|
||
|
|
|
||
|
|
validFields, ok := types.ValidFields[req.Type]
|
||
|
|
if !ok {
|
||
|
|
http.Error(w, "Invalid data type", http.StatusBadRequest)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(req.Fields) == 0 {
|
||
|
|
req.Fields = validFields
|
||
|
|
}
|
||
|
|
|
||
|
|
fieldSet := make(map[string]bool)
|
||
|
|
for _, f := range validFields {
|
||
|
|
fieldSet[f] = true
|
||
|
|
}
|
||
|
|
for _, f := range req.Fields {
|
||
|
|
if !fieldSet[f] {
|
||
|
|
http.Error(w, "Invalid field: "+f, http.StatusBadRequest)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
data := faker.GenerateBatch(req.Count, req.Type, req.Fields)
|
||
|
|
|
||
|
|
response := types.GenerateResponse{
|
||
|
|
Data: data,
|
||
|
|
Format: "json",
|
||
|
|
Meta: types.ResponseMeta{
|
||
|
|
Count: req.Count,
|
||
|
|
Seed: req.Seed,
|
||
|
|
GeneratedAt: time.Now().UTC().Format(time.RFC3339),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||
|
|
json.NewEncoder(w).Encode(response)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) Health(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) Fields(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||
|
|
json.NewEncoder(w).Encode(types.ValidFields)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *Handler) RegisterRoutes(mux *http.ServeMux) {
|
||
|
|
mux.HandleFunc("/generate", h.Generate)
|
||
|
|
mux.HandleFunc("/fields", h.Fields)
|
||
|
|
mux.HandleFunc("/health", h.Health)
|
||
|
|
}
|