Давно хотел сделать свой PasteBin, так как существующие хоть и выполняют задачу, но имеют слишком захламленный интерфейс.
Мне всегда лень было это сделать. Пробовал несколько раз, но даже учитывая что кода нужно самый минимум, до конца не доводил.
Недавно опять понадобился PasteBin, и я вспомнил про PocketBase.
С помощью DeepSeek и PocketBase я за несколько часов сделал работающее приложение. Всю муторную работу выполнил DeepSeek.
Фичи моего PasteBin:
-
Простой интерфейс.
-
Ни строчки Backend кода, благодаря PocketBase.
Что это и зачем?
PasteBin — это хранилище для фрагментов текста, предназначенное для пересылки, просмотра и копирования этого текста.
Допустим, мне нужно поделиться с коллегой куском кода, или файлом конфигурации, или инструкцией к чему-нибудь. В сообщение мессенджера большой текст не помещается, читать неудобно.
Поэтому я вставляю текст в PasteBin, получаю ссылку и отправляю коллеге ссылку на просмотр.
Ближайшим аналогом будет GitHub Gist, но он нацелен на долговременное хранение текстов, а в PasteBin — кратковременное хранение, на часы или дни.
Опыт с PocketBase
Я ранее писал про PocketBase: PocketBase: бэкенд без кода
PocketBase позволяет не писать бэкенд для доступа к данным. По сути, он является прослойкой для доступа из JS к серверной БД SQlite через готовое универсальное HTTP API.
Одной из сопутствующих целей проекта была попробовать PocketBase “в бою”. Выяснилось, что и у PocketBase есть недостатки, которые в первой же практической задаче привели к костылям.
Правила доступа
Нам требуется обеспечить безопасный доступ к данным. Как это сделать?
Для этого в PocketBase настраиваются правила доступа к коллекциям, так называемые API Rules. Грубо говоря, это фильтры, по которым PocketBase определяет, можете ли вы прочесть или изменить конкретную запись в БД.
Кейс PasteBin
Для PasteBin задумка проста: авторизация не требуется, любой с доступом к ссылке может просмотреть текст по ссылке.
Таким образом, для каждого фрагмента мы храним код который указывается в ссылке, по нему же и проверяется доступ к фрагменту.
Пример:
https://pastebin.leonidchernenko.ru/?p=K43plD
Проблема
Для доступа к пасте с нужным кодом мы используем запрос поиска с указанием кода пасты.
PocketBase позволяет настроить фильтры для доступа к коллекции, но нельзя задать фильтр так, чтобы в поиске всегда использовалось обязательное поле. Это приводит к тому, что убрав поля из фильтра на стороне клиента, можно выполнить запрос поиска без фильтрации по коду и получить все записи из БД.
Как решить?
- Использовать в фильтре Query-параметр запроса, дополнительно передать в него код пасты. Так как фильтр определяется сервером, клиент не сможет его обойти.
- Переключиться с использования поля
code
на использование Primary Key, и запрашивать записи не поиском а другим методом, View. Приемлемый вариант, тем более что PocketBase использует “буквенные” первичные ключи. Но я не захотел привязываться к PK а также “светить” его на самом видном месте. - Расширить поведение PocketBase через внедрение Backend кода в обработку API. Слишком много заморочек, решил так не делать.
- Самый очевидный вариант — настроить фильтр поиска на поле используемое в поиске. Но PocketBase так не умеет, увы.
Костыль
В итоге выбрал первый вариант. Но столкнулся с проблемой: в API PocketBase не предусмотрено добавление Query параметров в запрос. Поэтому пришлось слегка закостылить и написать запрос поиска пасты не через JS SDK PocketBase а через обычный fetch. В нём я уже добавил параметр и всё заработало.