Este repositório contĆ©m a API Back-End para o sistema BeautyManager, uma plataforma SaaS (Software as a Service) desenvolvida para a gestĆ£o eficiente de salƵes de beleza. ConstruĆda com Node.js, Express e TypeScript, esta API Ć© o nĆŗcleo do sistema, responsĆ”vel por:
- Gerenciar dados de usuƔrios, clientes, serviƧos (assignments) e agendamentos.
- Implementar a lógica de negócios e regras de acesso.
- Gerenciar autenticação e autorização de usuÔrios via JWT.
- Integrar-se com o Stripe para processar pagamentos, gerenciar assinaturas (planos gratuito e premium) e lidar com webhooks.
A API serve como a fonte de dados e lógica para o Front-End do BeautyManager.
- Aplicação Front-End Consumindo esta API:
- Modelo SaaS com Gerenciamento de Assinaturas: Lógica para lidar com diferentes nĆveis de acesso (gratuito e premium) baseados no status da assinatura do usuĆ”rio, gerenciada via Stripe.
- Autenticação Segura (JWT): Implementação de autenticação stateless usando JSON Web Tokens, com middleware (
isAuthenticated
) para proteger rotas. - Autorização Baseada em Assinatura: Verificação do status da assinatura do usuÔrio para liberar acesso a funcionalidades premium.
- API RESTful: Endpoints bem definidos para operaƧƵes CRUD em UsuƔrios, Clientes, ServiƧos (Assignments) e Agendamentos.
- ORM Moderno: Utilização do Prisma para interação com o banco de dados PostgreSQL, garantindo type-safety, migrações simplificadas e alta produtividade no desenvolvimento.
- Integração Completa com Stripe:
- Criação de sessões de checkout do Stripe.
- Manipulação de webhooks do Stripe para atualizar o status das assinaturas em tempo real.
- Criação de links para o Portal do Cliente Stripe.
- Código Tipado (TypeScript): Desenvolvimento 100% em TypeScript para maior robustez, manutenibilidade e prevenção de erros em tempo de desenvolvimento.
- Arquitetura EscalÔvel: Design modular com separação de responsabilidades (controllers, services, middlewares) e uso de banco de dados relacional eficiente, preparado para crescimento.
- Runtime: Node.js
- Framework: Express.js
- Linguagem: TypeScript
- Banco de Dados: PostgreSQL
- ORM: Prisma
- Autenticação: bcryptjs (Hashing de Senha), jsonwebtoken (JWT)
- Pagamentos: Stripe
- Middleware: CORS, Body-Parser
- Implantação: Vercel
Autenticação (isAuthenticated
) necessƔria para rotas marcadas com (auth)
.
UsuƔrios (User)
POST /users
- Cadastra um novo usuƔrio (requername
,email
,password
no body).POST /session
- Realiza login (requeremail
,password
no body), retorna token JWT.GET /user
- ObtƩm detalhes do usuƔrio autenticado.(auth)
PUT /user
- Atualiza dados do usuƔrio autenticado (requer dados comoname
,address
no body).(auth)
GET /status
- Verifica o status da assinatura (ativo/inativo) do usuƔrio autenticado.(auth)
ServiƧos (Assignment)
POST /assignment
- Cria um novo serviƧo (requername
,price
no body).(auth)
GET /assignments
- Lista os serviƧos do usuƔrio.(auth)
DELETE /assignment
- Deleta um serviƧo (requerassignment_id
como query parameter).(auth)
GET /assignmentsnumber
- Conta o número de serviços do usuÔrio.(auth)
GET /assignment
- ObtĆ©m detalhes de um serviƧo especĆfico (requerassignment_id
como query parameter).(auth)
PUT /assignment
- Atualiza um serviƧo (requerassignment_id
como query parameter ename
,price
no body).(auth)
Clientes (Customer)
POST /customer
- Cria um novo cliente (requername
,phone
no body).(auth)
GET /customers
- Busca clientes do usuƔrio pelo nome, ou telefone (aceitaname
ouphone
como query parameter para busca).(auth)
GET /customerlist
- Lista todos os clientes do usuƔrio autenticado.(auth)
GET /customer
- ObtĆ©m detalhes de um cliente especĆfico (requercustomer_id
como query parameter).(auth)
DELETE /customer
- Deleta um cliente (requercustomer_id
como query parameter).(auth)
PUT /customer
- Atualiza um cliente (requercustomer_id
como query parameter ename
,phone
no body).(auth)
Agendamentos (Scheduling)
POST /schedule
- Cria um novo agendamento (requercustomer_id
,assignment_id
,time
no body).(auth)
GET /schedule
- Lista os agendamentos do usuƔrio.(auth)
DELETE /schedule
- Deleta um agendamento (requerschedule_id
como query parameter).(auth)
Assinaturas (Subscription - Stripe)
POST /subscribe
- Cria uma sessão de checkout do Stripe para o usuÔrio iniciar/alterar assinatura.(auth)
POST /webhooks
- Endpoint pĆŗblico para receber eventos do Stripe (requerbodyParser.raw
, assinatura verificada).POST /create-portal
- Cria uma sessão do Portal do Cliente Stripe para o usuÔrio gerenciar sua assinatura.(auth)
A interação com o banco de dados PostgreSQL é gerenciada pelo Prisma ORM. O schema (prisma/schema.prisma
) define os seguintes modelos principais:
- User: Representa os usuÔrios do sistema (proprietÔrios/gerentes de salão). Contém informações de login, dados pessoais e relacionamento com assinaturas, serviços, clientes e agendamentos.
- Subscription: Armazena o status e detalhes da assinatura Stripe de cada usuƔrio.
- Assignment: Representa os serviços oferecidos pelo salão (ex: corte, manicure).
- Customer: Armazena os dados dos clientes do salão.
- Scheduling: Registra os agendamentos, relacionando UsuƔrio, Cliente e ServiƧo.
O projeto estĆ” organizado na seguinte estrutura:
/prisma
āāā schema.prisma # modelos do banco de dados
/src
āāā @types/express/ # Extenção da tipagem do express para incluir o user_id
āāā controllers/ # Controladores da aplicação
āāā middlewares/ # Middleware para autenticação de rotas
āāā prisma/ # Instancia o PrismaClient para se comunicar com o banco
āāā services/ # Lógica de negócios
āāā utils # FunƧƵes utilitĆ”rias do stripe
āāā routes.ts # Definição das rotas
āāā server.ts # Parte mais alta da aplicação para definição de middlewares globais
- Node.js
- NPM ou Yarn
- Git
- Banco de Dados PostgreSQL
- Conta na Stripe configurada com:
- Chaves de API (Secret Key).
- Um produto e um preƧo criados para a assinatura premium.
- Um endpoint de Webhook configurado para apontar para sua API local.
Siga os passos abaixo para rodar o projeto localmente:
# Clone o repositório
git clone https://github.com/Antonio-Savio/BeautyManager-back-end.git
# Acesse o diretório do projeto
cd BeautyManager
# Instale as dependĆŖncias
npm install
Crie um arquivo .env
e adicione as variƔveis de ambiente necessƔrias, como:
# Conexão com o Banco de Dados PostgreSQL
DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=public"
# Segredo para assinatura e verificação do JWT
JWT_SECRET="SEU_SEGREDO_PARA_JWT"
#Porta do seu servidor local
PORT=SUA_PORTA
# Chave PĆŗblica da API Stripe
NEXT_PUBLIC_STRIPE_PUBLIC_KEY="SUA_CHAVE_PUBLICA_STRIPE"
# Chave Secreta da API Stripe
STRIPE_API_KEY="SUA_CHAVE_SECRETA_STRIPE"
# ID do PreƧo (Price ID) do seu plano de assinatura no Stripe
STRIPE_PRICE="SEU_PRICE_ID_STRIPE"
# URL para onde o Stripe redirecionarÔ após sucesso/falha no checkout
STRIPE_REDIRECT_URL="http://localhost:3000/dashboard" # Ajuste conforme seu front-end
# Chave Secreta do Endpoint de Webhook (Webhook Signing Secret) (whsec_...)
STRIPE_WEBHOOK_SECRET="SUA_CHAVE_SECRETA_WEBHOOK_STRIPE"
Certifique-se de que seu PostgreSQL esteja rodando e as credenciais no DATABASE_URL
estejam corretas. Execute as migraƧƵes do Prisma:
# Aplica as migraƧƵes para criar/atualizar as tabelas no banco
npx prisma migrate dev
# ou
yarn prisma migrate dev
# (Opcional) Gera o Prisma Client se necessƔrio
npx prisma generate
# ou
yarn prisma generate
yarn dev
# ou
npm run dev
Este projeto estÔ configurado para implantação na Vercel.
- O arquivo
vercel.json
fornece a configuração bÔsica. - O script
vercel-build
nopackage.json
("tsc --build && prisma generate && prisma migrate deploy"
) lida com o processo de build:- Compila TypeScript para JavaScript.
- Gera o Prisma Client.
- Aplica as migraƧƵes do banco de dados.
- Configuração Essencial: à crucial configurar todas as variÔveis de ambiente listadas na seção
.env
nas configuraƧƵes da plataforma de hospedagem. - Webhook: O endpoint de webhook (
/webhooks
) na URL de produção deve ser configurado corretamente no dashboard do Stripe. - Banco de Dados: Utilize um serviço de banco de dados PostgreSQL hospedado (ex: Neon, Supabase, ElephantSQL) e configure a
DATABASE_URL
de acordo.
Contribuições são bem-vindas! Siga os passos abaixo:
- FaƧa um fork do projeto.
- Crie uma branch para sua feature (
git checkout -b feature/nova-feature
). - Commit suas mudanƧas (
git commit -m 'Adiciona nova feature'
). - Push para a branch (
git push origin feature/nova-feature
). - Abra um Pull Request.
Este projeto estƔ sob a licenƧa MIT. Consulte o arquivo LICENSE para mais detalhes.
Se tiver dúvidas ou sugestões, entre em contato:
- Email - savio.aragao@hotmail.com
- GitHub: Antonio-Savio
- LinkedIn: antonio-savio