78 lines
3.5 KiB
Markdown
78 lines
3.5 KiB
Markdown
# InboxIntel — Inbox Intelligence Platform
|
|
|
|
A Gmail analytics, cleanup, and automation app. Connects via Google OAuth2, syncs your inbox into PostgreSQL, and gives you a draggable analytics dashboard, safe bulk cleanup, unsubscribe management, optional AI analysis, advanced search, and PDF/CSV/JSON exports.
|
|
|
|
This repository is a full-stack **scaffold** structured for the 15-step implementation plan. Every layer is wired and compiles; the business logic is functional, with a few integration points (Gmail parsing edge cases, AI prompt tuning) intentionally left as clearly-marked extension points.
|
|
|
|
## Architecture
|
|
|
|
Clean Architecture across four backend projects plus a React SPA:
|
|
|
|
```
|
|
src/
|
|
InboxIntel.Domain Entities + enums. No external dependencies.
|
|
InboxIntel.Application Service interfaces, DTOs, validators, query parser.
|
|
InboxIntel.Infrastructure EF Core, Gmail client, sync worker, AI, export.
|
|
InboxIntel.Api ASP.NET Core Web API: auth, controllers, DI, Serilog.
|
|
frontend/ React + Vite dashboard (Chart.js, react-grid-layout).
|
|
tests/ Unit + integration test projects.
|
|
```
|
|
|
|
Dependency rule: `Api -> Infrastructure -> Application -> Domain`. Controllers contain no business logic; they delegate to Application-layer service interfaces resolved through DI.
|
|
|
|
See `docs/ARCHITECTURE.md` for the full design, data model, and request flow.
|
|
|
|
## Tech stack
|
|
|
|
.NET 8 / ASP.NET Core, EF Core + Npgsql (PostgreSQL), Hosted background worker, Serilog, FluentValidation, Polly (retry + backoff), Google.Apis.Gmail, QuestPDF/CsvHelper for exports, React 18 + Vite + Chart.js + react-grid-layout.
|
|
|
|
## Running with Docker (recommended)
|
|
|
|
```bash
|
|
cp .env.example .env # then fill in Google OAuth credentials
|
|
docker compose up --build
|
|
```
|
|
|
|
Services: PostgreSQL (5432), API (8080), frontend (8081). Optional reverse proxy:
|
|
|
|
```bash
|
|
docker compose --profile proxy up --build # everything on port 80
|
|
```
|
|
|
|
The API applies EF migrations automatically on startup (`Database:AutoMigrate`).
|
|
|
|
## Running locally (without Docker)
|
|
|
|
1. Start PostgreSQL and set the connection string in `src/InboxIntel.Api/appsettings.Development.json`.
|
|
2. Create the initial migration and database:
|
|
|
|
```bash
|
|
dotnet tool install --global dotnet-ef
|
|
dotnet ef migrations add InitialCreate \
|
|
-p src/InboxIntel.Infrastructure -s src/InboxIntel.Api
|
|
dotnet ef database update -p src/InboxIntel.Infrastructure -s src/InboxIntel.Api
|
|
```
|
|
|
|
3. Run the API and the frontend:
|
|
|
|
```bash
|
|
dotnet run --project src/InboxIntel.Api # http://localhost:5080
|
|
cd frontend && npm install && npm run dev # http://localhost:5173
|
|
```
|
|
|
|
## Google OAuth2 setup
|
|
|
|
Create an OAuth client (type: Web application) in the Google Cloud Console. Add the Gmail API. Authorized redirect URI: `http://localhost:5080/signin-google` (dev) and your production URL. Put the client id/secret in `.env` or user-secrets. Scopes requested: `openid email profile gmail.readonly gmail.modify` (no send scope).
|
|
|
|
## Security notes
|
|
|
|
OAuth refresh tokens are encrypted at rest with the ASP.NET Core Data Protection API (AES) and never logged. Keys persist to a mounted `/keys` volume. All destructive cleanup and unsubscribe actions require an explicit `Confirmed` flag and a server-side preview. The AI layer is advisory only — it never performs destructive actions.
|
|
|
|
## Tests
|
|
|
|
```bash
|
|
dotnet test
|
|
```
|
|
|
|
Unit tests cover the Gmail query parser and unsubscribe extraction; integration tests boot the API host and assert authorization is enforced.
|