4. Especificação Técnica do Sistema - Moutt/ENGENHARIA-DE-SOFTWARE GitHub Wiki
UC01 - EXPLORAR PROJETO
UC02 - REALIZAR PROJETO
UC03 - AVALIAR EMPRESA
UC04 - AVALIAR PRESTADOR DE SERVIÇO
UC05 - CONCLUIR PROJETO
UC06 - PUBLICAR PROJETO
UC07 - RETIRAR PROJETO
Classe | Tipo | Atributos-chave | Operações-chave |
---|---|---|---|
Usuario | Abstrata |
id , nome , email , senhaHash , tipo : UserType
|
— |
Empresa | ← Usuario
|
cnpj , telefone , endereco , razaoSocial
|
— |
Fornecedor | ← Usuario
|
avaliacaoMedia |
— |
Projeto | Domínio |
id , titulo , descricao , dataCriacao , dataEntregaPrevista , status : ProjectStatus
|
publicar() , fechar()
|
Proposta | Domínio |
id , valor , prazo , dataEnvio , status : ProposalStatus
|
enviar() , atualizarStatus()
|
Contrato | Domínio |
id , dataInicio , valorTotal , status : ContractStatus
|
ativar() , concluir() , cancelar()
|
Notificacao | Apoio |
id , mensagem , dataHora , lida : Boolean
|
marcarComoLida() |
HistoricoProjeto | Apoio |
id , acao , dataHora
|
— |
DocumentacaoProjeto | Apoio |
id , arquivoUrl , dataUpload
|
— |
Classe | Estereótipo | Operações Expostas | Usa / Cria |
---|---|---|---|
ProjetoController | <<controller>> |
postProjeto(dto) , listProjetos(filtro) , fecharProjeto(id)
|
Projeto , Empresa
|
PropostaController | <<controller>> |
createProposta(dto) , listPropostas(idProjeto) , aceitarProposta(id)
|
Proposta , Projeto , Fornecedor , Contrato
|
NotificacaoController | <<controller>> |
listNotificacoes(usuarioId) , marcarLida(notificacaoId)
|
Notificacao |
AuthController | <<controller>> |
login(dto) , logout(token)
|
Usuario |
Enum | Valores |
---|---|
ProjectStatus |
OPEN , IN_PROGRESS , CLOSED
|
ProposalStatus |
PENDING , ACCEPTED , DECLINED
|
ContractStatus |
ACTIVE , COMPLETED , CANCELED
|
UserType |
ADMIN , MODERATOR , COMPANY , SUPPLIER
|
1.COMPONENTES BACK-END
2.SUBSISTEMA DE NOTIFICAÇÃO ASSINCRONA
![subsistema de notificação assincrona]
Suporte às decisões de projeto do sistema de Marketplace de Projetos & Propostas
Este documento consolida táticas de qualidade (SEI/ATAM), padrões GoF & Enterprise,
e o estilo arquitetural adotado. Ele serve como guia para o time avaliar, justificar e comunicar suas decisões em cada sprint de evolução.
Item | Descrição |
---|---|
Domínio | Publicação de projetos por Empresas e envio/aceite de propostas por Fornecedores |
Camadas | UI → REST Controllers → Application Services → Domain → Repositories |
Estilo | • Clean / Hexagonal (Ports & Adapters) • Event-Driven para processos assíncronos • Relational DB + opcional cache Redis |
Tecnologias (pré-decisão) | Spring Boot / Node, PostgreSQL, RabbitMQ (bus), JWT, Docker/K8s |
Qualidade (QA) | Tática adotada | Padrão / Prática | Como será aplicado | Trade-off |
---|---|---|---|---|
Modificabilidade | Separation of Concerns | Layered Architecture, Controller-Service-Repository, DTO | Classes de interface REST isolam DTOs; Serviço orquestra domínio; Repositórios encapsulam JPA/SQL | +Clareza / Pequeno overhead de camadas |
Plugin/Replaceable Components | Interface (lollipop) + DI | Controllers dependem de IProjetoService , etc. |
+Mock fácil / +Hot-Swap | |
Performance | Asynchronous Execution | Event Bus, Observer |
PropostaAceita → fila → NotificationService
|
+Escalável / +Dev-Ops |
Caching | Repository-Cache Layer, Singleton do cache | Projetos abertos via Redis | +Resposta / Coerência eventual | |
Escalabilidade | Stateless Services | (possível) Microservice decomposition | Cada Controller + Service → pod/replica | +Horizontal scale / +Ops overhead |
Data Partitioning | Schema-per-Tenant / Sharding | partição por empresa | +Throughput / Consultas mais complexas | |
Disponibilidade | Retry + Timeout | Circuit Breaker, Retry Pattern | Client→Bus / DB drivers | +Resiliência / +Código |
Failover | Replica DB, Health Check | K8s liveness probes, read-replicas | +MTTR baixo / +Custo infra | |
Segurança | Autenticação | JWT, Singleton AuthProvider | AuthController → AuthProvider |
+Escalável / Revogação imediata difícil |
Autorização | RBAC, Policy Enforcer | Anotações @PreAuthorize , enum UserType
|
+Granular / Gerência de papéis | |
Testabilidade | Dependency Substitution | Factory Method, Builder Test | Mocks para IProjetoRepository
|
+Cobertura / Boilerplate |
Observabilidade | Log & Trace | Decorator para log, AOP | Interceptador REST → ELK | +Visibilidade / Overhead I/O |
Categoria | Padrões aplicados | Papel no sistema |
---|---|---|
Criacionais | Factory Method (criar Proposta/Contrato a partir de DTO) Singleton (AuthProvider, RedisCache) |
Remove new espalhado & garante instância única |
Estruturais | Facade (Auth API, Notification API) Repository / DAO Adapter (gateway de e-mail externo) |
Desacoplamento de subsistemas e de persistência |
Comportamentais | Observer / Event Publisher Strategy (cálculo de preço / ranking) Template Method (validação base × específica) |
Extensões sem alterar núcleo |
Nº | Decisão | Forças & Motivos | Status |
---|---|---|---|
ADR-001 | Adotar Clean Architecture | Facilita testes, mudança de frameworks, integração de bus | Aceita |
ADR-002 | Eventos de Domínio via RabbitMQ | Remove acoplamento síncrono; escalável | Aceita |
ADR-003 | JWT + Stateless Auth | Alinha com pods autoscaláveis | Aceita |
ADR-004 | Repository Pattern com UoW implícita | Consistência transacional por request | Aceita |
ADR-005 | Cache Redis para leitura pública | Balanceia performance × consistência | Provisório |
Próximos passos
• Validar ADR-005 em testes de carga
• Avaliar tática “Bulkhead” caso multitenant
• Versionar mensagens no schema-registry
Caso de uso | Táticas / Padrões relevantes |
---|---|
Publicar Projeto | Controller → Service → Factory Method; Repository; Cache miss-after-commit |
Enviar Proposta | Factory Method; Repository; Transaction Scope |
Aceitar Proposta | Domain Event → Observer → NotificationService; Retry + Circuit Breaker no e-mail |
Login / JWT | AuthController → AuthProvider (Singleton); Strategy (hash) |
Listar Projetos Abertos | Redis Cache; Read-replica DB; Pagination Strategy |
- Interfaces (
I*Service
,I*Repository
) publicadas conforme diagrama de componentes - Eventos de domínio serializados em JSON Schema
- Handlers externos encapsulados por Adapter + testes de contrato
- Factory Methods retornam objeto válido (usar validation template)
- Cobertura ≥ 80 % em Services e Domain (mocks via DI)
- Log decorado em todos os Controllers (AOP / Decorator)
- Bass, Clements & Kazman — Software Architecture in Practice (Táticas)
- Gamma et al. — Design Patterns – GoF
- Vernon — Implementing Domain-Driven Design (Layers, Events)