Skip to content

[Sugestão] Adicionar tipagem e validação de dados nos métodos da SDK #8

@DenisBessa

Description

@DenisBessa

Uma sugestão que melhoraria muito a SDK: adicionar tipos aos métodos, de modo que o desenvolvedor saiba quais valores são aceitos para cada parâmetro da SDK e quais valores a API vai retornar. Isso melhoria muito a DevX, porque o desenvolvedor não precisaria ficar lendo a documentação pra saber quai(s) campos são obrigatórios, e o próprio ambiente de desenvolvimento pode retornar se o objeto estiver incompleto ou inválido, por exemplo.

Estou falando de algo mais ou menos assim:

type BolixCreate = {
    payment: {
        banking_billet: {
            message?: string | undefined;
            configurations?: {
                fine: number;
                interest: number;
            } | undefined;
            expire_at: string;
            customer: {
                name: string | null;
                juridical_person: {
                    ...;
                };
                cpf: string | null;
                email: string;
                phone_number: string;
                address: {
                    ...;
                };
            };
        };
    };
    items: {
        ...;
    }[];
}

Daí a SDK poderia exigir este tipo no parâmetro body dos método que cria o Bolix, por exemplo.

Uma outra abordagem, mais sofisticada, seria adicionar uma biblioteca de validação de dados à SDK, como por exemplo o Zod.

Isso permitiria ao aplicativo validar os dados em tempo de execução, antes do envio para a Gerencianet. Desta forma, por exemplo, caso o usuário insira um CNPJ inválido, a própria SDK validaria este campo, sem necessidade de enviar os dados inválidos para a API só pra receber uma resposta de erro.

O Zod permite a validação de tipos em runtime, o que estende a segurança de tipo da aplicação, já que o Typescript faz a validação somente em build time.

Eu mesmo montei a validação "por tentativa e erro" aqui, mas sinto que está incompleto. Se a SDK fizesse isso, seria bem legal.

export const BolixCreateSchema = z.object({
  items: z.array(
    z.object({
      name: z.string().max(255),
      value: z.number().int().min(500),
      amount: z.number().int(),
    })
  ),
  payment: z.object({
    banking_billet: z.object({
      customer: z.object({
        juridical_person: z.object({
          corporate_name: z.string().max(255),
          cnpj: z.string().refine((s) => isCNPJ(s), { message: "CNPJ inválido" }),
        }),
        name: z.string().max(255).nullable(),
        cpf: z
          .string()
          .refine((s) => isCPF(s), { message: "CPF inválido" })
          .nullable(),
        email: z.string().email(),
        phone_number: z.string(),
        address: z.object({
          street: z.string(),
          number: z.string(),
          neighborhood: z.string(),
          zipcode: z.string(),
          city: z.string(),
          complement: z.string(),
          state: z.string(),
        }),
      }),
      expire_at: commonDateToString.refine((s) => moment(s).isAfter(moment()), { message: "Data de vencimento deve ser após a data atual" }),
      configurations: z
        .object({
          fine: z.number(),
          interest: z.number(),
        })
        .optional(),
      message: z.string().optional(),
    }),
  }),
});

Caso os mantenedores gostem da ideia, eu mesmo posso fazer uma PR implementando as sugestões.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions