Думки щодо сайту-альтернативи 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-стрічок