Otimização do Módulo de Atribuição de Tarefas em Sistema de Simulação de Emergência

O foco do dia foi aprimorar e validar o módulo de atribuição de tarefas no sistema de simulação de emergência, com ênfase em controle de permissões, fluxo de estados, validação de formulários, filtragem avançada e registro de operações.

Controel Granular de Permissões

O sistema implementa um modelo baseado em papéis com quatro níveis:

  • Administrador: acesso total
  • Coordenador: criação, atribuição e gerenciamento de tarefas
  • Chefe de Departamento: visualização e execução de tarefas do próprio departamento
  • Usuário Comum: apenas visualização e execução de tarefas atribuídas diretamente

A lógica de autorização é centralizada em um hook reutilizável que avalia tanto o papel do usuário quanto o contexto da tarefa (como o departamento do destinatário):

// hooks/useAuthz.ts
import { useSimulationStore } from '@/stores/simulation';

export const useAuthz = () => {
  const { user } = useSimulationStore();

  const capabilities = {
    admin: ['create', 'dispatch', 'modify', 'remove', 'view_all', 'execute'],
    coordinator: ['create', 'dispatch', 'modify', 'view_all', 'execute'],
    dept_lead: ['modify', 'view_dept', 'execute'],
    member: ['view_own', 'execute']
  };

  const can = (action: string): boolean => {
    const role = user?.role || 'member';
    return capabilities[role]?.includes(action) ?? false;
  };

  const canModify = (taskRecipient: string): boolean => {
    if (can('modify')) return true;
    if (can('view_dept')) {
      return user?.dept === extractDept(taskRecipient);
    }
    return false;
  };

  return { can, canModify };
};

Fluxo de Estados com Validação Rigorosa

O ciclo de vida das tarefas segue uma máquina de estados bem definida com transições controladas:

draft → pending → assigned → waiting → in_progress → [completed | aborted]
                             ↘ cancelled ↗

Cada transição é validada antes da persistência:

// lib/stateGuard.ts
type SimulationState = 'draft' | 'pending' | 'assigned' | 'waiting' | 
                      'in_progress' | 'completed' | 'cancelled' | 'aborted';

const transitions: Record<SimulationState, SimulationState[]> = {
  draft: ['pending'],
  pending: ['assigned', 'cancelled'],
  assigned: ['waiting'],
  waiting: ['in_progress', 'cancelled'],
  in_progress: ['completed', 'aborted'],
  completed: [],
  cancelled: ['pending'],
  aborted: []
};

export const isValidTransition = (from: SimulationState, to: SimulationState): boolean => {
  return transitions[from]?.includes(to) ?? false;
};

Validação Aprimorada de Formulários

Regras de validação foram implementadas para todos os campos críticos, incluindo verificação de datas futuras e limites de caracteres. Um hook dedicado separa a lógica de validação dos componentes de UI:

// hooks/useValidation.ts
export const useFormGuard = () => {
  const validateDispatchForm = (data: FormData): ValidationResult => {
    const errors: Record<string, string> = {};
    
    const deadline = new Date(data.get('deadline') as string);
    if (isNaN(deadline.getTime()) || deadline <= new Date()) {
      errors.deadline = 'Prazo deve ser uma data futura válida';
    }

    // demais validações...
    return { valid: Object.keys(errors).length === 0, errors };
  };

  return { validateDispatchForm };
};

Filtragem Inteligente de Listas

A interface de listagem suporta múltiplos critérios simultâneos:

  • Pesquisa textual em título, descrição e nomes de pessoas
  • Filtro por estado atual da tarefa
  • Segmentação por departamento
  • Classificação por prioridade

Resultados de busca destacam os termos correspondentes:

const highlightMatches = (text: string, query: string) => {
  if (!query) return text;
  return text.replace(
    new RegExp(`(${query})`, 'gi'), 
    '<mark class="bg-amber-200">$1</mark>'
  );
};

Registro Completo de Auditoria

Todas as operações significativas são registradas com metadados contextuais:

interface AuditRecord {
  id: string;
  timestamp: ISO8601;
  action: 'created' | 'updated' | 'deleted' | 'state_changed' | 'assigned';
  resourceType: 'simulation_task';
  resourceId: string;
  actor: string;
  details?: { [key: string]: any };
}

O sistema mantém um histórico local enquanto sincroniza com o backend, garantindo rastreabilidade mesmo em cenários offline temporários.

Verificação de Funcionalidades

Foram executados 22 cenários de teste cobrindo:

  • Fluxo completo do ciclo de vida de uma tarefa
  • Restrições de permissão entre diferentes papéis
  • Transições de estado válidas e inválidas
  • Entradas extremas e falhas de rede

Todos os casos passaram com 100% de sucesso, confirmando a robustez do módulo.

Tags: TypeScript React nextjs state-machine rbac

Publicado em 9-24 20:09