2025-08-21 23:47:15 -04:00

119 lines
2.8 KiB
Go

package handler
import (
"encoding/json"
"errors"
"ips-lacpass-backend/internal/ips/core"
errors2 "ips-lacpass-backend/pkg/errors"
"net/http"
)
type MergeIPSRequest struct {
CurrentIPS map[string]interface{} `json:"current_ips"`
NewIPS map[string]interface{} `json:"new_ips"`
}
type Handler struct {
IpsService *core.IpsService
}
func NewHandler(s *core.IpsService) *Handler {
return &Handler{
IpsService: s,
}
}
// GetIPS godoc
//
// @Summary Fetch IPS from national node.
// @Description Fetch IPS from national node using session access token user identifier.
// @Tags IPS FHIR
// @Produce json
//
// @Security ApiKeyAuth
//
// @Success 200 {object} any
// @Failure 400
// @Failure 404
// @Failure 500
// @Router /ips [get]
func (ih *Handler) Get(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
ips, err := ih.IpsService.GetIps(ctx)
if err != nil {
var httpErr *errors2.HttpError
if errors.As(err, &httpErr) {
res, err := json.Marshal(httpErr.Body)
if err != nil {
http.Error(w, "Failed to encode error response", http.StatusInternalServerError)
return
}
w.WriteHeader(httpErr.StatusCode)
_, err = w.Write(res)
if err != nil {
http.Error(w, "Failed to write response", http.StatusInternalServerError)
return
}
} else {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
return
}
res, err := json.Marshal(ips)
if err != nil {
http.Error(w, "Failed to encode response", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
_, err = w.Write(res)
if err != nil {
http.Error(w, "Failed to write response", http.StatusInternalServerError)
return
}
}
// MergeIPS godoc
//
// @Summary Merge two IPS bundles into a unified IPS.
// @Description Merge two FHIR R4 IPS bundles into a single one, removing reduncancy.
// @Tags IPS FHIR
// @Produce json
//
// @Security ApiKeyAuth
//
// @Param data body MergeIPSRequest true "IPS bundles to merge"
//
// @Success 200 {object} any
// @Failure 400
// @Failure 404
// @Failure 500
// @Router /ips/merge [post]
func (ih *Handler) Merge(w http.ResponseWriter, r *http.Request) {
var body MergeIPSRequest
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
println(err.Error())
w.WriteHeader(http.StatusBadRequest)
return
}
ctx := r.Context()
mi, err := ih.IpsService.MergeIPS(ctx, body.CurrentIPS, body.NewIPS)
if err != nil {
// TODO Do correct error handling
http.Error(w, "Failed to merge IPS", http.StatusInternalServerError)
}
res, err := json.Marshal(mi)
if err != nil {
http.Error(w, "Failed to encode response", http.StatusInternalServerError)
}
w.WriteHeader(http.StatusOK)
_, err = w.Write(res)
if err != nil {
http.Error(w, "Failed to write response", http.StatusInternalServerError)
return
}
}