Сервис коротких ссылок с аналитикой — это полноценный проект для тренировки архитектуры, с аутентификацией, доменной логикой, инфраструктурой и статистикой.
Пользователи регистрируются, создают короткие ссылки на свои URL, получают статистику по кликам. Админы видят глобальную аналитику и управляют блоклистом. Фокус на backend: clean/onion архитектура, SOLID, PostgreSQL + Alembic. Фронтенд: только Swagger + 1 простая HTML-страница для создания ссылки и просмотра своей статистики (fetch + таблица).
- User: id, nickname, hashed_password, salt, role (user/admin), created_at.
- Link: id, short_code (уникальный, 6–8 символов), original_url, owner_user_id, custom_slug (опционально), is_active, created_at, expires_at (опционально).
- Click: id, link_id, ip_address, user_agent, referrer (опционально), country (опционально, заглушка по IP), created_at (timestamp клика).
- BlockedDomain: domain (для админов), reason, is_active (чтобы блокировать подозрительные ссылки).
POST /auth/register— {nickname, password} → user_id, access_token.POST /auth/login— {nickname, password} → access_token.GET /auth/me— текущий user info.
POST /links— {original_url, custom_slug?, expires_at?} → {short_url, link_id}.GET /links— ?page, ?limit → список своих ссылок (paginated).GET /links/{id}— детали ссылки.DELETE /links/{id}— удалить свою.
GET /links/{id}/stats— ?from_date, ?to_date → {total_clicks, unique_ips, top_countries: [...], clicks_per_day: [...]}.GET /links/{id}/clicks— ?page, ?limit → список кликов (paginated).
GET /r/{short_code}— redirect to original_url, лог клика (async).
GET /admin/links— все ссылки (paginated).GET /admin/stats/global— общая статистика (total_links, total_clicks и т.д.).POST /admin/blocked-domains— {domain, reason}.GET /admin/blocked-domains— список.
- Замените параметры в файле .env на свои
- Запустите контейнер командой:
docker compose up --build - Сайт откроется на http:/localhost:8000/index.html
- Сваггер откроется на http:/localhost:8000/docs