Diagramas UML - ime-usp-br/laravel_11_starter_kit GitHub Wiki

Diagramas UML do Projeto Base USP

Esta seção apresenta os diagramas UML chave que descrevem a arquitetura, funcionalidades e fluxos principais do Projeto Base USP - Laravel 11. Estes diagramas servem como uma representação visual para facilitar o entendimento do sistema.

Os códigos-fonte dos diagramas são fornecidos no formato Mermaid. Você pode copiar e colar este código em editores que suportam Mermaid (incluindo o próprio GitHub, ou ferramentas como o Editor Online do Mermaid ou o Draw.io com seu plugin Mermaid) para visualizar e exportar os diagramas como imagens (PNG/SVG), que podem então ser inseridas nos locais indicados neste documento.

1. Diagrama de Casos de Uso (Visão Geral Funcional)

Este diagrama ilustra as principais funcionalidades oferecidas pelo projeto base e como os diferentes tipos de usuários (atores) interagem com elas.

Atores Principais:

  • Usuário (Geral): Representa qualquer pessoa interagindo com a aplicação antes ou durante a autenticação.
  • Usuário USP: Um membro da comunidade USP (aluno, docente, servidor).
  • Usuário Externo: Um usuário sem vínculo formal com a USP.
  • Administrador: Um usuário com privilégios elevados para gerenciar o sistema.
  • Sistema Senha Única: O serviço centralizado de autenticação da USP (ator externo).
  • Sistema Replicado: O banco de dados corporativo da USP (ator externo).
graph TD
    %% 1. Subgraph Funcionalidades Administrativas (Topo)
    subgraph FuncAdmin ["Funcionalidades Administrativas"]
        direction LR
        UC10("Acessar Área Admin")
        UC11("Listar Usuários")
        UC12("Criar Usuário USP\nvia Replicado")
        UC13("Criar Usuário Manual\n(USP/Externo)")
        UC14("Gerenciar Papéis/\nPermissões App")
    end

    %% 2. Subgraph Atores (Meio)
    subgraph Atores
        direction LR
        UsuarioGeral["Usuário (Geral)"]
        UsuarioUSP["Usuário USP"]
        UsuarioExterno["Usuário Externo"]
        Administrador["Administrador"]
        SistemaSU["Sistema Senha Única"]
        SistemaRep["Sistema Replicado"]
    end

    %% 3. Subgraph Funcionalidades Principais (Base)
    subgraph FuncPrincipais ["Funcionalidades Principais"]
        direction LR
        UC01("Autenticar via\nSenha Única")
        UC02("Autenticar via\nEmail/Senha Local")
        UC03("Registrar Conta")
        UC04("Verificar Email")
        UC05("Solicitar Link\nSenha Local USP")
        UC06("Definir Senha Local USP")
        UC07("Acessar Dashboard")
        UC08("Editar Perfil")
        UC09("Fazer Logout")
    end

    %% Conexões (mantidas, Mermaid ajustará o layout)
    UsuarioGeral --o UC01 & UC02 & UC03 & UC05
    UsuarioUSP --> UC01 & UC02 & UC05 & UC06
    UsuarioUSP --|> UsuarioGeral

    UsuarioExterno --> UC02
    UsuarioExterno --|> UsuarioGeral
    UsuarioUSP --o UC07 & UC08 & UC09
    UsuarioExterno --o UC07 & UC08 & UC09

    Administrador --|> UsuarioUSP %% Admin é um tipo de Usuário USP
    Administrador --o UC10
    UC10 --> UC11 & UC12 & UC13 & UC14

    UC01 --x SistemaSU
    UC12 --x SistemaRep

    UC03 -.-> UC04

    %% Estilos e Classes (mantidos)
    classDef ator fill:#e6f0ff,stroke:#84a9d1,stroke-width:1px,color:#000;
    class UsuarioGeral,UsuarioUSP,UsuarioExterno,Administrador,SistemaSU,SistemaRep ator;
    style UC01,UC02 fill:#ffffcc,stroke:#b3b300
    style UC03,UC04 fill:#e6ffe6,stroke:#008000
    style UC05,UC06 fill:#e6f7ff,stroke:#0077cc
    style UC07,UC08,UC09 fill:#f0f0f0,stroke:#666
    style UC10,UC11,UC12,UC13,UC14 fill:#ffe6e6,stroke:#cc0000
Loading

2. Diagramas de Sequência (Fluxos Chave)

Estes diagramas detalham a ordem das interações entre os componentes para realizar casos de uso específicos.

2.1. Login com Senha Única

Mostra o fluxo desde o clique no botão de login até o usuário ser autenticado e redirecionado.

sequenceDiagram
    participant Usuario as Usuário
    participant Navegador
    participant App as Aplicação Base<br/>(Middleware/Controller)
    participant Socialite as SenhaUnica<br/>Socialite Provider
    participant SU as Sistema Senha Única<br/>(OAuth1 Server)
    participant DB as Banco de Dados<br/>(User Model, Spatie)

    Usuario->>Navegador: Clica em "Login com Senha Única" (em /login)
    Navegador->>App: GET /socialite/login
    App->>Socialite: Chama redirect()
    Socialite->>SU: Solicita Request Token
    SU-->>Socialite: Retorna Request Token/Secret
    Socialite->>App: Guarda Secret na Sessão
    App-->>Navegador: Redirect para SU/authorize?oauth_token=...&callback_id=...
    Navegador->>SU: GET /wsusuario/oauth/authorize?oauth_token=...
    Usuario->>SU: Insere Credenciais USP
    SU-->>Navegador: Redirect para App/callback?oauth_token=...&oauth_verifier=...
    Navegador->>App: GET /callback?oauth_token=...&oauth_verifier=...
    App->>Socialite: Chama user() [handleProviderCallback]
    Socialite->>SU: Solicita Access Token (usando Request Token + Verifier)
    SU-->>Socialite: Retorna Access Token/Secret
    Socialite->>SU: Solicita Dados do Usuário (/usuariousp)
    SU-->>Socialite: Retorna dados (JSON com codpes, nome, email, vinculos)
    Socialite->>App: Retorna Objeto User Socialite
    App->>DB: User::firstOrNew(['codpes' => codpes])
    App->>DB: Atualiza/Preenche dados (nome, email)
    App->>DB: user->save()
    opt Marca Email como Verificado (se for novo ou nulo)
        App->>DB: user->email_verified_at = now()
        App->>DB: user->save()
    end
    opt Aplica Permissões (se config('senhaunica.permission'))
        App->>App: user->aplicarPermissoes(dadosSU)
        App->>DB: Sync roles/permissions (Spatie)
    end
    App->>App: Auth::login(user)
    App-->>Navegador: Redirect para Dashboard ('/')
    Navegador->>App: GET /
    App-->>Navegador: Exibe página autenticada
Loading

2.2. Registro de Novo Usuário (Tipo USP)

Detalha o fluxo de registro quando um usuário seleciona "Comunidade USP".

sequenceDiagram
    participant Usuario as Usuário
    participant Navegador
    participant App as Aplicação Base<br/>(Request/Controller)
    participant DB as Banco de Dados<br/>(User, Role)
    participant Mailer as Sistema de Email<br/>(Notification)

    Usuario->>Navegador: Preenche formulário /register (Tipo=USP, inclui CodPes, email @usp.br)
    Navegador->>App: POST /register (RegistrationRequest)
    App->>App: Validação (RegistrationRequest::rules) - Verifica unicidade email/codpes, formato email
    alt Validação Falha
        App-->>Navegador: Retorna com Erros
    else Validação OK
        App->>DB: User::create(dados validados) - Cria usuário, Hashea senha
        App->>DB: Role::firstOrCreate('usp_user')
        App->>DB: user->assignRole('usp_user')
        App->>App: Dispara evento Registered(user)
        App->>Mailer: Queue(new VerifyUserEmail(user)) - Envia email de verificação
        App->>App: Auth::login(user)
        App-->>Navegador: Redirect para /verify-email (verification.notice)
        Navegador->>App: GET /verify-email
        App-->>Navegador: Exibe página "Verifique seu Email"
    end
Loading

2.3. Criação de Usuário USP por Administrador

Ilustra como um administrador cria um usuário buscando dados no Replicado.

sequenceDiagram
    participant Admin as Administrador
    participant Navegador
    participant App as Aplicação Base<br/>(AdminUserController)
    participant Replicado as Fachada Replicado<br/>(Pessoa::fetch, Pessoa::email)
    participant DB as Banco de Dados<br/>(User, Role)
    participant Logger

    Admin->>Navegador: Acessa /admin/users/create/usp
    Navegador->>App: GET /admin/users/create/usp
    App-->>Navegador: Exibe formulário (input codpes)

    Admin->>Navegador: Insere CodPes e Submete
    Navegador->>App: POST /admin/users/create/usp (StoreUspUserRequest)
    App->>App: Validação (StoreUspUserRequest - codpes required, numeric, unique)
    alt Validação Falha (ex: já existe)
        App-->>Navegador: Redirect Back com Erros
    else Validação OK
        App->>Replicado: Pessoa::fetch(codpes)
        Replicado-->>App: Retorna dados da pessoa (ou null)
        alt Pessoa Não Encontrada
            App-->>Navegador: Redirect Back com Erro ('Nº USP não encontrado')
        else Pessoa Encontrada
            App->>Replicado: Pessoa::email(codpes)
            Replicado-->>App: Retorna email principal (ou vazio)
            alt Email Vazio
                 App-->>Navegador: Redirect Back com Erro ('Usuário sem email principal')
            else Email Encontrado
                App->>DB: Verifica se email já existe (User::where('email', email)->exists())
                alt Email Já Existe
                    App-->>Navegador: Redirect Back com Erro ('Usuário já cadastrado por Email')
                else Email OK
                    App->>App: Gera senha aleatória (Str::password)
                    App->>DB: User::create(codpes, nome, email, hash(senha), email_verified_at=now())
                    App->>DB: Role::firstOrCreate('usp_user')
                    App->>DB: user->assignRole('usp_user')
                    App->>App: Adiciona Flash Message com Sucesso + Senha Inicial
                    App-->>Navegador: Redirect para /admin/dashboard
                end
            end
        end
    end
    opt Exceção no Replicado
        App->>Logger: Log::error(...)
        App-->>Navegador: Redirect Back com Erro ('Erro ao conectar/processar Replicado')
    end
Loading

3. Diagrama de Classe (Modelos Principais)

Este diagrama mostra a estrutura das classes de modelo centrais (User, Role, Permission) e seus relacionamentos, incluindo os traits relevantes.

classDiagram
    class User {
        +int id
        +string name
        +string email
        +int codpes nullable
        +string password nullable
        +timestamp email_verified_at nullable
        +timestamp created_at
        +timestamp updated_at
        +string $appNs = 'web'
        +string $hierarquiaNs = 'senhaunica'
        +string $vinculoNs = 'senhaunica'
        +array $permissoesHierarquia
        +array $permissoesVinculo
        +trait HasRoles~Spatie~
        +trait HasSenhaunica~Uspdev~
        +trait Notifiable
        +trait HasFactory
        +interface MustVerifyEmail
        +getEnvAttribute() bool|string
        +getLevelAttribute() string
        +labelLevel(string $level = null) string
        +hasSenhaunicaJson() bool
        +aplicarPermissoes(UserSocialite $userSenhaUnica) void
        +listarPermissoesHierarquicas() array
        +listarPermissoesApp() array
        +listarPermissoesVinculo(array $vinculos) array
        +criarPermissoesPadrao() void
        +findOrCreateFromReplicado(int $codpes) User|string
        +verificaUsuarioLocal(int $codpes) bool
        +roles() BelongsToMany
        +permissions() BelongsToMany
        +sendEmailVerificationNotification() void
        +sendPasswordResetNotification(string $token) void
    }

    class Role {
        <<Spatie\Permission\Models\Role>>
        +int id
        +string name
        +string guard_name
        +timestamp created_at
        +timestamp updated_at
        +permissions() BelongsToMany
        +users() MorphToMany
    }

    class Permission {
        <<Spatie\Permission\Models\Permission>>
        +int id
        +string name
        +string guard_name
        +timestamp created_at
        +timestamp updated_at
        +roles() BelongsToMany
        +users() MorphToMany
    }

    User " * " -- " * " Role : via model_has_roles
    User " * " -- " * " Permission : via model_has_permissions (direta)
    Role " * " -- " * " Permission : via role_has_permissions

    User ..> MustVerifyEmail : implements
    User ..> HasRoles : uses
    User ..> HasSenhaunica : uses
    User ..> Notifiable : uses
    User ..> HasFactory : uses

    note for User "Usa traits de Spatie\Permission\Traits\HasRoles e Uspdev\SenhaunicaSocialite\Traits\HasSenhaunica"
Loading

4. Diagrama de Atividade (Fluxo de Registro)

Este diagrama ilustra o fluxo de decisão durante o processo de registro de um novo usuário.

graph TD
    A[Início: Acessa /register] --> B{Preenche Formulário};
    B --> C{Seleciona Tipo de Usuário};
    C -- Externo --> D[Valida Dados Comuns];
    C -- Comunidade USP --> E{Preenche Nº USP};
    E --> F[Valida Dados Comuns, Email, e Nº USP];
    D --> G{Validação OK?};
    F --> G;
    G -- Não --> H[Exibe Erros no Formulário];
    H --> B;
    G -- Sim --> I[Cria Usuário no BD];
    I --> J{Tipo USP?};
    J -- Sim --> K[Atribui Papel 'usp_user'];
    J -- Não --> L[Atribui Papel 'external_user'];
    K --> M[Dispara Evento Registered];
    L --> M;
    M --> N[Envia Email de Verificação];
    N --> O[Loga Usuário];
    O --> P[Redireciona para /verify-email];
    P --> Q[Fim do Fluxo de Registro];

    style H fill:#f9f,stroke:#333,stroke-width:2px
Loading

5. Proposta de Diagramas Adicionais (Ideais)

Para uma documentação ainda mais completa, especialmente à medida que aplicações mais complexas são construídas sobre este base, os seguintes diagramas PODERIAM ser considerados:

  • Diagrama de Componentes: Mostrar os principais pacotes de software (Laravel Framework, SenhaunicaSocialite, Spatie Permission, UspTheme, Replicado) e suas dependências, ajudando a entender a arquitetura de alto nível e possíveis pontos de acoplamento.
  • Diagrama de Implantação (Deployment): Visualizar como a aplicação seria implantada em um ambiente típico da USP, mostrando servidores web (Apache/Nginx), servidor de banco de dados (MySQL/PostgreSQL/SQLServer), servidor de cache (Redis/Memcached), servidor de filas e a interação com sistemas externos (Senha Única, Replicado).
  • Diagrama de Estados (State Machine): Se houvesse entidades com ciclos de vida complexos (ex: um processo de aprovação com múltiplos estados), um diagrama de estados para o Model correspondente seria útil. Para o projeto base atual, talvez não seja essencial.

Estes diagramas adicionais PODERIAM ser adicionados conforme a necessidade e a evolução do projeto base ou das aplicações derivadas.

⚠️ **GitHub.com Fallback** ⚠️