Skip to content

[API] Gestão de Regras Condicionais #18

@Rafaell-dev

Description

@Rafaell-dev

Card: Gestão de Regras Condicionais (ConditionalRule)

Objetivo

Permitir a criação de regras condicionais que definem o fluxo de navegação entre blocos de um survey com base nas respostas fornecidas pelo participante.

Esse recurso possibilita a criação de questionários dinâmicos, exibindo apenas os blocos relevantes conforme as respostas selecionadas.


Contexto

As regras condicionais são responsáveis por direcionar o participante para diferentes blocos do survey de acordo com critérios previamente definidos pelo pesquisador.

Exemplo:

Pergunta:
Você possui veículo?

○ Sim
○ Não

Regra:
Se resposta = Sim
→ Ir para bloco "Informações do Veículo"

Funcionalidades

Criar Regra

Permitir associar uma regra a uma pergunta.


Listar Regras

Permitir visualizar todas as regras configuradas para uma pergunta.


Consultar Regra

Permitir visualizar os detalhes de uma regra específica.


Atualizar Regra

Permitir alterar:

  • Operador
  • Valor de comparação
  • Bloco de destino

Remover Regra

Permitir excluir uma regra condicional.


Schema Existente

model ConditionalRule {
  id         String @id @default(uuid())

  questionId String
  question   Question @relation(
    fields: [questionId],
    references: [id],
    onDelete: Cascade
  )

  operator RuleOperator

  matchValue String

  targetBlockId String
  targetBlock Block @relation(
    "TargetBlock",
    fields: [targetBlockId],
    references: [id],
    onDelete: Cascade
  )
}

enum RuleOperator {
  EQUALS
  NOT_EQUALS
  GREATER_THAN
  LESS_THAN
}

Endpoints

Criar Regra

POST /questions/:questionId/rules

Listar Regras

GET /questions/:questionId/rules

Consultar Regra

GET /rules/:ruleId

Atualizar Regra

PATCH /rules/:ruleId

Excluir Regra

DELETE /rules/:ruleId

Regras de Negócio

RN01

A pergunta deve existir.


RN02

O bloco de destino deve existir.


RN03

O bloco de destino deve pertencer ao mesmo survey da pergunta.

Não permitir direcionamento entre surveys diferentes.


RN04

Não permitir criar regras apontando para o próprio bloco da pergunta.

Exemplo inválido:

Bloco A
↓
Pergunta
↓
Regra
↓
Bloco A

RN05

Não permitir criar ciclos de navegação.

Exemplo inválido:

Bloco A
↓
Bloco B
↓
Bloco C
↓
Bloco A

RN06

A pergunta deve ser compatível com regras condicionais.

Tipos suportados:

SINGLE_CHOICE
MULTIPLE_CHOICE
LIKERT
SLIDER

Tipos não suportados:

MEDIA_ONLY

RN07

O valor informado em matchValue deve ser compatível com o tipo da pergunta.

Exemplos:

SINGLE_CHOICE
→ optionId
LIKERT
→ valor numérico
SLIDER
→ valor numérico

RN08

Não permitir regras duplicadas para a mesma condição.

Exemplo inválido:

Pergunta X

Resposta = "SIM"
↓
Bloco A

Resposta = "SIM"
↓
Bloco B

RN09

Não permitir criação, alteração ou exclusão de regras em surveys arquivados.

Validação:

survey.status === 'ARCHIVED'

RN10

Não permitir alterações estruturais após o survey possuir respostas coletadas.

Validação:

survey.responses.length > 0

Segurança

Todas as rotas devem exigir autenticação JWT.

Validar ownership através da cadeia:

ConditionalRule
→ Question
→ Block
→ Survey
→ Researcher

Validação:

survey.researcherId === request.user.sub

Retornar:

403 Forbidden

quando o usuário não for proprietário.


Critérios de Aceite

  • Usuário autenticado consegue criar regras condicionais.
  • Usuário consegue listar regras de uma pergunta.
  • Usuário consegue consultar uma regra.
  • Usuário consegue atualizar uma regra.
  • Usuário consegue remover uma regra.
  • Sistema valida ownership corretamente.
  • Sistema impede regras entre surveys diferentes.
  • Sistema impede ciclos de navegação.
  • Sistema impede regras duplicadas.
  • Sistema bloqueia alterações após respostas coletadas.
  • Sistema bloqueia alterações em surveys arquivados.
  • Testes automatizados implementados.

Dependências

  • Autenticação
  • Gestão de Surveys
  • Gestão de Blocos
  • Gestão de Perguntas
  • Gestão de Opções de Resposta

Estimativa

5 Story Points

Complexidade: Média/Alta


Resultado Esperado

O pesquisador poderá construir fluxos dinâmicos dentro do survey, direcionando participantes para blocos específicos com base em suas respostas, permitindo pesquisas adaptativas e experiências personalizadas.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions