Detalhamento dos Módulos - ES2-UFPI/EsqueceramAI GitHub Wiki

2. Detalhamento dos Módulos

2.1 Objetivo

Esta seção descreve os módulos principais do Esqueceram AI, suas responsabilidades, funcionalidades, classes mais relevantes e os padrões de projeto utilizados.

O detalhamento prioriza os módulos centrais da aplicação e apresenta diagramas nos pontos em que eles são mais relevantes.

2.2 Padrões de Projeto Utilizados

Foram escolhidos padrões que possuem aplicação direta no sistema.

Padrão Onde será aplicado Justificativa
Abstract Factory Criação de diferentes tipos de itens Centraliza a criação dos objetos e facilita a inclusão de novas categorias
Observer Eventos de Match e notificações Permite reagir a um match sem acoplar o MatchService às ações posteriores

Outros padrões não serão adicionados apenas para aumentar a quantidade. Novos padrões poderão ser utilizados caso exista necessidade concreta.

2.3 Visão Geral dos Módulos

Módulo Responsabilidade geral
Acesso e Perfil Gerencia cadastro, autenticação e dados do usuário
Gestão de Itens Gerencia itens perdidos e encontrados
Busca e Filtros Permite localizar itens e restringir resultados
Match Compara itens e identifica possíveis correspondências
Notificações Informa usuários sobre eventos importantes
Postos de Coleta Gerencia locais de entrega e retirada
Recompensas Gerencia pontos e recompensas associados aos achados
Recuperação Controla confirmação de propriedade, reserva e devolução

2.4 Módulo de Acesso e Perfil

Descrição

Controla as contas dos usuários e as informações necessárias para identificar cada participante.

Funcionalidades

  • cadastrar usuário;
  • realizar login e logout;
  • manter sessão autenticada;
  • consultar e atualizar perfil;
  • controlar permissões de acesso.

Classes principais

Usuario, Perfil, UsuarioController, UsuarioService e UsuarioRepository.

2.5 Módulo de Gestão de Itens

Descrição

Responsável pelo cadastro e manutenção dos objetos perdidos e encontrados. Cada registro pode conter descrição, categoria, cor, marca, modelo, localização, data, fotografia, tipo de registro e estado atual.

Funcionalidades

  • cadastrar item perdido;
  • cadastrar item encontrado;
  • editar informações;
  • consultar item;
  • alterar estado;
  • associar fotografia;
  • informar localização;
  • classificar categoria;
  • encaminhar o item ao processo de Match.

Classes principais

Item, ItemEletronico, ItemDocumento, ItemAcessorio, ItemController, ItemService e ItemRepository.

Diagrama de Classes

classDiagram
    class Item {
        <<abstract>>
        +Long id
        +String descricao
        +String cor
        +String imagemUrl
        +String localizacao
        +StatusItem status
        +TipoRegistro tipoRegistro
    }
    class ItemEletronico {
        +String marca
        +String modelo
    }
    class ItemDocumento {
        +String tipoDocumento
        +String orgaoEmissor
    }
    class ItemAcessorio {
        +String material
        +String marca
    }
    class Usuario {
        +Long id
        +String nome
        +String email
    }
    class PostoColeta {
        +Long id
        +String nome
        +String endereco
    }
    class ItemRepository {
        +salvar(item)
        +buscarPorId(id)
        +buscarPorFiltros(filtros)
    }

    Item <|-- ItemEletronico
    Item <|-- ItemDocumento
    Item <|-- ItemAcessorio
    Usuario "1" --> "0..*" Item : registra
    PostoColeta "0..1" --> "0..*" Item : recebe
    ItemRepository --> Item : persiste
Loading

Padrão aplicado — Abstract Factory

O Abstract Factory será utilizado para criar objetos específicos conforme a categoria do item. Um eletrônico pode possuir marca e modelo, enquanto um documento pode possuir tipo e órgão emissor.

classDiagram
    class Item {
        <<abstract>>
    }
    class ItemEletronico
    class ItemDocumento
    class ItemAcessorio
    class ItemFactory {
        <<interface>>
        +criarItem(dados) Item
    }
    class EletronicoFactory {
        +criarItem(dados) Item
    }
    class DocumentoFactory {
        +criarItem(dados) Item
    }
    class AcessorioFactory {
        +criarItem(dados) Item
    }

    Item <|-- ItemEletronico
    Item <|-- ItemDocumento
    Item <|-- ItemAcessorio
    ItemFactory <|.. EletronicoFactory
    ItemFactory <|.. DocumentoFactory
    ItemFactory <|.. AcessorioFactory
    EletronicoFactory --> ItemEletronico : cria
    DocumentoFactory --> ItemDocumento : cria
    AcessorioFactory --> ItemAcessorio : cria
Loading

Benefícios

  • encapsula a criação dos objetos;
  • reduz condicionais no código de negócio;
  • facilita a inclusão de novas categorias;
  • separa a responsabilidade de criação;
  • reduz o acoplamento entre serviços e tipos concretos.

2.6 Módulo de Busca e Filtros

Descrição

Permite encontrar registros de itens utilizando características fornecidas no cadastro.

Funcionalidades

  • buscar por descrição;
  • filtrar por categoria;
  • filtrar por localização;
  • filtrar por data;
  • filtrar por cor;
  • filtrar por marca;
  • combinar filtros;
  • consultar possíveis itens relacionados.

Classes principais

BuscaService, FiltroItem, BuscaController e ItemRepository.

A busca fornece candidatos e não deve ser considerada, sozinha, como confirmação de propriedade.

2.7 Módulo de Match

Descrição

Compara características de itens perdidos e encontrados para identificar possíveis correspondências.

Podem ser consideradas características como categoria, descrição, cor, marca, modelo, localização, período aproximado e fotografia, quando disponível.

O resultado deve ser tratado como possível correspondência, e não como prova automática de propriedade.

Funcionalidades

  • receber item encontrado;
  • buscar itens perdidos candidatos;
  • comparar características;
  • calcular grau de compatibilidade;
  • registrar possíveis matches;
  • notificar módulos interessados;
  • permitir confirmação ou recusa.

Classes principais

Match, MatchService, MatchController, MatchRepository e MatchObserver.

Diagrama de Classes

classDiagram
    class Match {
        +Long id
        +double score
        +StatusMatch status
        +Date dataCriacao
    }
    class Item {
        +Long id
        +String descricao
        +String cor
        +String marca
        +String localizacao
    }
    class MatchService {
        +procurarMatches(item)
        +calcularScore(itemA, itemB)
        +confirmarMatch(id)
        +recusarMatch(id)
    }
    class MatchRepository {
        +salvar(match)
        +buscarPorUsuario(id)
        +buscarPorId(id)
    }

    Item "1" --> "0..*" Match : participa
    MatchService --> MatchRepository : utiliza
    Match --> Item : relaciona
Loading

2.8 Módulo de Notificações

Descrição

Responsável por informar os usuários sobre eventos relevantes. A entrega será realizada pelo Firebase Cloud Messaging.

Funcionalidades

  • enviar notificação de possível match;
  • informar alterações relevantes na recuperação;
  • informar eventos relacionados ao item;
  • manter dados necessários para o envio;
  • integrar com o FCM.

Classes principais

NotificacaoService, NotificationObserver e FCMClient.

O módulo funciona como observador dos eventos de Match. O MatchService não precisa conhecer os detalhes de envio.

2.9 Módulo de Postos de Coleta

Descrição

Representa os locais físicos onde itens encontrados podem ser entregues e posteriormente retirados pelos proprietários.

Funcionalidades

  • cadastrar posto;
  • consultar postos;
  • exibir localização;
  • associar item ao posto;
  • registrar recebimento;
  • registrar retirada.

Classes principais

PostoColeta, PostoColetaService, PostoColetaController e PostoColetaRepository.

Os itens não precisam ficar expostos fisicamente ao público no posto. O sistema utiliza os registros cadastrados para controlar o fluxo de entrega e retirada.

2.10 Módulo de Recompensas

Descrição

Registra benefícios associados à contribuição de usuários que encontram e entregam itens.

Funcionalidades

  • atribuir pontos;
  • consultar pontuação;
  • registrar recompensa;
  • registrar recebimento;
  • associar recompensa a item recuperado.

Classes principais

Recompensa, Pontuacao, RecompensaService e RecompensaRepository.

2.11 Módulo de Recuperação

Descrição

Controla o processo posterior à identificação de uma possível correspondência.

Funcionalidades

  • confirmar propriedade;
  • recusar correspondência;
  • reservar item;
  • controlar estado da recuperação;
  • registrar retirada;
  • registrar devolução.

Classes principais

Recuperacao, RecuperacaoService, MatchService e PostoColetaService.

Fluxo

Possível Match
      ↓
Confirmação de propriedade
      ↓
Item reservado
      ↓
Retirada no posto
      ↓
Item devolvido

Regra importante

Um item no estado RESERVADO não deve ser disponibilizado para uma segunda reserva concorrente.

2.12 Padrão de Projeto — Observer

O Observer será utilizado para desacoplar o reconhecimento de um match das ações que devem ocorrer como consequência desse evento.

Motivação

Depois que um match é identificado, mais de uma ação pode ocorrer:

Match identificado
       ↓
 ┌─────┴───────────┐
 ↓                 ↓
Notificação     Recompensa
 ↓                 ↓
FCM              Pontos

O MatchService não deve precisar conhecer todos os detalhes dessas ações.

Estrutura

classDiagram
    class MatchObserver {
        <<interface>>
        +atualizar(evento)
    }
    class NotificationObserver {
        +atualizar(evento)
    }
    class RewardObserver {
        +atualizar(evento)
    }
    class HistoryObserver {
        +atualizar(evento)
    }
    class MatchService {
        +processarMatch()
        +notificarObservers(evento)
    }

    MatchObserver <|.. NotificationObserver
    MatchObserver <|.. RewardObserver
    MatchObserver <|.. HistoryObserver
    MatchService --> MatchObserver : notifica
Loading

Funcionamento

MatchService
      ↓
Evento MatchIdentificado
      ↓
 ┌──────────────┬───────────────┬──────────────┐
 ↓              ↓               ↓
Notification   Reward          History
Observer       Observer        Observer
 ↓              ↓               ↓
FCM            Pontos          Histórico

Benefícios

  • reduz acoplamento;
  • facilita inclusão de novas reações;
  • favorece separação de responsabilidades;
  • facilita integrações externas;
  • melhora a extensibilidade do Match.

2.13 Diagrama de Sequência — Identificação de Match

O cenário representa o processo em que uma pessoa registra um item encontrado e o sistema verifica possíveis itens perdidos compatíveis.

sequenceDiagram
    actor Encontrador
    actor Proprietario
    participant Web as Aplicação Web
    participant API as ItemController
    participant ItemService as ItemService
    participant MatchService as MatchService
    participant Repo as ItemRepository
    participant DB as PostgreSQL
    participant Storage as Firebase Storage
    participant Observer as NotificationObserver
    participant FCM as Firebase FCM

    Encontrador->>Web: Cadastra item encontrado
    Web->>API: POST /api/itens
    API->>ItemService: registrarItem(dados)
    ItemService->>Storage: upload da fotografia (se informada)
    Storage-->>ItemService: storage_path
    ItemService->>Repo: salvar(item)
    Repo->>DB: INSERT item
    DB-->>Repo: Item salvo
    Repo-->>ItemService: Item
    ItemService->>MatchService: procurarMatches(item)
    MatchService->>Repo: buscarItensPerdidos()
    Repo->>DB: SELECT candidatos
    DB-->>Repo: Lista de candidatos
    Repo-->>MatchService: Candidatos
    MatchService->>MatchService: calcularScore()

    alt Match encontrado
        MatchService->>Repo: salvarMatch()
        Repo->>DB: INSERT match
        MatchService->>Observer: MatchIdentificado
        Observer->>FCM: enviarNotificacao()
        FCM-->>Proprietario: Nova possível correspondência
    else Nenhum match
        MatchService-->>ItemService: Nenhuma correspondência
    end

    ItemService-->>API: Resultado
    API-->>Web: JSON

    Proprietario->>Web: Confirma propriedade
    Web->>API: POST /api/matches/{id}/confirmar
    API->>MatchService: confirmarMatch(id)
    MatchService->>Repo: reservarItem(id)
    Repo->>DB: UPDATE status = RESERVADO
Loading

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