{"id":50797728,"url":"https://github.com/samiracavalcanti/pinterestclone","last_synced_at":"2026-06-12T16:01:12.457Z","repository":{"id":357023204,"uuid":"1234113794","full_name":"SamiraCavalcanti/PinterestClone","owner":"SamiraCavalcanti","description":"PinterestClone - Clone do Pinterest desenvolvido com Flask. Plataforma fullstack com autenticação, upload de fotos, feed personalizado  e suite completa de testes com integração contínua.","archived":false,"fork":false,"pushed_at":"2026-05-11T01:16:42.000Z","size":14597,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-11T01:34:05.036Z","etag":null,"topics":["dockerfile","flask","postgresql","python3","render"],"latest_commit_sha":null,"homepage":"https://pinterestclone-3p1n.onrender.com","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SamiraCavalcanti.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-09T19:10:11.000Z","updated_at":"2026-05-11T01:16:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/SamiraCavalcanti/PinterestClone","commit_stats":null,"previous_names":["samiracavalcanti/pinterestclone"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/SamiraCavalcanti/PinterestClone","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamiraCavalcanti%2FPinterestClone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamiraCavalcanti%2FPinterestClone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamiraCavalcanti%2FPinterestClone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamiraCavalcanti%2FPinterestClone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SamiraCavalcanti","download_url":"https://codeload.github.com/SamiraCavalcanti/PinterestClone/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamiraCavalcanti%2FPinterestClone/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34251773,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dockerfile","flask","postgresql","python3","render"],"created_at":"2026-06-12T16:01:10.953Z","updated_at":"2026-06-12T16:01:12.431Z","avatar_url":"https://github.com/SamiraCavalcanti.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FakePinterest\n\nPlataforma de compartilhamento de imagens inspirada no Pinterest, desenvolvida com Flask como aplicação fullstack. O projeto inclui autenticação de usuários, upload de fotos, feed personalizado e suite completa de testes automatizados com pipeline CI/CD integrado ao GitHub Actions.\n\n## Pré-requisitos\n\n- Python 3.12 ou superior\n- pip (gerenciador de pacotes Python)\n- Docker (opcional, para containerização)\n- Git\n\n## Instalação Local\n\n### Passo 1: Clonar o repositório\n\n```bash\ngit clone git@github.com:SamiraCavalcanti/PinterestClone.git\ncd PinterestClone\n```\n\n### Passo 2: Criar e ativar ambiente virtual\n\nPara Linux/Mac:\n\n```bash\npython -m venv venv\nsource venv/bin/activate\n```\n\nPara Windows:\n\n```bash\npython -m venv venv\nvenv\\Scripts\\activate\n```\n\n### Passo 3: Instalar dependências\n\n```bash\npip install --upgrade pip\npip install -r requirements.txt\n```\n\n### Passo 4: Executar a aplicação\n\n```bash\npython main.py\n```\n\nA aplicação estará disponível em http://localhost:5000\n\n## Estrutura do Projeto\n\n```\nfakepinterest/\n├── .github/\n│   └── workflows/\n│       ├── ci.yml              # Pipeline de integração contínua\n│       └── cd.yml              # Pipeline de entrega contínua\n├── src/\n│   └── app/\n│       ├── __init__.py         # Inicialização da aplicação Flask\n│       ├── models.py           # Modelos do banco de dados\n│       ├── forms.py            # Formulários WTForms\n│       ├── routes.py           # Rotas da aplicação\n│       ├── templates/          # Templates HTML\n│       │   ├── homepage.html\n│       │   ├── criarconta.html\n│       │   ├── perfil.html\n│       │   ├── feed.html\n│       │   └── navbar.html\n│       └── static/\n│           ├── css/            # Arquivos CSS\n│           └── fotos_posts/    # Diretório para uploads\n├── tests/\n│   └── test_app.py             # Testes automatizados (pytest)\n├── conftest.py                 # Configuração pytest\n├── main.py                     # Ponto de entrada da aplicação\n├── Dockerfile                  # Configuração para containerização\n├── .dockerignore               # Arquivos ignorados ao buildar Docker\n├── requirements.txt            # Dependências Python\n├── .gitignore                  # Arquivos ignorados pelo Git\n├── LICENSE                     # Licença MIT\n└── README.md                   # Este arquivo\n```\n\n## Recursos Principais\n\nAutenticação e Conta de Usuário\n\n- Registro de novos usuários com validação de email\n- Login com autenticação segura (bcrypt)\n- Senha criptografada no banco de dados\n- Sessão persistente com flask-login\n\nGerenciamento de Fotos\n\n- Upload de fotos para perfil de usuário\n- Armazenamento seguro em diretório estático\n- Listagem de fotos por usuário\n- Visualização de fotos no feed\n\nFeed Social\n\n- Exibição de todas as fotos em ordem cronológica inversa\n- Apenas usuários autenticados podem acessar\n- Atualização dinâmica do feed\n\nSegurança\n\n- Validação de entrada com WTForms\n- Proteção contra CSRF\n- Senhas criptografadas com bcrypt\n- Rotas protegidas com login_required\n\n## Interface da Aplicação\n\n### Tela de Login\n\nModal de login centralizado com campos para email e senha. Usuários podem criar conta ou fazer login com suas credenciais.\n\n![Login](docs/screenshots/image-1778360369683.png)\n\n### Página de Criar Conta\n\nFormulário para registro com validação de email, nome completo, senha e confirmação de senha. O sistema verifica se o email já existe.\n\n![Criar Conta](docs/screenshots/image-1778360372070.png)\n\n### Perfil do Usuário\n\nExibe o nome do usuário no topo com opção de upload de fotos. As fotos são organizadas em grid 5 colunas (3 na primeira linha, 2 na segunda, etc.), mostrando as imagens enviadas pelo usuário.\n\n![Perfil](docs/screenshots/image-1778360362677.png)\n\n\n![Perfil2](docs/screenshots/image-1778360366711.png)\n\n\n## Usando a Aplicação\n\nFuncionalidades de Usuário\n\n1. Criar Conta: Acesse http://localhost:5000/criarconta e preencha o formulário\n2. Fazer Login: Volte à página inicial e insira suas credenciais\n3. Acessar Perfil: Após login, você será redirecionado para seu perfil\n4. Upload de Foto: Na página de perfil, clique em \"Escolher Arquivo\" e selecione uma imagem\n5. Ver Feed: Clique em \"Feed\" para visualizar todas as fotos da plataforma\n6. Logout: Clique em \"Sair\" para fazer logout\n\n## Testes Automatizados\n\nExecutar todos os testes:\n\n```bash\npytest tests/ -v\n```\n\nExecutar com cobertura de código:\n\n```bash\npytest tests/ -v --cov=src --cov-report=html\n```\n\nSuite de Testes\n\n- test_homepage: Verifica se página inicial carrega corretamente\n- test_criar_conta: Testa criação de nova conta de usuário\n- test_feed_sem_login: Verifica se feed exige autenticação\n- test_login_invalido: Testa rejeição de credenciais incorretas\n- test_login_valido: Testa login bem-sucedido\n- test_feed_com_login: Testa acesso ao feed após autenticação\n- test_logout: Testa logout da aplicação\n\n## Usando Docker\n\nBuild da imagem Docker:\n\n```bash\ndocker build -t fakepinterest:latest .\n```\n\nExecutar a aplicação em container:\n\n```bash\ndocker run -p 5000:5000 fakepinterest:latest\n```\n\nVerificar logs do container:\n\n```bash\ndocker logs \u003ccontainer-id\u003e\n```\n\nParar o container:\n\n```bash\ndocker stop \u003ccontainer-id\u003e\n```\n\n## Pipeline de CI/CD\n\nIntegração Contínua (CI)\n\nO arquivo .github/workflows/ci.yml configura automação para:\n\n- Executar em: Push para main/develop e Pull Requests\n- Testa: Código com pytest\n- Valida: Sintaxe com flake8\n- Gera: Relatório de cobertura\n- Upload: Resultados dos testes como artifact\n\nEntrega Contínua (CD)\n\nO arquivo .github/workflows/cd.yml configura automação para:\n\n- Executar em: Push para branch main\n- Build: Imagem Docker otimizada\n- Push: Para Docker Hub e GitHub Container Registry\n- Cache: Otimizado para builds rápidos\n\nConfiguração de Secrets\n\nPara ativar o CD (deploy Docker), configure em GitHub:\n\n1. Vá para Settings \u003e Secrets and variables \u003e Actions\n2. Adicione novo secret: DOCKER_USERNAME\n3. Adicione novo secret: DOCKER_PASSWORD\n4. Use suas credenciais do Docker Hub\n\n## Deploy no Kubernetes\n\nPreparação para Kubernetes\n\nA aplicação está pronta para deployment no Kubernetes com:\n\n- Dockerfile otimizado com multi-stage build\n- Healthcheck configurado para liveness probe\n- Variáveis de ambiente personalizáveis\n- Port 5000 exposta\n\nExemplo de Deployment Kubernetes:\n\n```yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: fakepinterest\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: fakepinterest\n  template:\n    metadata:\n      labels:\n        app: fakepinterest\n    spec:\n      containers:\n        - name: fakepinterest\n          image: docker.io/seu-usuario/fakepinterest:latest\n          ports:\n            - containerPort: 5000\n          env:\n            - name: FLASK_ENV\n              value: production\n          livenessProbe:\n            httpGet:\n              path: /\n              port: 5000\n            initialDelaySeconds: 10\n            periodSeconds: 30\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: fakepinterest-service\nspec:\n  selector:\n    app: fakepinterest\n  ports:\n    - protocol: TCP\n      port: 80\n      targetPort: 5000\n  type: LoadBalancer\n```\n\nAplicar no cluster:\n\n```bash\nkubectl apply -f deployment.yaml\n```\n\n## Variáveis de Ambiente\n\nA aplicação usa as seguintes variáveis de ambiente:\n\n```\nFLASK_APP=main.py              # Arquivo principal da aplicação\nFLASK_ENV=production           # Ambiente (production/development)\nPYTHONUNBUFFERED=1            # Logs em tempo real no Docker\nDATABASE_URL=sqlite:///...    # URL do banco de dados (opcional)\n```\n\n## Dependências Principais\n\n- Flask 3.1.3: Framework web\n- Flask-SQLAlchemy 3.1.1: ORM para banco de dados\n- Flask-Login 0.6.3: Gerenciamento de sessão de usuários\n- Flask-Bcrypt 1.0.1: Criptografia de senhas\n- Flask-WTF 1.2.1: Processamento de formulários\n- pytest 7.4.4: Framework de testes\n- python-dotenv 1.0.0: Gerenciamento de variáveis de ambiente\n\nVeja requirements.txt para a lista completa.\n\n## Troubleshooting\n\nProblema: ModuleNotFoundError ao rodar a aplicação\n\nSolução: Certifique-se de que o venv está ativado e conftest.py está na raiz do projeto\n\nProblema: Porta 5000 já está em uso\n\nSolução: Use outra porta com flask run --port 5001\n\nProblema: Banco de dados não encontrado\n\nSolução: Execute conftest.py ou delete instance/comunidade.db para recriá-lo\n\nProblema: Arquivo de foto não é encontrado após upload\n\nSolução: Verifique permissões da pasta static/fotos_posts/ com chmod 755\n\n## Contribuições\n\nPara contribuir ao projeto:\n\n1. Faça um fork do repositório\n2. Crie uma branch para sua feature (git checkout -b feature/nova-funcionalidade)\n3. Commit suas mudanças (git commit -am 'Adiciona nova funcionalidade')\n4. Push para a branch (git push origin feature/nova-funcionalidade)\n5. Abra um Pull Request\n\nPadrões de Código\n\n- Siga PEP 8 para Python\n- Adicione testes para novas funcionalidades\n- Mantenha a documentação atualizada\n- Use commits significativos\n\n## Licença\n\nEste projeto está licenciado sob a licença MIT. Veja o arquivo LICENSE para detalhes completos.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamiracavalcanti%2Fpinterestclone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsamiracavalcanti%2Fpinterestclone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamiracavalcanti%2Fpinterestclone/lists"}