package elinps import ( "errors" "regexp" "strings" "e-li.nps/internal/contratos" ) var emailRe = regexp.MustCompile(`^[^\s@]+@[^\s@]+\.[^\s@]+$`) func normalizeEmail(s string) string { return strings.ToLower(strings.TrimSpace(s)) } func ValidatePedidoInput(in *contratos.PedidoInput) error { in.ProdutoNome = strings.TrimSpace(in.ProdutoNome) in.InquilinoCodigo = strings.TrimSpace(in.InquilinoCodigo) in.InquilinoNome = strings.TrimSpace(in.InquilinoNome) in.UsuarioCodigo = strings.TrimSpace(in.UsuarioCodigo) in.UsuarioNome = strings.TrimSpace(in.UsuarioNome) in.UsuarioTelefone = strings.TrimSpace(in.UsuarioTelefone) in.UsuarioEmail = normalizeEmail(in.UsuarioEmail) if in.ProdutoNome == "" || len(in.ProdutoNome) > 64 { return errors.New("produto_nome invalido") } if in.InquilinoCodigo == "" || len(in.InquilinoCodigo) > 64 { return errors.New("inquilino_codigo invalido") } if in.InquilinoNome == "" || len(in.InquilinoNome) > 128 { return errors.New("inquilino_nome invalido") } if in.UsuarioCodigo == "" || len(in.UsuarioCodigo) > 64 { return errors.New("usuario_codigo invalido") } if in.UsuarioNome == "" || len(in.UsuarioNome) > 128 { return errors.New("usuario_nome invalido") } // E-mail passa a ser opcional: o controle de exibição é por // (produto + inquilino_codigo + usuario_codigo). if in.UsuarioEmail != "" { if len(in.UsuarioEmail) > 254 || !emailRe.MatchString(in.UsuarioEmail) { return errors.New("usuario_email invalido") } } if len(in.UsuarioTelefone) > 64 { return errors.New("usuario_telefone invalido") } return nil } func ValidatePatchInput(in *contratos.PatchInput) error { if in.Nota != nil { if *in.Nota < 1 || *in.Nota > 10 { return errors.New("nota invalida") } } if in.Justificativa != nil { j := strings.TrimSpace(*in.Justificativa) if len(j) > 2000 { return errors.New("justificativa muito longa") } *in.Justificativa = j } return nil }