This skill should be used when the user asks about how the rep-adb-api repository works, asks about patterns, architecture, conventions, base classes, naming rules, or asks "how do we do X in this project". Also activate when the user mentions AdB, AdBContext, CommandHandler, MainController, MediatR, CQRS, IRequestHandler, CommandResult, or AbstractValidatorBase.
O projeto usa Clean Architecture com CQRS via MediatR.
/src
├── AdB.Domain → Entidades e regras de domínio
├── AdB.Core → Base classes (Command, CommandHandler, Message, etc.)
├── AdB.Data → Repositórios, EF Core (AdBContext), Dapper (AdBDapperContext)
├── AdB.Application → Commands, Queries, Services
└── AdB.API → Controllers, Configurações de DI
Message (abstract)
├── Command : Message, IRequest<CommandResult>
└── Event : Message
CommandHandler (abstract)
└── {Entity}CommandHandler : CommandHandler, IRequestHandler<...>
Controller
└── MainController : Controller
└── {Entity}Controller : MainController
| Tipo | Namespace |
|------|-----------|
| Commands | AdB.Application.Commands.{Entidade} |
| Queries (MediatR) | AdB.Application.Queries.{Modulo}.{Entidade} |
| Queries (Service) | AdB.Application.Queries |
| Controllers | AdB.API.Controllers |
| DI Commands | AdB.API.Configurations.DependencyInjections |
| Tipo | Padrão | Exemplos |
|------|--------|----------|
| Command | {Verbo}{Entidade}Command | RegistrarAgendamentoCommand, CancelarPresenteCommand |
| Handler de Command | {Entidade}CommandHandler | AgendamentoCommandHandler, PresenteCommandHandler |
| Query (MediatR) | {Verbo}{Entidade}Query | ListarArquitetosQuery, ObterArquitetoQuery |
| Query Result | {Verbo}{Entidade}QueryResult ou {Entidade}ItemResponse | ObterArquitetoQueryResult |
| Query (Service) | {Entidade}Queries | ClienteQueries, OrcamentoQueries |
| Controller | {Entidade}Controller | ProdutoController, AgendamentoController |
| Repository (interface) | I{Entidade}Repository | IConsultoriaRepository |
| Service (interface) | I{Nome}Service | IGoogleService, IDiscordService |
ObterPorId(Guid id)
ObterTodos()
Adicionar(T entity)
Atualizar(T entity)
Excluir(T entity)
Sempre usar resource strings para mensagens:
ValidationResource.Obrigatorio → campo obrigatórioValidationResource.Invalido → campo inválidoValidationResource.NaoLocalizado → entidade não encontradaValidationResource.MaximoCaracteres → máximo de caracteresTermsResource.{NomeDoCampo} → nome do campo em PT-BRUso com interpolação:
ValidationResource.Obrigatorio.FormatField(new string[] { TermsResource.Nome })
ValidationResource.NaoLocalizado.FormatField(new string[] { TermsResource.Consultoria })
Controller → _mediator.Send(command)
↓
Handler.Handle() → if (!request.Validar()) return request.ValidationResult;
↓
AbstractValidatorBase<T>.Validate() → CommandResult(errors)
_repository.Adicionar(entity); // 1. Adiciona ao contexto
var result = await PersistirDados(_repository.UnitOfWork); // 2. Commit
return result; // 3. Retorna CommandResult
// Com 1 termo
return LancarErro(ValidationResource.NaoLocalizado, TermsResource.Consultoria);
// Direto com mensagem
return LancarErro("Mensagem de erro direto");
// Adicionar erro sem retornar
AdicionarErro("Mensagem de erro");
// Retorna 200 OK com dados
return CustomResponse(dados);
// Retorna 200 OK com CommandResult (mapeia erros automaticamente)
return CustomResponse(await _mediator.Send(command));
// Adicionar erro manualmente e retornar 400
AdicionarErroTratado("campo", "mensagem");
return CustomResponse();
src/AdB.API/Configurations/DependencyInjections/CommandsDIConfig.cssrc/AdB.API/Configurations/DependencyInjections/QueriesDIConfig.csAddMediatR + Assembly scanningsrc/AdB.API/Configurations/DependencyInjections/DIConfig.csQuery + Handler + Response no mesmo arquivo .cs.
Handler implementa IRequestHandler<TQuery, TResponse>.
Auto-descoberto pelo MediatR — não precisa registrar manualmente.
Interface I{Entidade}Queries + implementação {Entidade}Queries.
Usa AdBDapperContext com SQL em SQLQueriesResource.
Deve ser registrado em QueriesDIConfig.cs.
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer