package middleware import ( "net/url" "strings" "code.tczkiot.com/wlw/ai-agent/internal/pkg/httpx" "code.tczkiot.com/wlw/ai-agent/internal/services" "github.com/gin-gonic/gin" ) func ExternalUserMiddleware(ctx *gin.Context) { channel := services.ChannelService.GetEnabledChannel(ctx) if channel == nil { httpx.AbortJSON(ctx, 200, httpx.JsonErrorMsg(ctx, "error.e0210")) return } external, err := services.SubjectService.ResolveExternal( ctx.Request.Context(), requestExternalValue(ctx, "X-External-Id", "external_id"), decodeExternalName(requestExternalValue(ctx, "X-External-Name", "external_name")), ) if err != nil { httpx.AbortJSON(ctx, 200, httpx.JsonErrorMsg(ctx, "error.auth.expired")) return } httpx.SetExternalUser(ctx, external) ctx.Next() } func requestExternalValue(ctx *gin.Context, header, query string) string { if value := strings.TrimSpace(ctx.GetHeader(header)); value != "" { return value } return strings.TrimSpace(ctx.Query(query)) } func decodeExternalName(value string) string { decoded, err := url.QueryUnescape(strings.TrimSpace(value)) if err != nil { return strings.TrimSpace(value) } return strings.TrimSpace(decoded) }