From 079bcd59bdec111e00048824825db689999af9c6 Mon Sep 17 00:00:00 2001 From: Ryu Date: Thu, 11 Jun 2026 19:39:07 -0300 Subject: [PATCH 1/2] DOCS: atualiza documentacao do MVP --- .gitignore | 2 +- README.md | 35 +++++++++----- {docs/diario => diario}/2026-05-31.md | 0 {docs/diario => diario}/2026-06-05.md | 0 {docs/diario => diario}/2026-06-09.md | 0 diario/2026-06-11.md | 17 +++++++ {docs/diario => diario}/diario.md | 1 + docs/README.md | 8 ++-- docs/arquitetura.md | 12 ++--- docs/casos-de-uso.md | 12 ++++- docs/diagramas/mvp-projeto-final.svg | 66 +++++++++++++++++---------- docs/modelos-de-dados.md | 5 +- docs/product-backlog.md | 39 +++++++++++----- docs/requisitos.md | 23 ++++++++-- docs/resultados.md | 23 +++++----- docs/testes.md | 11 +++-- docs/uml.md | 5 +- include/contact.h | 2 +- 18 files changed, 176 insertions(+), 85 deletions(-) rename {docs/diario => diario}/2026-05-31.md (100%) rename {docs/diario => diario}/2026-06-05.md (100%) rename {docs/diario => diario}/2026-06-09.md (100%) create mode 100644 diario/2026-06-11.md rename {docs/diario => diario}/diario.md (91%) diff --git a/.gitignore b/.gitignore index bf17dd9..ee303ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ .vscode -.codex +.codex \ No newline at end of file diff --git a/README.md b/README.md index c2f0eec..bd602f0 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,15 @@ Permitir que um usuário manipule contatos em linha de comando e mantenha os dad * Adicionar contatos * Listar contatos -* Buscar contatos -* Remover contatos * Salvar contatos em arquivo * Carregar contatos ao iniciar +* Encerrar o programa salvando os dados + +# Funcionalidades planejadas + +* Buscar contatos +* Remover contatos +* Melhorar validação das entradas # Estrutura do projeto @@ -39,8 +44,12 @@ ContactManager/ │ ├─ requisitos.md │ ├─ resultados.md │ ├─ testes.md -│ └─ diario/ -│ └─ diario.md +├─ diario/ +│ ├─ diario.md +│ ├─ 2026-05-31.md +│ ├─ 2026-06-05.md +│ ├─ 2026-06-09.md +│ └─ 2026-06-11.md ├─ include/ │ ├─ contact.h │ └─ storage.h @@ -50,21 +59,23 @@ ContactManager/ └─ storage.c ``` -# Como compilar +# Como compilar e executar -O projeto ainda está em desenvolvimento. Para compilar após corrigir as implementações, use: +O projeto está em desenvolvimento, mas o fluxo básico de adicionar, listar, carregar e salvar contatos já pode ser compilado: ```bash mkdir -p data gcc -Iinclude src/main.c src/contact.c src/storage.c -o contactmanager +./contactmanager ``` # Status do projeto -* Implementação parcial em `src/contact.c`. -* Interface de persistência definida em `include/storage.h`. -* `src/storage.c` ainda precisa de correção e validação. -* `src/main.c` ainda não contém o menu principal e o fluxo de execução. +* `src/main.c` contém menu interativo com opções para adicionar, listar e sair. +* `src/contact.c` implementa `addContact` e `listContacts`. +* `src/storage.c` implementa `saveContacts` e `loadContacts` usando `data/contacts.txt`. +* `removeContact` e `findContact` estão declaradas em `include/contact.h`, mas ainda não foram implementadas. +* O menu ainda não possui opções de busca e remoção. # Documentação @@ -77,7 +88,7 @@ gcc -Iinclude src/main.c src/contact.c src/storage.c -o contactmanager * `docs/product-backlog.md` — backlog de funcionalidades. * `docs/resultados.md` — resultados concluídos. * `docs/testes.md` — casos de teste. -* `docs/diario/diario.md` — histórico de desenvolvimento. +* `diario/diario.md` — histórico de desenvolvimento. * `CONTRIBUTING.md` — guia de convenção de commits. # Convenção de commits @@ -93,4 +104,4 @@ Use prefixos de commit para organizar o histórico do projeto: # Observações -O projeto está em fase de desenvolvimento e a documentação foi reorganizada para refletir o estado atual do código e do planejamento. +O projeto está em fase de desenvolvimento. A documentação diferencia o que já está implementado no CLI básico do que permanece planejado para as próximas etapas. diff --git a/docs/diario/2026-05-31.md b/diario/2026-05-31.md similarity index 100% rename from docs/diario/2026-05-31.md rename to diario/2026-05-31.md diff --git a/docs/diario/2026-06-05.md b/diario/2026-06-05.md similarity index 100% rename from docs/diario/2026-06-05.md rename to diario/2026-06-05.md diff --git a/docs/diario/2026-06-09.md b/diario/2026-06-09.md similarity index 100% rename from docs/diario/2026-06-09.md rename to diario/2026-06-09.md diff --git a/diario/2026-06-11.md b/diario/2026-06-11.md new file mode 100644 index 0000000..461e779 --- /dev/null +++ b/diario/2026-06-11.md @@ -0,0 +1,17 @@ +# Diário de Desenvolvimento — 2026-06-11 + +## Trabalho realizado +- Revisão da documentação principal para refletir o estado atual do código. +- Confirmação de que o CLI atual possui opções para adicionar contato, listar contatos e sair salvando os dados. +- Confirmação de que `src/storage.c` salva e carrega contatos usando `data/contacts.txt`. +- Registro de busca e remoção como funcionalidades planejadas, pois ainda não estão implementadas no menu nem em `src/contact.c`. +- Atualização de README, requisitos, arquitetura, casos de uso, testes, backlog, modelo de dados, resultados e UML. + +## Decisões de arquitetura +- Confirmado o uso de persistência local via arquivo em `data/contacts.txt` para a primeira fase, mantendo a separação de responsabilidades entre CLI, lógica de contatos e persistência. +- Preservado o padrão modular do projeto: `include/contact.h`, `include/storage.h`, `src/contact.c`, `src/storage.c` e `src/main.c`. +- Definido que a primeira versão de estabilidade deve concluir busca por nome/telefone e remoção antes de avançar para integrações externas. + +## Observações +- A documentação agora diferencia funcionalidades implementadas de funcionalidades planejadas. +- Próximo passo: implementar `findContact` e `removeContact`, atualizar o menu e registrar novos testes funcionais. diff --git a/docs/diario/diario.md b/diario/diario.md similarity index 91% rename from docs/diario/diario.md rename to diario/diario.md index 1320b8f..580e6aa 100644 --- a/docs/diario/diario.md +++ b/diario/diario.md @@ -7,5 +7,6 @@ Este diretório registra o progresso do projeto ContactManager organizado por di - [2026-05-31](2026-05-31.md) - [2026-06-05](2026-06-05.md) - [2026-06-09](2026-06-09.md) +- [2026-06-11](2026-06-11.md) > Adicione novas entradas criando um arquivo separado para cada data, por exemplo `YYYY-MM-DD.md`. diff --git a/docs/README.md b/docs/README.md index a77e62f..3060c7d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,19 +10,19 @@ Este diretório reúne os artefatos de documentação do projeto e serve como í * `fluxos.md` — Fluxos de interação e operação do sistema. * `modelos-de-dados.md` — Modelo de dados atual e formato de persistência. * `product-backlog.md` — Backlog inicial do projeto. -* `testes.md` — Casos de teste planejados e status atual. +* `testes.md` — Casos de teste planejados, executados e status atual. * `resultados.md` — Resultados concluídos até o momento. -* `diario/diario.md` — Diário de desenvolvimento com histórico por dia. +* `../diario/diario.md` — Diário de desenvolvimento com histórico por dia. ## Como usar 1. Leia `README.md` na raiz do projeto para entender o propósito geral. 2. Consulte `docs/README.md` para ver onde cada tipo de documentação está localizado. 3. Use `docs/requisitos.md` e `docs/arquitetura.md` como referências para implementação. -4. Atualize `docs/diario/diario.md` sempre que fizer mudanças significativas no projeto. +4. Atualize `diario/diario.md` e o arquivo diário da data correspondente sempre que fizer mudanças significativas no projeto. ## Observações A documentação foi reorganizada em junho de 2026 para refletir o estado atual da implementação em C e o ciclo de desenvolvimento do projeto. -O projeto está em evolução para uma arquitetura híbrida com PostgreSQL como backend planejado, Python para automações e uma interface gráfica futura. \ No newline at end of file +No estado atual, o projeto possui CLI básico com adição, listagem, carregamento e salvamento em arquivo local. Busca, remoção, PostgreSQL, automações Python e interface gráfica permanecem como evolução planejada. diff --git a/docs/arquitetura.md b/docs/arquitetura.md index 2fc7cfa..a57b1f9 100644 --- a/docs/arquitetura.md +++ b/docs/arquitetura.md @@ -29,8 +29,8 @@ Responsável por: Responsável por: - adicionar um contato à lista em memória - listar contatos presentes em memória -- buscar contatos -- remover contatos +- futuramente, buscar contatos +- futuramente, remover contatos ### `src/storage.c` Responsável por: @@ -77,12 +77,12 @@ ContactManager/ ## Observações sobre o estado atual - `src/contact.c` contém funções de cadastro e listagem em memória. -- `src/storage.c` está em desenvolvimento e precisa de correção para gravar e ler corretamente. -- `src/main.c` ainda não possui o menu completo nem a sequência de chamadas de rotina. +- `src/storage.c` grava e lê contatos em arquivo local. +- `src/main.c` possui menu básico com opções de adicionar, listar e sair. - O arquivo de persistência esperado é `data/contacts.txt`. +- Busca e remoção ainda não estão conectadas ao menu e seguem como evolução imediata. - A arquitetura futura prevê migração para PostgreSQL, adoção de Python em scripts de manutenção e a criação de uma interface gráfica. ## Referência - Veja também `docs/modelos-de-dados.md` para o formato do contato e do armazenamento. -- O histórico de desenvolvimento está em `docs/diario/diario.md`. - +- O histórico de desenvolvimento está em `diario/diario.md`. diff --git a/docs/casos-de-uso.md b/docs/casos-de-uso.md index b847f5e..d1ab7f0 100644 --- a/docs/casos-de-uso.md +++ b/docs/casos-de-uso.md @@ -1,7 +1,7 @@ # Casos de Uso ## Descrição geral -Este documento descreve os casos de uso do sistema ContactManager e a interação do usuário com as funcionalidades atualmente planejadas. +Este documento descreve os casos de uso do sistema ContactManager e a interação do usuário com as funcionalidades implementadas e planejadas. ## Caso de Uso Principal ```mermaid @@ -29,29 +29,39 @@ flowchart TB ## Casos de Uso Detalhados ### Caso de Uso: Adicionar contato +Estado: implementado. + - O usuário seleciona a opção de adicionar contato. - O sistema solicita nome e telefone. - O sistema armazena o contato em memória. - O sistema retorna ao menu principal. ### Caso de Uso: Listar contatos +Estado: implementado. + - O usuário seleciona a opção de listar contatos. - O sistema exibe todos os contatos presentes em memória. - O sistema retorna ao menu principal. ### Caso de Uso: Buscar contato +Estado: planejado. + - O usuário seleciona a opção de buscar contato. - O sistema solicita o termo de busca. - O sistema exibe os contatos cujo nome ou telefone contenham o termo. - O sistema retorna ao menu principal. ### Caso de Uso: Remover contato +Estado: planejado. + - O usuário seleciona a opção de remover contato. - O sistema solicita o nome ou o índice do contato. - O sistema remove o contato correspondente da memória. - O sistema atualiza o arquivo de dados e retorna ao menu. ### Caso de Uso: Persistência de dados +Estado: implementado. + - O sistema carrega contatos do arquivo ao iniciar. - O sistema salva contatos no arquivo antes de encerrar. diff --git a/docs/diagramas/mvp-projeto-final.svg b/docs/diagramas/mvp-projeto-final.svg index e4fb9d1..e2d7c70 100644 --- a/docs/diagramas/mvp-projeto-final.svg +++ b/docs/diagramas/mvp-projeto-final.svg @@ -1,10 +1,14 @@ - + @@ -12,30 +16,44 @@ - - MVP planejado - ContactManager - Diagrama de visão geral do produto final + + MVP atual - ContactManager + Visão do CLI básico implementado e das próximas funcionalidades planejadas - - Terminal - - Menu de navegação - - Opções de CRUD - - Mensagens e confirmações + + Interface CLI + + Implementado + - Menu numerico + - Adicionar contato + - Listar contatos + - Sair salvando dados - - Lógica de Contatos - - Adicionar contato - - Listar contatos - - Buscar contatos - - Remover contatos - - Validação de entradas + + Lógica de Contatos + + Implementado + - Estrutura Contact + - addContact() + - listContacts() + - Limite de 100 contatos - - Persistência - - Salvar em arquivo - - Carregar ao iniciar - - Manter dados entre execuções + + Persistência Local + + Implementado + - saveContacts() + - loadContacts() + - Arquivo data/contacts.txt + - Cria data/ ao salvar - - + + Proximas evolucoes do MVP + + Planejado + Buscar contatos, remover contatos e melhorar validacao de entradas + + + + diff --git a/docs/modelos-de-dados.md b/docs/modelos-de-dados.md index 0855ec0..95a8e35 100644 --- a/docs/modelos-de-dados.md +++ b/docs/modelos-de-dados.md @@ -41,8 +41,9 @@ Maria,21988887777 ## Limitações atuais - O modelo atual não inclui campos de e-mail, ID ou categorias. -- A implementação de persistência ainda não está concluída. -- Caso o diretório `data/` não exista, a aplicação deve criar o diretório antes de salvar os dados. +- A persistência atual usa um formato simples separado por vírgula e ainda não trata vírgulas dentro dos campos. +- Caso o diretório `data/` não exista, a aplicação cria o diretório antes de salvar os dados. +- O carregamento atual assume que cada linha válida possui nome e telefone no formato `nome,telefone`. ## Possíveis extensões futuras - adicionar campo `email` diff --git a/docs/product-backlog.md b/docs/product-backlog.md index fbc69ee..19a427f 100644 --- a/docs/product-backlog.md +++ b/docs/product-backlog.md @@ -23,16 +23,31 @@ Este documento contém os itens principais a serem desenvolvidos para o projeto - **PB-010**: Como desenvolvedor, quero testes básicos para validar as funcionalidades principais. ## Prioridade Inicial -1. PB-001: Adicionar contato -2. PB-002: Listar contatos -3. PB-005: Salvar contatos em arquivo -4. PB-006: Carregar contatos do arquivo -5. PB-003: Buscar contatos -6. PB-004: Remover contatos -7. PB-007: Menu de terminal -8. PB-008: Mensagens do sistema -9. PB-009: Documentação -10. PB-010: Testes básicos +1. PB-003: Buscar contatos +2. PB-004: Remover contatos +3. PB-008: Melhorar mensagens e validação de entrada +4. PB-010: Ampliar testes básicos +5. PB-009: Manter documentação atualizada +6. PB-005: Evoluir persistência em arquivo +7. PB-006: Evoluir carregamento de dados +8. PB-007: Evoluir menu de terminal +9. PB-001: Adicionar contato +10. PB-002: Listar contatos + +## Status dos itens + +| ID | Estado | Observação | +|--------|---------------|------------| +| PB-001 | Implementado | Adição disponível no menu atual | +| PB-002 | Implementado | Listagem disponível no menu atual | +| PB-003 | Pendente | Ainda sem opção no menu | +| PB-004 | Pendente | Ainda sem opção no menu | +| PB-005 | Implementado | Salvamento em `data/contacts.txt` ao sair | +| PB-006 | Implementado | Carregamento em `data/contacts.txt` ao iniciar | +| PB-007 | Parcial | Menu possui adicionar, listar e sair | +| PB-008 | Parcial | Existem mensagens básicas; validações ainda são simples | +| PB-009 | Em andamento | Documentação atualizada conforme evolução | +| PB-010 | Em andamento | Testes manuais registrados em `tests/` | ## Notas - Este backlog inicial serve de base para o planejamento das próximas sprints. @@ -43,7 +58,7 @@ Este documento contém os itens principais a serem desenvolvidos para o projeto ### Sprint 1 — 09/06/2026 a 16/06/2026 - **Meta:** estabilizar a versão CLI completa e a persistência local. - **Itens principais:** PB-001, PB-002, PB-005, PB-006, PB-003. -- **Critérios de aceitação:** o sistema adiciona, lista, busca, remove e salva contatos localmente; o fluxo CLI está validado. +- **Critérios de aceitação:** o sistema adiciona, lista, carrega e salva contatos localmente; busca e remoção ficam registradas como próximos itens caso não sejam concluídas na sprint. ### Sprint 2 — 17/06/2026 a 23/06/2026 - **Meta:** introduzir PostgreSQL como backend e automação com Python. @@ -60,4 +75,4 @@ Este documento contém os itens principais a serem desenvolvidos para o projeto - O prazo de cada sprint deve ser respeitado sempre que possível, com revisão diária de progresso no diário. - A documentação deve refletir claramente as mudanças na arquitetura e a evolução do backend. - \ No newline at end of file + diff --git a/docs/requisitos.md b/docs/requisitos.md index fdc62ac..bc7a53c 100644 --- a/docs/requisitos.md +++ b/docs/requisitos.md @@ -2,7 +2,7 @@ ## Introdução -ContactManager é um sistema de terminal para gerenciamento local de contatos. O objetivo é fornecer operações básicas de cadastro, consulta, remoção e persistência em arquivo. +ContactManager é um sistema de terminal para gerenciamento local de contatos. O objetivo é fornecer operações básicas de cadastro, listagem e persistência em arquivo, evoluindo depois para consulta e remoção. ## Escopo @@ -22,6 +22,18 @@ O sistema opera localmente e não depende de rede ou banco de dados externo na f | RF-06 | Carregar dados | Ler contatos ao iniciar o sistema | Alta | UC-6 | | RF-07 | Encerrar | Finalizar o programa de forma limpa | Alta | UC-7 | +## Estado dos Requisitos Funcionais + +| ID | Estado | Observação | +|-------|---------------|------------| +| RF-01 | Implementado | Disponível na opção 1 do menu | +| RF-02 | Implementado | Disponível na opção 2 do menu | +| RF-03 | Planejado | Declarado no cabeçalho, mas ainda sem implementação no menu | +| RF-04 | Planejado | Declarado no cabeçalho, mas ainda sem implementação no menu | +| RF-05 | Implementado | Executado ao sair do programa | +| RF-06 | Implementado | Executado ao iniciar o programa | +| RF-07 | Implementado | Disponível na opção 3 do menu | + ## Requisitos Não Funcionais | ID | Nome | Descrição | @@ -65,12 +77,15 @@ O ContactManager será considerado funcional quando: * for possível adicionar contatos * for possível listar contatos -* for possível buscar contatos -* for possível remover contatos * os dados forem salvos corretamente * os dados forem carregados corretamente * o programa encerrar sem perda de informações +Para o ciclo completo planejado, também será necessário: + +* buscar contatos por nome ou telefone +* remover contatos cadastrados + ## Estado atual -A implementação atual está em desenvolvimento. A documentação descreve o projeto real, mas o código ainda precisa ser corrigido para suportar todas as funcionalidades previstas. +A implementação atual está em desenvolvimento. O CLI básico já cobre adicionar, listar, carregar e salvar contatos. Busca e remoção permanecem como funcionalidades planejadas. diff --git a/docs/resultados.md b/docs/resultados.md index 2fd4102..5703c8c 100644 --- a/docs/resultados.md +++ b/docs/resultados.md @@ -13,29 +13,30 @@ Este documento lista os resultados concluídos desde o início do projeto Contac - Diretório `src/` contém a implementação em C. - `README.md` e `docs/README.md` fornecem visão geral e índice da documentação. -## 3. Implementação parcial do núcleo +## 3. Implementação atual do núcleo - `include/contact.h` define a struct `Contact` com campos `name` e `phone`. - `src/contact.c` implementa a função `addContact` e a função `listContacts`. - `include/storage.h` prototipa `saveContacts` e `loadContacts`. -- `src/storage.c` contém a base da lógica de persistência, mas ainda precisa de correções. -- `src/main.c` está presente, mas ainda não possui o fluxo de menu completo. +- `src/storage.c` implementa salvamento e carregamento em `data/contacts.txt`. +- `src/main.c` possui menu interativo para adicionar contatos, listar contatos e sair salvando os dados. ## 4. Documentação e acompanhamento -- `docs/diario/diario.md` registra o histórico de desenvolvimento por dia e sequência de entregas. +- `diario/diario.md` registra o histórico de desenvolvimento por dia e sequência de entregas. - `docs/testes.md` apresenta o primeiro caso de teste e o status atual de testes. - `docs/requisitos.md`, `docs/arquitetura.md` e `docs/modelos-de-dados.md` foram atualizados para refletir a implementação C. - `docs/README.md` foi criado como índice de documentação. ## 5. Estado atual do projeto -- Implementação de entrada e listagem de contatos presente, mas com ajustes necessários. -- Persistência em arquivo ainda precisa ser corrigida e validada. -- Menu principal e fluxo de execução não estão implementados em `src/main.c`. +- Fluxo básico do CLI implementado: carregar, adicionar, listar, salvar e encerrar. +- Persistência local em arquivo implementada com criação do diretório `data/` ao salvar. +- Busca e remoção ainda não estão implementadas no menu nem em `src/contact.c`. +- Validação de entrada ainda é simples e deve ser aprimorada. ## 6. Próximos resultados esperados -- Corrigir `src/storage.c` para permitir salvar e carregar contatos corretamente. -- Ajustar `src/contact.c` para corrigir a listagem de contatos. -- Implementar `src/main.c` com menu interativo e chamadas a rotinas de contato. -- Validar o primeiro caso de teste e incluir testes de persistência e remoção. +- Implementar busca de contatos por nome ou telefone. +- Implementar remoção de contatos. +- Atualizar o menu principal com opções de busca e remoção. +- Ampliar os testes funcionais para cobrir busca, remoção e persistência após reiniciar o programa. ## Observação - A documentação foi reorganizada para oferecer um guia mais claro e alinhado ao estado atual do projeto. diff --git a/docs/testes.md b/docs/testes.md index 4d11df6..247d392 100644 --- a/docs/testes.md +++ b/docs/testes.md @@ -15,13 +15,14 @@ Resultado esperado: - A aplicação não deve travar ou apresentar erro de execução ao listar contatos. Observações: -- Essa validação inicial foca em `src/contact.c` e no menu de interação ainda não implementado em `src/main.c`. -- Caso a persistência em arquivo ainda não esteja funcionando, o teste deve ser considerado como um primeiro passo para validar o fluxo de entrada e exibição dos dados. +- Essa validação inicial foca em `src/contact.c`, `src/main.c` e no fluxo básico de interação por terminal. +- A persistência em arquivo deve ser validada observando a criação ou atualização de `data/contacts.txt`. ## Situação atual de testes -- O código atual precisa ser ajustado antes que este caso de teste possa ser executado com sucesso. -- Após a correção de `src/storage.c`, deve-se verificar também a persistência em `data/contacts.txt`. -- Um próximo caso de teste deve incluir a remoção de contatos e a verificação de recarga de dados após reiniciar o programa. +- O fluxo de adicionar, listar, salvar e carregar contatos já pode ser testado manualmente. +- Existe registro de teste funcional em `tests/2026-06-09-add-list-persist.md`. +- Um próximo caso de teste deve incluir busca e remoção assim que essas funções forem implementadas. +- A recarga dos dados após reiniciar o programa deve continuar sendo validada em testes de regressão. ## Histórico de testes executados - Os casos de teste registrados são armazenados em `tests/`. diff --git a/docs/uml.md b/docs/uml.md index 72b498b..c7cf2bf 100644 --- a/docs/uml.md +++ b/docs/uml.md @@ -68,7 +68,7 @@ classDiagram ## O que vai ser feito - Finalizar implementação de `removeContact` e `findContact` no backend C. -- Corrigir e validar o armazenamento local em `src/storage.c` para garantir persistência confiável. +- Ampliar a validação do armazenamento local em `src/storage.c` para garantir persistência confiável. - Migrar parte da persistência para PostgreSQL como backend robusto. - Criar scripts Python para migração de dados, importação/exportação e automações auxiliares. - Desenvolver a interface gráfica do projeto para melhorar a usabilidade. @@ -83,7 +83,8 @@ classDiagram - salvamento e carregamento de contatos funcionando. - documentação atualizada sobre o estado atual. - Critério de aceitação: - - o programa compila sem erros e suporta adicionar, listar, buscar, remover e salvar contatos localmente. + - o programa compila sem erros e suporta adicionar, listar, carregar e salvar contatos localmente. + - busca e remoção são implementadas ou permanecem registradas como pendências da sprint. - os testes básicos de fluxo CLI passam. ### Sprint 2 — 17/06/2026 a 23/06/2026 diff --git a/include/contact.h b/include/contact.h index 85b944f..7ccec5d 100644 --- a/include/contact.h +++ b/include/contact.h @@ -17,4 +17,4 @@ int findContact(Contact contacts[], int id); // Prototipo de função para busca #endif // Prototipo de função para buscar um contatos por nome. -// Podde ser melhorada para retornar um ponteiro para o contato encontrado ou NULL se não encontrado. \ No newline at end of file +// Pode ser melhorada para retornar um ponteiro para o contato encontrado ou NULL se não encontrado. \ No newline at end of file From ebe4616e8fc9dd6117c253e4dcf145a1cd8bb8df Mon Sep 17 00:00:00 2001 From: Ryu Date: Sun, 14 Jun 2026 13:34:04 -0300 Subject: [PATCH 2/2] feat: complete ContactManager implementation with CRUD operations --- .github/workflows/ci.yml | 13 +- .github/workflows/version-bump.yml | 55 +++++++ .gitignore | 14 +- DOCUMENTATION.md | 93 +++++++++++ Makefile | 36 +++++ README.md | 211 ++++++++++++++++--------- build/Makefile | 71 +++++++++ build/README.md | 53 +++++++ build/config.mk | 53 +++++++ docs/README.md | 70 ++++---- docs/arquitetura.md | 151 ++++++++++-------- docs/build.md | 76 +++++++++ docs/casos-de-uso.md | 137 ++++++++++------ docs/diagramas/README.md | 23 +-- docs/diagramas/casos-de-uso.svg | 85 +++++----- docs/diagramas/fluxo-inicializacao.svg | 133 +++++++--------- docs/diagramas/modelo-dados.svg | 124 +++++---------- docs/diagramas/mvp-projeto-final.svg | 29 ++-- docs/diagramas/uml-classes.svg | 129 +++++++-------- docs/fluxos.md | 127 ++++++++++----- docs/modelos-de-dados.md | 108 ++++++++----- docs/product-backlog.md | 151 +++++++++--------- docs/requisitos.md | 136 ++++++++-------- docs/resultados.md | 97 +++++++----- docs/testes.md | 95 +++++++---- docs/uml.md | 156 ++++++++---------- include/config.h | 40 +++++ include/contact.h | 28 ++-- include/error.h | 23 +++ include/storage.h | 25 +-- scripts/README.md | 74 +++++++++ scripts/build.sh | 142 +++++++++++++++++ src/config.c | 29 ++++ src/contact.c | 103 ++++++++++-- src/error.c | 20 +++ src/main.c | 119 ++++++++------ src/storage.c | 62 ++++---- tests/2026-06-09-add-list-persist.md | 9 +- tests/2026-06-14-crud-completo.md | 83 ++++++++++ tests/README.md | 63 +++++--- 40 files changed, 2176 insertions(+), 1070 deletions(-) create mode 100644 .github/workflows/version-bump.yml create mode 100644 DOCUMENTATION.md create mode 100644 Makefile create mode 100644 build/Makefile create mode 100644 build/README.md create mode 100644 build/config.mk create mode 100644 docs/build.md create mode 100644 include/config.h create mode 100644 include/error.h create mode 100644 scripts/README.md create mode 100755 scripts/build.sh create mode 100644 src/config.c create mode 100644 src/error.c create mode 100644 tests/2026-06-14-crud-completo.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 00117a1..070ed99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,13 +25,10 @@ jobs: sudo apt-get install -y gcc - name: Compile ContactManager - run: | - mkdir -p data - gcc -Iinclude src/main.c src/contact.c src/storage.c -o contactmanager + run: make build - name: Run static compilation checks - run: | - gcc -Iinclude -Wall -Wextra -Werror -c src/main.c src/contact.c src/storage.c + run: make test release: name: Release artifact @@ -49,9 +46,7 @@ jobs: sudo apt-get install -y gcc - name: Compile artifact - run: | - mkdir -p data - gcc -Iinclude src/main.c src/contact.c src/storage.c -o contactmanager + run: make build - name: Create GitHub release uses: ncipollo/release-action@v1 @@ -59,4 +54,4 @@ jobs: tag: ${{ github.ref_name }} name: Release ${{ github.ref_name }} body: "Build artifact for ${{ github.ref_name }}" - files: contactmanager + files: dist/contactmanager diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml new file mode 100644 index 0000000..a6ea7ba --- /dev/null +++ b/.github/workflows/version-bump.yml @@ -0,0 +1,55 @@ +name: Version Bump + +on: + push: + branches: + - main + paths: + - 'include/config.h' + - '.github/workflows/version-bump.yml' + +jobs: + bump-version: + runs-on: ubuntu-latest + if: github.event_name == 'push' + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Find current version + id: current_version + run: | + version=$(grep -E '^#define APP_VERSION "[0-9]+\.[0-9]+"' include/config.h | head -n1 | sed -E 's/^#define APP_VERSION "([0-9]+\.[0-9]+)"/\1/') + echo "version=$version" >> $GITHUB_OUTPUT + + - name: Bump patch version + id: bump_version + run: | + version=${{ steps.current_version.outputs.version }} + major=$(echo "$version" | cut -d. -f1) + minor=$(echo "$version" | cut -d. -f2) + patch=0 + new_version="$major.$minor.$patch" + sed -i -E "s/^#define APP_VERSION \"[0-9]+\.[0-9]+\"/#define APP_VERSION \"$new_version\"/" include/config.h + echo "new_version=$new_version" >> $GITHUB_OUTPUT + + - name: Commit version bump + run: | + git add include/config.h + git commit -m "chore: bump app version to ${{ steps.bump_version.outputs.new_version }}" + git push origin main + + - name: Create release + if: startsWith(github.ref, 'refs/heads/main') + uses: ncipollo/release-action@v1 + with: + tag: "v${{ steps.bump_version.outputs.new_version }}" + name: "Release v${{ steps.bump_version.outputs.new_version }}" + body: | + Automatic version bump to ${{ steps.bump_version.outputs.new_version }}. diff --git a/.gitignore b/.gitignore index ee303ce..ae087ca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,12 @@ -.vscode -.codex \ No newline at end of file +.vscode/ +.codex/ + +# Build artifacts +build/obj/ +dist/ +*.o +contactmanager +contactmanager-debug + +# Runtime data +data/*.txt diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md new file mode 100644 index 0000000..0d3e7c7 --- /dev/null +++ b/DOCUMENTATION.md @@ -0,0 +1,93 @@ +# Mapa Geral da Documentação + +Este arquivo é o ponto de entrada para navegar pela documentação do ContactManager. Use-o quando precisar localizar rapidamente requisitos, arquitetura, build, testes ou histórico. + +## Início Rápido + +| Objetivo | Documento | +|----------|-----------| +| Entender o projeto | [README.md](README.md) | +| Compilar e executar | [docs/build.md](docs/build.md) | +| Entender requisitos | [docs/requisitos.md](docs/requisitos.md) | +| Entender arquitetura | [docs/arquitetura.md](docs/arquitetura.md) | +| Ver modelo de dados | [docs/modelos-de-dados.md](docs/modelos-de-dados.md) | +| Ver testes | [docs/testes.md](docs/testes.md) | +| Contribuir | [CONTRIBUTING.md](CONTRIBUTING.md) | + +## Documentação na Raiz + +| Arquivo | Função | +|---------|--------| +| [README.md](README.md) | Visão geral, estado atual, estrutura e uso básico | +| [DOCUMENTATION.md](DOCUMENTATION.md) | Este mapa geral | +| [CONTRIBUTING.md](CONTRIBUTING.md) | Convenções de contribuição e commits | +| [LICENSE](LICENSE) | Licença do projeto | + +## Documentação Técnica + +| Arquivo | Conteúdo | +|---------|----------| +| [docs/README.md](docs/README.md) | Índice técnico do diretório `docs/` | +| [docs/build.md](docs/build.md) | Build, execução, teste, instalação e saídas geradas | +| [docs/requisitos.md](docs/requisitos.md) | Requisitos funcionais, não funcionais, restrições e aceites | +| [docs/arquitetura.md](docs/arquitetura.md) | Componentes, responsabilidades e fluxo geral | +| [docs/modelos-de-dados.md](docs/modelos-de-dados.md) | Estrutura `Contact`, limites e formato de persistência | +| [docs/casos-de-uso.md](docs/casos-de-uso.md) | Casos de uso implementados e planejados | +| [docs/fluxos.md](docs/fluxos.md) | Fluxos de inicialização, CRUD e persistência | +| [docs/testes.md](docs/testes.md) | Estratégia de testes e estado atual | +| [docs/product-backlog.md](docs/product-backlog.md) | Backlog priorizado | +| [docs/resultados.md](docs/resultados.md) | Resultados concluídos e próximos passos | +| [docs/uml.md](docs/uml.md) | Diagrama de classes e visão modular | +| [docs/diagramas/](docs/diagramas/) | SVGs e artefatos visuais | + +## Build e Automação + +| Local | Função | +|-------|--------| +| [Makefile](Makefile) | Atalhos da raiz que delegam para `build/Makefile` | +| [build/Makefile](build/Makefile) | Regras principais de compilação | +| [build/config.mk](build/config.mk) | Variáveis reutilizáveis de build | +| [build/README.md](build/README.md) | Referência rápida do sistema de build | +| [scripts/build.sh](scripts/build.sh) | Script auxiliar para build, run, test e clean | +| [scripts/README.md](scripts/README.md) | Documentação dos scripts | + +## Testes e Histórico + +| Local | Função | +|-------|--------| +| [tests/README.md](tests/README.md) | Convenção para registrar testes manuais | +| [tests/2026-06-09-add-list-persist.md](tests/2026-06-09-add-list-persist.md) | Registro de teste funcional | +| [diario/diario.md](diario/diario.md) | Índice do diário de desenvolvimento | +| [diario/](diario/) | Entradas por data | + +## Convenções de Localização + +| Tipo de conteúdo | Local | +|------------------|-------| +| Código fonte | `src/` | +| Cabeçalhos | `include/` | +| Documentação técnica | `docs/` | +| Diagramas | `docs/diagramas/` | +| Testes manuais | `tests/` | +| Histórico | `diario/` | +| Build system | `build/`, `Makefile` | +| Scripts | `scripts/` | +| CI/CD | `.github/workflows/` | +| Dados gerados em runtime | `data/` | +| Objetos gerados | `build/obj/` | +| Binários gerados | `dist/` | + +## Regras de Manutenção + +- Atualize o `README.md` quando mudar a experiência principal do usuário. +- Atualize `docs/requisitos.md`, `docs/casos-de-uso.md` e `docs/fluxos.md` quando mudar comportamento. +- Atualize `docs/arquitetura.md` e `docs/uml.md` quando mudar módulos, contratos ou responsabilidades. +- Atualize `docs/modelos-de-dados.md` quando mudar `Contact`, limites ou formato de arquivo. +- Atualize `docs/build.md`, `build/README.md` e `scripts/README.md` quando mudar o fluxo de build. +- Registre validações relevantes em `tests/` e resultados consolidados em `docs/testes.md`. + +## Última Revisão + +- Data: 14 de junho de 2026 +- Versão documentada: `APP_VERSION "1.0"` +- Estado: CLI local com CRUD por número/índice, persistência em CSV simples e build organizado em `build/obj/` e `dist/`. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..008e1fd --- /dev/null +++ b/Makefile @@ -0,0 +1,36 @@ +# ContactManager Root Makefile +# This delegates to the actual build configuration in build/Makefile + +.PHONY: help build debug release run debug-run clean test install uninstall + +help: + @$(MAKE) -f build/Makefile help + +build: + @$(MAKE) -f build/Makefile build + +debug: + @$(MAKE) -f build/Makefile debug + +release: + @$(MAKE) -f build/Makefile release + +run: + @$(MAKE) -f build/Makefile run + +debug-run: + @$(MAKE) -f build/Makefile debug-run + +clean: + @$(MAKE) -f build/Makefile clean + +test: + @$(MAKE) -f build/Makefile test + +install: + @$(MAKE) -f build/Makefile install + +uninstall: + @$(MAKE) -f build/Makefile uninstall + +.DEFAULT_GOAL := help diff --git a/README.md b/README.md index bd602f0..c9b774f 100644 --- a/README.md +++ b/README.md @@ -1,107 +1,160 @@ # ContactManager ---- -ContactManager é um protótipo de sistema de gerenciamento de contatos para terminal desenvolvido em C. +ContactManager é um sistema de gerenciamento de contatos para terminal, desenvolvido em C. A versão atual oferece um fluxo local de CRUD, persistência em arquivo CSV simples e organização modular para facilitar manutenção e evolução. -![MVP planejado do ContactManager](docs/diagramas/mvp-projeto-final.svg) +![MVP atual do ContactManager](docs/diagramas/mvp-projeto-final.svg) -O projeto foca em: -- operações básicas de cadastro, consulta, remoção e persistência de contatos. -- organização modular de código em `include/` e `src/`. -- documentação técnica e rastreamento do desenvolvimento. +## Objetivo -# Objetivo +Permitir que o usuário cadastre, consulte, atualize, remova e mantenha contatos salvos localmente, usando uma interface simples de linha de comando. -Permitir que um usuário manipule contatos em linha de comando e mantenha os dados gravados localmente em arquivo. +## Estado Atual -# Escopo atual +Implementado: +- adicionar contato com nome, telefone e email; +- listar contatos carregados em memória; +- buscar contato pelo número exibido na lista; +- atualizar os dados de um contato pelo número exibido; +- remover contato pelo número exibido; +- carregar contatos ao iniciar; +- salvar contatos em `data/contacts.txt` ao sair; +- compilar com Make usando saídas separadas em `build/obj/` e `dist/`. -* Adicionar contatos -* Listar contatos -* Salvar contatos em arquivo -* Carregar contatos ao iniciar -* Encerrar o programa salvando os dados +Planejado: +- busca avançada por nome, telefone ou email; +- validação de entrada mais robusta; +- testes automatizados além do teste básico de encerramento; +- importação/exportação de dados; +- possível evolução para banco de dados ou interface gráfica. -# Funcionalidades planejadas +## Estrutura do Projeto -* Buscar contatos -* Remover contatos -* Melhorar validação das entradas +```text +ContactManager/ +├── Makefile # Atalhos da raiz para o build principal +├── README.md # Visão geral do projeto +├── DOCUMENTATION.md # Mapa geral da documentação +├── CONTRIBUTING.md # Convenções de contribuição +├── build/ +│ ├── Makefile # Regras principais de compilação +│ ├── config.mk # Variáveis do build +│ ├── README.md # Referência rápida do build +│ └── obj/ # Objetos gerados (ignorado pelo Git) +├── dist/ # Binários gerados (ignorado pelo Git) +├── data/ # Dados locais de execução (ignorado pelo Git) +├── include/ +│ ├── config.h # Constantes e API de configuração +│ ├── contact.h # Modelo Contact e operações de contato +│ ├── storage.h # API de persistência +│ └── error.h # Códigos de erro da aplicação +├── src/ +│ ├── main.c # Menu e fluxo principal +│ ├── config.c # Implementação da configuração +│ ├── contact.c # Operações CRUD em memória +│ ├── storage.c # Leitura e gravação em arquivo +│ └── error.c # Mensagens de erro da aplicação +├── scripts/ +│ ├── build.sh # Interface shell para os comandos de build +│ └── README.md +├── docs/ +│ ├── README.md # Índice técnico +│ ├── build.md # Guia de build, execução e instalação +│ ├── requisitos.md +│ ├── arquitetura.md +│ ├── modelos-de-dados.md +│ ├── casos-de-uso.md +│ ├── fluxos.md +│ ├── testes.md +│ ├── product-backlog.md +│ ├── resultados.md +│ ├── uml.md +│ └── diagramas/ +├── tests/ # Registros de testes manuais +└── diario/ # Histórico de desenvolvimento +``` -# Estrutura do projeto +## Como Compilar +```bash +make build ``` -ContactManager/ -├─ README.md -├─ LICENSE -├─ docs/ -│ ├─ README.md -│ ├─ arquitetura.md -│ ├─ casos-de-uso.md -│ ├─ fluxos.md -│ ├─ modelos-de-dados.md -│ ├─ product-backlog.md -│ ├─ requisitos.md -│ ├─ resultados.md -│ ├─ testes.md -├─ diario/ -│ ├─ diario.md -│ ├─ 2026-05-31.md -│ ├─ 2026-06-05.md -│ ├─ 2026-06-09.md -│ └─ 2026-06-11.md -├─ include/ -│ ├─ contact.h -│ └─ storage.h -└─ src/ - ├─ main.c - ├─ contact.c - └─ storage.c + +O binário release é gerado em: + +```text +dist/contactmanager ``` -# Como compilar e executar +## Como Executar -O projeto está em desenvolvimento, mas o fluxo básico de adicionar, listar, carregar e salvar contatos já pode ser compilado: +```bash +make run +``` + +Ou diretamente, após compilar: ```bash -mkdir -p data -gcc -Iinclude src/main.c src/contact.c src/storage.c -o contactmanager -./contactmanager +./dist/contactmanager ``` -# Status do projeto +## Outros Comandos + +```bash +make help # Lista os targets disponíveis +make debug # Gera dist/contactmanager-debug +make test # Compila e executa um teste básico +make clean # Remove build/obj/ e dist/ +make install # Instala o binário em /usr/local/bin +``` + +Também é possível usar o script: + +```bash +./scripts/build.sh build +./scripts/build.sh run +./scripts/build.sh test +``` + +## Persistência + +Os contatos são mantidos em memória durante a execução. Ao escolher a opção de sair, a aplicação salva os dados em: + +```text +data/contacts.txt +``` + +O formato atual é CSV simples: + +```text +nome,telefone,email +``` -* `src/main.c` contém menu interativo com opções para adicionar, listar e sair. -* `src/contact.c` implementa `addContact` e `listContacts`. -* `src/storage.c` implementa `saveContacts` e `loadContacts` usando `data/contacts.txt`. -* `removeContact` e `findContact` estão declaradas em `include/contact.h`, mas ainda não foram implementadas. -* O menu ainda não possui opções de busca e remoção. +O diretório `data/` é criado automaticamente quando necessário. -# Documentação +## Documentação -* `docs/README.md` — índice da documentação do projeto. -* `docs/requisitos.md` — requisitos funcionais e não funcionais. -* `docs/arquitetura.md` — arquitetura do sistema em C. -* `docs/casos-de-uso.md` — casos de uso e diagramas. -* `docs/fluxos.md` — fluxos operacionais do sistema. -* `docs/modelos-de-dados.md` — modelo de dados e formato de persistência. -* `docs/product-backlog.md` — backlog de funcionalidades. -* `docs/resultados.md` — resultados concluídos. -* `docs/testes.md` — casos de teste. -* `diario/diario.md` — histórico de desenvolvimento. -* `CONTRIBUTING.md` — guia de convenção de commits. +- [DOCUMENTATION.md](DOCUMENTATION.md) - mapa geral de navegação. +- [docs/README.md](docs/README.md) - índice técnico. +- [docs/build.md](docs/build.md) - build, execução, teste e instalação. +- [docs/requisitos.md](docs/requisitos.md) - requisitos e critérios de aceitação. +- [docs/arquitetura.md](docs/arquitetura.md) - módulos e responsabilidades. +- [docs/modelos-de-dados.md](docs/modelos-de-dados.md) - modelo `Contact` e formato de arquivo. +- [docs/casos-de-uso.md](docs/casos-de-uso.md) - interações do usuário. +- [docs/fluxos.md](docs/fluxos.md) - fluxos operacionais. +- [docs/testes.md](docs/testes.md) - estratégia e registros de teste. +- [docs/product-backlog.md](docs/product-backlog.md) - próximos itens planejados. -# Convenção de commits +## Convenção de Commits -Use prefixos de commit para organizar o histórico do projeto: +Use os prefixos definidos em [CONTRIBUTING.md](CONTRIBUTING.md): -- `STR:` — estrutura e refatoração -- `FEAT:` — nova implementação ou função -- `FIX:` — correções de bug -- `TEST:` — testes, builds e validações -- `DOCS:` — documentação -- `CHORE:` — manutenção geral +- `STR:` estrutura e refatoração; +- `FEAT:` novas funcionalidades; +- `FIX:` correções; +- `TEST:` testes e validações; +- `DOCS:` documentação; +- `CHORE:` manutenção. -# Observações +## Observação -O projeto está em fase de desenvolvimento. A documentação diferencia o que já está implementado no CLI básico do que permanece planejado para as próximas etapas. +Este projeto ainda está em evolução. A documentação deve separar claramente o que já está implementado no CLI atual do que permanece planejado para versões futuras. diff --git a/build/Makefile b/build/Makefile new file mode 100644 index 0000000..fbe1163 --- /dev/null +++ b/build/Makefile @@ -0,0 +1,71 @@ +include build/config.mk + +OBJ = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRC_FILES)) +DEBUG_OBJ = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%_debug.o,$(SRC_FILES)) + +.PHONY: all build debug release clean run test help install uninstall + +help: + @echo "ContactManager Build System" + @echo "" + @echo "Available targets:" + @echo " make build - Build release binary in $(BIN_DIR)/" + @echo " make debug - Build debug binary with symbols in $(BIN_DIR)/" + @echo " make release - Clean and build optimized release binary" + @echo " make run - Build and run the program" + @echo " make test - Run tests (if available)" + @echo " make clean - Remove build artifacts" + @echo " make install - Install binary to $(INSTALL_DIR)" + @echo " make uninstall - Remove installed binary" + @echo "" + +all: release + +$(TARGET): $(OBJ) + @mkdir -p $(BIN_DIR) + $(CC) $(LDFLAGS) -o $@ $^ + +$(DEBUG_TARGET): $(DEBUG_OBJ) + @mkdir -p $(BIN_DIR) + $(CC) $(LDFLAGS) -o $@ $^ + +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS_BASE) $(RELEASE_FLAGS) -c $< -o $@ + +$(OBJ_DIR)/%_debug.o: $(SRC_DIR)/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS_BASE) $(DEBUG_FLAGS) -c $< -o $@ + +build: $(TARGET) + +debug: $(DEBUG_TARGET) + +release: clean $(TARGET) + +run: build + mkdir -p $(DATA_DIR) + ./$(TARGET) + +debug-run: debug + mkdir -p $(DATA_DIR) + gdb ./$(DEBUG_TARGET) + +clean: + rm -rf $(OBJ_DIR) $(BIN_DIR) + +test: build + @echo "Testing ContactManager..." + @printf "6\n" | ./$(TARGET) >/dev/null + +install: release + @echo "Installing ContactManager to $(INSTALL_DIR)..." + install -m $(INSTALL_MODE) $(TARGET) $(INSTALL_DIR)/contactmanager + @echo "Installation complete!" + +uninstall: + @echo "Removing ContactManager from $(INSTALL_DIR)..." + rm -f $(INSTALL_DIR)/contactmanager + @echo "Uninstall complete!" + +.DEFAULT_GOAL := help diff --git a/build/README.md b/build/README.md new file mode 100644 index 0000000..0fc1b41 --- /dev/null +++ b/build/README.md @@ -0,0 +1,53 @@ +# Build System + +Este diretório contém a configuração principal de build do ContactManager. + +## Arquivos + +| Arquivo | Função | +|---------|--------| +| `Makefile` | Targets principais de build, debug, run, test, clean e install | +| `config.mk` | Variáveis reutilizáveis de compilação e diretórios | +| `README.md` | Esta referência rápida | +| `obj/` | Objetos gerados durante a compilação, ignorados pelo Git | + +## Uso Rápido + +Execute a partir da raiz do projeto: + +```bash +make help +make build +make debug +make run +make test +make clean +``` + +## Saídas + +| Target | Saída | +|--------|-------| +| `make build` | `dist/contactmanager` | +| `make debug` | `dist/contactmanager-debug` | +| `make clean` | remove `build/obj/` e `dist/` | + +## Variáveis + +| Variável | Padrão | Uso | +|----------|--------|-----| +| `CC` | `gcc` | Compilador C | +| `OBJ_DIR` | `build/obj` | Diretório dos objetos | +| `BIN_DIR` | `dist` | Diretório dos binários | +| `INSTALL_DIR` | `/usr/local/bin` | Diretório de instalação | + +Exemplo: + +```bash +CC=clang make build +BIN_DIR=/tmp/contactmanager make build +``` + +## Referência Completa + +Consulte [docs/build.md](../docs/build.md). diff --git a/build/config.mk b/build/config.mk new file mode 100644 index 0000000..ac9b123 --- /dev/null +++ b/build/config.mk @@ -0,0 +1,53 @@ +# Build Configuration for ContactManager +# This file contains build-time configuration options + +# Compiler and flags +CC ?= gcc +CFLAGS_BASE = -Iinclude -Wall -Wextra -std=c99 +DEBUG_FLAGS = -g -O0 -DDEBUG -fno-omit-frame-pointer +RELEASE_FLAGS = -O2 -DNDEBUG +LDFLAGS = + +# Source files +SRC_DIR = src +INCLUDE_DIR = include +SRC_FILES = $(SRC_DIR)/main.c \ + $(SRC_DIR)/contact.c \ + $(SRC_DIR)/storage.c \ + $(SRC_DIR)/config.c \ + $(SRC_DIR)/error.c + +# Build artifacts +OBJ_DIR ?= build/obj +BIN_DIR ?= dist +TARGET = $(BIN_DIR)/contactmanager +DEBUG_TARGET = $(BIN_DIR)/contactmanager-debug + +# Installation +INSTALL_DIR ?= /usr/local/bin +INSTALL_MODE = 755 + +# Data directory +DATA_DIR = data + +# Feature flags +ENABLE_COLOR ?= 1 +ENABLE_DEBUG ?= 0 + +# Diagnostics +VERBOSE ?= 0 + +# Derived variables +ifeq ($(VERBOSE),1) + SILENT = +else + SILENT = @ +endif + +ifeq ($(ENABLE_DEBUG),1) + CFLAGS = $(CFLAGS_BASE) $(DEBUG_FLAGS) + TARGET_BINARY = $(DEBUG_TARGET) +else + CFLAGS = $(CFLAGS_BASE) $(RELEASE_FLAGS) + TARGET_BINARY = $(TARGET) +endif diff --git a/docs/README.md b/docs/README.md index 3060c7d..46eb6fc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,28 +1,42 @@ -# Documentação do ContactManager - -Este diretório reúne os artefatos de documentação do projeto e serve como índice para os documentos principais. - -## Documentos principais - -* `requisitos.md` — Requisitos funcionais, não funcionais e restrições do sistema. -* `arquitetura.md` — Arquitetura do sistema e organização dos módulos em C. -* `casos-de-uso.md` — Casos de uso e diagramas de interação do usuário. -* `fluxos.md` — Fluxos de interação e operação do sistema. -* `modelos-de-dados.md` — Modelo de dados atual e formato de persistência. -* `product-backlog.md` — Backlog inicial do projeto. -* `testes.md` — Casos de teste planejados, executados e status atual. -* `resultados.md` — Resultados concluídos até o momento. -* `../diario/diario.md` — Diário de desenvolvimento com histórico por dia. - -## Como usar - -1. Leia `README.md` na raiz do projeto para entender o propósito geral. -2. Consulte `docs/README.md` para ver onde cada tipo de documentação está localizado. -3. Use `docs/requisitos.md` e `docs/arquitetura.md` como referências para implementação. -4. Atualize `diario/diario.md` e o arquivo diário da data correspondente sempre que fizer mudanças significativas no projeto. - -## Observações - -A documentação foi reorganizada em junho de 2026 para refletir o estado atual da implementação em C e o ciclo de desenvolvimento do projeto. - -No estado atual, o projeto possui CLI básico com adição, listagem, carregamento e salvamento em arquivo local. Busca, remoção, PostgreSQL, automações Python e interface gráfica permanecem como evolução planejada. +# Documentação Técnica do ContactManager + +Este diretório reúne a documentação técnica do projeto. O objetivo é manter requisitos, arquitetura, modelo de dados, fluxos, testes e backlog alinhados ao código atual. + +## Índice + +| Documento | Descrição | +|-----------|-----------| +| [build.md](build.md) | Como compilar, executar, testar, limpar e instalar | +| [requisitos.md](requisitos.md) | Requisitos funcionais, não funcionais, restrições e critérios de aceitação | +| [arquitetura.md](arquitetura.md) | Componentes, responsabilidades e fluxo principal | +| [modelos-de-dados.md](modelos-de-dados.md) | Struct `Contact`, limites e persistência em CSV | +| [casos-de-uso.md](casos-de-uso.md) | Casos de uso implementados e planejados | +| [fluxos.md](fluxos.md) | Fluxos de inicialização, CRUD e encerramento | +| [testes.md](testes.md) | Estratégia de testes e estado atual | +| [product-backlog.md](product-backlog.md) | Backlog priorizado do produto | +| [resultados.md](resultados.md) | Resultados concluídos e próximos passos | +| [uml.md](uml.md) | Visão UML dos módulos do sistema | +| [diagramas/](diagramas/) | Diagramas SVG e referências visuais | + +## Estado Documentado + +A documentação descreve a versão atual do CLI em C: +- contatos possuem `name`, `phone` e `email`; +- o limite configurado é de 1000 contatos; +- as operações disponíveis são adicionar, listar, atualizar, remover e buscar por número exibido; +- os dados são carregados de `data/contacts.txt` ao iniciar; +- os dados são salvos em `data/contacts.txt` ao sair; +- o build gera objetos em `build/obj/` e binários em `dist/`. + +## Como Atualizar + +- Mudanças de comportamento devem refletir em `requisitos.md`, `casos-de-uso.md`, `fluxos.md` e `testes.md`. +- Mudanças estruturais devem refletir em `arquitetura.md`, `uml.md` e no `README.md` da raiz. +- Mudanças no modelo `Contact` ou no arquivo CSV devem refletir em `modelos-de-dados.md`. +- Mudanças de build devem refletir em `build.md`, `../build/README.md` e `../scripts/README.md`. + +## Referências + +- Visão geral: [../README.md](../README.md) +- Mapa geral: [../DOCUMENTATION.md](../DOCUMENTATION.md) +- Histórico: [../diario/diario.md](../diario/diario.md) diff --git a/docs/arquitetura.md b/docs/arquitetura.md index a57b1f9..1912e7c 100644 --- a/docs/arquitetura.md +++ b/docs/arquitetura.md @@ -2,87 +2,108 @@ ## Visão Geral -ContactManager é um protótipo em C com divisão de responsabilidades entre interface, lógica de contatos e persistência. +ContactManager segue uma arquitetura modular simples em C. A aplicação é composta por um menu de terminal, uma camada de operações sobre contatos em memória, uma camada de persistência em arquivo e uma configuração centralizada. -A arquitetura atual separa: -- definição de tipos e assinaturas em `include/` -- operações de contato em `src/contact.c` -- persistência de dados em `src/storage.c` -- fluxo de execução e menu em `src/main.c` - -O projeto também está evoluindo para uma arquitetura híbrida: -- PostgreSQL será adotado como backend de banco de dados para persistência mais robusta e escalável. -- Python será usado em tarefas auxiliares, como scripts de migração, importação/exportação e automações de manutenção. -- Uma interface gráfica será criada para oferecer uma experiência de usuário mais intuitiva além da linha de comando. - -## Componentes principais +## Componentes ### `src/main.c` -Responsável por: -- inicializar o programa -- carregar os contatos do arquivo -- exibir o menu principal ao usuário -- disparar as operações correspondentes às opções escolhidas -- salvar os dados antes de encerrar + +Responsabilidades: +- inicializar a configuração; +- carregar contatos ao iniciar; +- exibir o menu principal; +- receber a opção do usuário; +- chamar as operações de contato; +- salvar os dados ao sair. ### `src/contact.c` -Responsável por: -- adicionar um contato à lista em memória -- listar contatos presentes em memória -- futuramente, buscar contatos -- futuramente, remover contatos + +Responsabilidades: +- adicionar contato; +- listar contatos; +- buscar contato pelo número exibido; +- atualizar contato; +- remover contato. + +As operações usam um vetor de `Contact` mantido em memória durante a execução. ### `src/storage.c` -Responsável por: -- salvar os contatos em arquivo local -- carregar os contatos gravados ao iniciar o programa -### `include/contact.h` -Define a estrutura de dados `Contact` e as funções de contato. +Responsabilidades: +- criar o diretório `data/` quando necessário; +- salvar contatos em `data/contacts.txt`; +- carregar contatos de `data/contacts.txt`. + +### `src/config.c` e `include/config.h` + +Responsabilidades: +- concentrar nome e versão da aplicação; +- definir limites de contatos e tamanhos de campos; +- definir caminhos de dados; +- expor funções de leitura dessas configurações. + +### `src/error.c` e `include/error.h` -### `include/storage.h` -Define as assinaturas de `saveContacts` e `loadContacts`. +Responsabilidades: +- declarar códigos de erro da aplicação; +- fornecer mensagens textuais para esses códigos. -## Fluxo geral esperado +O módulo existe como base de padronização, embora o fluxo atual ainda use mensagens diretas em alguns pontos. + +## Contratos Públicos + +| Header | Conteúdo | +|--------|----------| +| `include/contact.h` | `struct Contact` e funções de CRUD | +| `include/storage.h` | `saveContacts` e `loadContacts` | +| `include/config.h` | constantes e funções de configuração | +| `include/error.h` | enum de erros e mensagens | + +## Fluxo Geral ```mermaid -flowchart LR - Init[Inicialização] --> Load[Carregar dados do arquivo] - Load --> Menu[Exibir menu principal] - Menu --> Input[Receber opção do usuário] - Input --> Execute[Executar operação selecionada] - Execute --> Loop[Voltar ao menu] - Loop --> Check{Encerrar?} - Check -- Não --> Menu - Check -- Sim --> Save[Salvar contatos no arquivo] - Save --> End[Finalizar] +flowchart TD + Start[Iniciar programa] --> Config[Inicializar configuração] + Config --> Load[Carregar data/contacts.txt] + Load --> Menu[Exibir menu] + Menu --> Choice{Opção} + Choice --> Add[Adicionar] + Choice --> List[Listar] + Choice --> Update[Atualizar] + Choice --> Remove[Remover] + Choice --> Find[Buscar por número] + Choice --> Exit[Sair] + Add --> Menu + List --> Menu + Update --> Menu + Remove --> Menu + Find --> Menu + Exit --> Save[Salvar data/contacts.txt] + Save --> End[Finalizar] ``` -## Estrutura de arquivos atual +## Organização de Build +O projeto usa `Makefile` na raiz como atalho para `build/Makefile`. + +```text +src/*.c -> build/obj/*.o +build/obj/*.o -> dist/contactmanager ``` -ContactManager/ -├─ README.md -├─ LICENSE -├─ docs/ -├─ include/ -│ ├─ contact.h -│ └─ storage.h -└─ src/ - ├─ main.c - ├─ contact.c - └─ storage.c -``` -## Observações sobre o estado atual +O binário debug é gerado em `dist/contactmanager-debug`. + +## Limites Atuais + +- O sistema salva no arquivo apenas ao sair. +- A busca atual usa o número exibido na lista, não busca textual. +- O formato CSV é simples e não faz escaping de vírgulas. +- Entradas com espaços não são suportadas no fluxo atual de leitura. -- `src/contact.c` contém funções de cadastro e listagem em memória. -- `src/storage.c` grava e lê contatos em arquivo local. -- `src/main.c` possui menu básico com opções de adicionar, listar e sair. -- O arquivo de persistência esperado é `data/contacts.txt`. -- Busca e remoção ainda não estão conectadas ao menu e seguem como evolução imediata. -- A arquitetura futura prevê migração para PostgreSQL, adoção de Python em scripts de manutenção e a criação de uma interface gráfica. +## Evoluções Possíveis -## Referência -- Veja também `docs/modelos-de-dados.md` para o formato do contato e do armazenamento. -- O histórico de desenvolvimento está em `diario/diario.md`. +- Extrair a interface de menu para um módulo próprio. +- Salvar automaticamente após operações de escrita. +- Criar parser CSV mais robusto. +- Introduzir testes automatizados para os fluxos interativos. +- Adicionar uma camada futura de repositório caso o armazenamento deixe de ser arquivo local. diff --git a/docs/build.md b/docs/build.md new file mode 100644 index 0000000..8575d6c --- /dev/null +++ b/docs/build.md @@ -0,0 +1,76 @@ +# Build e Execução + +Este guia documenta o fluxo oficial de compilação, execução, teste e instalação do ContactManager. + +## Estrutura de Build + +```text +. +├── Makefile # Atalhos da raiz +├── build/ +│ ├── Makefile # Regras principais de compilação +│ ├── config.mk # Variáveis de build +│ └── obj/ # Objetos gerados em tempo de build +├── dist/ # Binários gerados +├── scripts/ +│ └── build.sh # Interface shell para os targets +├── src/ # Código fonte +└── include/ # Cabeçalhos públicos do projeto +``` + +`build/obj/` e `dist/` são gerados automaticamente e não devem ser versionados. + +## Comandos Principais + +```bash +make help +make build +make debug +make run +make test +make clean +``` + +Os mesmos comandos podem ser executados pelo script: + +```bash +./scripts/build.sh build +./scripts/build.sh debug +./scripts/build.sh run +./scripts/build.sh test +``` + +## Saídas Geradas + +| Comando | Saída | +|---------|-------| +| `make build` | `dist/contactmanager` | +| `make debug` | `dist/contactmanager-debug` | +| `make test` | compila e executa um teste básico de encerramento | +| `make clean` | remove `build/obj/` e `dist/` | + +## Variáveis + +| Variável | Padrão | Uso | +|----------|--------|-----| +| `CC` | `gcc` | Compilador C | +| `OBJ_DIR` | `build/obj` | Diretório de objetos | +| `BIN_DIR` | `dist` | Diretório de binários | +| `INSTALL_DIR` | `/usr/local/bin` | Destino do `make install` | +| `VERBOSE` | `0` | Saída detalhada quando suportada | + +Exemplo: + +```bash +CC=clang make build +BIN_DIR=/tmp/contactmanager make build +``` + +## Instalação + +```bash +make install +make uninstall +``` + +Por padrão, a instalação copia `dist/contactmanager` para `/usr/local/bin/contactmanager`. diff --git a/docs/casos-de-uso.md b/docs/casos-de-uso.md index d1ab7f0..f6f7f32 100644 --- a/docs/casos-de-uso.md +++ b/docs/casos-de-uso.md @@ -1,71 +1,108 @@ # Casos de Uso -## Descrição geral -Este documento descreve os casos de uso do sistema ContactManager e a interação do usuário com as funcionalidades implementadas e planejadas. +Este documento descreve as interações principais entre o usuário do terminal e o ContactManager. + +## Ator Principal + +| Ator | Descrição | +|------|-----------| +| Usuário | Pessoa que executa o programa no terminal para gerenciar contatos locais | + +## Visão Geral -## Caso de Uso Principal ```mermaid flowchart TB - actor[Usuário] - subgraph Sistema ContactManager - A[Adicionar contato] - B[Listar contatos] - C[Buscar contato] - D[Remover contato] - E[Salvar dados em arquivo] - F[Carregar dados ao iniciar] - G[Sair do programa] - end - - actor --> A - actor --> B - actor --> C - actor --> D - actor --> E - actor --> F - actor --> G + User[Usuário] + Add[Adicionar contato] + List[Listar contatos] + Update[Atualizar contato] + Remove[Remover contato] + Find[Buscar por número] + Exit[Sair e salvar] + Load[Carregar dados ao iniciar] + + User --> Add + User --> List + User --> Update + User --> Remove + User --> Find + User --> Exit + Load --> User ``` -## Casos de Uso Detalhados +## UC-01 - Adicionar Contato + +Estado: implementado. + +Fluxo: +1. O usuário seleciona a opção `1`. +2. O sistema solicita nome. +3. O sistema solicita telefone. +4. O sistema solicita email. +5. O sistema adiciona o contato em memória. +6. O sistema retorna ao menu. + +Observação: o contato será gravado em arquivo quando o usuário sair pela opção `6`. + +## UC-02 - Listar Contatos + +Estado: implementado. + +Fluxo: +1. O usuário seleciona a opção `2`. +2. O sistema exibe todos os contatos em memória. +3. Cada contato recebe um número de exibição. +4. O sistema retorna ao menu. + +## UC-03 - Atualizar Contato -### Caso de Uso: Adicionar contato Estado: implementado. -- O usuário seleciona a opção de adicionar contato. -- O sistema solicita nome e telefone. -- O sistema armazena o contato em memória. -- O sistema retorna ao menu principal. +Fluxo: +1. O usuário seleciona a opção `3`. +2. O sistema solicita o número do contato. +3. O sistema valida se o número existe. +4. O sistema solicita novo nome, telefone e email. +5. O sistema atualiza o contato em memória. +6. O sistema retorna ao menu. + +## UC-04 - Remover Contato -### Caso de Uso: Listar contatos Estado: implementado. -- O usuário seleciona a opção de listar contatos. -- O sistema exibe todos os contatos presentes em memória. -- O sistema retorna ao menu principal. +Fluxo: +1. O usuário seleciona a opção `4`. +2. O sistema solicita o número do contato. +3. O sistema valida se o número existe. +4. O sistema remove o contato em memória. +5. O sistema reorganiza a lista. +6. O sistema retorna ao menu. -### Caso de Uso: Buscar contato -Estado: planejado. +## UC-05 - Buscar por Número -- O usuário seleciona a opção de buscar contato. -- O sistema solicita o termo de busca. -- O sistema exibe os contatos cujo nome ou telefone contenham o termo. -- O sistema retorna ao menu principal. +Estado: implementado. -### Caso de Uso: Remover contato -Estado: planejado. +Fluxo: +1. O usuário seleciona a opção `5`. +2. O sistema solicita o número do contato. +3. O sistema exibe o contato correspondente ou informa que não encontrou. +4. O sistema retorna ao menu. -- O usuário seleciona a opção de remover contato. -- O sistema solicita o nome ou o índice do contato. -- O sistema remove o contato correspondente da memória. -- O sistema atualiza o arquivo de dados e retorna ao menu. +## UC-06 - Sair e Salvar -### Caso de Uso: Persistência de dados Estado: implementado. -- O sistema carrega contatos do arquivo ao iniciar. -- O sistema salva contatos no arquivo antes de encerrar. +Fluxo: +1. O usuário seleciona a opção `6`. +2. O sistema cria `data/` se necessário. +3. O sistema grava `data/contacts.txt`. +4. O sistema encerra. + +## Casos Planejados -## Notas -- O ator principal é o usuário do terminal. -- O sistema deve ser simples e responder via CLI. -- Por agora, o foco é validar as operações básicas e estabelecer a arquitetura de persistência. +| ID | Caso | Estado | +|----|------|--------| +| UC-07 | Buscar por nome, telefone ou email | Planejado | +| UC-08 | Importar contatos | Planejado | +| UC-09 | Exportar contatos | Planejado | +| UC-10 | Validar campos com regras mais completas | Planejado | diff --git a/docs/diagramas/README.md b/docs/diagramas/README.md index 5403b9f..5ed90b0 100644 --- a/docs/diagramas/README.md +++ b/docs/diagramas/README.md @@ -1,6 +1,6 @@ # Diagramas - ContactManager -Esta pasta contém os diagramas SVG do projeto ContactManager, gerados a partir dos documentos de planejamento. +Esta pasta contém os diagramas SVG do projeto ContactManager. Eles servem como apoio visual para os documentos técnicos em `docs/`. ## Diagramas Disponíveis @@ -24,11 +24,16 @@ Esta pasta contém os diagramas SVG do projeto ContactManager, gerados a partir - **Descrição**: Fluxograma detalhado do processo de inicialização e operação do sistema - **Referência**: [docs/fluxos.md](../fluxos.md) -### 5. Modelo de Dados (ER) +### 5. Modelo de Dados - **Arquivo**: `modelo-dados.svg` -- **Descrição**: Diagrama de modelo de dados do projeto ContactManager +- **Descrição**: Diagrama do modelo atual em memória e do arquivo CSV - **Referência**: [docs/modelos-de-dados.md](../modelos-de-dados.md) +### 6. MVP Atual +- **Arquivo**: `mvp-projeto-final.svg` +- **Descrição**: Visão resumida do estado atual do MVP e próximas evoluções +- **Referência**: [README.md](../../README.md) + ## Como Usar Os arquivos SVG podem ser: @@ -39,18 +44,18 @@ Os arquivos SVG podem ser: ## Regeneração dos Diagramas -Para regenerar os diagramas a partir dos arquivos Mermaid na documentação, use: +Para regenerar diagramas a partir dos blocos Mermaid na documentação, use uma ferramenta compatível com Mermaid. Exemplo: ```bash # Instalar mermaid-cli (se não estiver instalado) npm install -g @mermaid-js/mermaid-cli -# Gerar todos os diagramas -mmdc -i docs/fluxos.md -o diagramas/ +# Gerar um diagrama a partir de um arquivo Mermaid separado +mmdc -i fluxo.mmd -o docs/diagramas/fluxo.svg ``` ## Notas -- Todos os diagramas foram criados em formato SVG para melhor qualidade e escalabilidade -- Os diagramas refletem o planejamento técnico do projeto ContactManager -- Para atualizações, consulte os arquivos Markdown na pasta `docs/` +- Todos os diagramas foram criados em formato SVG para melhor qualidade e escalabilidade. +- Os diagramas devem acompanhar o estado documentado nos arquivos Markdown. +- Quando um fluxo mudar no código, atualize primeiro o Markdown correspondente e depois o SVG. diff --git a/docs/diagramas/casos-de-uso.svg b/docs/diagramas/casos-de-uso.svg index 8ac54fa..5db91ed 100644 --- a/docs/diagramas/casos-de-uso.svg +++ b/docs/diagramas/casos-de-uso.svg @@ -1,53 +1,54 @@ - + - - - - - Usuário - - - - ContactManager - - - - Adicionar - - - Listar - - - Buscar - - - Remover - - - Salvar - - - Carregar - - - - - - - - - - - + + + + + + + Usuario + + + ContactManager + + + Adicionar + + + Listar + + + Atualizar + + + Remover + + + Buscar numero + + + Carregar dados + + + Sair e salvar + + + + + + + + diff --git a/docs/diagramas/fluxo-inicializacao.svg b/docs/diagramas/fluxo-inicializacao.svg index 79f383d..0b57eea 100644 --- a/docs/diagramas/fluxo-inicializacao.svg +++ b/docs/diagramas/fluxo-inicializacao.svg @@ -1,88 +1,67 @@ - + - - - - Início - - - - - - - Carregar dados do arquivo - - - - - - - Exibir menu principal - - - - - - - Escolher ação - - - - - - Adicionar - - - - - - Listar - - - - - - Buscar - - - - - - Remover - - - - - - - Salvar dados - - - - - Sair? - - - - Não - - - - Sim - - - - Fim + + + Inicio + + + + Inicializar configuracao + + + + Carregar data/contacts.txt + + + + Exibir menu principal + + + + Opcao? + + + Adicionar + + + + Listar + + + + Atualizar + + + + Remover + + + + Buscar + + + + + + + + + + Salvar e sair + + + + Fim diff --git a/docs/diagramas/modelo-dados.svg b/docs/diagramas/modelo-dados.svg index 2fe496b..0231597 100644 --- a/docs/diagramas/modelo-dados.svg +++ b/docs/diagramas/modelo-dados.svg @@ -1,92 +1,44 @@ - + + + + - - - - - USUARIO - - - - id (PK) - nome (UK) - email (UK) - data_criacao - TIMESTAMP - - - - - CONTATO - - - - id (PK) - usuario_id (FK) - nome - sobrenome - categoria - data_criacao - data_atualizacao - - - - - TELEFONE - - - - id (PK) - contato_id (FK) - numero (UK) - tipo - VARCHAR(20) - - - - - EMAIL - - - - id (PK) - contato_id (FK) - endereco (UK) - tipo - VARCHAR(20) - - - - - 1 - M - tem - - - - 1 - M - possui - - - - 1 - M - possui - - - Legenda: - PK = Primary Key (Chave Primária) - FK = Foreign Key (Chave Estrangeira) - UK = Unique Key (Chave Única) - 1 = Um / M = Muitos + + + Modelo de dados atual + ContactManager usa um vetor em memoria e persistencia CSV simples. + + + + Contact + name: char[100] + phone: char[20] + email: char[100] + Quantidade maxima: 1000 + + + data/contacts.txt + nome,telefone,email + Uma linha por contato + + + saveContacts() + + loadContacts() + + + Limitacoes: sem ID persistente, sem escape de virgulas e leitura atual sem campos com espacos. diff --git a/docs/diagramas/mvp-projeto-final.svg b/docs/diagramas/mvp-projeto-final.svg index e2d7c70..c2394c9 100644 --- a/docs/diagramas/mvp-projeto-final.svg +++ b/docs/diagramas/mvp-projeto-final.svg @@ -16,42 +16,43 @@ + MVP atual - ContactManager - Visão do CLI básico implementado e das próximas funcionalidades planejadas + CLI local em C com CRUD por numero exibido, CSV simples e build organizado Interface CLI Implementado - Menu numerico - - Adicionar contato - - Listar contatos - - Sair salvando dados + - Adicionar e listar + - Atualizar e remover + - Buscar por numero - Lógica de Contatos + Logica de Contatos Implementado - - Estrutura Contact - - addContact() - - listContacts() - - Limite de 100 contatos + - Contact: nome, telefone, email + - add/list/find/update/remove + - Limite de 1000 contatos + - Configuracao centralizada - Persistência Local + Persistencia Local Implementado - saveContacts() - loadContacts() - - Arquivo data/contacts.txt - - Cria data/ ao salvar + - data/contacts.txt + - CSV: nome,telefone,email - Proximas evolucoes do MVP + Proximas evolucoes Planejado - Buscar contatos, remover contatos e melhorar validacao de entradas + Busca textual, validacao robusta, testes automatizados e CSV seguro diff --git a/docs/diagramas/uml-classes.svg b/docs/diagramas/uml-classes.svg index 76e0149..9597e5a 100644 --- a/docs/diagramas/uml-classes.svg +++ b/docs/diagramas/uml-classes.svg @@ -1,80 +1,71 @@ - + - + - - - - - - - - ContactManager - - +main() - - - - - Menu - - +mostrarMenu() - +receberOpcao() - +executarOpcao() - - - - - Agenda - - +adicionarContato() - +listarContatos() - +buscarContato() - +removerContato() - - - - - Persistencia - - +salvarContatos() - +carregarContatos() - - - - - Contato - - -nome: string - -telefone: string - -email: string - - +toString() - - - - - - - - - - - - - - - - + + + + Main + + +main() + +menu loop + +dispatch option + + + + ContactModule + + +addContact() + +listContacts() + +findContact() + +updateContact() + +removeContact() + + + + StorageModule + + +saveContacts() + +loadContacts() + + + + Config + + +initConfig() + +getDatabaseFile() + + + + Contact + + +name: char[100] + +phone: char[20] + +email: char[100] + + max: 1000 records + + + + ErrorModule + + +getErrorMessage() + + + + + + + diff --git a/docs/fluxos.md b/docs/fluxos.md index 3ee1e3a..28f0119 100644 --- a/docs/fluxos.md +++ b/docs/fluxos.md @@ -1,62 +1,109 @@ # Fluxos do Sistema -Este documento descreve os principais fluxos de interação do usuário e do sistema no ContactManager. +Este documento descreve os principais fluxos operacionais do ContactManager. + +## Fluxo Principal -## Fluxo de Inicialização ```mermaid flowchart TD - Start[Início do programa] --> Load[Carregar dados do arquivo] - Load --> Menu[Exibir menu principal] - Menu --> Choice{Escolher ação} - Choice -- Adicionar contato --> Add[Adicionar novo contato] - Choice -- Listar contatos --> List[Listar contatos existentes] - Choice -- Buscar contato --> Search[Buscar contato] - Choice -- Remover contato --> Remove[Remover contato] - Choice -- Sair --> Save[Salvar dados e encerrar] + Start[Início] --> Init[Inicializar configuração] + Init --> Load[Carregar contatos do arquivo] + Load --> Menu[Mostrar menu] + Menu --> Choice{Escolha do usuário} + Choice -- 1 --> Add[Adicionar contato] + Choice -- 2 --> List[Listar contatos] + Choice -- 3 --> Update[Atualizar contato] + Choice -- 4 --> Remove[Remover contato] + Choice -- 5 --> Find[Buscar por número] + Choice -- 6 --> Save[Salvar contatos] + Choice -- Inválida --> Invalid[Mostrar opção inválida] Add --> Menu List --> Menu - Search --> Menu + Update --> Menu Remove --> Menu + Find --> Menu + Invalid --> Menu Save --> End[Fim] ``` -## Fluxo de Adicionar Contato +## Fluxo de Adição + +```mermaid +flowchart TD + Start[Selecionar opção 1] --> Limit{Limite atingido?} + Limit -- Sim --> Error[Informar limite de contatos] + Limit -- Não --> Name[Solicitar nome] + Name --> Phone[Solicitar telefone] + Phone --> Email[Solicitar email] + Email --> Store[Adicionar ao vetor em memória] + Store --> Menu[Voltar ao menu] + Error --> Menu +``` + +## Fluxo de Listagem + ```mermaid flowchart TD - Start[Seleciona "Adicionar contato"] --> Input[Solicitar dados do contato] - Input --> Validate[Validar entrada] - Validate -- Válido --> Save[Salvar contato na memória] - Save --> Persist[Atualizar arquivo de dados] - Persist --> Confirm[Mostrar mensagem de sucesso] - Confirm --> Menu[Retornar ao menu] - Validate -- Inválido --> Error[Mostrar mensagem de erro] - Error --> Input + Start[Selecionar opção 2] --> Empty{Lista vazia?} + Empty -- Sim --> None[Mostrar nenhum contato encontrado] + Empty -- Não --> Print[Exibir contatos numerados] + None --> Menu[Voltar ao menu] + Print --> Menu ``` -## Fluxo de Buscar Contato +## Fluxo de Atualização + ```mermaid flowchart TD - Start[Seleciona "Buscar contato"] --> Query[Solicitar termo de busca] - Query --> Search[Pesquisar contatos] - Search --> Found{Contato encontrado?} - Found -- Sim --> Show[Exibir contato(s)] - Found -- Não --> None[Mostrar "nenhum resultado"] - Show --> Menu[Retornar ao menu] - None --> Menu + Start[Selecionar opção 3] --> Empty{Lista vazia?} + Empty -- Sim --> NoContacts[Informar ausência de contatos] + Empty -- Não --> Ask[Solicitar número do contato] + Ask --> Found{Número válido?} + Found -- Não --> NotFound[Informar contato não encontrado] + Found -- Sim --> Name[Solicitar novo nome] + Name --> Phone[Solicitar novo telefone] + Phone --> Email[Solicitar novo email] + Email --> Update[Atualizar em memória] + Update --> Menu[Voltar ao menu] + NoContacts --> Menu + NotFound --> Menu ``` -## Fluxo de Remover Contato +## Fluxo de Remoção + +```mermaid +flowchart TD + Start[Selecionar opção 4] --> Empty{Lista vazia?} + Empty -- Sim --> NoContacts[Informar ausência de contatos] + Empty -- Não --> Ask[Solicitar número do contato] + Ask --> Found{Número válido?} + Found -- Não --> NotFound[Informar contato não encontrado] + Found -- Sim --> Shift[Remover e reorganizar vetor] + Shift --> Success[Informar sucesso] + Success --> Menu[Voltar ao menu] + NoContacts --> Menu + NotFound --> Menu +``` + +## Fluxo de Busca por Número + +```mermaid +flowchart TD + Start[Selecionar opção 5] --> Ask[Solicitar número] + Ask --> Found{Número válido?} + Found -- Sim --> Show[Exibir contato] + Found -- Não --> NotFound[Informar contato não encontrado] + Show --> Menu[Voltar ao menu] + NotFound --> Menu +``` + +## Fluxo de Persistência + ```mermaid flowchart TD - Start[Seleciona "Remover contato"] --> Query[Solicitar nome ou ID] - Query --> Search[Localizar contato] - Search --> Found{Contato encontrado?} - Found -- Sim --> Confirm[Confirmar remoção] - Confirm -- Sim --> Delete[Remover contato da memória] - Delete --> Persist[Atualizar arquivo de dados] - Persist --> Success[Mostrar confirmação] - Success --> Menu[Retornar ao menu] - Confirm -- Não --> Menu - Found -- Não --> None[Mostrar "contato não encontrado"] - None --> Menu + Exit[Selecionar opção 6] --> Dir[Criar data/ se necessário] + Dir --> Open[Abrir data/contacts.txt] + Open --> Write[Gravar nome, telefone e email] + Write --> Close[Fechar arquivo] + Close --> End[Encerrar] ``` diff --git a/docs/modelos-de-dados.md b/docs/modelos-de-dados.md index 95a8e35..7a55749 100644 --- a/docs/modelos-de-dados.md +++ b/docs/modelos-de-dados.md @@ -1,58 +1,94 @@ # Modelo de Dados -Este documento descreve o modelo de dados atual do ContactManager em C. +Este documento descreve o modelo de dados atual do ContactManager. -## Estrutura de Contato +## Struct `Contact` -A estrutura utilizada em `include/contact.h` é: +A estrutura principal está definida em `include/contact.h`: ```c -#define MAX_NAME 100 -#define MAX_PHONE 20 - typedef struct { - char name[MAX_NAME]; - char phone[MAX_PHONE]; + char name[MAX_NAME]; + char phone[MAX_PHONE]; + char email[MAX_EMAIL]; } Contact; ``` -### Campos -- `name` — nome do contato, até 99 caracteres. -- `phone` — telefone do contato, até 19 caracteres. +Os limites vêm de `include/config.h`: + +```c +#define MAX_CONTACTS 1000 +#define MAX_NAME_LENGTH 100 +#define MAX_PHONE_LENGTH 20 +#define MAX_EMAIL_LENGTH 100 +``` + +## Campos -## Armazenamento em memória +| Campo | Descrição | Limite prático | +|-------|-----------|----------------| +| `name` | Nome do contato | até 99 caracteres úteis | +| `phone` | Telefone do contato | até 19 caracteres úteis | +| `email` | Email do contato | até 99 caracteres úteis | -Os contatos são mantidos em um vetor de `Contact` em memória durante a execução do programa. +Os limites úteis deixam espaço para o caractere nulo final das strings em C. -## Formato de persistência +## Armazenamento em Memória -O arquivo de dados esperado é `data/contacts.txt`. Cada contato deve estar em uma linha no formato: +Durante a execução, os contatos ficam em um vetor local: +```c +Contact contacts[MAX_CONTACTS]; ``` -nome,telefone -``` + +O contador `count` controla quantos registros estão ocupados. + +## Identificação dos Contatos + +A versão atual não possui campo `id` persistido. O usuário seleciona contatos pelo número exibido na listagem, que corresponde à posição do contato no vetor em base 1. Exemplo: +```text +Contato 1: +Nome: Ana | Telefone: 11999999999 | Email: ana@example.com +``` + +Nesse caso, o número `1` pode ser usado para buscar, atualizar ou remover o contato durante a execução atual. + +## Persistência + +O arquivo de dados atual é: + +```text +data/contacts.txt +``` + +Cada linha usa CSV simples: + +```text +nome,telefone,email ``` -João,11999999999 -Maria,21988887777 + +Exemplo: + +```text +Ana,11999999999,ana@example.com +Bruno,21988887777,bruno@example.com ``` -## Limitações atuais -- O modelo atual não inclui campos de e-mail, ID ou categorias. -- A persistência atual usa um formato simples separado por vírgula e ainda não trata vírgulas dentro dos campos. -- Caso o diretório `data/` não exista, a aplicação cria o diretório antes de salvar os dados. -- O carregamento atual assume que cada linha válida possui nome e telefone no formato `nome,telefone`. - -## Possíveis extensões futuras -- adicionar campo `email` -- adicionar campo `id` único para cada contato -- suportar múltiplos telefones por contato -- usar formato CSV mais robusto ou JSON - -## Evolução planejada -- Migrar a persistência atual de arquivo local para um backend PostgreSQL com tabela `contacts`. -- Definir um esquema relacional com campos como `id`, `name`, `phone`, `email` e timestamps de alteração. -- Usar Python para criar scripts de migração e importação/exportação de dados entre o formato local e o banco de dados. -- Suportar a interface gráfica para apresentar contatos e operações em vez de depender exclusivamente do CLI. +## Limitações + +- O CSV atual não escapa vírgulas dentro dos campos. +- O carregamento espera três campos por linha. +- Não há ID persistente. +- Não há timestamps de criação ou atualização. +- O fluxo atual lê campos sem espaços. + +## Evoluções Possíveis + +- Adicionar ID persistente. +- Salvar automaticamente após adicionar, atualizar ou remover. +- Usar parser CSV dedicado. +- Permitir nomes com espaços. +- Adicionar campos opcionais, como endereço, categoria ou observações. diff --git a/docs/product-backlog.md b/docs/product-backlog.md index 19a427f..48532db 100644 --- a/docs/product-backlog.md +++ b/docs/product-backlog.md @@ -1,78 +1,73 @@ -# Product Backlog Inicial - -Este documento contém os itens principais a serem desenvolvidos para o projeto ContactManager. - -## Épicos e Itens - -### 1. Gerenciamento de Contatos -- **PB-001**: Como usuário, quero adicionar um contato para armazenar informações pessoais. -- **PB-002**: Como usuário, quero listar todos os contatos salvos para visualizar meu catálogo. -- **PB-003**: Como usuário, quero buscar contatos por nome ou telefone para encontrar um registro rapidamente. -- **PB-004**: Como usuário, quero remover um contato para manter a lista atualizada. - -### 2. Persistência de Dados -- **PB-005**: Como usuário, quero salvar contatos em arquivo para manter os dados entre execuções. -- **PB-006**: Como usuário, quero carregar contatos do arquivo ao iniciar o programa para retomar meu catálogo. - -### 3. Interface de Terminal -- **PB-007**: Como usuário, quero um menu interativo no terminal para executar ações de forma clara. -- **PB-008**: Como usuário, quero mensagens de sucesso e erro para entender o resultado das operações. - -### 4. Documentação e Qualidade -- **PB-009**: Como desenvolvedor, quero documentação de requisitos e arquitetura para orientar o desenvolvimento. -- **PB-010**: Como desenvolvedor, quero testes básicos para validar as funcionalidades principais. - -## Prioridade Inicial -1. PB-003: Buscar contatos -2. PB-004: Remover contatos -3. PB-008: Melhorar mensagens e validação de entrada -4. PB-010: Ampliar testes básicos -5. PB-009: Manter documentação atualizada -6. PB-005: Evoluir persistência em arquivo -7. PB-006: Evoluir carregamento de dados -8. PB-007: Evoluir menu de terminal -9. PB-001: Adicionar contato -10. PB-002: Listar contatos - -## Status dos itens - -| ID | Estado | Observação | -|--------|---------------|------------| -| PB-001 | Implementado | Adição disponível no menu atual | -| PB-002 | Implementado | Listagem disponível no menu atual | -| PB-003 | Pendente | Ainda sem opção no menu | -| PB-004 | Pendente | Ainda sem opção no menu | -| PB-005 | Implementado | Salvamento em `data/contacts.txt` ao sair | -| PB-006 | Implementado | Carregamento em `data/contacts.txt` ao iniciar | -| PB-007 | Parcial | Menu possui adicionar, listar e sair | -| PB-008 | Parcial | Existem mensagens básicas; validações ainda são simples | -| PB-009 | Em andamento | Documentação atualizada conforme evolução | -| PB-010 | Em andamento | Testes manuais registrados em `tests/` | - -## Notas -- Este backlog inicial serve de base para o planejamento das próximas sprints. -- Os itens podem ser refinados e divididos à medida que o projeto avança. - -## Planejamento de sprints - -### Sprint 1 — 09/06/2026 a 16/06/2026 -- **Meta:** estabilizar a versão CLI completa e a persistência local. -- **Itens principais:** PB-001, PB-002, PB-005, PB-006, PB-003. -- **Critérios de aceitação:** o sistema adiciona, lista, carrega e salva contatos localmente; busca e remoção ficam registradas como próximos itens caso não sejam concluídas na sprint. - -### Sprint 2 — 17/06/2026 a 23/06/2026 -- **Meta:** introduzir PostgreSQL como backend e automação com Python. -- **Itens principais:** PB-005 (evolução), PB-006 (evolução), PB-009. -- **Critérios de aceitação:** existe script de migração Python; o banco PostgreSQL armazena e recupera contatos. - -### Sprint 3 — 24/06/2026 a 30/06/2026 -- **Meta:** criar a primeira interface gráfica do projeto. -- **Itens principais:** PB-007, PB-008, PB-009. -- **Critérios de aceitação:** protótipo de UI está funcional para as operações básicas; a experiência é mais intuitiva que o CLI. - -## Aceites -- Cada item do backlog deve ser entregável, testável e documentado. -- O prazo de cada sprint deve ser respeitado sempre que possível, com revisão diária de progresso no diário. -- A documentação deve refletir claramente as mudanças na arquitetura e a evolução do backend. - - +# Product Backlog + +Este backlog organiza os próximos passos do ContactManager a partir do estado atual do CLI. + +## Itens + +| ID | Item | Estado | Prioridade | +|----|------|--------|------------| +| PB-001 | Adicionar contato | Implementado | Alta | +| PB-002 | Listar contatos | Implementado | Alta | +| PB-003 | Buscar contato por número exibido | Implementado | Alta | +| PB-004 | Atualizar contato | Implementado | Alta | +| PB-005 | Remover contato | Implementado | Alta | +| PB-006 | Carregar contatos ao iniciar | Implementado | Alta | +| PB-007 | Salvar contatos ao sair | Implementado | Alta | +| PB-008 | Organizar build em `build/obj/` e `dist/` | Implementado | Alta | +| PB-009 | Documentação técnica revisada | Implementado | Alta | +| PB-010 | Registrar testes de busca, atualização e remoção | Pendente | Alta | +| PB-011 | Automatizar testes de CRUD | Pendente | Alta | +| PB-012 | Melhorar validação de entrada | Pendente | Alta | +| PB-013 | Permitir campos com espaços | Pendente | Média | +| PB-014 | Melhorar parser CSV | Pendente | Média | +| PB-015 | Salvar automaticamente após alterações | Pendente | Média | +| PB-016 | Busca textual por nome, telefone ou email | Pendente | Média | +| PB-017 | Importação/exportação | Pendente | Baixa | +| PB-018 | Avaliar backend alternativo | Futuro | Baixa | +| PB-019 | Avaliar interface gráfica | Futuro | Baixa | + +## Prioridade Atual + +1. PB-010: registrar testes manuais para os fluxos implementados. +2. PB-011: automatizar cenários de CRUD. +3. PB-012: melhorar validação de entrada. +4. PB-013: permitir campos com espaços. +5. PB-014: robustecer o formato de persistência. +6. PB-016: implementar busca textual. + +## Planejamento Sugerido + +### Sprint 1 - Estabilização do CLI + +Meta: garantir que o CRUD atual esteja bem testado e documentado. + +Entregáveis: +- casos de teste para busca por número, atualização e remoção; +- teste automatizado com entrada simulada; +- revisão de mensagens de erro; +- documentação de resultados atualizada. + +### Sprint 2 - Qualidade de Entrada e Persistência + +Meta: reduzir limitações do fluxo atual. + +Entregáveis: +- leitura de nomes com espaços; +- validação de telefone e email; +- parser CSV mais seguro; +- decisão sobre salvamento imediato após alterações. + +### Sprint 3 - Evoluções Funcionais + +Meta: ampliar recursos sem quebrar o CLI atual. + +Entregáveis: +- busca por nome, telefone ou email; +- importação/exportação; +- avaliação técnica de backend ou interface futura. + +## Critérios de Priorização + +- Primeiro estabilizar o que já existe. +- Depois ampliar testes e validação. +- Só então introduzir mudanças maiores de arquitetura ou interface. diff --git a/docs/requisitos.md b/docs/requisitos.md index bc7a53c..4e71e3b 100644 --- a/docs/requisitos.md +++ b/docs/requisitos.md @@ -1,91 +1,79 @@ -# ContactManager - Requisitos do Sistema +# Requisitos do Sistema ## Introdução -ContactManager é um sistema de terminal para gerenciamento local de contatos. O objetivo é fornecer operações básicas de cadastro, listagem e persistência em arquivo, evoluindo depois para consulta e remoção. +ContactManager é uma aplicação CLI em C para gerenciamento local de contatos. A versão atual mantém os contatos em memória durante a execução e persiste os dados em arquivo CSV simples ao encerrar. -## Escopo +## Escopo Atual -O sistema opera localmente e não depende de rede ou banco de dados externo na fase inicial. - -> Os dados são armazenados em arquivo local na fase atual. Há um plano de evolução para adotar PostgreSQL como backend e oferecer automação com Python e interface gráfica. +O sistema deve operar localmente, sem rede e sem banco de dados externo. A experiência principal é um menu de terminal com operações de CRUD sobre contatos. ## Requisitos Funcionais -| ID | Nome | Descrição | Prioridade | Caso de Uso | -|-------|-------------------|--------------------------------------|------------|-------------| -| RF-01 | Adicionar contato | Cadastrar novo contato em memória | Alta | UC-1 | -| RF-02 | Listar contatos | Exibir contatos cadastrados | Alta | UC-2 | -| RF-03 | Buscar contatos | Buscar contatos por nome ou telefone | Alta | UC-3 | -| RF-04 | Remover contato | Excluir contato existente | Alta | UC-4 | -| RF-05 | Salvar dados | Persistir contatos em arquivo | Alta | UC-5 | -| RF-06 | Carregar dados | Ler contatos ao iniciar o sistema | Alta | UC-6 | -| RF-07 | Encerrar | Finalizar o programa de forma limpa | Alta | UC-7 | - -## Estado dos Requisitos Funcionais - -| ID | Estado | Observação | -|-------|---------------|------------| -| RF-01 | Implementado | Disponível na opção 1 do menu | -| RF-02 | Implementado | Disponível na opção 2 do menu | -| RF-03 | Planejado | Declarado no cabeçalho, mas ainda sem implementação no menu | -| RF-04 | Planejado | Declarado no cabeçalho, mas ainda sem implementação no menu | -| RF-05 | Implementado | Executado ao sair do programa | -| RF-06 | Implementado | Executado ao iniciar o programa | -| RF-07 | Implementado | Disponível na opção 3 do menu | +| ID | Nome | Descrição | Estado | +|----|------|-----------|--------| +| RF-01 | Adicionar contato | Cadastrar contato com nome, telefone e email | Implementado | +| RF-02 | Listar contatos | Exibir todos os contatos carregados em memória | Implementado | +| RF-03 | Buscar por número | Buscar contato pelo número exibido na listagem | Implementado | +| RF-04 | Atualizar contato | Editar nome, telefone e email pelo número exibido | Implementado | +| RF-05 | Remover contato | Remover contato pelo número exibido | Implementado | +| RF-06 | Carregar dados | Ler contatos de `data/contacts.txt` ao iniciar | Implementado | +| RF-07 | Salvar dados | Gravar contatos em `data/contacts.txt` ao sair | Implementado | +| RF-08 | Encerrar | Finalizar o programa de forma controlada | Implementado | +| RF-09 | Busca avançada | Buscar por nome, telefone ou email | Planejado | +| RF-10 | Importar/exportar | Mover dados entre formatos externos | Planejado | ## Requisitos Não Funcionais -| ID | Nome | Descrição | -|--------|-----------------|-----------------------------------------------------| -| RNF-01 | Plataforma | Compatível com Linux | -| RNF-02 | Interface | Interface de linha de comando (CLI) | -| RNF-03 | Persistência | Manter dados entre execuções | -| RNF-04 | Simplicidade | Navegação clara por menu numérico | -| RNF-05 | Manutenibilidade| Código organizado e modular | -| RNF-06 | Desempenho | Resposta rápida para operações básicas | -| RNF-07 | Backend | Suportar evolução para PostgreSQL como backend | +| ID | Nome | Descrição | +|----|------|-----------| +| RNF-01 | Plataforma | Executar em ambiente Linux | +| RNF-02 | Interface | Usar interface de linha de comando | +| RNF-03 | Persistência | Manter dados entre execuções usando arquivo local | +| RNF-04 | Simplicidade | Oferecer menu numérico claro | +| RNF-05 | Manutenibilidade | Separar código em módulos pequenos e coesos | +| RNF-06 | Portabilidade | Usar C padrão e dependências mínimas | +| RNF-07 | Rastreabilidade | Manter documentação, testes e histórico atualizados | ## Requisitos de Engenharia -| ID | Nome | Descrição | -|-------|-------------------------------|------------------------------------------------------------------| -| RE-01 | Modularização | Cada funcionalidade deve estar em módulo separado | -| RE-02 | Separação de responsabilidades| Interface, lógica de negócio e persistência devem ser desacopladas| -| RE-03 | Tratamento de erros | Entradas e falhas devem ser validadas | -| RE-04 | Uso de constantes | Limites e tamanhos devem usar constantes simbólicas | -| RE-05 | Estruturas de dados | Contatos devem ser representados por `struct` | -| RE-06 | Organização de projeto | Código, documentação e dados devem permanecer separados | +| ID | Nome | Descrição | +|----|------|-----------| +| RE-01 | Modularização | Separar fluxo principal, contatos, storage, config e erros | +| RE-02 | Contratos em headers | Expor estruturas e assinaturas em `include/` | +| RE-03 | Build organizado | Gerar objetos em `build/obj/` e binários em `dist/` | +| RE-04 | Configuração centralizada | Manter limites e caminhos em `include/config.h` | +| RE-05 | Documentação alinhada | Atualizar docs quando houver mudança de comportamento | +| RE-06 | Testabilidade | Permitir execução básica via `make test` | ## Restrições -| ID | Nome | Descrição | -|--------|----------------|---------------------------------------------------------| -| RC-01 | Linguagem | Implementar em C | -| RC-02 | Ambiente | Executar em Linux | -| RC-03 | Interface | Usar somente CLI | -| RC-04 | Armazenamento | Persistir em arquivo local na fase atual. Evoluir para PostgreSQL posteriormente | -| RC-05 | Base de dados | Não usar banco de dados externo na fase inicial | -| RC-06 | Rede | Sem comunicação de rede | -| RC-07 | Capacidade | Suportar até 100 contatos | -| RC-08 | Dependências | Usar apenas a biblioteca padrão do C | -| RC-09 | Execução | Operar localmente em uma única máquina | - -## Critérios de aceitação - -O ContactManager será considerado funcional quando: - -* for possível adicionar contatos -* for possível listar contatos -* os dados forem salvos corretamente -* os dados forem carregados corretamente -* o programa encerrar sem perda de informações - -Para o ciclo completo planejado, também será necessário: - -* buscar contatos por nome ou telefone -* remover contatos cadastrados - -## Estado atual - -A implementação atual está em desenvolvimento. O CLI básico já cobre adicionar, listar, carregar e salvar contatos. Busca e remoção permanecem como funcionalidades planejadas. +| ID | Nome | Descrição | +|----|------|-----------| +| RC-01 | Linguagem | Implementar em C | +| RC-02 | Execução | Operar localmente em uma única máquina | +| RC-03 | Armazenamento | Usar arquivo local na versão atual | +| RC-04 | Rede | Não depender de comunicação de rede | +| RC-05 | Capacidade | Suportar até 1000 contatos conforme `MAX_CONTACTS` | +| RC-06 | Formato | Persistir em CSV simples `nome,telefone,email` | +| RC-07 | Entrada | Ler campos sem espaços usando o fluxo atual com `scanf` | + +## Critérios de Aceitação da Versão Atual + +A versão atual é considerada funcional quando: +- compila com `make build`; +- executa com `make run` ou `./dist/contactmanager`; +- adiciona contato com nome, telefone e email; +- lista contatos cadastrados; +- busca, atualiza e remove por número exibido; +- carrega dados existentes ao iniciar; +- salva dados ao sair; +- passa em `make test`. + +## Pendências Reconhecidas + +- A busca por conteúdo ainda não pesquisa nome, telefone ou email. +- A validação de entrada ainda é simples. +- A persistência é gravada ao sair, não após cada operação. +- O CSV atual não trata vírgulas dentro dos campos. +- Ainda não há suíte automatizada completa para todos os fluxos interativos. diff --git a/docs/resultados.md b/docs/resultados.md index 5703c8c..41d15ed 100644 --- a/docs/resultados.md +++ b/docs/resultados.md @@ -1,42 +1,59 @@ # Resultados Concluídos -Este documento lista os resultados concluídos desde o início do projeto ContactManager até o momento atual. - -## 1. Objetivo e escopo definidos -- Projeto planejado como um sistema de gerenciamento de contatos em terminal. -- Escopo definido para operações básicas: adicionar, listar, buscar, remover e persistência local. -- Arquitetura modular definida com separação entre código-fonte (`src/`), cabeçalhos (`include/`) e documentação (`docs/`). - -## 2. Estrutura do projeto organizada -- Diretório `docs/` contém a documentação do projeto. -- Diretório `include/` contém definições de tipos e assinaturas de funções. -- Diretório `src/` contém a implementação em C. -- `README.md` e `docs/README.md` fornecem visão geral e índice da documentação. - -## 3. Implementação atual do núcleo -- `include/contact.h` define a struct `Contact` com campos `name` e `phone`. -- `src/contact.c` implementa a função `addContact` e a função `listContacts`. -- `include/storage.h` prototipa `saveContacts` e `loadContacts`. -- `src/storage.c` implementa salvamento e carregamento em `data/contacts.txt`. -- `src/main.c` possui menu interativo para adicionar contatos, listar contatos e sair salvando os dados. - -## 4. Documentação e acompanhamento -- `diario/diario.md` registra o histórico de desenvolvimento por dia e sequência de entregas. -- `docs/testes.md` apresenta o primeiro caso de teste e o status atual de testes. -- `docs/requisitos.md`, `docs/arquitetura.md` e `docs/modelos-de-dados.md` foram atualizados para refletir a implementação C. -- `docs/README.md` foi criado como índice de documentação. - -## 5. Estado atual do projeto -- Fluxo básico do CLI implementado: carregar, adicionar, listar, salvar e encerrar. -- Persistência local em arquivo implementada com criação do diretório `data/` ao salvar. -- Busca e remoção ainda não estão implementadas no menu nem em `src/contact.c`. -- Validação de entrada ainda é simples e deve ser aprimorada. - -## 6. Próximos resultados esperados -- Implementar busca de contatos por nome ou telefone. -- Implementar remoção de contatos. -- Atualizar o menu principal com opções de busca e remoção. -- Ampliar os testes funcionais para cobrir busca, remoção e persistência após reiniciar o programa. - -## Observação -- A documentação foi reorganizada para oferecer um guia mais claro e alinhado ao estado atual do projeto. +Este documento resume o que já foi entregue no ContactManager e quais pontos continuam em evolução. + +## 1. Estrutura do Projeto + +Concluído: +- separação entre `src/`, `include/`, `docs/`, `tests/`, `scripts/` e `build/`; +- `Makefile` na raiz delegando para `build/Makefile`; +- artefatos de build isolados em `build/obj/` e `dist/`; +- `.gitignore` ajustado para ignorar binários, objetos e dados gerados. + +## 2. Núcleo da Aplicação + +Concluído: +- menu principal em `src/main.c`; +- configuração centralizada em `config.h/c`; +- modelo `Contact` com nome, telefone e email; +- limite de 1000 contatos; +- operações de adicionar, listar, buscar por número, atualizar e remover; +- mensagens básicas para entradas inválidas ou contatos inexistentes. + +## 3. Persistência Local + +Concluído: +- carregamento de `data/contacts.txt` ao iniciar; +- criação de `data/` ao salvar; +- gravação em CSV simples no formato `nome,telefone,email`; +- salvamento ao sair pela opção `6`. + +## 4. Build e Automação + +Concluído: +- `make build` gera `dist/contactmanager`; +- `make debug` gera `dist/contactmanager-debug`; +- `make test` compila e executa validação básica; +- `make clean` remove `build/obj/` e `dist/`; +- `scripts/build.sh` fornece interface auxiliar; +- CI usa o fluxo de Make. + +## 5. Documentação + +Concluído: +- `README.md` atualizado como visão geral; +- `DOCUMENTATION.md` criado como mapa geral; +- `docs/README.md` atualizado como índice técnico; +- requisitos, arquitetura, modelo de dados, casos de uso, fluxos, testes, backlog e UML revisados. + +## Estado Atual + +O projeto possui uma versão CLI funcional para CRUD local simples. O sistema ainda está em desenvolvimento e deve evoluir principalmente em validação de entrada, testes automatizados e robustez de persistência. + +## Próximos Resultados Esperados + +- Registrar testes manuais para busca, atualização e remoção. +- Automatizar cenários de CRUD com entrada simulada. +- Melhorar leitura de campos com espaços. +- Tratar erros de leitura e escrita de forma padronizada. +- Avaliar salvamento automático após operações que alteram dados. diff --git a/docs/testes.md b/docs/testes.md index 247d392..bcacda9 100644 --- a/docs/testes.md +++ b/docs/testes.md @@ -1,30 +1,69 @@ # Testes -## 2026-06-05 - Primeiro caso de teste -Objetivo: validar a funcionalidade de adicionar e listar contatos com a implementação atual. - -Passos: -1. Compilar o projeto e garantir que o código atual tenha pelo menos o fluxo básico funcional. -2. Executar o programa e selecionar a opção de adicionar contato. -3. Inserir um nome simples, por exemplo: `João`. -4. Inserir um telefone simples, por exemplo: `11999999999`. -5. Selecionar a opção de listar contatos. - -Resultado esperado: -- O contato `João` deve aparecer na listagem com o telefone `11999999999`. -- A aplicação não deve travar ou apresentar erro de execução ao listar contatos. - -Observações: -- Essa validação inicial foca em `src/contact.c`, `src/main.c` e no fluxo básico de interação por terminal. -- A persistência em arquivo deve ser validada observando a criação ou atualização de `data/contacts.txt`. - -## Situação atual de testes -- O fluxo de adicionar, listar, salvar e carregar contatos já pode ser testado manualmente. -- Existe registro de teste funcional em `tests/2026-06-09-add-list-persist.md`. -- Um próximo caso de teste deve incluir busca e remoção assim que essas funções forem implementadas. -- A recarga dos dados após reiniciar o programa deve continuar sendo validada em testes de regressão. - -## Histórico de testes executados -- Os casos de teste registrados são armazenados em `tests/`. -- Cada arquivo contém data, objetivo, comando, saída, erros e status. -- Exemplo: `tests/2026-06-09-add-list-persist.md`. +Este documento consolida a estratégia de testes do ContactManager e o estado atual das validações. + +## Estratégia Atual + +A versão atual possui: +- teste básico automatizado via `make test`; +- registros de testes manuais em `tests/`; +- validação manual recomendada para fluxos interativos completos. + +## Teste Automatizado Disponível + +```bash +make test +``` + +O target atual: +1. compila o projeto; +2. executa `dist/contactmanager`; +3. envia a opção `6` para validar encerramento e salvamento básico. + +Esse teste confirma que o programa compila e encerra sem travar, mas ainda não cobre todo o CRUD. + +## Teste Manual Principal + +Registro existente: + +- [tests/2026-06-09-add-list-persist.md](../tests/2026-06-09-add-list-persist.md) +- [tests/2026-06-14-crud-completo.md](../tests/2026-06-14-crud-completo.md) + +Esses registros cobrem adição, listagem, busca por número, atualização, remoção e persistência. + +## Roteiro Manual Recomendado + +```bash +make clean +make build +./dist/contactmanager +``` + +Fluxos a validar: +1. adicionar contato com nome, telefone e email; +2. listar contatos; +3. buscar contato pelo número exibido; +4. atualizar contato pelo número exibido; +5. remover contato pelo número exibido; +6. sair pela opção `6`; +7. executar novamente e confirmar que os dados foram carregados. + +## Cobertura Atual + +| Área | Estado | Observação | +|------|--------|------------| +| Compilação | Coberta | `make build` e `make test` | +| Encerramento básico | Coberta | `make test` envia opção `6` | +| Adição | Manual | Registrada em `tests/` | +| Listagem | Manual | Registrada em `tests/` | +| Persistência | Manual | Registrada em `tests/` | +| Busca por número | Manual | Registrada em `tests/2026-06-14-crud-completo.md` | +| Atualização | Manual | Registrada em `tests/2026-06-14-crud-completo.md` | +| Remoção | Manual | Registrada em `tests/2026-06-14-crud-completo.md` | +| Entradas inválidas | Parcial | Mensagens simples; precisa ampliar casos | + +## Próximos Testes + +- Automatizar fluxos interativos com entrada simulada. +- Adicionar verificação do conteúdo gerado em `data/contacts.txt`. +- Validar comportamento com arquivo ausente, vazio e parcialmente inválido. diff --git a/docs/uml.md b/docs/uml.md index c7cf2bf..6d80f64 100644 --- a/docs/uml.md +++ b/docs/uml.md @@ -1,114 +1,86 @@ # Diagrama UML -Este documento contém o diagrama UML de classes e o planejamento ágil do sistema ContactManager. +Este documento apresenta uma visão modular do ContactManager. O sistema é implementado em C, então as classes abaixo representam módulos e responsabilidades, não classes reais de orientação a objetos. -## Visão UML Estendida +## Visão Atual ```mermaid classDiagram - class ContactManager { + class Main { +main() - +executarMenu() + +show menu + +dispatch option } - class Menu { - +mostrarMenu() - +receberOpcao() - +validarOpcao() + + class Config { + +initConfig() + +getAppName() + +getAppVersion() + +getMaxContacts() + +getDatabaseFile() } - class ContactService { + + class ContactModule { +addContact() +listContacts() +findContact() + +updateContact() +removeContact() } - class Storage { + + class StorageModule { +saveContacts() +loadContacts() } - class Contact { - -name: string - -phone: string - +toString(): string - } - class PostgreSQLBackend { - +connect() - +saveContact() - +loadContacts() - +migrateSchema() - } - class PythonAutomation { - +runMigrationScript() - +exportContacts() - +importContacts() + + class ErrorModule { + +getErrorMessage() } - class GUI { - +showWindow() - +displayContacts() - +handleUserEvents() + + class Contact { + +name + +phone + +email } - ContactManager --> Menu - Menu --> ContactService - Menu --> Storage - ContactService --> Contact - Storage --> Contact - ContactService --> PostgreSQLBackend : future persistence - PostgreSQLBackend --> PythonAutomation : migration / data ops - Menu --> GUI : future UI + Main --> Config + Main --> ContactModule + Main --> StorageModule + ContactModule --> Contact + StorageModule --> Contact + ErrorModule ..> Main : available for standardization ``` -## O que foi feito - -- Implementado o núcleo do CLI em `src/main.c` com menu e chamadas para adicionar/listar contatos. -- Desenvolvidas as funções `addContact` e `listContacts` em `src/contact.c`. -- Criado o módulo de persistência em `src/storage.c` com `saveContacts` e `loadContacts`. -- Organizada a documentação em `docs/`, incluindo diário por dias e arquitetura. -- Configurado CI/CD em `.github/workflows/ci.yml` e criado a tag local `v1.0.0`. - -## O que vai ser feito - -- Finalizar implementação de `removeContact` e `findContact` no backend C. -- Ampliar a validação do armazenamento local em `src/storage.c` para garantir persistência confiável. -- Migrar parte da persistência para PostgreSQL como backend robusto. -- Criar scripts Python para migração de dados, importação/exportação e automações auxiliares. -- Desenvolver a interface gráfica do projeto para melhorar a usabilidade. -- Atualizar requisitos e arquitetura com o novo modelo híbrido. - -## Prazo e planejamento ágil - -### Sprint 1 — 09/06/2026 a 16/06/2026 -- Objetivo: estabilizar a versão CLI completa e a persistência local. -- Entregáveis: - - implementação de `removeContact` e `findContact`. - - salvamento e carregamento de contatos funcionando. - - documentação atualizada sobre o estado atual. -- Critério de aceitação: - - o programa compila sem erros e suporta adicionar, listar, carregar e salvar contatos localmente. - - busca e remoção são implementadas ou permanecem registradas como pendências da sprint. - - os testes básicos de fluxo CLI passam. - -### Sprint 2 — 17/06/2026 a 23/06/2026 -- Objetivo: introduzir o backend PostgreSQL e automações Python. -- Entregáveis: - - modelo de dados PostgreSQL definido. - - scripts Python para criar a tabela e migrar dados do arquivo local. - - documentação do novo backend e dos scripts. -- Critério de aceitação: - - existe conexão funcional com PostgreSQL. - - dados podem ser movidos entre o arquivo local e o banco PostgreSQL. - -### Sprint 3 — 24/06/2026 a 30/06/2026 -- Objetivo: desenvolver a primeira interface gráfica do projeto. -- Entregáveis: - - protótipo de UI gráfica integrado ao backend. - - descrição do fluxo de uso do GUI. -- Critério de aceitação: - - a interface gráfica oferece as operações básicas de contato. - - a UI se conecta corretamente ao backend de dados. - -## Critérios de aceitação gerais - -- O ContactManager deve suportar o ciclo completo de cadastro, visualização, busca, remoção e persistência. -- A documentação deve refletir claramente o estado atual e o plano de evolução. -- Cada sprint deve ter entregáveis definidos e testáveis. -- A adoção de PostgreSQL e Python deve ser documentada como evolução planejada, sem comprometer o funcionamento atual em C. +## Módulos + +| Módulo | Arquivos | Responsabilidade | +|--------|----------|------------------| +| Main | `src/main.c` | Fluxo do programa e menu | +| Config | `include/config.h`, `src/config.c` | Constantes e configurações | +| ContactModule | `include/contact.h`, `src/contact.c` | CRUD em memória | +| StorageModule | `include/storage.h`, `src/storage.c` | Persistência em arquivo | +| ErrorModule | `include/error.h`, `src/error.c` | Códigos e mensagens de erro | + +## Estado Atual + +Implementado: +- contato com nome, telefone e email; +- CRUD por número exibido; +- carregamento e salvamento em CSV; +- build organizado; +- documentação técnica alinhada ao fluxo atual. + +Em evolução: +- uso mais consistente do módulo de erros; +- testes automatizados de CRUD; +- validação de entrada; +- busca textual; +- persistência mais robusta. + +## Visão Futura + +Possíveis extensões: +- módulo de menu separado de `main.c`; +- camada de repositório para desacoplar storage; +- parser CSV dedicado; +- interface gráfica ou backend alternativo, caso o escopo do projeto cresça. diff --git a/include/config.h b/include/config.h new file mode 100644 index 0000000..9784d10 --- /dev/null +++ b/include/config.h @@ -0,0 +1,40 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include +#include + +#define APP_NAME "Contact Manager" +#define APP_VERSION "1.0" + +#define MAX_CONTACTS 1000 + +#define MAX_NAME_LENGTH 100 +#define MAX_PHONE_LENGTH 20 +#define MAX_EMAIL_LENGTH 100 + +#define DATA_DIRECTORY "data/" +#define DATABASE_FILE "data/contacts.txt" + +#define MENU_WIDTH 32 + +#define ENABLE_COLOR 1 +#define CLEAR_SCREEN_COMMAND "clear" + +#define INPUT_BUFFER_SIZE 256 + +void initConfig(void); +const char *getAppName(void); +const char *getAppVersion(void); +int getMaxContacts(void); +int getMaxNameLength(void); +int getMaxPhoneLength(void); +int getMaxEmailLength(void); +const char *getDataDirectory(void); +const char *getDatabaseFile(void); +int getMenuWidth(void); +bool isColorEnabled(void); +const char *getClearScreenCommand(void); +size_t getInputBufferSize(void); + +#endif \ No newline at end of file diff --git a/include/contact.h b/include/contact.h index 7ccec5d..78cfdf2 100644 --- a/include/contact.h +++ b/include/contact.h @@ -1,20 +1,22 @@ #ifndef CONTACT_H -#define CONTACT_H +#define CONTACT_H -#define MAX_NAME 100 -#define MAX_PHONE 20 +#include "config.h" + +#define MAX_NAME MAX_NAME_LENGTH +#define MAX_PHONE MAX_PHONE_LENGTH +#define MAX_EMAIL MAX_EMAIL_LENGTH typedef struct { - char name[MAX_NAME]; - char phone[MAX_PHONE]; + char name[MAX_NAME]; + char phone[MAX_PHONE]; + char email[MAX_EMAIL]; } Contact; -void addContact(Contact contacts[], int *count); // Prototipo de função para adicionar um contato. -void listContacts(Contact contacts[], int count); // Prototipo de função para listar os contatos. -void removeContact(Contact contacts[], int *count); // Prototipo de função para remover um contato. -int findContact(Contact contacts[], int id); // Prototipo de função para buscar um contato por ID. - +void addContact(Contact contacts[], int *count); +void listContacts(Contact contacts[], int count); +void removeContact(Contact contacts[], int *count); +int findContact(Contact contacts[], int count, int id); +int updateContact(Contact contacts[], int count); -#endif -// Prototipo de função para buscar um contatos por nome. -// Pode ser melhorada para retornar um ponteiro para o contato encontrado ou NULL se não encontrado. \ No newline at end of file +#endif diff --git a/include/error.h b/include/error.h new file mode 100644 index 0000000..7ad3164 --- /dev/null +++ b/include/error.h @@ -0,0 +1,23 @@ +#ifndef ERROR_H +#define ERROR_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + APP_ERROR_NONE = 0, + APP_ERROR_FILE_OPEN, + APP_ERROR_FILE_WRITE, + APP_ERROR_FILE_READ, + APP_ERROR_INVALID_INPUT, + APP_ERROR_LIMIT_REACHED +} AppErrorCode; + +const char *getErrorMessage(AppErrorCode code); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/storage.h b/include/storage.h index 96b7126..c232a8f 100644 --- a/include/storage.h +++ b/include/storage.h @@ -1,24 +1,9 @@ -#ifndef STORAGE_H -#define STORAGE_H +#ifndef STORAGE_H +#define STORAGE_H #include "contact.h" -// Prototipo de função para salvar os contatos em um arquivo. -void saveContacts( - Contact contacts[], - int count -); +void saveContacts(Contact contacts[], int count); +void loadContacts(Contact contacts[], int *count); -// Prototipo de função para carregar os contatos do arquivo. -void loadContacts( - Contact contacts[], - int *count -); - -// Prototipo de função para remover um contato do arquivo. - -// Prototipo de função para buscar um contato por nome no arquivo. - -// As funções removeContact e findContact ainda precisam ser implementadas, mas os protótipos já estão definidos para futuras implementações. - -#endif \ No newline at end of file +#endif diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..5c049a0 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,74 @@ +# Scripts de Automação + +Este diretório contém scripts auxiliares para automação e desenvolvimento do ContactManager. + +## build.sh + +Script principal de build com interface amigável e feedback colorido. + +### Uso + +```bash +./scripts/build.sh [comando] +``` + +### Comandos + +| Comando | Descrição | +|---------|-----------| +| `build` | Compilar binário release (padrão) | +| `debug` | Compilar com símbolos de debug | +| `release` | Build limpo e otimizado | +| `run` | Compilar e executar programa | +| `clean` | Remover artefatos de build | +| `test` | Executar testes | +| `help` | Mostrar ajuda | + +### Exemplos + +```bash +# Build padrão +./scripts/build.sh build + +# Build debug +./scripts/build.sh debug + +# Compilar e executar +./scripts/build.sh run + +# Usar compilador alternativo +CC=clang ./scripts/build.sh build +``` + +## Saídas Geradas + +| Comando | Saída | +|---------|-------| +| `./scripts/build.sh build` | `dist/contactmanager` | +| `./scripts/build.sh debug` | `dist/contactmanager-debug` | +| `./scripts/build.sh clean` | remove `build/obj/` e `dist/` | + +## Integração com Make + +Os scripts delegam para [build/Makefile](../build/Makefile) para a compilação real: + +```bash +make -f build/Makefile build # Equivalente a ./scripts/build.sh build +``` + +## Variáveis de Ambiente Suportadas + +- `CC` - Compilador a usar (padrão: gcc) +- `VERBOSE` - Saída detalhada (default: 0) +- `INSTALL_DIR` - Diretório de instalação +- `OBJ_DIR` - Diretório de objetos (padrão: `build/obj`) +- `BIN_DIR` - Diretório de binários (padrão: `dist`) + +## Próximos Scripts + +Possibilidades para futuras expansões: + +- `test.sh` - Suite de testes automatizados +- `coverage.sh` - Geração de cobertura de testes +- `package.sh` - Criação de pacotes (.deb, .rpm) +- `release.sh` - Processo de release com versionamento diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..245b15f --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,142 @@ +#!/bin/bash + +# ContactManager Build Script +# Provides automated build, test, and packaging + +set -e + +PROJECT_NAME="ContactManager" +BUILD_DIR="build" +SRC_DIR="src" +INCLUDE_DIR="include" +TARGET="contactmanager" +TARGET_PATH="dist/$TARGET" +VERSION=$(grep -E '^#define APP_VERSION' "$INCLUDE_DIR/config.h" | sed -E 's/.*"([^"]+)".*/\1/') + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Functions +print_header() { + echo -e "${GREEN}=== $1 ===${NC}" +} + +print_error() { + echo -e "${RED}Error: $1${NC}" >&2 +} + +print_success() { + echo -e "${GREEN}✓ $1${NC}" +} + +print_info() { + echo -e "${YELLOW}→ $1${NC}" +} + +show_usage() { + cat << EOF +Usage: ./scripts/build.sh [command] + +Commands: + build Build the project (default) + debug Build with debug symbols + release Build optimized release binary + run Build and run the program + clean Remove build artifacts + test Run basic tests + help Show this help message + +Environment variables: + CC C compiler (default: gcc) + INSTALL_DIR Installation directory (default: /usr/local/bin) + +Examples: + ./scripts/build.sh build # Build release binary + ./scripts/build.sh debug # Build debug binary + CC=clang ./scripts/build.sh build # Build with clang +EOF +} + +build_project() { + print_header "Building $PROJECT_NAME v$VERSION" + make -f build/Makefile build || { + print_error "Build failed" + exit 1 + } + print_success "Build completed successfully" +} + +build_debug() { + print_header "Building $PROJECT_NAME (Debug)" + make -f build/Makefile debug || { + print_error "Debug build failed" + exit 1 + } + print_success "Debug build completed successfully" +} + +build_release() { + print_header "Building $PROJECT_NAME (Release)" + make -f build/Makefile release || { + print_error "Release build failed" + exit 1 + } + print_success "Release build completed successfully" +} + +run_program() { + print_header "Running $PROJECT_NAME" + make -f build/Makefile run +} + +clean_build() { + print_header "Cleaning build artifacts" + make -f build/Makefile clean + print_success "Clean completed" +} + +run_tests() { + print_header "Running tests" + if [ ! -f "$TARGET_PATH" ]; then + print_info "Building first..." + build_project + fi + make -f build/Makefile test || { + print_error "Tests failed" + exit 1 + } + print_success "Tests passed" +} + +# Main +case "${1:-build}" in + build) + build_project + ;; + debug) + build_debug + ;; + release) + build_release + ;; + run) + run_program + ;; + clean) + clean_build + ;; + test) + run_tests + ;; + help) + show_usage + ;; + *) + print_error "Unknown command: $1" + show_usage + exit 1 + ;; +esac diff --git a/src/config.c b/src/config.c new file mode 100644 index 0000000..55bff0d --- /dev/null +++ b/src/config.c @@ -0,0 +1,29 @@ +#include "config.h" + +void initConfig(void) { + // Placeholder para inicialização futura de configurações. +} + +const char *getAppName(void) { return APP_NAME; } + +const char *getAppVersion(void) { return APP_VERSION; } + +int getMaxContacts(void) { return MAX_CONTACTS; } + +int getMaxNameLength(void) { return MAX_NAME_LENGTH; } + +int getMaxPhoneLength(void) { return MAX_PHONE_LENGTH; } + +int getMaxEmailLength(void) { return MAX_EMAIL_LENGTH; } + +const char *getDataDirectory(void) { return DATA_DIRECTORY; } + +const char *getDatabaseFile(void) { return DATABASE_FILE; } + +int getMenuWidth(void) { return MENU_WIDTH; } + +bool isColorEnabled(void) { return ENABLE_COLOR; } + +const char *getClearScreenCommand(void) { return CLEAR_SCREEN_COMMAND; } + +size_t getInputBufferSize(void) { return INPUT_BUFFER_SIZE; } diff --git a/src/contact.c b/src/contact.c index fc701b3..09f48da 100644 --- a/src/contact.c +++ b/src/contact.c @@ -1,31 +1,100 @@ +#include "contact.h" + #include -#include "../include/contact.h" // Função para adicionar um novo contato à lista. void addContact(Contact contacts[], int *count) { - printf("Inserir nome do contato: \n"); - scanf("%99s", contacts[*count].name); + printf("Inserir nome do contato: \n"); + scanf("%99s", contacts[*count].name); + + printf("Inserir telefone do contato: \n"); + scanf("%19s", contacts[*count].phone); - printf("Inserir telefone do contato: \n"); - scanf("%19s", contacts[*count].phone); + printf("Inserir email do contato: \n"); + scanf("%99s", contacts[*count].email); - (*count)++; + (*count)++; } -// Funçao para listar os contatos armazenados. +// Função para listar os contatos armazenados. void listContacts(Contact contacts[], int count) { - if (count == 0) { - printf("Nenhum contato encontrado!\n"); - return; - } - - for (int i = 0; i < count; i++) { - printf("Contato %d:\n", i + 1); - printf("Nome: %s | Telefone: %s\n", contacts[i].name, contacts[i].phone); - } + if (count == 0) { + printf("Nenhum contato encontrado!\n"); + return; + } + + for (int i = 0; i < count; i++) { + printf("Contato %d:\n", i + 1); + printf("Nome: %s | Telefone: %s | Email: %s\n", contacts[i].name, + contacts[i].phone, contacts[i].email); + } +} + +// Retorna o índice do contato pelo ID (1-based). Retorna -1 se não encontrado. +int findContact(Contact contacts[], int count, int id) { + (void)contacts; + + if (id < 1 || id > count) { + return -1; + } + return id - 1; +} + +// Remove um contato pelo número exibido na lista. +void removeContact(Contact contacts[], int *count) { + if (*count == 0) { + printf("Nenhum contato para remover.\n"); + return; + } + + int id; + printf("Digite o número do contato para remover: "); + if (scanf("%d", &id) != 1) { + printf("Entrada inválida.\n"); + return; + } + + int index = findContact(contacts, *count, id); + if (index < 0) { + printf("Contato não encontrado.\n"); + return; + } + + for (int i = index; i < *count - 1; i++) { + contacts[i] = contacts[i + 1]; + } + + (*count)--; + printf("Contato removido com sucesso.\n"); } -// As funções removeContact e findContact ainda precisam ser implementadas. +// Atualiza um contato pelo número exibido na lista. +int updateContact(Contact contacts[], int count) { + if (count == 0) { + printf("Nenhum contato para atualizar.\n"); + return 0; + } + + int id; + printf("Digite o número do contato para atualizar: "); + if (scanf("%d", &id) != 1) { + printf("Entrada inválida.\n"); + return 0; + } + int index = findContact(contacts, count, id); + if (index < 0) { + printf("Contato não encontrado.\n"); + return 0; + } + printf("Atualizar nome (atual: %s): \n", contacts[index].name); + scanf("%99s", contacts[index].name); + printf("Atualizar telefone (atual: %s): \n", contacts[index].phone); + scanf("%19s", contacts[index].phone); + printf("Atualizar email (atual: %s): \n", contacts[index].email); + scanf("%99s", contacts[index].email); + printf("Contato atualizado com sucesso.\n"); + return 1; +} diff --git a/src/error.c b/src/error.c new file mode 100644 index 0000000..acffb2d --- /dev/null +++ b/src/error.c @@ -0,0 +1,20 @@ +#include "error.h" + +const char *getErrorMessage(AppErrorCode code) { + switch (code) { + case APP_ERROR_NONE: + return "Sem erro"; + case APP_ERROR_FILE_OPEN: + return "Nao foi possivel abrir o arquivo"; + case APP_ERROR_FILE_WRITE: + return "Nao foi possivel gravar no arquivo"; + case APP_ERROR_FILE_READ: + return "Nao foi possivel ler o arquivo"; + case APP_ERROR_INVALID_INPUT: + return "Entrada invalida"; + case APP_ERROR_LIMIT_REACHED: + return "Limite de contatos atingido"; + default: + return "Erro desconhecido"; + } +} diff --git a/src/main.c b/src/main.c index 93ee442..cde6b58 100644 --- a/src/main.c +++ b/src/main.c @@ -1,52 +1,77 @@ #include -#include -#include "../include/contact.h" -#include "../include/storage.h" - -#define MAX_CONTACTS 100 +#include "config.h" +#include "contact.h" +#include "storage.h" int main(void) { - Contact contacts[MAX_CONTACTS]; - int count = 0; - int option; - -// Carregar contatos do arquivo ao iniciar o programa. - loadContacts(contacts, &count); - - do { - printf("\nContact Manager\n"); - printf("1. Adicionar contato\n"); - printf("2. Listar contatos\n"); - printf("3. Sair\n"); - printf("Escolha uma opção: "); - if (scanf("%d", &option) != 1) { - fprintf(stderr, "Entrada inválida. Saindo.\n"); - break; - } -// Limpar o buffer de entrada para evitar problemas com scanf. - switch (option) { - case 1: - if (count >= MAX_CONTACTS) { - printf("Limite de contatos atingido.\n"); - } else { - addContact(contacts, &count); - } - break; - case 2: - listContacts(contacts, count); - break; - case 3: - saveContacts(contacts, count); - printf("Contatos salvos. Até logo!\n"); - break; - default: - printf("Opção inválida. Tente novamente.\n"); - break; - } - } while (option != 3); - - return 0; + Contact contacts[MAX_CONTACTS]; + int count = 0; + int option; + + initConfig(); + + // Carregar contatos do arquivo ao iniciar o programa. + loadContacts(contacts, &count); + + do { + printf("\n%s %s\n", getAppName(), getAppVersion()); + printf("1. Adicionar contato\n"); + printf("2. Listar contatos\n"); + printf("3. Atualizar contato\n"); + printf("4. Remover contato\n"); + printf("5. Buscar contato por número\n"); + printf("6. Sair\n"); + printf("Escolha uma opção: "); + + if (scanf("%d", &option) != 1) { + fprintf(stderr, "Entrada inválida. Saindo.\n"); + break; + } + + switch (option) { + case 1: + if (count >= getMaxContacts()) { + printf("Limite de contatos atingido.\n"); + } else { + addContact(contacts, &count); + } + break; + case 2: + listContacts(contacts, count); + break; + case 3: + updateContact(contacts, count); + break; + case 4: + removeContact(contacts, &count); + break; + case 5: { + int id = 0; + printf("Digite o número do contato para buscar: "); + if (scanf("%d", &id) != 1) { + printf("Entrada inválida.\n"); + break; + } + int index = findContact(contacts, count, id); + if (index < 0) { + printf("Contato não encontrado.\n"); + } else { + printf("Contato %d encontrado:\n", id); + printf("Nome: %s | Telefone: %s | Email: %s\n", contacts[index].name, + contacts[index].phone, contacts[index].email); + } + break; + } + case 6: + saveContacts(contacts, count); + printf("Contatos salvos. Até logo!\n"); + break; + default: + printf("Opção inválida. Tente novamente.\n"); + break; + } + } while (option != 6); + + return 0; } -// O programa agora inclui a funcionalidade de carregar e salvar contatos usando as funções definidas em storage.c. -// As funções removeContact e findContact ainda precisam ser implementadas, mas a estrutura básica do programa já está funcional para adicionar e listar contatos. \ No newline at end of file diff --git a/src/storage.c b/src/storage.c index 8131716..9ef9f0d 100644 --- a/src/storage.c +++ b/src/storage.c @@ -1,40 +1,42 @@ -#include -#include +#include "storage.h" + #include -#include "../include/storage.h" +#include +#include // para mkdir + +#include "config.h" // Função para salvar os contatos em um arquivo. void saveContacts(Contact contacts[], int count) { - if (mkdir("data", 0755) != 0 && errno != EEXIST) { - perror("Não foi possível criar diretório data\n"); - return; - } - - FILE *file = fopen("data/contacts.txt", "w"); - if (!file) { - perror("Não foi possível abrir o arquivo de contatos\n"); - return; - } - - for (int i = 0; i < count; i++) { - fprintf(file, "%s,%s\n", contacts[i].name, contacts[i].phone); - } - - fclose(file); + if (mkdir(DATA_DIRECTORY, 0755) != 0 && errno != EEXIST) { + perror("Não foi possível criar diretório de dados\n"); + return; + } + + FILE *file = fopen(DATABASE_FILE, "w"); + if (!file) { + perror("Não foi possível abrir o arquivo de contatos\n"); + return; + } + + for (int i = 0; i < count; i++) { + fprintf(file, "%s,%s,%s\n", contacts[i].name, contacts[i].phone, + contacts[i].email); + } + + fclose(file); } -// A função saveContacts agora inclui a criação do diretório "data" se ele não existir, garantindo que o arquivo de contatos possa ser salvo corretamente. void loadContacts(Contact contacts[], int *count) { - FILE *f = fopen("data/contacts.txt", "r"); - if (!f) { - return; - } + FILE *f = fopen(DATABASE_FILE, "r"); + if (!f) { + return; + } - while (fscanf(f, "%99[^,],%19[^\n]\n", contacts[*count].name, contacts[*count].phone) == 2) { - (*count)++; - } + while (fscanf(f, "%99[^,],%19[^,],%99[^\n]\n", contacts[*count].name, + contacts[*count].phone, contacts[*count].email) == 3) { + (*count)++; + } - fclose(f); + fclose(f); } -// A função loadContacts lê os contatos do arquivo "data/contacts.txt" e os armazena na matriz de contatos, atualizando o contador de contatos. Se o arquivo não existir, a função simplesmente retorna sem fazer nada, permitindo que o programa continue funcionando normalmente. -// As funções saveContacts e loadContacts agora estão implementadas, permitindo que os contatos sejam salvos e carregados de um arquivo, garantindo a persistência dos dados entre as execuções do programa. \ No newline at end of file diff --git a/tests/2026-06-09-add-list-persist.md b/tests/2026-06-09-add-list-persist.md index 0910c83..f5fe3e9 100644 --- a/tests/2026-06-09-add-list-persist.md +++ b/tests/2026-06-09-add-list-persist.md @@ -11,15 +11,16 @@ printf '1 João 11999999999 +joao@example.com 2 -3 -' | ./contactmanager +6 +' | ./dist/contactmanager ``` ## Saída - Programa exibiu o menu principal. -- Solicitou dados de contato e aceitou nome e telefone. -- Listou o contato `João` com telefone `11999999999`. +- Solicitou dados de contato e aceitou nome, telefone e email. +- Listou o contato `João` com telefone `11999999999` e email `joao@example.com`. - Salvou os contatos antes de encerrar. ## Erros diff --git a/tests/2026-06-14-crud-completo.md b/tests/2026-06-14-crud-completo.md new file mode 100644 index 0000000..757e250 --- /dev/null +++ b/tests/2026-06-14-crud-completo.md @@ -0,0 +1,83 @@ +# Teste: 2026-06-14 - CRUD Completo + +## Data + +- 2026-06-14 + +## Objetivo + +- Validar o fluxo completo de CRUD no CLI atual: + - adicionar contatos; + - listar contatos; + - buscar por número exibido; + - atualizar contato; + - remover contato; + - salvar em arquivo. + +## Ambiente + +- Diretório de execução: `/tmp/contactmanager-test-2026-06-14-crud` +- Binário executado: `/home/avlis/ContactManager/dist/contactmanager` +- Observação: o teste foi executado fora da raiz do projeto para não alterar `data/contacts.txt` do workspace. + +## Comando + +```bash +printf '1 +Ana +11111111111 +ana@example.com +1 +Beto +22222222222 +beto@example.com +2 +5 +1 +3 +2 +Bruno +33333333333 +bruno@example.com +2 +4 +1 +2 +6 +' | /home/avlis/ContactManager/dist/contactmanager +``` + +## Resultado Observado + +- O programa iniciou com o menu principal. +- O contato `Ana` foi adicionado com telefone e email. +- O contato `Beto` foi adicionado com telefone e email. +- A listagem mostrou os dois contatos. +- A busca pelo número `1` encontrou `Ana`. +- O contato número `2` foi atualizado de `Beto` para `Bruno`. +- A listagem após atualização mostrou `Ana` e `Bruno`. +- O contato número `1` foi removido com sucesso. +- A listagem final mostrou apenas `Bruno`. +- Ao sair pela opção `6`, os contatos foram salvos. + +## Arquivo Gerado + +Arquivo verificado: + +```text +/tmp/contactmanager-test-2026-06-14-crud/data/contacts.txt +``` + +Conteúdo: + +```csv +Bruno,33333333333,bruno@example.com +``` + +## Erros + +- Nenhum erro observado. + +## Status + +- sucesso diff --git a/tests/README.md b/tests/README.md index b291031..0f32573 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,23 +1,44 @@ # Rastreamento de Testes -Este diretório armazena os testes executados no ContactManager e serve como histórico de execução. - -Cada arquivo de teste deve conter: -- `Data`: data da execução -- `Objetivo`: o que está sendo validado -- `Comando`: o comando usado para executar o teste -- `Saída`: o resultado exibido pelo programa -- `Erros`: mensagens de erro ou problemas encontrados -- `Status`: `sucesso` ou `falha` - -### Convenção de nomes -Use nomes de arquivo com data e descrição curta, por exemplo: - -- `2026-06-09-add-list-persist.md` -- `2026-06-10-remove-search.md` - -### Uso -1. Execute o comando de teste. -2. Registre a saída e qualquer erro. -3. Defina se o teste foi um sucesso ou falha. -4. Salve o arquivo neste diretório. +Este diretório armazena registros de testes manuais do ContactManager. + +## Quando Criar um Registro + +Crie um arquivo em `tests/` quando validar um fluxo relevante, corrigir um bug ou confirmar uma regressão. + +## Estrutura Recomendada + +Cada arquivo deve conter: +- data da execução; +- objetivo; +- comando usado; +- entradas fornecidas ao programa; +- resultado observado; +- erros encontrados; +- status final: `sucesso` ou `falha`. + +## Convenção de Nomes + +Use data e descrição curta: + +```text +2026-06-09-add-list-persist.md +2026-06-14-update-remove-find.md +``` + +## Fluxos Importantes + +- adicionar, listar e persistir; +- buscar por número; +- atualizar contato; +- remover contato; +- recarregar dados após reiniciar; +- lidar com entradas inválidas. + +## Comandos Úteis + +```bash +make build +./dist/contactmanager +make test +```