# CoreSync Backend **CoreSync** é a API backend desenvolvida para um aplicativo mobile de gestão de treinos e academia. Este projeto tem caráter acadêmico e foi desenvolvido como parte dos requisitos do **7º semestre do IFRS - Campus Vacaria**. O foco principal desta implementação é explorar e aplicar conceitos avançados de engenharia de software, garantindo um código altamente testável, escalável e de fácil manutenção. --- ## Stack Tecnológico A base de tecnologia foi escolhida para alinhar a expressividade do Groovy com a robustez do ecossistema Spring: * **Linguagem:** Groovy (Closures, Records, sintaxe enxuta) * **Runtime:** Java 26 (toolchain via Gradle) * **Framework:** Spring Boot (Web, Security, Data MongoDB) * **Banco de Dados:** MongoDB * **Comunicação:** RESTful (JSON) + Autenticação Stateless (JWT) * **Cliente-Alvo:** App mobile construído em React Native --- ## Arquitetura e Padrões de Projeto O CoreSync foi arquitetado como um **Monolito Modular**, fundamentado nos princípios de **Domain-Driven Design (DDD)** e na **Arquitetura Hexagonal (Ports & Adapters)**. A premissa absoluta do projeto é o **isolamento total da Regra de Negócio**. As camadas de Domínio (`domain`) e Aplicação (`application`) são 100% agnósticas de framework, infraestrutura, banco de dados ou protocolos de rede (HTTP). ### Diretrizes Fundamentais 1. **Modelagem Baseada em Records:** Imutabilidade garantida por design. Toda transição de estado no domínio produz uma nova instância (`copy-on-write`). 2. **Validação Fail-Fast:** Todas as invariantes de negócio são validadas nos construtores compactos dos `records`. É impossível instanciar um objeto de domínio em estado inválido. 3. **Domínio Rico (Rich Domain):** A lógica pertence às entidades. Serviços de aplicação apenas orquestram as transições, nunca concentram regras de negócio. 4. **Sem Lombok, Sem Magia Oculta:** O projeto abole o uso de Lombok, tirando proveito dos recursos nativos do Groovy (construtores por mapa, propriedades automáticas e `@Slf4j`). 5. **POJO Services:** Os casos de uso (`application/service`) não possuem anotações do framework (`@Service`). Eles são instanciados e injetados via `@Configuration` nos módulos. 6. **Desacoplamento de IDs:** A geração de identificadores (UUID) ocorre antes da persistência, na camada de aplicação, delegando ao banco de dados apenas o armazenamento. --- ## Estrutura de Diretórios ```text src/main/groovy/br/dev/jsilveira/coresync/ ├── domain/ # Coração do software (Records, Value Objects e Exceptions) ├── application/ # Casos de uso (Services) e contratos (Ports In/Out) ├── adapter/ # Conexão com o mundo externo (Controllers, Repositories, Entities) └── config/ # Injeção de dependências (Bean wiring) ``` ## Autenticação e Segurança **Todas as requisições (exceto rotas públicas) exigem validação via token JWT.** **A extração do usuário logado e a validação do token ocorrem na borda externa (adaptador web). O domínio recebe apenas os IDs processados, desconhecendo por completo o conceito de token ou contexto de segurança web.**