Публікація

Думки щодо сайту-альтернативи Reddit

Роздумую над тим як можно зробити такий сайт, уточнюю попередні думки

Ітак, попередній пост знаходиться тут. Після того я ще думав як організувати сайт щоб мінімально навантажувати сервер та більше роботи перенести на клієнт.

Я вже прийшов до думки, що потрібно писати RSS клієнт, який буде слідкувати за купою RSS стрічок. Просто цей рідер буде дуже схожим на соціальну мережу з соціальною складовою: реації, коментарі.

Рідер працює наступним чином:

  • Користувач логінеться через OAuth-провайдер
  • Генерується JWT токен, який зберігається на клієнті. В токені: :user_id користувача, яке є похідним від emailsha256(:email + env.SALT);
  • Рідер зчитує профіль користувача /u/:user_id/profile.json, та зберігає в localStorage['profile']. Cписок підписок – це посилання на RSS стрічки у вигляді /u/:user_id/:year/:month/:day/feed.xml. Якщо профіля не існує – пропонується створити Рідер зчитує підписки користувача /u/:user_id/subscribed.json які представлені у вигляді посилань: /u/:user_id/updates.json (фід користувача) або /m/feeds.feedburner.com/itcua (фід-дзеркало);
  • В рідері в фоні (WebWorker) працює безкінечний цикл на базі setInterval(), який бере список підписок, відсортований по даті останнього зчитування, бере підписку, яка оновлювалася найдавніше, робить запрос на отримання даних, парсить XML та зберігає записи в IndexedDB, повідомляє основну сторінку про оновлення, ставить дату оновлення підписки поточну;
  • Коли користувач знаходиться на сторінці, то робиться запрос postMessage({ type: 'fetch_updates' }) для отримання оновлень від WebWorker і в setInterval() цей запрос повторюється кожну хвилину;
  • В стрічці користувач має каретку часу until (timestamp), яка вказує на час до якого потрібно показувати оновлення, якщо є оновлення, які є перевершують каретку часу, то показується плашка Показати N оновлень. Головними моментами, в котрих я маю сумління, це те як оновлювати стрічку користувача /u/:user_id/:year/:month/:day/updates.json. Думаю, що стрічка буде оновлюватися напряму, коли користувач додає новий пост. Це оновлення буде записуватися в стрічку поточного дня. В підписках будуть як прямі URL на стрічки, так і URL з паттерном /u/2fd4e1c67a2d28fced849ee1bb76e7391b93eb12/:year/:month/:day/updates.json. Ці підстановки будуть зроблені автоматично при зборі інформації зі стрічок по мірі гортання користувачом стрічки.

Головна стрічка-редірект буде за адресою: /u/:user_id/updates.xml в котру буде записуватися редірект на останній фід при створенні посту.

Як працюють реакції та коментарі:

Гарним питанням є коментарі та реакції. Може бути два шляхи: або продовжити зберігання в R2, або використати Clouflare D1.

Пост зберігається у R2 за посиланням: /u/:user_id/:year/:month/:day/:slug/index.html.

Тим не меньш. Коментарі та реакцію будуть працювати так:

  • При гортанні стрічки робиться запит /u/:user_id/:year/:month/:day/:slug/reactions.json де зберігаються всі реакції до посту;
  • При переході до посту робиться запит /u/:user_id/:year/:month/:day/:slug/comments.json де зберігаються всі кометраі до посту.

Ці два файли будуть оновлюватися cron-скриптом, котрий буде брати коментарі та реакції з D1. Для додавання кометарів та реакцій буде дві таблиці:

:update_type = ps|cm|ra|rp|sb – shortcut of post|comment|reaction|repost|subscription UPDATE_ID = :timestamp:update_type:user_id

1
2
3
4
- update_id UPDATE_ID
- user_id string
- date datetime
- data json

Підписки кладуться в /u/:user_id/subscribed.json, /u/:user_id/subscribers.json при кожній підпиці/відписці.

В підсумку, як виглядає файлова структура в S3:

1
2
3
4
5
6
7
8
9
/u/:user_id/:year/:month/:day/:slug/index.html – Контент посту, в директорію складаються завантажені користувачем ассети (зображення, відео, аудіо)
/u/:user_id/:year/:month/:day/updates.json – Стрічка оновлень корстувача за день
/u/:user_id/updates.json – Стрічка-редірект на фід за останній день
/u/:user_id/subscribed.json – Список підписок
/u/:user_id/subscribers.json – Список підписників
/u/:user_id/blocked.json - Список заблокованих користувачів
/u/:user_id/profile.json - Профіль користувача (username, etc.)
/u/:user_id/avatar.jpg – Аватар користувача
/updates/:year/:month/:day/comments.json – Коментарі за день

Як виглядає список колекцій:

Список колекцій зберігається на Github в форматі YAML.

1
2
3
4
5
6
- url: /u/:user_id/updates.json
  groups: [User]
- url: /m/t.me/liganet
  groups: [Mirror]
- url: /m/feeds.feedburner.com/itcua
  groups: [Mirror]

Є декілька типів RSS стрічок:

  • /u – користувацька стрічка
  • /m – стрічка-дзеркало для телеграм та зовнішніх RSS-стрічок
Публікація захищена ліцензією CC BY 4.0 .