Skip to content

doimih/7mail

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

7Mail - Newsletter Builder & Sender

Platforma pentru creare, management si livrare newslettere, cu backend FastAPI, frontend React si persistenta PostgreSQL.

Ce include proiectul

  • Editor de continut newsletter (blocuri + template-uri)
  • Management utilizatori si roluri (admin/editor/subscriber)
  • Management template-uri, campanii, liste de destinatari si abonati
  • Tracking pentru opens/clicks/unsubscribe
  • Upload media pentru continut si newsletter design
  • Pagina publica de prezentare + dashboard admin

Stack tehnic

  • Frontend: React 18, TypeScript, Vite, Tailwind
  • Backend: FastAPI, SQLAlchemy, Pydantic, Alembic
  • Baza de date: PostgreSQL 16
  • Runtime: Docker / Docker Compose
  • Reverse proxy productie: Traefik (routing pe /7mail)

Structura proiectului

7mail/
├── backend/
│   ├── app/
│   │   ├── core/
│   │   ├── models/
│   │   ├── routes/
│   │   ├── schemas/
│   │   ├── services/
│   │   └── main.py
│   ├── alembic/
│   ├── scripts/
│   ├── requirements.txt
│   └── Dockerfile
├── frontend/
│   ├── src/
│   ├── public/
│   ├── package.json
│   ├── vite.config.ts
│   └── Dockerfile
├── postgres/
│   └── init.sql
├── nginx/
├── docker-compose.yml
├── deploy.sh
└── validate.sh

Frontend (stare actuala)

Rutele definite in aplicatie:

  • / - pagina publica (landing)
  • /admin - dashboard admin

Observatie: in cod exista multe componente pentru editor/campanii/template-uri/subscribers, dar la nivel de router principal sunt montate explicit doar cele 2 rute de mai sus.

Backend API (stare actuala)

Prefix API versionat: /api/v1

Auth

  • POST /api/v1/auth/register
  • POST /api/v1/auth/login
  • POST /api/v1/auth/refresh
  • GET /api/v1/auth/me
  • POST /api/v1/auth/lost-password

Templates

  • GET /api/v1/templates
  • GET /api/v1/templates/my
  • GET /api/v1/templates/{template_id}
  • POST /api/v1/templates
  • PUT /api/v1/templates/{template_id}
  • DELETE /api/v1/templates/{template_id}
  • POST /api/v1/templates/{template_id}/duplicate
  • GET /api/v1/templates/categories/list

Campaigns

  • GET /api/v1/campaigns
  • GET /api/v1/campaigns/{campaign_id}
  • POST /api/v1/campaigns
  • PUT /api/v1/campaigns/{campaign_id}
  • DELETE /api/v1/campaigns/{campaign_id}
  • POST /api/v1/campaigns/{campaign_id}/schedule
  • POST /api/v1/campaigns/{campaign_id}/send-now
  • POST /api/v1/campaigns/{campaign_id}/pause
  • GET /api/v1/campaigns/{campaign_id}/recipients

Subscribers

  • GET /api/v1/subscribers
  • POST /api/v1/subscribers
  • GET /api/v1/subscribers/{subscriber_id}
  • PATCH /api/v1/subscribers/{subscriber_id}
  • DELETE /api/v1/subscribers/{subscriber_id}
  • POST /api/v1/subscribers/import-csv
  • GET /api/v1/subscribers/export/csv

Recipient Lists

  • GET /api/v1/recipient-lists
  • GET /api/v1/recipient-lists/default
  • GET /api/v1/recipient-lists/{list_id}
  • POST /api/v1/recipient-lists
  • PUT /api/v1/recipient-lists/{list_id}
  • DELETE /api/v1/recipient-lists/{list_id}
  • GET /api/v1/recipient-lists/{list_id}/recipients
  • POST /api/v1/recipient-lists/{list_id}/recipients
  • POST /api/v1/recipient-lists/{list_id}/recipients/import
  • PUT /api/v1/recipient-lists/{list_id}/recipients/{recipient_id}
  • DELETE /api/v1/recipient-lists/{list_id}/recipients/{recipient_id}
  • POST /api/v1/recipient-lists/{list_id}/add-from-subscribers

Newsletter Designs

  • GET /api/v1/newsletter-designs
  • POST /api/v1/newsletter-designs
  • GET /api/v1/newsletter-designs/{newsletter_id}
  • PATCH /api/v1/newsletter-designs/{newsletter_id}
  • DELETE /api/v1/newsletter-designs/{newsletter_id}
  • POST /api/v1/newsletter-designs/{newsletter_id}/preview-html
  • GET /api/v1/newsletter-designs/{newsletter_id}/html
  • GET /api/v1/newsletter-designs/blocks/templates

Newsletter Media

  • POST /api/v1/newsletter-media/upload
  • GET /api/v1/newsletter-media/{media_id}
  • DELETE /api/v1/newsletter-media/{media_id}

Newsletters

  • GET /api/v1/newsletters/public
  • GET /api/v1/newsletters/my
  • POST /api/v1/newsletters/
  • GET /api/v1/newsletters/{newsletter_id}
  • PUT /api/v1/newsletters/{newsletter_id}
  • DELETE /api/v1/newsletters/{newsletter_id}
  • POST /api/v1/newsletters/{newsletter_id}/schedule
  • POST /api/v1/newsletters/{newsletter_id}/send
  • GET /api/v1/newsletters/admin/all

Content, Media, Contact, Admin Settings

  • GET /api/v1/content/page
  • GET /api/v1/content/sections
  • GET /api/v1/content/sections/{section_id}
  • POST /api/v1/admin/sections
  • PUT /api/v1/admin/sections/{section_id}
  • DELETE /api/v1/admin/sections/{section_id}
  • POST /api/v1/admin/sections/{section_id}/content
  • POST /api/v1/media/upload
  • DELETE /api/v1/media/{file_id}
  • GET /api/v1/media/list
  • POST /api/v1/contact
  • GET /api/v1/admin/contact-settings
  • PUT /api/v1/admin/contact-settings
  • POST /api/v1/admin/contact-settings/test
  • GET /api/v1/admin/email-settings
  • POST /api/v1/admin/email-settings/
  • PUT /api/v1/admin/email-settings/
  • POST /api/v1/admin/email-settings/test
  • GET /api/v1/admin/general-settings
  • PUT /api/v1/admin/general-settings
  • GET /api/v1/admin/users
  • GET /api/v1/admin/users/{user_id}
  • POST /api/v1/admin/users/
  • PUT /api/v1/admin/users/{user_id}
  • PATCH /api/v1/admin/users/{user_id}/role
  • DELETE /api/v1/admin/users/{user_id}

Tracking si SEO (fara prefix /api/v1)

  • GET /t/open/{tracking_token}
  • GET /t/click/{tracking_token}?url=<target>
  • GET /t/unsubscribe/{tracking_token}
  • GET /robots.txt
  • GET /sitemap.xml

Health

  • GET /api/health
  • GET /7mail/api/health

Mode de rulare

1) Rulare locala (fara Docker pentru frontend)

Backend

cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

Backend docs: http://localhost:8000/docs

Frontend

cd frontend
npm install
cp .env.example .env
npm run dev

Frontend dev: http://localhost:3000

2) Rulare cu Docker Compose

cp .env.example .env
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
docker-compose up -d --build

Important:

  • docker-compose.yml este orientat pe infrastructura cu Traefik si retea externa shop-online_web
  • serviciul frontend nu expune port direct catre host (foloseste expose), deci accesul browser depinde de proxy-ul Traefik
  • backend este expus pe http://localhost:8000

Cont implicit

  • Email: admin@example.com
  • Parola: admin123

Schimba credentialele in orice mediu non-local.

Variabile de mediu

Root .env.example

  • DB_USER
  • DB_PASSWORD
  • DB_NAME
  • DB_PORT
  • JWT_SECRET_KEY
  • BACKEND_CORS_ORIGINS
  • ENVIRONMENT
  • DEBUG

Backend .env.example

  • DATABASE_URL
  • JWT_SECRET_KEY
  • JWT_ALGORITHM
  • ACCESS_TOKEN_EXPIRE_MINUTES
  • API_V1_STR
  • PROJECT_NAME
  • PUBLIC_BASE_URL
  • BACKEND_CORS_ORIGINS
  • UPLOAD_DIR
  • MAX_UPLOAD_SIZE
  • ADMIN_EMAIL
  • ADMIN_PASSWORD
  • ENVIRONMENT

Frontend .env.example

  • VITE_API_URL
  • VITE_ENVIRONMENT

Comenzi utile

# Validare rapida structurala
bash validate.sh

# Deploy helper script local
bash deploy.sh local

# Loguri docker
docker-compose logs -f backend
docker-compose logs -f frontend
docker-compose logs -f postgres

# Oprire servicii
docker-compose down

Observatii importante

  • Modelele Campaign, RecipientList si CampaignRecipient sunt in backend/app/models/template.py.
  • Exista si fisierul backend/app/routes/template_fixed.py, dar routerul incarcat in aplicatie este backend/app/routes/template.py.
  • In frontend/vite.config.ts, base este setat la /7mail/.

Testare rapida API

# Login
curl -X POST http://localhost:8000/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@example.com","password":"admin123"}'

# List templates (inlocuieste <TOKEN>)
curl -H "Authorization: Bearer <TOKEN>" \
  http://localhost:8000/api/v1/templates

Licenta

MIT

Repository

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors