Pular para o conteúdo

Automacoes (mini-n8n nativo)

Engine de automacoes built-in: Gatilho → Condicao → Acao. 14+ triggers (event/scheduled/webhook), 8 actions (notify, tag, announce, webhook, enroll, etc). SSRF prevention, rate limiting, chain depth limit.

2026-05-23 5 min
Resposta curta

Studeia tem engine de automacoes 'mini-n8n' built-in. Padrao: Gatilho → Condicao → Acao. 3 trigger types (event da plataforma, scheduled cron, webhook publico). 14+ eventos (lesson_completed, quiz_submitted, enrollment_created, forum_post_created, scheduled_trigger, etc). 8 actions (send_notification, add_tag, remove_tag, create_announcement, send_webhook, send_web_request, enroll_user, trigger_automation). UI wizard 4 steps + historico de runs.

Padrao Gatilho → Condicao → Acao

Trigger (event, scheduled, ou webhook)
  ↓
Condition (logic AND/OR, com rules sobre user.*, event.*)
  ↓
Action (uma ou mais, executadas sequencialmente)

Triggers (3 tipos)

1. event

Disparado por eventos da plataforma via emitAutomationEvent() em after().

{ "type": "event", "config": { "eventName": "lesson_completed", "filters": {} } }

Eventos suportados: lesson_completed, module_completed, course_completed, quiz_submitted, enrollment_created, enrollment_completed, forum_post_created, forum_reply_created, grade_posted, announcement_created, live_class_started, student_inactive, tag_added_to_user, tag_removed_from_user, webhook_received, scheduled_trigger.

2. scheduled

Cron-based.

{
  "type": "scheduled",
  "config": {
    "mode": "interval|daily|weekly|cron",
    "hours": 24,
    "time": "08:00",
    "timezone": "America/Sao_Paulo"
  }
}

Processado por GET /api/cron/automations (CRON_SECRET).

3. webhook

Endpoint publico autenticado por token 64-char hex.

URL: /api/automations/webhook/[token]
GET  → health check
POST → triggers automation (body JSON virara event.data)

Conditions

{
  "logic": "and",
  "rules": [
    { "field": "user.role", "operator": "eq", "value": "student" },
    { "field": "event.score", "operator": "gte", "value": 80 }
  ]
}

Operators: eq, neq, gt, gte, lt, lte, contains, not_contains, in, not_in.

Fields acessiveis:

  • user.* — id, name, email, role, tags
  • event.* — campos do evento (courseId, score, lessonTitle, etc)

Nested groups (AND/OR) sao suportados.

Actions (8 tipos)

ActionFuncao
send_notificationIn-app notification (trigger_user ou users_with_tag)
add_tagAdicionar UserTag
remove_tagRemover UserTag
create_announcementCria Announcement + notifica alunos (curso ou tenant)
send_webhookPOST/PUT para URL externa (com SSRF prevention)
send_web_requestGET/POST/PUT/DELETE para API externa
enroll_userMatricula trigger_user em curso
trigger_automationEncadeia outra (max depth 5)

Template interpolation

Strings em actions suportam {{placeholders}}:

  • {{user.name}}, {{user.email}}, {{user.role}}
  • {{event.courseId}}, {{event.score}}, {{event.lessonTitle}}

Seguranca

  • Tenant isolation: todas as queries filtram por tenantId. Automacao de um tenant NUNCA executa para usuario de outro.
  • SSRF prevention: url-validator.ts bloqueia IPs privados, localhost, metadata endpoints (169.254.169.254). IPv4 + IPv6.
  • HTTP timeout: 10s via AbortController.
  • Webhook token: 64-char hex, rotacionavel.
  • Chain depth: max 5 niveis de trigger_automation recursivo.
  • Rate limit: maxRunsPerHour/maxRunsPerDay por automacao (Redis INCR, fallback DB count).

Exemplo: notificar pai quando aluno menor inativo 5 dias

{
  "name": "Alerta inatividade — menores",
  "trigger": {
    "type": "event",
    "config": { "eventName": "student_inactive" }
  },
  "conditions": {
    "logic": "and",
    "rules": [
      { "field": "user.role", "operator": "eq", "value": "student" },
      { "field": "user.isMinor", "operator": "eq", "value": true },
      { "field": "event.inactiveDays", "operator": "gte", "value": 5 }
    ]
  },
  "actions": [
    {
      "type": "send_notification",
      "config": {
        "recipient": "users_with_tag",
        "tag": "parent_of_{{user.id}}",
        "title": "{{user.name}} inativo ha {{event.inactiveDays}} dias",
        "message": "Estimulamos um login. Acesse [link]."
      }
    }
  ]
}

UI

/institution/automations:

  • Lista com filtros (status, trigger type), toggle, search
  • Wizard 4 steps (Trigger → Conditions → Actions → Review)
  • Historico de runs com rows expandiveis (status, duration, actionResults JSON)

Veja tambem

FAQ

Studeia tem automacoes built-in?

Sim. Engine 'mini-n8n' nativo: Gatilho → Condicao → Acao. 3 tipos de trigger (evento da plataforma, agendado, webhook publico) com 14+ eventos. 8 tipos de acao (in-app notification, add/remove tag, create announcement, send webhook, send web request, enroll user, trigger automation). UI wizard 4 steps + historico de runs.

Posso disparar webhook quando aluno completa quiz?

Sim. Trigger: event quiz_submitted. Condition opcional (ex: score >= 80). Action: send_webhook para sua URL. Suporta template interpolation: {{user.name}}, {{event.score}}, {{event.lessonTitle}}.

Tem rate limiting?

Sim. Por automacao: maxRunsPerHour + maxRunsPerDay. Verificado via Redis INCR com fallback DB count. Quando excede: run e marcada como skipped + log.

Posso encadear automacoes?

Sim. Action trigger_automation chama outra automacao. Chain depth maximo 5 niveis (anti-loop infinito).

Veja tambem

Automacoes (mini-n8n nativo) | Studeia Docs