Change language

wf-team-invite

Назначение

Преобразует вставленный список людей — «имя + адрес», в любой форме, в которой
его записал человек, — в учётные записи пользователей, роли, карточки
сотрудников и приглашения, а затем отправляет каждому ссылку для входа.

Он существует потому, что четыре сервиса должны согласованно обработать одну
строку этого списка (rp-identity, rp-access, rp-staff, rp-auth и
почтовая лямбда), а микросервисы не вызывают друг друга.

Почему это также граница привилегий

rp-access полностью отклоняет JWT пользователя (@Access("internal")), поэтому
ни одна поверхность не может выдать роль. centimanus запускает этот скрипт с
SERVICE_TOKEN, а право на его запуск является обычным разрешением —
wf/workflows/wf-team-invite.js(x), проверяемым на границе
(signal_provider.zig:146) и записанным в одном файле пресетов. Поэтому в
продукте нет понятия «администратор».

Скрипт не может узнать, кто его вызвал, поэтому защита от повышения привилегий
представляет собой фиксированный список: manager, operator, viewer.
owner и root здесь нельзя выдавать.

Структура

  1. текстовые источники — files.materialize + files.extractText, а также
    rawText;
  2. люди — сначала rt.llm, построчное регулярное выражение в качестве
    запасного варианта;
  3. один rt.attempt на человека — пользователь, базовый пресет + роль, теги
    группы, карточка, приглашение;
  4. письмо — отдельная попытка, поэтому отклонённая ретрансляция является
    ответвлением, а не потерянной учётной записью;
  5. отчёт, чьи staffIds поверхность превращает в открытую таблицу, содержащую
    ровно этих людей.

Повторный запуск для того же списка безопасен: известный адрес получает статус
updated, а не создаёт вторую учётную запись.

Прямые зависимости модулей

  • g-access, g-auth, g-files, g-identity, g-notify, g-ses, g-smtp,
    g-staff

Членство в решении

  • production

Исходный код

modules/workflows/wf-team-invite