Думки щодо сайту-альтернативи Reddit
Роздумую над тим як можно зробити такий сайт, уточнюю попередні думки
Ітак, попередній пост знаходиться тут. Після того я ще думав як організувати сайт щоб мінімально навантажувати сервер та більше роботи перенести на клієнт.
Я вже прийшов до думки, що потрібно писати RSS клієнт, який буде слідкувати за купою RSS стрічок. Просто цей рідер буде дуже схожим на соціальну мережу з соціальною складовою: реації, коментарі.
Рідер працює наступним чином:
- Користувач логінеться через OAuth-провайдер
- Генерується JWT токен, який зберігається на клієнті. В токені:
:user_idкористувача, яке є похідним відemail–sha256(: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-стрічок