1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/pocketbase

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
CHANGELOG_8_15.md 71 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
root Отправлено 26.09.2024 16:59 36529a9

Список изменений с версии v0.8.x до версии v0.15.x

v0.15.3

  • Обновлён интерфейс администратора (Admin UI) для использования последней версии JS SDK, чтобы разрешить конфликт поля записи isNew (#2385).

  • Исправлен z-index полноэкранного поля editor (#2410).

  • Вставляет настройки приложения по умолчанию как часть миграции системы init, чтобы они всегда были доступны при доступе из пользовательской миграции (#2423).

v0.15.2

  • Исправлено разрешение идентификаторов в запросе вида SELECT DISTINCT (#2349-5706019).

  • Исправлено неправильное разрешение схемы коллекции вида в нескольких полях с псевдонимами, происходящих из одного источника поля (#2349-5707675).

  • Добавлена резервная информация о перенаправлении OAuth2, чтобы уведомить пользователя о необходимости вернуться в приложение, если окно браузера не закрывается автоматически.

v0.15.1

  • Запускает связанные события подписки в реальном времени модели Record при сохранении структуры модели (#2325).

  • Исправлена ошибка, когда сочетание клавиш Ctrl + S в поле editor не распространяло ярлык быстрого сохранения на родительскую форму.

  • Добавлено сочетание клавиш ⌘ + S для ярлыка быстрого сохранения записи (у меня нет устройства Mac для тестирования, но оно должно работать на основе документации e.metaKey).

  • Включён RTL для редактора TinyMCE (#2327).

  • Уменьшены сдвиги вертикального макета формы записи и немного улучшена скорость рендеринга при загрузке нескольких полей relation.

  • Активирован кэш ресурсов интерфейса администратора.

v0.15.0

  • Упрощён поток аутентификации OAuth2 в одном вызове «всё в одном» (#55). Требуется JS SDK версии 0.14.0+ или Dart SDK версии 0.9.0+. Старый метод обмена кодом и токеном всё ещё поддерживается, но метод SDK переименован в authWithOAuth2Code() (чтобы минимизировать критические изменения, в JS SDK есть функция перегрузки, которая будет проксировать существующие вызовы authWithOauth2 на authWithOAuth2Code). Для получения дополнительной информации и примера вы можете проверить https://pocketbase.io/docs/authentication/#oauth2-integration.

  • Поддерживаются защищённые файлы (#215). Требуется JS SDK версии 0.14.0+ или Dart SDK версии 0.9.0+. Работает с недолговечным (~5 минут) токеном файла, переданным как параметр запроса с URL файла. Для получения дополнительной информации и примеров вы можете проверить https://pocketbase.io/docs/files-handling/#protected-files.

  • ⚠️ Исправлена опечатка в Record.WithUnkownData() -> Record.WithUnknownData().

  • Добавлена поддержка простого поиска по шаблону в интерфейсе администратора.

  • Добавлен авторежим «черновик», позволяющий восстановить предыдущее состояние записи в случае случайного обновления или сбоя питания.

  • Добавлено сочетание клавиш Ctrl + S, позволяющее сохранить изменения в записи без закрытия панели.

  • Добавлена поддержка «перетаскивания файлов» для поля загрузки файлов.

  • Обновился интерфейс администратора OAuth2.

v0.14.5

  • Проверяется наличие нулевых хуков в forms.RecordUpsert, когда используется с пользовательским Dao (#2277).

  • Исправлена проблема, из-за которой подробное сообщение об ошибке уникальности не возвращалось при сбое создания записи (#2287).

v0.14.4

  • Исправлена одновременная запись карты, вызывающая панику в кэше list.ExistInSliceWithRegex() (#2272).

v0.14.3

  • Исправлены проблемы с визуализацией метаданных в Firefox в интерфейсе администратора Logs (#2221).

  • Выполнено понижение до версии 1 пакета aws/aws-sdk-go, поскольку версия 2 имеет проблемы совместимости с GCS (#2231).

  • Обновлено... GitHub action to use min Go 1.20.3 для предкомпилированного исполняемого файла, поскольку он содержит некоторые незначительные исправления безопасности в net/http.

v0.14.2

  • Частично восстановлена старая обработка COALESCE как запасной вариант для поддержки сравнения пустых строк с отсутствующими объединёнными полями отношений.

v0.14.1

  • Исправлены события реального времени, срабатывающие до завершения загрузки файлов.
  • Обновлена базовая библиотека S3 до использования aws-sdk-go-v2 (#1346; спасибо @yuxiang-gao).
  • Обновлено TinyMCE до версии 6.4.1.
  • Обновлён godoc методов Dao.Save*.

v0.14.0

  • Добавлена экспериментальная интеграция Apple OAuth2.
  • Добавлена поддержка правил фильтра @request.headers.*.
  • Поддержка расширенных уникальных ограничений и управления индексами (#345, #544).
  • Упрощён интерфейс полей коллекций для облегчения и ускорения создания схемы данных.
  • Устаревший метод SchemaField.Unique. Теперь уникальные ограничения управляются через индексы. Поле Unique не используется и будет удалено в будущей версии.
  • Из некоторых сгенерированных условий фильтрации удалена упаковка COALESCE для более эффективного использования индексов (#1939).
  • Столбцы представления id распознаются как отдельные поля отношения (#2029).
  • Оптимизирован поиск по одному отношению.
  • Нормализованы значения записей при изменении параметра поля maxSelect (select, file, relation). При переходе от одного к нескольким все уже вставленные одиночные значения преобразуются в массив. При переходе от нескольких к одному сохраняется только последний элемент из уже вставленных элементов массива.
  • Коэффициент стоимости/раунда генерации хэша bcrypt изменён с 13 на 12, так как несколько пользователей жаловались на медленные ответы authWithPassword на оборудовании с низкими характеристиками. Изменение повлияет только на новых пользователей. В зависимости от спроса мы можем сделать его настраиваемым в параметрах аутентификации.
  • Упрощены стили шаблонов почты по умолчанию для большего контроля над макетом шаблона (#1904).
  • Возможность явно установить идентификатор записи в пользовательском интерфейсе администратора (#2118).
  • Команда migrate history-sync для очистки таблицы истории _migrations от ссылок на удалённые файлы миграции.
  • Новые поля в структуре core.RecordAuthWithOAuth2Event:
IsNewRecord     bool,          // логическое поле, указывающее, создал ли действие OAuth2 новую запись авторизации
ProviderName    string,        // имя провайдера OAuth2 (например, "google")
ProviderClient  auth.Provider, // загруженный клиент провайдера
  • CGO linux target для предкомпилированного исполняемого файла.
  • ⚠️ Переименованы daos.GetTableColumns() в daos.TableColumns() для единообразия с другими помощниками Dao для таблиц.
  • ⚠️ Переименован daos.GetTableInfo() в daos.TableInfo() для единообразия с другими помощниками Dao для таблиц.
  • ⚠️ Изменён types.JsonArray для поддержки указания универсального типа, например, types.JsonArray[T]. Если вы ранее использовали types.JsonArray, вам необходимо обновить его до types.JsonArray[any].
  • ⚠️ Зарегистрировано промежуточное ПО RemoveTrailingSlash только для маршрутов /api/*, поскольку оно вызывает проблемы с конечными точками обслуживания файлов по подпути ([#2072]).
  • ⚠️ Значение метода в журналах запросов изменено на ВЕРХНИЙ РЕГИСТР, например, «get» => «GET» (#1956).
  • Другие незначительные улучшения интерфейса.

v0.13.4

  • Удалена активная проверка уникального имени коллекции для поддержки ленивой проверки во время массового импорта.

v0.13.3

  • Исправлен импорт коллекций представлений (#2044).
  • Обновлён пользовательский интерфейс выбора записей администратора для правильного отображения представления. Отношения коллекций.

v0.13.2

  • Исправлена ошибка JS в админке при выборе нескольких полей file в качестве отношения «Отображаемые поля» (#1989).

v0.13.1

  • Добавлена поддержка метода запроса HEAD для маршрута /api/files/:collection/:recordId/:filename (#1976).

v0.13.0

  • Введён новый тип коллекции «Просмотр», позволяющий создавать коллекцию только для чтения на основе пользовательского SQL-запроса SELECT. Он поддерживает:

    • агрегации (COUNT(), MIN(), MAX(), GROUP BY и т. д.);
    • псевдонимы столбцов и таблиц;
    • CTE и выражения подзапросов;
    • автоматическую ассоциацию полей отношений;
    • проксирование полей файлов (до 5 связанных отношений, например, view1->view2->...->base);
    • фильтры, сортировку и расширение;
    • правила API списка и просмотра.
  • Добавлено автоматическое повторение с отказом (по умолчанию 8 попыток) для запросов SELECT, чтобы корректно обрабатывать ошибки типа «база данных заблокирована» (#1795). Максимальное количество попыток можно получить или изменить через Dao.MaxLockRetries.

  • Установлен максимальный тайм-аут выполнения запроса по умолчанию (30 с). Тайм-аут по умолчанию можно получить или изменить с помощью Dao.ModelQueryTimeout. Для готовых исполняемых файлов его также можно изменить с помощью флага --queryTimeout=10.

  • Поддержка dao.RecordQuery(collection) для прямого сканирования результатов One() и All() в *models.Record или []*models.Record, без необходимости явного использования NullStringMap.

  • Возможность перезаписать стандартные заголовки ответа сервера, если установлен явный заголовок ответа.

  • Добавление эскизов к файлам при визуализации полей отображения файлов.

  • Опция «Минимальный выбор» для поля отношения.

  • Доступ к os.Environ() через process.env в JS-миграциях.

  • Поле UploadedFiles добавлено в структуры событий RecordCreateEvent и RecordUpdateEvent.

  • ⚠️ Файлы загружаются после сохранения записи, что позволяет безопасно устанавливать уникальный идентификатор записи из хука OnModelBeforeCreate.

  • ⚠️ Функция System.GetFile() теперь возвращает непосредственно *blob.Reader, а не интерфейс io.ReadCloser.

  • ⚠️ Поля To, Cc и Bcc в mailer.Message изменены на []mail.Address для единообразия и возможности использовать несколько получателей и необязательное имя.

    Если вы отправляете собственные электронные письма, вам придётся заменить:

    message := &mailer.Message{
      ...
    
      // (старое) To: mail.Address{Address: "to@example.com"}
      To: []mail.Address{{Address: "to@example.com", Name: "Some optional name"}},
    
      // (старое) Cc: []string{"cc@example.com"}
      Cc: []mail.Address{{Address: "cc@example.com", Name: "Some optional name"}},
    
      // (старое) Bcc: []string{"bcc@example.com"}
      Bcc: []mail.Address{{Address: "bcc@example.com", Name: "Some optional name"}},
    
      ...
    }
  • ⚠️ Интеграция Authentik переработана в более общий провайдер «OpenID Connect» (oidc), который поддерживает любые OIDC-провайдеры (Okta, Keycloak и др.). Если вы ранее использовали Authentik, убедитесь, что ключ провайдера в вашем коде переименован в oidc. Чтобы включить более одного провайдера OIDC, можно использовать дополнительные ключи провайдеров oidc2 и oidc3.

  • ⚠️ Убраны ранее устаревшие помощники Dao.Block() и Dao.Continue() в пользу Dao.NonconcurrentDB().

  • Улучшения в административном интерфейсе.

v0.12.3

  • Исправлено отсутствие реакции «Переключить столбец» при переходе между коллекциями (#1836).

  • Регистрация текущего времени и даты при запуске сервера (#1822).

v0.12.2

  • Устранена проблема с кнопкой «Очистить» в компоненте выбора даты, которая не очищала значение (#1730).

  • Небольшое увеличение контрастности полей (#1742).

  • Автоматическое закрытие выпадающего списка множественного выбора при достижении максимального количества элементов.

v0.12.1 Фиксирована ошибка JS при сохранении пустого отношения.

  • Исправлена проблема, из-за которой класс CSS overlay-active не удалялся при закрытии вложенной панели наложения (#1718).

  • Добавлено название коллекции на странице (#1711).

v0.12.0

  • Рефакторинг интерфейса выбора отношений для обеспечения серверного поиска, сортировки, создания, обновления и удаления записей отношений (#976).

  • Добавлена новая опция RelationOptions.DisplayFields, позволяющая указать пользовательскую визуализацию полей отношений в интерфейсе администратора.

  • Добавлен провайдер Authentik OAuth2 (#1377; спасибо @pr0ton11).

  • Добавлен провайдер LiveChat OAuth2 (#1573; спасибо @mariosant).

  • Добавлен провайдер Gitea OAuth2 (#1643; спасибо @hlanderdev).

  • Добавлены превью файлов PDF (#1548; спасибо @mjadobson).

  • Добавлены превью видео- и аудиофайлов.

  • Добавлено поле editor для HTML-контента на основе TinyMCE (#370). На данный момент новое поле не имеет никаких параметров конфигурации или валидаций, но это может измениться в будущем в зависимости от того, как разработчики будут его использовать.

  • Добавлены опции «Дублировать» для коллекций и записей в интерфейсе администратора (#1656).

  • Добавлен помощник filesystem.GetFile() для чтения файлов через абстракцию FileSystem (#1578; спасибо @avarabyeu).

  • Добавлены новые хуки событий аутентификации для более точного контроля и обработки более сложных сценариев аутентификации:

    // auth record
    OnRecordBeforeAuthWithPasswordRequest()
    OnRecordAfterAuthWithPasswordRequest()
    OnRecordBeforeAuthWithOAuth2Request()
    OnRecordAfterAuthWithOAuth2Request()
    OnRecordBeforeAuthRefreshRequest()
    OnRecordAfterAuthRefreshRequest()
    
    // admin
    OnAdminBeforeAuthWithPasswordRequest()
    OnAdminAfterAuthWithPasswordRequest()
    OnAdminBeforeAuthRefreshRequest()
    OnAdminAfterAuthRefreshRequest()
    OnAdminBeforeRequestPasswordResetRequest()
    OnAdminAfterRequestPasswordResetRequest()
    OnAdminBeforeConfirmPasswordResetRequest()
    OnAdminAfterConfirmPasswordResetRequest()
  • Добавлена вспомогательная функция models.Record.CleanCopy(), создающая новую копию записи с последним состоянием данных существующей записи и всеми остальными параметрами, сброшенными до значений по умолчанию.

  • Добавлена новая вспомогательная функция apis.RecordAuthResponse(app, httpContext, record, meta), возвращающая стандартный ответ API аутентификации записи (#1623).

  • Проведён рефакторинг операций расширения и изменения данных модели Record для обеспечения безопасности параллельного выполнения.

  • Все перехватчики отправки форм forms были изменены для использования универсального типа данных в качестве полезной нагрузки.

  • Добавились несколько помощников store.Store:

    store.Reset(newData map[string]T)
    store.Length() int
    store.GetAll() map[string]T
  • Поддержка тегов для всех связанных с записями и моделями событийных хуков.

    Теги позволяют регистрировать обработчики событий, которые будут вызываться только для совпадающих имён таблиц или идентификаторов/имён коллекций. Например:

    app.OnRecordBeforeCreateRequest("articles").Add(func(e *core.RecordCreateEvent) error {
      // вызывается только при создании записи "articles"
      log.Println(e.Record)
      return nil
    })

    Для всех этих событийных хуков *hook.Hook был заменён на *hooks.TaggedHook, но сигнатуры методов хука остались прежними, поэтому он должен вести себя так же, как и раньше, если теги не были указаны.

  • ⚠️ Исправлена нормализация значения поля string json (#1703).

    Чтобы обеспечить бесшовную поддержку запросов application/json и multipart/form-data, применяются следующие правила нормализации, если поле json является простой строковой величиной:

    • "true" преобразуется в json true
    • "false" Текст запроса:

is converted to the json false - "null" is converted to the json null - "[1,2,3]" is converted to the json [1,2,3] - "{"a":1,"b":2}" is converted to the json {"a":1,"b":2} - numeric strings are converted to json number - double quoted strings are left as they are (aka. without normalizations) - any other string (empty string too) is double quoted

Additionally, the "Nonempty" `json` field constraint now checks for `null`, `[]`, `{}` and `""` (empty string).
  • Added aria-label to some of the buttons in the Admin UI for better accessibility (#1702; thanks @ndarilek).

  • Updated the filename extension checks in the Admin UI to be case-insensitive (#1707; thanks @hungcrush).

Перевод текста на русский язык:

Преобразуется в JSON как false: — «null» преобразуется в JSON null; — «[1, 2, 3]» преобразуется в JSON [1, 2, 3]; — "{"a":1,"b":2}" преобразуется в JSON {«a»:1,«b»:2}; — числовые строки преобразуются в число JSON; — строки в двойных кавычках остаются без изменений (т. е. без нормализации); — любая другая строка (включая пустую строку) заключается в двойные кавычки.

Кроме того, ограничение поля «Непустое» json теперь проверяет наличие null, [], {} и "" (пустая строка).

— Добавлен атрибут aria-label к некоторым кнопкам в административном интерфейсе для улучшения доступности (#1702, спасибо @ndarilek).

— Обновлены проверки расширений имён файлов в административном пользовательском интерфейсе, чтобы они были нечувствительны к регистру (#1707, спасибо @hungcrush). В запросе представлен текст, связанный с разработкой и обновлением программного обеспечения PocketBase. Текст содержит информацию о новых функциях, исправлениях ошибок и других изменениях в разных версиях программы.

В запросе присутствуют фрагменты кода, которые связаны с языком программирования Go. Однако в запросе нет технических терминов или специфических понятий, требующих перевода. Поэтому перевод текста не требуется. Изменения в версии pocketbase 0.9.2:

— Исправлена проблема конфликта имён столбцов при удалении записей ([#1220]).

Изменения в версии pocketbase 0.9.1:

— Перемещение операций загрузки и удаления файлов из транзакций базы данных для минимизации времени блокировки.

— Добавление семафора запросов Dao и базовой обработки ошибок и повторных попыток для повышения пропускной способности одновременной записи ([#1187]).

— Исправление проблемы каскадного удаления записей при наличии ссылок типа «A<->B».

— Замена c.QueryString() на c.QueryParams().Encode() для обеспечения возможности загрузки изменённых параметров запроса промежуточным программным обеспечением в действиях crud по умолчанию ([#1210]).

— Устранение проблемы, когда поле datetime не вызывало событие onChange при ручном редактировании поля, а также добавление кнопки «Очистить» ([#1219]).

— Обновление действия GitHub goreleaser для использования go 1.19.4, поскольку эта версия содержит некоторые исправления безопасности.

Изменения в версии pocketbase 0.9.0:

— Решение проблемы параллельного обновления и удаления нескольких связей ([#1138]).

— Включение необработанных данных пользователя OAuth2 (meta.rawUser) и токена доступа OAuth2 (meta.accessToken) в ответ аутентификации ([#654]).

— Метод BaseModel.UnmarkAsNew() был переименован в MarkAsNotNew(). Кроме того, чтобы упростить запросы вставки модели с пользовательскими идентификаторами, больше не требуется вызывать MarkAsNew() для моделей с установленным ID, которые были инициализированы вручную, так как теперь это состояние по умолчанию. Когда модель заполняется значениями из базы данных (например, после сканирования строки), она автоматически помечается как «не новая».

— Добавлен метод Record.OriginalCopy(), который возвращает новую копию Record, заполненную исходными данными загруженной записи (полезно, если вы хотите сравнить старые и новые значения полей).

— Добавлены новые обработчики событий: app.OnBeforeBootstrap(), app.OnAfterBootstrap(), app.OnBeforeApiError(), app.OnAfterApiError(), app.OnRealtimeDisconnectRequest(), app.OnRealtimeBeforeMessageSend(), app.OnRealtimeAfterMessageSend(), app.OnRecordBeforeRequestPasswordResetRequest(), app.OnRecordAfterRequestPasswordResetRequest(), app.OnRecordBeforeConfirmPasswordResetRequest(), app.OnRecordAfterConfirmPasswordResetRequest(), app.OnRecordBeforeRequestVerificationRequest(), app.OnRecordAfterRequestVerificationRequest() и app.OnRecordBeforeConfirmVerificationRequest(). app.OnRecordAfterConfirmVerificationRequest()

app.OnRecordBeforeRequestEmailChangeRequest()

app.OnRecordAfterRequestEmailChangeRequest()

app.OnRecordBeforeConfirmEmailChangeRequest()

app.OnRecordAfterConfirmEmailChangeRequest()

В файле хранится оригинальное имя файла как метаданные под ключом original_filename. Доступ к нему можно получить следующим образом:

fs, _ := app.NewFilesystem()
defer fs.Close()

attrs, _ := fs.Attributes(fikeKey)
attrs.Metadata["original_name"]

Добавлена поддержка запросов файлов Partial/Range (#1125). Это незначительное изменение, если вы используете filesystem.Serve (например, в качестве части пользовательского хука OnFileDownloadRequest):

// old
filesystem.Serve(res, e.ServedPath, e.ServedName)

// new
filesystem.Serve(res, req, e.ServedPath, e.ServedName)

Команда migrate была переработана для поддержки внешних файлов миграции JavaScript с использованием встроенного интерпретатора JS (goja). Это позволяет создавать собственные сценарии миграции, такие как программное создание коллекций, инициализация настроек по умолчанию, выполнение импорта данных и т. д., с помощью JavaScript API, очень похожего на Go (скоро появится дополнительная документация).

Команда migrate доступна по умолчанию для предварительно созданного исполняемого файла, но если вы используете PocketBase в качестве фреймворка, вам необходимо зарегистрировать её вручную:

migrationsDir := "" // default to "pb_migrations" (for js) and "migrations" (for go)

// load js files if you want to allow loading external JavaScript migrations
jsvm.MustRegisterMigrations(app, &jsvm.MigrationsOptions{
    Dir: migrationsDir,
})

// register the `migrate` command
migratecmd.MustRegister(app, app.RootCmd, &migratecmd.Options{
    TemplateLang: migratecmd.TemplateLangJS, // or migratecmd.TemplateLangGo (default)
    Dir:          migrationsDir,
    Automigrate:  true,
})

Переработка также включает поддержку автоматических миграций.

Если Automigrate включено (по умолчанию true для предварительно созданного исполняемого файла; может быть отключено с помощью --automigrate=0), PocketBase будет автоматически генерировать файлы миграции JS (или Go) в фоновом режиме с изменениями вашей коллекции. Каталог с миграциями JS можно зафиксировать в вашем git-репозитории. Все миграции (Go и JS) автоматически выполняются при запуске сервера.

Также обратите внимание, что автоматически сгенерированные миграции являются детализированными (в отличие от команды моментального снимка migrate collections) и позволяют нескольким разработчикам независимо вносить изменения в коллекции (даже редактируя одну и ту же коллекцию), минимизируя возможные конфликты слияния. Вот пример файла миграции JS, который будет создан, например, если вы отредактируете одно название коллекции:

// pb_migrations/1669663597_updated_posts_old.js
migrate((db) => {
    // up
    const dao = new Dao(db)
    const collection = dao.findCollectionByNameOrId("lngf8rb3dqu86r3")
    collection.name = "posts_new"
    return dao.saveCollection(collection)
}, (db) => {
    // down
    const dao = new Dao(db)
    const collection = dao.findCollectionByNameOrId("lngf8rb3dqu86r3")
    collection.name = "posts_old"
    return dao.saveCollection(collection)
})

Добавлены новые помощники Dao, чтобы упростить получение и обновление настроек приложения из миграции:

dao.FindSettings([optEncryptionKey])
dao.SaveSettings(newSettings, [optEncryptionKey])

core.Settings перемещён в models/settings.Settings:

core.Settings{}           -> settings.Settings{}
core.NewSettings()        -> settings.New()
core.MetaConfig{}         -> settings.MetaConfig{}
core.LogsConfig{}         -> settings.LogsConfig{}
core.SmtpConfig{}         -> settings.SmtpConfig{}
core.S3Config{}           -> settings.S3Config{}
core.TokenConfig{}        -> settings.TokenConfig{}
core.AuthProviderConfig{} -> settings.AuthProviderConfig{}

Изменён интерфейс mailer.Mailer (незначительное нарушение работы, если вы отправляете собственные электронные письма): app.NewMailClient().Send(from, to, subject, html, attachments?)

// New: app.NewMailClient().Send(&mailer.Message{ From: from, To: to, Subject: subject, HTML: html, Attachments: attachments, // new configurable fields Bcc: []string{"bcc1@example.com", "bcc2@example.com"}, Cc: []string{"cc1@example.com", "cc2@example.com"}, Headers: map[string]string{"Custom-Header": "test"}, Text: "custom plain text version", })


**Новый struct *mailer.Message* теперь также является членом событий *MailerRecordEvent* и *MailerAdminEvent***

- Другие незначительные исправления и улучшения пользовательского интерфейса.

## v0.8.0

⚠️ Этот релиз содержит критические изменения и требует некоторых шагов по ручной миграции!

Самое большое изменение — это объединение моделей *User* и коллекции *profiles* согласно #376 (https://github.com/pocketbase/pocketbase/issues/376).
Больше нет поля типа *user*, а пользователи представляют собой просто коллекцию «auth» (теперь мы поддерживаем типы коллекций, в настоящее время только «base» и «auth»).
Это должно упростить управление пользователями и в то же время позволить нам иметь неограниченное количество коллекций «auth», каждая со своими собственными настраиваемыми полями и вариантами аутентификации (например, персонал, клиент и т. д.).

В дополнение к объединению *Users* и *profiles*, этот релиз включает в себя несколько других улучшений:

— Добавлена поддержка косвенного расширения согласно #312 (https://github.com/pocketbase/pocketbase/issues/312#issuecomment-1242893496).

— Поле типа *json* теперь поддерживает фильтрацию и сортировку согласно #423 (https://github.com/pocketbase/pocketbase/issues/423#issuecomment-1258302125).

— В поле *relation* теперь можно использовать неограниченное *maxSelect* (то есть без верхнего предела).

— Добавлена поддержка комбинированной аутентификации по электронной почте/имени пользователя + паролю (см. ниже *authWithPassword()*).

— Добавлена поддержка полного управления пользователями типа «руководитель-подчинённый», включая специальное правило API, позволяющее напрямую изменять системные поля, такие как электронная почта, пароль и т.д., не требуя *oldPassword* или другой проверки пользователя.

— Включена привязка учётной записи OAuth2 при авторизованном запросе из той же коллекции auth (*это полезно, например, если поставщик OAuth2 не возвращает электронную почту и вы хотите связать её с текущим вошедшим пользователем*).

— Добавлена возможность переключать видимость столбцов записей в таблице списка.

— Добавлена поддержка переупорядочивания полей схемы коллекции.

— Добавлено несколько новых поставщиков OAuth2 (Microsoft Azure AD, Spotify, Twitch, Kakao).

— Улучшено использование памяти при загрузке больших файлов согласно #835 (https://github.com/pocketbase/pocketbase/discussions/835).

— Более подробные документы предварительного просмотра API и документация сайта (репозиторий находится по адресу https://github.com/pocketbase/site).

— Другие незначительные улучшения производительности (в основном связанные с поисковыми API).

### Миграция с версии v0.7.x

— **Данные.**

— **SDK.**

— **API.**

— **Внутренние компоненты.**

#### Данные

Объединение пользователей и профилей влечёт за собой несколько необходимых изменений в базе данных.
Самый простой способ применить их — использовать новую временную команду *upgrade*:

```sh
# убедитесь, что у вас есть копия pb_data на случай, если что-то пойдёт не так
cp -r ./pb_data ./pb_data_backup

# запустите команду обновления
./pocketbase08 upgrade

# запустите приложение как обычно
./pocketbase08 serve

Команда upgrade:

— Создаёт новую коллекцию users с объединёнными полями из таблицы _users и коллекции profiles. Новые записи пользователей будут иметь идентификаторы из коллекции profiles.

— Изменяет все поля типа user на relation и обновляет ссылки, чтобы они указывали на новые идентификаторы пользователей.

— Переименовывает все фильтры @collection.profiles., @request.user. и @request.user.profile.* в @collection.users.* и @request.auth.*.

— Добавляет 2 ко всем именам полей схемы и правилам фильтрации API, которые конфликтуют с новыми системными зарезервированными:

collectionId   => collectionId2
collectionName => collectionName2
expand         => expand2

// только для полей коллекции «profiles»:
username               => username2
email                  => email2
emailVisibility        =>
``` **emailVisibility2**  
verified => verified2  
tokenKey => tokenKey2  
passwordHash => passwordHash2  
lastResetSentAt => lastResetSentAt2  
lastVerificationSentAt => lastVerificationSentAt2

#### SDKs  
Please check the individual SDK package changelog and apply the necessary changes in your code:  
— JavaScript SDK changelog  
```sh  
npm install pocketbase@latest --save  

— Dart SDK changelog

dart pub add pocketbase:^0.5.0  
# or with Flutter:  
flutter pub add pocketbase:^0.5.0

API

You don't have to read this if you are using an official SDK.

  • The authorization schema is no longer necessary. Now it is auto detected from the JWT token payload:
Old New
Authorization: Admin TOKEN Authorization: TOKEN
Authorization: User TOKEN Authorization: TOKEN
  • All datetime strings are now returned in ISO8601 format — with Z suffix and space as separator between the date and time part:
Old New
2022-01-02 03:04:05.678 2022-01-02 03:04:05.678Z
  • Removed the @ prefix from the system record fields for easier JSON parsing:
Old New
@collectionId collectionId
@collectionName collectionName
@expand expand
  • All users API handlers are moved under /api/collections/:collection/:
Old New
GET /api/users/auth-methods GET /api/collections/:collection/auth-methods
POST /api/users/refresh POST /api/collections/:collection/auth-refresh
POST /api/users/auth-via-oauth2 POST /api/collections/:collection/auth-with-oauth2
You can now also pass optional createData object on OAuth2 sign-up.
Also please note that now required user/profile fields are properly validated when creating new auth model on OAuth2 sign-up.
POST /api/users/auth-via-email POST /api/collections/:collection/auth-with-password
Handles username/email + password authentication.
{«identity»: «usernameOrEmail», «password»: «123456»}
POST /api/users/request-password-reset POST /api/collections/:collection/request-password-reset
POST /api/users/confirm-password-reset POST /api/collections/:collection/confirm-password-reset
POST /api/users/request-verification POST
/api/коллекции/:коллекция/проверка-запроса POST /api/пользователи/подтверждение-проверки POST /api/коллекции/:коллекция/подтверждение-проверки POST /api/пользователи/запрос-изменения-электронной-почты POST /api/коллекции/:коллекция/запрос-изменения-электронной-почты POST /api/пользователи/подтверждение-изменения-электронной-почты POST /api/коллекции/:коллекция/подтверждение-изменения-электронной-почты GET /api/пользователи GET /api/коллекции/:коллекция/записи GET /api/пользователи/:id GET /api/коллекции/:коллекция/записи/:id POST /api/пользователи POST /api/коллекции/:коллекция/записи PATCH /api/пользователи/:id PATCH /api/коллекции/:коллекция/записи/:id DELETE /api/пользователи/:id DELETE /api/коллекции/:коллекция/записи/:id GET /api/пользователи/:id/внешние-авторизации GET /api/коллекции/:коллекция/записи/:id/внешние-авторизации DELETE /api/пользователи/:id/внешние-авторизации/:провайдер DELETE /api/коллекции/:коллекция/записи/:id/внешние-авторизации/:провайдер

В связи с вышеуказанными изменениями, свойство user в ответе авторизации переименовано в record.

  • Также был обновлён API администраторов для соответствия изменениям в API пользователей:

    Старый Новый
    POST /api/администраторы/обновление POST /api/администраторы/обновление-аутентификации
    POST /api/администраторы/аутентификация-через-email POST /api/администраторы/аутентификация-с-паролем
    {"идентификатор": "test@example.com", "пароль": "123456"}
    (обратите внимание, что поле тела электронной почты было переименовано в идентификатор)
  • Чтобы избежать путаницы с ответами метода аутентификации, следующие конечные точки теперь возвращают 204 без тела (ранее 200 с токеном и моделью аутентификации):

    POST /api/administrators/подтверждение-сброс-пароля
    POST /api/collections/:collection/подтверждение-сброс-пароля
    POST /api/collections/:collection/подтверждение-верификации
    POST /api/collections/:collection/подтверждение-изменение-электронной-почты
  • Были переименованы поля настроек, связанные с пользователями, возвращаемые GET /api/settings:

    Старый Новый
    пользовательAuthToken записьAuthToken
    пользовательPasswordResetToken записьPasswordResetToken
    пользовательEmailChangeToken записьEmailChangeToken
    пользовательVerificationToken записьVerificationToken

Внутреннее устройство

Вы не обязаны Перевод текста на русский язык:

Прочитайте это, если вы не используете PocketBase в качестве фреймворка.

  1. Удалены фабрики forms.New*WithConfig(), чтобы минимизировать двусмысленность. Если вам нужно передать транзакцию Dao, вы можете использовать новый метод SetDao(dao), доступный для экземпляров форм.
  2. forms.RecordUpsert.LoadData(data map[string]any) теперь может массово загружать внешние данные из карты. Чтобы загрузить данные из экземпляра запроса, можно использовать forms.RecordUpsert.LoadRequest(r, optKeysPrefix = "").
  3. У schema.RelationOptions.MaxSelect появился новый тип *int (можно использовать новый помощник types.Pointer(123) для присвоения значений указателя).
  4. Переименована константа apis.ContextUserKey («user») в apis.ContextAuthRecordKey («authRecord»).
  5. Заменены пользовательские промежуточные программы на их альтернативы с учётными записями:
Старое Новое
apis.RequireUserAuth() apis.RequireRecordAuth(optCollectionNames ...string)
apis.RequireAdminOrUserAuth() apis.RequireAdminOrRecordAuth(optCollectionNames ...string)
N/A RequireSameContextRecordAuth()
(требует, чтобы учётная запись была из той же контекстной коллекции)
6. Следующие помощники Dao для записей теперь используют идентификатор или имя коллекции вместо *models.Collection, чтобы уменьшить многословность при извлечении записей: 7. Все помощники Dao, связанные с пользователями, заменены эквивалентами для учётных записей:
Старое Новое
dao.FindRecordById(collection, ...) dao.FindRecordById(collectionNameOrId, ...)
dao.FindRecordsByIds(collection, ...) dao.FindRecordsByIds(collectionNameOrId, ...)
dao.FindRecordsByExpr(collection, ...) dao.FindRecordsByExpr(collectionNameOrId, ...)
dao.FindFirstRecordByData(collection, ...) dao.FindFirstRecordByData(collectionNameOrId, ...)
dao.IsRecordValueUnique(collection, ...) dao.IsRecordValueUnique(collectionNameOrId, ...)
8. Структуру ApiError и фабрики перенесли в подпакет github.com/pocketbase/pocketbase/apis:
Старое Новое
dao.UserQuery() dao.RecordQuery(collection)
dao.FindUserById(id) dao.FindRecordById(collectionNameOrId, id)
dao.FindUserByToken(token, baseKey) dao.FindAuthRecordByToken(token, baseKey)
dao.FindUserByEmail(email) dao.FindAuthRecordByEmail(collectionNameOrId, email)
N/A dao.FindAuthRecordByUsername(collectionNameOrId, username)
**rest**.ApiError{} **apis**.ApiError{}

rest.NewNotFoundError() apis.NewNotFoundError()

rest.NewBadRequestError() apis.NewBadRequestError()

rest.NewForbiddenError() apis.NewForbiddenError()

rest.NewUnauthorizedError() apis.NewUnauthorizedError()

rest.NewApiError() apis.NewApiError()

  • Renamed models.Record helper getters:
    SetDataValue — Set,
    GetDataValue — Get,
    GetBoolDataValue — GetBool,
    GetStringDataValue — GetString,
    GetIntDataValue — GetInt,
    GetFloatDataValue — GetFloat,
    GetTimeDataValue — GetTime,
    GetDateTimeDataValue — GetDateTime,
    GetStringSliceDataValue — GetStringSlice.

  • Добавлены новые auth collection models.Record помощники:
    func (m *Record) Username() string,
    func (m *Record) SetUsername(username string) error,
    func (m *Record) Email() string,
    func (m *Record) SetEmail(email string) error,
    func (m *Record) EmailVisibility() bool,
    func (m *Record) SetEmailVisibility(visible bool) error,
    func (m *Record) IgnoreEmailVisibility(state bool),
    func (m *Record) Verified() bool,
    func (m *Record) SetVerified(verified bool) error,
    func (m *Record) TokenKey() string,
    func (m *Record) SetTokenKey(key string) error,
    func (m *Record) RefreshTokenKey() error,
    func (m *Record) LastResetSentAt() types.DateTime,
    func (m *Record) SetLastResetSentAt(dateTime types.DateTime) error,
    func (m *Record) LastVerificationSentAt() types.DateTime,
    func (m *Record) SetLastVerificationSentAt(dateTime types.DateTime) error,
    func (m *Record) ValidatePassword(password string) bool,
    func (m *Record) SetPassword(password string) error.

  • Добавлена опция для возврата сериализованных пользовательских моделей.Record полей данных:
    func (m *Record) UnknownData() map[string]any,
    func (m *Record) WithUnknownData(state bool).

  • Удалена model.User. Теперь данные пользователя хранятся в виде auth models.Record.
    User.Email — Record.Email(),
    User.TokenKey — Record.TokenKey(),
    User.Verified — Record.Verified(),
    User.SetPassword — Record.SetPassword(),
    User.RefreshTokenKey — Record.RefreshTokenKey().

  • Заменены связанные с User крючки событий на их Record альтернативу. Хук. Хук[*МейлерПользовательСобытие]

**Текст запроса:**

OnRecordBeforeUnlinkExternalAuthRequest() *hook.Hook[*RecordUnlinkExternalAuthEvent]

Перевод:

Он рекорд бефоре унк линк экстернал аут хекстэссэнд точка ком *хук точка хук[*рекорд унк линк экстернал аут хевэнт]

Текст запроса:

  • Replaced forms.UserEmailLogin{} with forms.RecordPasswordLogin{} (for both username and email depending on which is enabled for the collection).

Перевод:

— Заменено формс точка юзер эмэйл логин {} на формс точка рекорд пассворд логин {} (для имени пользователя и электронной почты в зависимости от того, что включено для коллекции).

Текст запроса:

  • Renamed user related core.Settings fields:
Старое Новое
Путь импорта
github.com/pocketbase/pocketbase/tools/rest github.com/pocketbase/pocketbase/apis
Поля ОнМейлерБефореЗаписьСбросПассвордСенд()
ОнМейлерАфтерПользователь СбросПассвордСенд() *hook.Hook[*MailerRecordEvent]
ОнМейлерБефореПользовательВерификатионСенд() *hook.Hook[*MailerUserEvent] ОнМейлерБефореЗапись ВерификатионСенд() *hook.Hook[*MailerRecordEvent]
ОнМейлерАфтерПользовательВерификатионСенд() *hook.Hook[*MailerUserEvent] ОнМейлерАфтерЗапись ВерификатионСенд() *hook.Hook[*MailerRecordEvent]
ОнМейлерБефореПользовательЧенджЭмэйлСенд() *hook.Hook[*MailerUserEvent] ОнМейлерБефореЗапись ЧенджЭмэйлСенд() *hook.Hook[*MailerRecordEvent]
ОнМейлерАфтерПользовательЧенджЭмэйлСенд() *hook.Hook[*MailerUserEvent] ОнМейлерАфтерЗапись ЧенджЭмэйлСенд() *hook.Hook[*MailerRecordEvent]
ОнПользователиЛистРекуест() *hook.Hook[*Пользователь ЛистИвент] ОнЗаписиЛистРекуест() *hook.Hook[*ЗаписиЛистИвент]
ОнПользовательВьюРекуест() *hook.Hook[*Пользователь ВьюИвент] ОнЗаписьВьюРекуест() *hook.Hook[*ЗаписьВьюИвент]
ОнПользовательБефореКриэйтРекуест() *hook.Hook[*Пользователь КриэйтИвент] ОнЗапись БефореКриэйтРекуест() *hook.Hook[*ЗаписьКриэйтИвент]
ОнПользовательАфтерКриэйтРекуест() *hook.Hook[*Пользователь КриэйтИвент] ОнЗапись АфтерКриэйтРекуест() *hook.Hook[*ЗаписьКриэйтИвент]
ОнПользовательБефореАпдатеРекуест() *hook.Hook[*Пользователь АпдатеИвент] ОнЗапись БефореАпдатеРекуест() *hook.Hook[*ЗаписьАпдатеИвент]
ОнПользовательАфтерАпдатеРекуест() *hook.Hook[*Пользователь АпдатеИвент] ОнЗапись АфтерАпдатеРекуест() *hook.Hook[*ЗаписьАпдатеИвент]
ОнПользовательБефореДелитРекуест() *hook.Hook[*Пользователь ДелитИвент] ОнЗапись БефореДелитРекуест() *hook.Hook[*ЗаписьДелитИвент]
ОнПользовательАфтерДелитРекуест() *hook.Hook[*Пользователь ДелитИвент] ОнЗапись АфтерДелитРекуест() *hook.Hook[*ЗаписьДелитИвент]
ОнПользовательАутРекуест() *hook.Hook[*Пользователь АутИвент] ОнЗапись АутРекуест() *hook.Hook[*ЗаписьАутИвент]
ОнПользовательЛистЭкстерналАутентикэйшнс() *hook.Hook[*Пользователь ЛистЭкстерналАутентикэйшнсИвент] ОнЗапись ЛистЭкстерналАутентикэйшнс() *hook.Hook[*ЗаписьЛистЭкстерналАутентикэйшнсИвент]
ОнПользовательБефореУнклинЭкстерналАутентикэйшнРекуест() *hook.Hook[*Пользователь УнклинЭкстерналАутентикэйшнИвент]
Old New
core.Settings.UserAuthToken{} core.Settings.RecordAuthToken{}
core.Settings.UserPasswordResetToken{} core.Settings.RecordPasswordResetToken{}
core.Settings.UserEmailChangeToken{} core.Settings.RecordEmailChangeToken{}
core.Settings.UserVerificationToken{} core.Settings.RecordVerificationToken{}

Перевод:

— Переименованы связанные с пользователем поля core.Settings: <таблица класс="д-таблэйр" видтв "100%" > <тр> <тх>Олд</тх> <тх>Нью</тх> </тр> <тр валгн топ> <тид кор точка сеттингс точка <стрнг>юзер</стрнг> аут токен {}</тид> <тид кор точка сеттингс точка <стрнг>рекорд</стрнг> аут токен {}</тид> </тр> <тр валгн топ> <тид кор точка сеттингс точка <стрнг>юзер</стрнг> пассворд ресет токен {}</тид> <тид кор точка сеттингс точка <стрнг>рекорд</стрнг> пассворд ресет токен {}</тид> </тр> <тр валгн топ> <тид кор точка сеттингс точка <стрнг>юзер</стрнг> емэйл чендж токен {}</тид> <тид кор точка сеттингс точка <стрнг>рекорд</стрнг> емэйл чендж токен {}</тид> </тр> <тр валгн топ> <тид кор точка сеттингс точка <стрнг>юзер</стрнг> верификейшн токен {}</тид> <тид кор точка сеттингс точка <стрнг>рекорд</стрнг> верификейшн токен {}</тид> </тр> </таблица>

Текст запроса:

The second argument of apis.StaticDirectoryHandler(fileSystem, enableIndexFallback) now is used to enable/disable index.html forwarding on missing file (eg. in case of SPA).

Перевод:

Второй аргумент apis точка статикт директори хендлер точка файлс стэм точка энбл индекс фэлбэквард теперь используется для включения/отключения переадресации index точка html при отсутствии файла (например, в случае SPA).

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/pocketbase.git
git@api.gitlife.ru:oschina-mirror/pocketbase.git
oschina-mirror
pocketbase
pocketbase
master