← todos os artigos

.NET

O projeto CRUD que construí para ter algo para mostrar a recrutadores

Inspirado num teste de código que André Baltieri (Balta) dá para candidatos, construí um app CRUD de Student e assinatura Premium com auth de verdade em alguns dias, e gastei o tempo que sobrou no que de fato faz um projeto parecer terminado.

O projeto CRUD que construí para ter algo para mostrar a recrutadores

Eu queria um projeto para o qual pudesse apontar recrutadores que estivesse de fato terminado, não mais uma ideia pela metade sentada num repo em algum lugar. O prompt para isso veio de um vídeo do André Baltieri, do Balta, passando por um teste de código que ele dá para candidatos a uma vaga na Balta.io: construir um app completo de gerenciamento de Student e assinatura Premium com authentication em ASP.NET Core, entregue em alguns dias.

Por que construí a mesma coisa

O ponto inteiro do Balta naquele vídeo era que terminar algo simples e funcional supera uma versão inacabada e over-engineered de algo ambicioso. Isso combinava exatamente com o que eu precisava para uma peça de portfólio, então construí o mesmo briefing para mim mesmo: um app CRUD de Student e assinatura Premium, auth de verdade, nada exótico.

O que de fato tornou isso rápido

Usei o Identity embutido do ASP.NET Core em vez de escrever minha própria authentication do zero:

dotnet new razor -au Individual

Essa única flag -au Individual monta um sistema local de identity completo, registro, login, logout, e cookies persistentes, sem eu tocar numa implementação de JWT.

Para os models de Student e Premium, apoiei em data annotations em vez de escrever lógica de validação separada:

public class Student
{
    [Key]
    public int Id { get; set; }

    [Required(ErrorMessage = "Full Name is required")]
    [StringLength(80, MinimumLength = 5)]
    public string Name { get; set; } = string.Empty;

    [Required]
    [EmailAddress]
    public string Email { get; set; } = string.Empty;

    public List<Premium> Premiums { get; set; } = new();
}

Um único attribute no model cuida tanto da constraint de database quanto da validação de formulário na página, sem JavaScript extra ou checagens manuais em nenhum dos lados.

A outra grande economia de tempo foi scaffolding. O gerador de código da Microsoft consegue construir o conjunto completo de páginas CRUD diretamente contra o EF Core:

dotnet tool install -g dotnet-aspnet-codegenerator
dotnet aspnet-codegenerator razorpage Create Create -m Student -dc ApplicationDbContext -sqlite -udl -outDir Pages/Students

Isso gerou as views, os handlers de formulário, e as chamadas de save para Create, Edit, Delete, Details, e a list view em minutos em vez de horas.

O que eu fiz com o tempo que sobrou

Assim que o CRUD e a auth de base estavam funcionando, gastei o resto do tempo nas partes que de fato fazem um projeto parecer terminado em vez de scaffolded: limpando o código gerado e os nomes, estilizando a UI de verdade em vez de deixar o visual padrão do Bootstrap, populando o database para que não estivesse vazio na primeira vez que alguém abrisse, e adicionando tests em volta dos endpoints principais.

O que eu tirei disso

A lição de verdade foi que um projeto pequeno e completo diz mais para um recrutador do que um maior que está pela metade, e o formato de teste do Balta é uma boa forma de impor essa restrição a si mesmo.