Banco de Dados
Visão Geral
O FinBoost+ utiliza PostgreSQL como banco principal e H2 para testes. A estrutura foi projetada para suportar grupos financeiros colaborativos com controle granular de despesas e divisões entre membros.
Diagrama de Relacionamentos
erDiagram
User ||--o{ GroupMember : "pertence a"
Group ||--o{ GroupMember : "possui"
User ||--o{ Expense : "cria"
Group ||--o{ Expense : "contém"
Category ||--o{ Expense : "categoriza"
Expense ||--o{ UserExpenseDivision : "divide entre"
User ||--o{ UserExpenseDivision : "recebe divisão"
User ||--o{ Role : "possui"
User {
Long id PK
String name
String email
String password
LocalDateTime createdAt
LocalDateTime updatedAt
boolean enabled
}
Group {
Long id PK
String name
String description
LocalDateTime createdAt
Long createdBy FK
}
GroupMember {
GroupMemberId id PK
LocalDateTime joinedAt
String role
}
Expense {
Long id PK
String description
BigDecimal amount
LocalDateTime createdAt
Long userId FK
Long groupId FK
Long categoryId FK
}
Category {
Long id PK
String name
String description
String color
}
UserExpenseDivision {
UserExpenseDivisionId id PK
BigDecimal amount
LocalDateTime createdAt
}
Role {
Long id PK
String authority
}
Principais Entidades
User
Representa os usuários da aplicação.
Campo | Tipo | Descrição |
---|---|---|
id | Long | Identificador único |
name | String | Nome completo |
String | Email (único) | |
password | String | Senha criptografada |
enabled | Boolean | Status da conta |
createdAt | LocalDateTime | Data de criação |
updatedAt | LocalDateTime | Última atualização |
Group
Grupos financeiros onde usuários compartilham despesas.
Campo | Tipo | Descrição |
---|---|---|
id | Long | Identificador único |
name | String | Nome do grupo |
description | String | Descrição opcional |
createdBy | Long | ID do criador |
createdAt | LocalDateTime | Data de criação |
GroupMember
Associação entre usuários e grupos com chave composta.
Campo | Tipo | Descrição |
---|---|---|
id | GroupMemberId | Chave composta (userId + groupId) |
role | String | Papel no grupo (ADMIN, MEMBER) |
joinedAt | LocalDateTime | Data de entrada |
Expense
Despesas registradas nos grupos.
Campo | Tipo | Descrição |
---|---|---|
id | Long | Identificador único |
description | String | Descrição da despesa |
amount | BigDecimal | Valor total |
userId | Long | Quem pagou |
groupId | Long | Grupo associado |
categoryId | Long | Categoria da despesa |
createdAt | LocalDateTime | Data de criação |
Category
Categorias para organizar despesas.
Campo | Tipo | Descrição |
---|---|---|
id | Long | Identificador único |
name | String | Nome da categoria |
description | String | Descrição |
color | String | Cor para UI |
UserExpenseDivision
Como as despesas são divididas entre membros.
Campo | Tipo | Descrição |
---|---|---|
id | UserExpenseDivisionId | Chave composta (userId + expenseId) |
amount | BigDecimal | Valor que o usuário deve |
createdAt | LocalDateTime | Data da divisão |
Role
Papéis e permissões dos usuários.
Campo | Tipo | Descrição |
---|---|---|
id | Long | Identificador único |
authority | String | Nome do papel (ROLE_USER, ROLE_ADMIN) |
Relacionamentos Principais
-
User ↔ Group
Relacionamento: Many-to-Many através de GroupMember
Finalidade: Um usuário pode participar de múltiplos grupos
Chave: Composta por userId + groupId -
Expense ↔ User
Relacionamento: Many-to-Many através de UserExpenseDivision
Finalidade: Uma despesa pode ser dividida entre vários usuários
Lógica: Quem paga vs. quem deve -
Group → Expense
Relacionamento: One-to-Many
Finalidade: Cada despesa pertence a um grupo específico
Configurações de Banco
Desenvolvimento
spring.datasource.url=jdbc:postgresql://localhost:5432/finboost
spring.datasource.username=finboost
spring.datasource.password=dev123
spring.jpa.hibernate.ddl-auto=update
Testes
spring.datasource.url=jdbc:h2:mem:testdb
spring.jpa.hibernate.ddl-auto=create-drop
spring.h2.console.enabled=true
Produção
spring.datasource.url=${DATABASE_URL}
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=false
Segurança e Validações
- Senhas: Criptografadas com BCrypt
- Emails: Únicos e validados
- Relacionamentos: Integridade referencial mantida
- Auditoria: Campos de data automáticos