Своя неделя и своя история
Сетка по дням с блоками и точками напоминаний. Границы окна задаёт фронт: бэк отдаёт пересекающиеся интервалы, а не лежащие внутри, поэтому событие через полночь видно в обоих днях.
Свой день, неделя и напоминания — в одном месте. Чужая занятость видна по @username, но содержимое закрыто, если ты его закрыл. Обезличивание происходит на сервере, поэтому название записи физически не уезжает в браузер.
Неделя занятости. Цветной блок — то, чем занят человек и что он готов показать. Серый — то, что он занят, но не рассказал.
Два вопроса разделены специально. Человек может не хотеть, чтобы мир знал, что в это время он у врача, — и при этом хотеть, чтобы друзья не пришли к нему в гости.
| Уровень | Ты | Друг | Чужой |
|---|---|---|---|
| PRIVATEПо умолчанию. Не показывать, чем занят, безопаснее, чем показывать всем | Видно | Серый блок | Серый блок |
| FRIENDSСодержимое видно друзьям в любую сторону | Видно | Видно | Серый блок |
| LISTРовно тем, кого ты назвал. Список не может быть пустым | Видно | По списку | Серый блок |
| PUBLICВсем, у кого профиль открыт | Видно | Видно | Видно |
Настоящие имя и почта необязательны. Пароль в демо-режиме хранится как есть — для проверки, не для продакшена.
Событие — это отрезок, напоминание — точка. Наложения разрешены: «занят» и не обязан быть непротиворечивым.
У каждой записи своя видимость. По умолчанию PRIVATE, так что забыть и открыть всё случайно нельзя.
Web Push приходит в браузер в назначенный момент. Одноразовый или по cron-правилу с часовым поясом.
Сетка по дням с блоками и точками напоминаний. Границы окна задаёт фронт: бэк отдаёт пересекающиеся интервалы, а не лежащие внутри, поэтому событие через полночь видно в обоих днях.
Cron в часовом поясе напоминания, а не сервера. «Каждый день в 9:00» считается там, где находится человек. Шестое поле cron — секунды, и об этом сервис предупреждает заранее.
Страница человека по адресу /u/anna. Закрытый профиль отдаёт 404, а не 403: код 403 подтверждал бы, что имя занято, и позволял бы перебирать чужие.
Push подписывается в браузере, а уходит с бэка. Приватный ключ VAPID на фронт не попадает: бэк сам отдаёт публичный ключ одной ручкой.
Браузер знает только про Next. Идентичность берётся из подписанной cookie, а бэк видит заголовок и общий секрет, подтверждающий, что запрос пришёл от Next.
У каждой доменной ошибки свой код и текст, а не «что-то пошло не так». Форма подсвечивает конкретное поле, а не показывает красное обвестие вокруг всей карточки.
Без мелкого шрифта: пять правил, которые определяют, что сервис вообще такое.
Свою занятость видно всем, у кого профиль открыт. Это и есть смысл сервиса: «я занят» должно быть видно.
Содержимое записи — другое дело. Оно не показывается никому, кроме тех, кому ты разрешил, и не уезжает в браузер.
У закрытого профиля занятость не видна вообще: даже серых блоков не будет. Иначе «закрытый профиль» ничего бы не значил.
Чужие записи не редактируются и не удаляются: попытка достать чужое даёт 404, как будто его нет.
Уведомления приходят в браузер, а не в приложение. Браузер закрыт — уведомление пропущено, и это нормально.
Занятость видна всем, у кого открыт профиль. Чем именно занят — только тем, кому ты это разрешил.