🗄️ Persistência e Deduplicação

Fase 3 · PostgreSQL · Flyway · JPA · SHA-256

🎯 Objetivo

A Fase 3 introduz persistência desacoplada para transcrições, permitindo reutilização futura baseada em hash SHA-256 do áudio.

A estratégia prepara o sistema para:

🏗️ Estratégia Arquitetural

Camada Responsabilidade
Domain Entidade Transcription e regras de deduplicação
Application Use cases de persistência e recuperação
Port TranscriptionGateway desacoplado do banco
Adapter Implementação JPA/PostgreSQL
Infrastructure Datasource, Flyway e pool de conexões

🔐 Estratégia de Deduplicação

Cada áudio será convertido para um hash SHA-256 determinístico.

        
        audio bytes
          ↓
        SHA-256
          ↓
        audioHash
          ↓
        consulta persistência
          ↓
        reutiliza ou processa IA
      
    

O hash será utilizado futuramente como:

AudioHash e Deduplicação

O sistema agora possui um serviço dedicado para geração determinística do audioHash utilizando SHA-256 hexadecimal baseado no conteúdo binário do áudio.

    MessageDigest md = MessageDigest.getInstance("SHA-256");
    
    byte[] hash = md.digest(audioBytes);
    
    return HexFormat.of().formatHex(hash);
    

O hash será utilizado futuramente para deduplicação de transcrições, reuso inteligente e integração com mecanismos de cache.

Busca por AudioHash

O sistema agora possui um caso de uso dedicado para recuperação de transcrições utilizando audioHash.

      Optional<Transcription> result =
          gateway.findByAudioHash(audioHash);
      

O fluxo prepara a aplicação para deduplicação futura antes do envio para processamento de IA.

Adapter JPA

A persistência agora possui implementação concreta utilizando Spring Data JPA e PostgreSQL.

      @Entity
      @Table(name = "transcriptions")
      public class TranscriptionEntity {

        @Id
        @Column(nullable = false, updatable = false)
        private UUID id;

        @Column(name = "audio_hash", nullable = false, unique = true, length = 64)
        private String audioHash;

        @Column(name = "transcription", nullable = false, columnDefinition = "TEXT")
        private String transcription;

        @Column(name = "created_at", nullable = false, updatable = false)
        private LocalDateTime createdAt;
      }
      

A entidade JPA permanece separada da entidade de domínio preservando o isolamento arquitetural.

Migration Inicial

Foi criada a primeira migration Flyway responsável pela estrutura inicial da persistência de transcrições.

      CREATE TABLE transcriptions
      (
          id            UUID         NOT NULL,
          audio_hash    VARCHAR(64)  NOT NULL,
          transcription TEXT         NOT NULL,
          created_at    TIMESTAMPTZ  NOT NULL DEFAULT now(),

          CONSTRAINT pk_transcriptions PRIMARY KEY (id),
          CONSTRAINT uq_transcriptions_audio_hash UNIQUE (audio_hash)
      );
    

O índice único em audio_hash prepara a aplicação para deduplicação eficiente.

🧱 Estrutura da tabela

Campo Tipo Descrição
id UUID Identificador da transcrição
audio_hash VARCHAR(64) Hash SHA-256 único
transcription TEXT Conteúdo transcrito
created_at TIMESTAMP Data de persistência

🧩 Fluxo planejado

HTTP Request
      ↓
GetTranscriptionByHashUseCase
      ↓
TranscriptionGateway
      ↓
PostgreSQL

(se não existir)

Processar IA
      ↓
SaveTranscriptionUseCase
      ↓
Persistir resultado

📍 Roadmap da Fase 3

Versão Item
3.1.0 Setup PostgreSQL + JPA + Flyway
3.2.0 Entidade de domínio e portas
3.3.0 Serviço de geração SHA-256
3.4.0 SaveTranscriptionUseCase
3.5.0 GetTranscriptionByHashUseCase
3.6.0 Migration Flyway inicial
3.7.0 Adapter JPA + Repository PostgreSQL
3.8.0 Endpoints de persistência e recuperação