2025-09-16 08:00:11 +10:00

90 lines
2.5 KiB
Go

package handler
import (
"encoding/json"
"errors"
"ips-lacpass-backend/internal/wallet/client"
"ips-lacpass-backend/internal/wallet/core"
customErrors "ips-lacpass-backend/pkg/errors"
"net/http"
)
type Handler struct {
WalletService *core.WalletService
}
func NewHandler(s *core.WalletService) *Handler {
return &Handler{
WalletService: s,
}
}
type GenerateWalletLinkRequest struct {
Claims map[string]interface{} `json:"claims"`
CredentialType client.CredentialType `json:"credentialType"`
}
// GenerateWalletLink godoc
//
// @Summary Generate a wallet link.
// @Description Generate a new wallet link with the given claims. Must enable wallet in config.
// @Tags Wallet
// @Accept json
// @Produce json
//
// @Security ApiKeyAuth
//
// @Param data body GenerateWalletLinkRequest true "Claims for the wallet link"
//
// @Success 200 {object} client.GenerateWalletLinkResponse
// @Failure 400
// @Failure 500
// @Router /wallet/generate-link [post]
func (h *Handler) GenerateWalletLink(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var reqBody GenerateWalletLinkRequest
if err := json.NewDecoder(r.Body).Decode(&reqBody); err != nil {
http.Error(w, `{"error": "invalid_request_body"}`, http.StatusBadRequest)
return
}
if reqBody.CredentialType != client.VerifiableHealthLink && reqBody.CredentialType != client.ICVP {
http.Error(w, `{"error": "invalid_credential_type", "message": "credentialType must be either VerifiableHealthLink or ICVP"}`, http.StatusBadRequest)
return
}
ctx := r.Context()
walletResponse, err := h.WalletService.GenerateWalletLink(ctx, reqBody.Claims, reqBody.CredentialType)
if err != nil {
var httpErr *customErrors.HttpError
if errors.As(err, &httpErr) {
res, err := json.Marshal(httpErr.Body)
if err != nil {
http.Error(w, `{"error": "internal_server_error"}`, http.StatusInternalServerError)
return
}
w.WriteHeader(httpErr.StatusCode)
_, err = w.Write(res)
if err != nil {
http.Error(w, `{"error": "internal_server_error"}`, http.StatusInternalServerError)
return
}
} else {
http.Error(w, `{"error": "internal_server_error"}`, http.StatusInternalServerError)
}
return
}
res, err := json.Marshal(walletResponse)
if err != nil {
http.Error(w, `{"error": "internal_server_error"}`, http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
_, err = w.Write(res)
if err != nil {
http.Error(w, `{"error": "internal_server_error"}`, http.StatusInternalServerError)
return
}
}