Думаю доработать свой Fitness Calendar, чтобы он стал выглядеть как полноценное приложение, и выложить его на гитхаб или захостить в ажур
Вот чат даже план готовый расписал
Отлично, давай разложу Habit Tracker так, чтобы ты мог прямо сегодня начать: фичи → БД (MS SQL) → API (.NET) → фронт (React) → Hangfire → email → MVP-план.
1) Что именно делаем (минимум и «вкусняшки»)
MVP (чтобы заработало и было не стыдно)
-
Регистрация/логин (JWT)
-
Список привычек (CRUD)
-
Отметка “сделано сегодня” (check-in)
-
Streak (текущая серия + лучшая)
-
Weekly stats (за 7/28 дней)
-
Heatmap за последние 365 дней
Nice-to-have (красиво для портфолио)
-
Цель: “X раз в неделю” или “ежедневно”
-
Напоминания (email)
-
Timezone per user (чтобы “сегодня” было корректно)
-
Архив привычек вместо удаления
-
Экспорт в CSV
2) MS SQL схема (простая и правильная)
Таблицы
Users
-
Id (uniqueidentifier)
-
Email (nvarchar, unique)
-
PasswordHash
-
TimeZoneId (nvarchar, default 'Europe/Zaporozhye')
-
CreatedAt
Habits
-
Id
-
UserId (FK)
-
Title
-
Description (nullable)
-
Color (nullable, для UI)
-
FrequencyType (tinyint) — Daily / Weekly
-
TargetPerWeek (tinyint, nullable) — если Weekly
-
IsArchived (bit)
-
CreatedAt
HabitCheckins
-
Id
-
HabitId (FK)
-
UserId (FK, чтобы фильтровать быстрее)
-
Date (date) — ключевой момент: храним как date, не datetime
-
CreatedAt
EmailReminders
-
Id
-
UserId
-
HabitId (nullable — можно общий reminder)
-
TimeLocal (time) — например 20:30
-
DaysOfWeek (tinyint bitmask, nullable) — или отдельная таблица
-
IsEnabled
Важные ограничения
-
UNIQUE (HabitId, Date)— чтобы нельзя было дважды отметить один день -
Индекс:
(UserId, Date)на HabitCheckins — для heatmap и статистики
3) API эндпоинты (то, что реально нужно фронту)
Habits
-
GET /api/habits -
POST /api/habits -
PUT /api/habits/{id} -
POST /api/habits/{id}/archive
Check-ins
-
POST /api/habits/{id}/checkinsbody:{ date?: 'YYYY-MM-DD' }(если не передали — берём “сегодня” в TZ пользователя) -
DELETE /api/habits/{id}/checkins/{date}(снять отметку)
Analytics
-
GET /api/habits/{id}/streak→{ currentStreak, bestStreak, lastCheckinDate } -
GET /api/habits/{id}/weekly-stats?weeks=12→ массив по неделям -
GET /api/habits/{id}/heatmap?from=YYYY-MM-DD&to=YYYY-MM-DD→{ date, count }[](count обычно 0/1 для одной привычки; для общего heatmap можно суммировать все привычки)
💡 Вариант: сделать общий heatmap по всем привычкам:
-
GET /api/analytics/heatmap?days=365
4) Как считать streak правильно (важный алгоритм)
Текущий streak
-
Берём все даты check-in по привычке, сортируем убыв.
-
Если последняя дата != today и != yesterday → streak = 0
-
Иначе считаем сколько подряд дней без дырок.
Best streak
-
Можно считать “на лету” по списку дат
-
Или хранить денормализовано в Habits (но MVP проще без этого)
5) React UI (минимальный набор экранов)
Страницы
-
Login/Register
-
Dashboard:
-
карточки привычек (с кнопкой “done today”)
-
current streak
-
mini weekly summary
-
-
Habit details:
-
heatmap (как GitHub)
-
weekly chart
-
список последних отметок
-
Heatmap библиотека
Самый простой вариант:
-
react-calendar-heatmap(готовый “github-like”)
Или своя сетка на CSS Grid (если хочешь “без либ”).
6) Hangfire: зачем и какие джобы
Где Hangfire реально нужен
-
Email reminders (ежедневный планировщик)
-
Recalculate statistics (если захочешь кэшировать агрегаты)
-
Digest email раз в неделю (по желанию)
Простой подход (MVP)
-
Каждую минуту/5 минут job:
-
выбирает reminders, у которых “пора” (с учётом TZ)
-
шлёт письмо
-
пишет лог отправки (опционально)
-
Hangfire storage можно держать в том же MS SQL.
7) Email notification (без боли)
Для портфолио лучше:
-
SendGrid / Mailgun / SMTP (например, Gmail SMTP, но упрётся в ограничения)
-
Локально: “писать в лог + показывать в UI” (как mock), а потом переключить на реальную отправку
Письмо:
-
тема: “Время тренировки: {HabitTitle}”
-
кнопка: “Отметить как сделано” (deep link на фронт)
😎 MVP план по шагам (чтобы не утонуть)
День 1–2
-
Auth + Users
-
Habits CRUD
День 3
-
Check-in endpoints + уникальность (HabitId, Date)
День 4
-
Streak + weekly stats на backend
День 5
-
React dashboard + habit details
День 6
-
Heatmap + weekly график
День 7
-
Hangfire + простые email reminders (или mock)
9) Чтобы выглядело “по-взрослому” в GitHub
-
README:
-
скриншоты UI
-
ERD схема БД
-
список фич
-
как запустить через docker-compose
-
-
Docker-compose:
api + mssql + hangfire dashboard -
Тесты:
-
streak algorithm unit tests
-
integration test на “не дать два чек-ина в один день”
-
Если хочешь, я в следующем сообщении сразу дам готовый “скелет” проекта:
-
структуру solution (Domain/Application/Infrastructure/WebApi)
-
DDL для MS SQL (таблицы + индексы + уникальные ключи)
-
DTO + контроллеры (минимальные)
-
и пример React-страниц + heatmap компонент
Скажи только: ты хочешь Clean Architecture + MediatR или простой слойный вариант (Controllers → Services → EF)?