{"id":51169635,"url":"https://github.com/devalex-full/portf-lio-backend","last_synced_at":"2026-06-26T23:03:47.499Z","repository":{"id":365402164,"uuid":"1270711341","full_name":"DevAlex-full/portf-lio-backend","owner":"DevAlex-full","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-17T06:27:43.000Z","size":52,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-17T08:18:19.060Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DevAlex-full.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-06-16T01:30:31.000Z","updated_at":"2026-06-17T06:27:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/DevAlex-full/portf-lio-backend","commit_stats":null,"previous_names":["devalex-full/portf-lio-backend"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/DevAlex-full/portf-lio-backend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevAlex-full%2Fportf-lio-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevAlex-full%2Fportf-lio-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevAlex-full%2Fportf-lio-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevAlex-full%2Fportf-lio-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DevAlex-full","download_url":"https://codeload.github.com/DevAlex-full/portf-lio-backend/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevAlex-full%2Fportf-lio-backend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34835782,"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-26T02:00:06.560Z","response_time":106,"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":[],"created_at":"2026-06-26T23:03:47.317Z","updated_at":"2026-06-26T23:03:47.490Z","avatar_url":"https://github.com/DevAlex-full.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Portfólio CMS — Backend\n\nAPI REST do **Portfólio CMS** de Alex Bueno, responsável por autenticação, gerenciamento de conteúdo, upload de mídias, dados públicos do site, dashboard administrativo, clientes, feedbacks, projetos, leads e configurações globais.\n\n\u003e **Status:** produção  \n\u003e **Base URL:** https://portf-lio-backend.onrender.com  \n\u003e **Tipo de projeto:** proprietário / não open source\n\n---\n\n## Visão Geral\n\nEste repositório contém o backend do portfólio profissional, desenvolvido com **Node.js**, **Fastify**, **TypeScript**, **Prisma ORM** e **PostgreSQL via Supabase**.\n\nA API foi criada para alimentar o frontend público e o painel administrativo do portfólio, permitindo que todo o conteúdo seja gerenciado via CMS, sem edição manual no código.\n\n---\n\n## Stack Técnica\n\n| Camada | Tecnologia |\n|---|---|\n| Runtime | Node.js |\n| Framework HTTP | Fastify |\n| Linguagem | TypeScript |\n| ORM | Prisma |\n| Banco de Dados | PostgreSQL / Supabase |\n| Storage | Supabase Storage |\n| Autenticação | JWT |\n| Hash de Senhas | bcryptjs |\n| Upload | @fastify/multipart |\n| Segurança | CORS, Helmet, validações e rotas protegidas |\n| Deploy | Render |\n\n---\n\n## Principais Recursos\n\n- API pública para o site institucional.\n- API administrativa protegida por JWT.\n- Login administrativo.\n- Dashboard com indicadores consolidados.\n- CRUD de projetos.\n- CRUD de clientes/cases.\n- CRUD de feedbacks/depoimentos.\n- CRUD de certificações.\n- CRUD de habilidades.\n- CRUD de serviços e pacotes.\n- Gestão de leads.\n- Gestão de mídia e upload para Supabase Storage.\n- Gestão de Hero, Sobre, Contato e Configurações SEO.\n- Seed idempotente com dados iniciais.\n- Migrations versionadas com Prisma.\n- Deploy em produção no Render.\n\n---\n\n## Arquitetura\n\n```txt\nportf-lio-backend/\n├── prisma/\n│   ├── migrations/\n│   │   ├── 20240101000000_init/\n│   │   ├── 20240115000000_add_lead_source/\n│   │   ├── 20240201000000_add_client_model/\n│   │   ├── 20240210000000_add_client_status/\n│   │   └── 20240220000000_add_feedbacks/\n│   └── schema.prisma\n├── src/\n│   ├── controllers/\n│   │   ├── auth.controller.ts\n│   │   ├── certification.controller.ts\n│   │   ├── client.controller.ts\n│   │   ├── dashboard.controller.ts\n│   │   ├── feedback.controller.ts\n│   │   ├── lead.controller.ts\n│   │   ├── media.controller.ts\n│   │   ├── project.controller.ts\n│   │   ├── service.controller.ts\n│   │   ├── single-record.controller.ts\n│   │   └── skill.controller.ts\n│   ├── lib/\n│   │   ├── prisma.ts\n│   │   └── supabase.ts\n│   ├── plugins/\n│   │   └── auth.plugin.ts\n│   ├── routes/\n│   │   ├── auth.routes.ts\n│   │   ├── client.routes.ts\n│   │   ├── content.routes.ts\n│   │   ├── feedback.routes.ts\n│   │   ├── media.routes.ts\n│   │   ├── project.routes.ts\n│   │   └── single-record.routes.ts\n│   ├── types/\n│   │   └── fastify.d.ts\n│   ├── seed.ts\n│   └── server.ts\n├── .env.example\n├── nodemon.json\n├── package.json\n├── tsconfig.json\n└── README.md\n```\n\n---\n\n## Modelos Principais\n\n| Model | Descrição |\n|---|---|\n| Admin | Usuário administrativo do CMS |\n| Media | Biblioteca de arquivos e uploads |\n| Hero | Conteúdo da seção principal |\n| About | Conteúdo institucional |\n| Project | Projetos do portfólio |\n| Client | Clientes e cases reais |\n| Feedback | Depoimentos e prova social |\n| Certification | Certificações profissionais |\n| Skill | Habilidades técnicas |\n| ServicePlan | Planos e pacotes comerciais |\n| ServiceExtra | Serviços extras |\n| Contact | Dados de contato e redes sociais |\n| SiteSettings | SEO e configurações globais |\n| Lead | Leads capturados pelo site |\n| BlogPost | Estrutura para conteúdo/blog |\n| BlogCategory | Categorias de blog |\n| SiteVisit | Estrutura para métricas de acesso |\n\n---\n\n## Endpoints Públicos\n\n| Método | Rota | Descrição |\n|---|---|---|\n| GET | `/health` | Health check da API |\n| POST | `/api/auth/login` | Login administrativo |\n| GET | `/api/projects` | Projetos ativos |\n| GET | `/api/projects/:slug` | Projeto por slug |\n| GET | `/api/clients` | Clientes ativos |\n| GET | `/api/feedbacks` | Feedbacks ativos |\n| GET | `/api/certifications` | Certificações ativas |\n| GET | `/api/skills` | Habilidades ativas |\n| GET | `/api/services` | Planos e serviços ativos |\n| GET | `/api/hero` | Dados do Hero |\n| GET | `/api/about` | Dados do Sobre |\n| GET | `/api/contact` | Dados de Contato |\n| GET | `/api/settings` | Configurações públicas e SEO |\n| POST | `/api/leads` | Cadastro de lead |\n\n---\n\n## Endpoints Administrativos\n\nRotas administrativas exigem autenticação via Bearer Token.\n\n| Método | Rota | Descrição |\n|---|---|---|\n| GET | `/api/auth/me` | Dados do admin logado |\n| POST | `/api/auth/change-password` | Alteração de senha |\n| GET | `/api/dashboard/stats` | Indicadores do dashboard |\n| GET/POST/PUT/DELETE | `/api/projects` | Gestão de projetos |\n| GET/POST/PUT/DELETE | `/api/clients` | Gestão de clientes |\n| GET/POST/PUT/DELETE | `/api/feedbacks` | Gestão de feedbacks |\n| GET/POST/PUT/DELETE | `/api/certifications` | Gestão de certificações |\n| GET/POST/PUT/DELETE | `/api/skills` | Gestão de habilidades |\n| GET/POST/PUT/DELETE | `/api/services/plans` | Gestão de planos |\n| GET/POST/PUT/DELETE | `/api/services/extras` | Gestão de extras |\n| GET/PATCH/DELETE | `/api/leads` | Gestão de leads |\n| GET/POST/DELETE | `/api/media` | Biblioteca de mídias |\n| PUT | `/api/hero` | Atualização do Hero |\n| PUT | `/api/about` | Atualização do Sobre |\n| PUT | `/api/contact` | Atualização de Contato |\n| PUT | `/api/settings` | Atualização de SEO/configurações |\n\n---\n\n## Variáveis de Ambiente\n\nCrie um arquivo `.env` baseado no `.env.example`.\n\n```env\nPORT=3001\nNODE_ENV=development\nFRONTEND_URL=http://localhost:3000\nDATABASE_URL=postgresql://...\nDIRECT_URL=postgresql://...\nJWT_SECRET=...\nSUPABASE_URL=...\nSUPABASE_SERVICE_ROLE_KEY=...\nADMIN_EMAIL=...\nADMIN_PASSWORD=...\n```\n\n\u003e Nunca versionar `.env` com valores reais.\n\n---\n\n## Setup Local\n\n```bash\n# Instalar dependências\nnpm install\n\n# Gerar Prisma Client\nnpx prisma generate\n\n# Aplicar migrations\nnpx prisma migrate deploy\n\n# Popular banco com dados iniciais\nnpm run seed\n\n# Rodar em desenvolvimento\nnpm run dev\n```\n\nAPI local:\n\n```txt\nhttp://localhost:3001\n```\n\nHealth check:\n\n```txt\nhttp://localhost:3001/health\n```\n\n---\n\n## Build e Produção\n\n```bash\n# Build de produção\nnpm run build\n\n# Start em produção\nnpm start\n```\n\nNo Render, a configuração recomendada é:\n\n```txt\nBuild Command: npm install --include=dev \u0026\u0026 npm run build\nStart Command: node dist/server.js\n```\n\nAs migrations devem ser aplicadas de forma controlada:\n\n```bash\nnpx prisma migrate deploy\nnpm run seed\n```\n\n---\n\n## Migrations\n\nO histórico de migrations deve permanecer imutável após aplicado em produção.\n\nRegras adotadas:\n\n- Não editar migrations já aplicadas.\n- Criar sempre migrations aditivas para novas tabelas/campos.\n- Validar localmente com `npx prisma generate` e `npm run build` antes do deploy.\n- Usar `prisma migrate deploy` em produção.\n\n---\n\n## Segurança\n\n- Rotas administrativas protegidas por JWT.\n- Senhas armazenadas com hash bcrypt.\n- Upload controlado por validação de arquivo.\n- CORS configurado para o frontend autorizado.\n- Variáveis sensíveis fora do repositório.\n- Service Role do Supabase usada somente no backend.\n\n---\n\n## Licença e Uso\n\nEste projeto é **proprietário** e **não é open source**.\n\nO código, estrutura de API, controllers, seed, migrations, modelos de banco, regras de negócio e integrações pertencem ao autor. Não é permitido copiar, redistribuir, revender, publicar ou reutilizar este backend sem autorização expressa.\n\n---\n\n## Autor\n\n**Alex Bueno**  \nDesenvolvedor Full Stack\n\n- Portfólio: https://portifoliodevalex.vercel.app/\n- Backend: https://portf-lio-backend.onrender.com\n- GitHub: https://github.com/DevAlex-full\n- LinkedIn: https://www.linkedin.com/in/alexander-bueno-43823a358/\n- Instagram: https://www.instagram.com/alexbueno.dev/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevalex-full%2Fportf-lio-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevalex-full%2Fportf-lio-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevalex-full%2Fportf-lio-backend/lists"}