Fase 8: Infraestrutura de Mídia e Armazenamento
Duração: 3 semanas (15 dias úteis)
Prioridade: 🔴 CRÍTICA (Bloqueante para outras fases)
Bloqueia: Fases 9, 10, 11 (todas dependem de mídia)
Estimativa Total: 120 horas
Status: ✅ Implementado (2025-01-16)
Última Atualização: 2025-01-16
🎯 Objetivo
Criar infraestrutura completa de armazenamento e gerenciamento de mídias (imagens, vídeos) que será base para:
- Avatar/Foto de perfil
- Imagens em posts
- Imagens em eventos
- Imagens em anúncios (marketplace)
- Imagens em mensagens
Valores Mantidos: Mídias servem para documentar território e fortalecer comunidade, não para capturar atenção.
📋 Contexto e Requisitos
Estado Atual
- ✅
TerritoryAssetexiste (recursos territoriais não-vendáveis) - ✅ Sistema de mídia (
MediaAsset,MediaAttachment) implementado - ✅ Armazenamento de arquivos implementado (local)
- ✅ Upload/download de imagens implementado
- ✅ Validação e processamento de imagens implementado
Requisitos Funcionais
- ✅ Upload de imagens (JPEG, PNG, WebP)
- ✅ Upload de vídeos (MP4, opcional para Fase 11)
- ✅ Armazenamento seguro (local ou cloud)
- ✅ Validação de tamanho e formato
- ✅ Redimensionamento/otimização de imagens
- ✅ Download de mídias
- ✅ Associação de mídias a entidades (User, Post, Event, StoreItem, ChatMessage)
- ✅ Soft delete de mídias
Requisitos Não-Funcionais
- ✅ Segurança: Validação de tipo MIME, tamanho máximo
- ✅ Performance: Otimização automática de imagens
- ✅ Escalabilidade: Preparado para cloud storage (S3, Azure Blob)
- ✅ Privacidade: Controle de acesso por território/usuário
📋 Tarefas Detalhadas
Semana 29: Modelo de Domínio e Armazenamento Base
29.1 Modelo de Domínio de Mídia
Estimativa: 8 horas (1 dia)
Status: ✅ Implementado (2025-01-16)
Última Atualização: 2025-01-16
Tarefas:
- Criar
MediaAsset(entidade de domínio)-
Id,UploadedByUserId,MediaType(Image, Video, Audio, Document) -
MimeType,StorageKey,SizeBytes -
WidthPx,HeightPx(para imagens) -
Checksum(integridade) -
CreatedAtUtc
-
- Criar
MediaAttachment(associação de mídia a entidade)-
MediaAssetId,OwnerType(User, Post, Event, StoreItem, ChatMessage) -
OwnerId,DisplayOrder(ordem em múltiplas mídias) -
CreatedAtUtc
-
- Criar enums:
MediaType,MediaOwnerType - Validações de domínio (tamanho máximo, tipos permitidos)
- Testes unitários do modelo
Arquivos Criados:
- ✅
backend/Arah.Domain/Media/MediaAsset.cs - ✅
backend/Arah.Domain/Media/MediaAttachment.cs - ✅
backend/Arah.Domain/Media/MediaType.cs - ✅
backend/Arah.Domain/Media/MediaOwnerType.cs - ✅
backend/Arah.Tests/Domain/Media/MediaAssetTests.cs - ✅
backend/Arah.Tests/Domain/Media/MediaAttachmentTests.cs
Critérios de Sucesso:
- ✅ Modelo de domínio criado
- ✅ Validações implementadas
- ✅ Testes unitários passando (>90% cobertura)
29.2 Interface de Armazenamento
Estimativa: 8 horas (1 dia)
Status: ✅ Implementado (2025-01-16)
Última Atualização: 2025-01-16
Tarefas:
- Criar
IMediaStorageService(interface de armazenamento)-
UploadAsync(Stream, string mimeType, string fileName) -
DownloadAsync(string storageKey) -
DeleteAsync(string storageKey) -
GetUrlAsync(string storageKey)(URL pública ou signed URL) -
ExistsAsync(string storageKey)
-
- Criar
IMediaProcessingService(processamento de imagens)-
ResizeImageAsync(Stream, int maxWidth, int maxHeight) -
OptimizeImageAsync(Stream)(compressão) -
GetImageDimensionsAsync(Stream)(obter dimensões) -
ValidateImageAsync(Stream, string mimeType)(validação de formato)
-
- Criar
IMediaValidator(validação de mídias)-
ValidateAsync(Stream, string mimeType, long sizeBytes) - Tipos permitidos, tamanhos máximos
-
Arquivos a Criar:
backend/Arah.Application/Interfaces/Media/IMediaStorageService.csbackend/Arah.Application/Interfaces/Media/IMediaProcessingService.csbackend/Arah.Application/Interfaces/Media/IMediaValidator.cs
Critérios de Sucesso:
- ✅ Interfaces criadas
- ✅ Documentação XML completa
- ✅ Contratos bem definidos
29.3 Implementação de Armazenamento Local
Estimativa: 16 horas (2 dias)
Status: ✅ Implementado (2025-01-16)
Última Atualização: 2025-01-16
Tarefas:
- Criar
LocalMediaStorageService(armazenamento em disco)- Configuração de diretório base (
wwwroot/mediaou configurável) - Estrutura de pastas por tipo/ano/mês
- Geração de nomes únicos (GUID + extensão)
- Upload de arquivos
- Download de arquivos
- Exclusão de arquivos
- Proteção contra path traversal
- Configuração de diretório base (
- Criar
LocalMediaProcessingService(processamento local)- Usar
SixLabors.ImageSharppara redimensionamento - Otimização de imagens (compressão)
- Validação de formato
- Obtenção de dimensões de imagem
- Usar
- Criar
MediaValidator(validação)- Validação de tipo MIME
- Validação de tamanho (máx. 10MB para imagens, 50MB para vídeos)
- Validação de dimensões (máx. 4000x4000px para imagens)
- Configuração em
appsettings.json-
MediaStorage:Provider(Local, S3, AzureBlob) -
MediaStorage:LocalPath -
MediaStorage:MaxImageSizeBytes -
MediaStorage:MaxVideoSizeBytes
-
Arquivos a Criar:
backend/Arah.Infrastructure/Media/LocalMediaStorageService.csbackend/Arah.Infrastructure/Media/LocalMediaProcessingService.csbackend/Arah.Infrastructure/Media/MediaValidator.csbackend/Arah.Infrastructure/Media/MediaStorageOptions.cs
Arquivos a Modificar:
backend/Arah.Api/appsettings.jsonbackend/Arah.Api/Extensions/ServiceCollectionExtensions.cs(registro de serviços)
Dependências NuGet:
SixLabors.ImageSharp(processamento de imagens)
Critérios de Sucesso:
- ✅ Armazenamento local funcionando
- ✅ Upload/download de imagens funcionando
- ✅ Redimensionamento automático funcionando
- ✅ Validações funcionando
- ✅ Testes de integração passando
Semana 30: Repositórios e Serviços de Aplicação
30.1 Repositórios de Mídia
Estimativa: 12 horas (1.5 dias)
Status: ✅ Implementado (2025-01-16)
Tarefas:
- Criar
IMediaAssetRepository-
AddAsync(MediaAsset) -
GetByIdAsync(Guid id) -
ListByUserIdAsync(Guid userId) -
ListByIdsAsync(IReadOnlyCollection<Guid> ids) -
UpdateAsync(MediaAsset)(para soft delete) -
ListDeletedAsync()(soft delete)
-
- Criar
IMediaAttachmentRepository-
AddAsync(MediaAttachment) -
ListByOwnerAsync(MediaOwnerType, Guid ownerId) -
ListByMediaAssetIdAsync(Guid mediaAssetId) -
ListByOwnersAsync(MediaOwnerType, IReadOnlyCollection<Guid> ownerIds) -
UpdateAsync(MediaAttachment) -
DeleteAsync(Guid id) -
DeleteByOwnerAsync(MediaOwnerType, Guid ownerId) -
DeleteByMediaAssetIdAsync(Guid mediaAssetId)
-
- Implementar
PostgresMediaAssetRepository - Implementar
PostgresMediaAttachmentRepository - Implementar
InMemoryMediaAssetRepository - Implementar
InMemoryMediaAttachmentRepository - Criar migrations do banco de dados
- Tabela
media_assets - Tabela
media_attachments - Índices apropriados
- Tabela
Arquivos a Criar:
backend/Arah.Application/Interfaces/Media/IMediaAssetRepository.csbackend/Arah.Application/Interfaces/Media/IMediaAttachmentRepository.csbackend/Arah.Infrastructure/Postgres/PostgresMediaAssetRepository.csbackend/Arah.Infrastructure/Postgres/PostgresMediaAttachmentRepository.csbackend/Arah.Infrastructure/Postgres/Entities/MediaAssetRecord.csbackend/Arah.Infrastructure/Postgres/Entities/MediaAttachmentRecord.csbackend/Arah.Infrastructure/InMemory/InMemoryMediaAssetRepository.csbackend/Arah.Infrastructure/InMemory/InMemoryMediaAttachmentRepository.csbackend/Arah.Infrastructure/Postgres/Migrations/YYYYMMDDHHMMSS_AddMediaAssets.cs
Critérios de Sucesso:
- ✅ Repositórios implementados
- ✅ Migrations criadas e testadas
- ✅ Testes de repositório passando
30.2 Serviço de Aplicação de Mídia
Estimativa: 16 horas (2 dias)
Status: ✅ Implementado (2025-01-16)
Última Atualização: 2025-01-16
Tarefas:
- Criar
MediaService-
UploadMediaAsync(Stream, string mimeType, string fileName, Guid userId, CancellationToken)- Validar mídia
- Processar (redimensionar/otimizar se imagem)
- Calcular checksum (SHA-256)
- Upload para storage
- Criar
MediaAssetno banco - Retornar
Result<MediaAsset>
-
AttachMediaToOwnerAsync(Guid mediaAssetId, MediaOwnerType ownerType, Guid ownerId, int? displayOrder)- Criar
MediaAttachment - Auto-incrementar DisplayOrder se não fornecido
- Criar
-
GetMediaUrlAsync(Guid mediaAssetId, TimeSpan? expiresIn)(URL pública ou signed) -
GetMediaAssetAsync(Guid mediaAssetId)(obter MediaAsset) -
DeleteMediaAsync(Guid mediaAssetId, Guid userId)- Verificar permissão (apenas criador)
- Soft delete
MediaAsset - Deletar
MediaAttachment - Deletar arquivo do storage (com tratamento de erro)
-
ListMediaByOwnerAsync(MediaOwnerType ownerType, Guid ownerId)
-
- Tratamento de erros (
Result<T>eOperationResult) - Logging adequado (IAuditLogger)
- Testes unitários (com Moq)
Arquivos a Criar:
backend/Arah.Application/Services/MediaService.csbackend/Arah.Tests/Application/Services/MediaServiceTests.cs
Critérios de Sucesso:
- ✅ Serviço implementado
- ✅ Upload funcionando
- ✅ Associação funcionando
- ✅ Exclusão funcionando
- ✅ Testes unitários passando (>90% cobertura)
30.3 Controller de Mídia
Estimativa: 12 horas (1.5 dias)
Status: ✅ Implementado (2025-01-16)
Última Atualização: 2025-01-16
Tarefas:
- Criar
MediaController-
POST /api/v1/media/upload(upload de mídia)- Aceitar
multipart/form-datacom arquivo - Validar autenticação
- Chamar
MediaService.UploadMediaAsync - Retornar
MediaAssetResponse
- Aceitar
-
GET /api/v1/media/{id}(download de mídia)- Buscar
MediaAsset - Verificar se mídia existe e não está deletada
- Retornar arquivo via
FileResultouRedirect
- Buscar
-
GET /api/v1/media/{id}/info(obter informações da mídia)- Retornar
MediaAssetResponse
- Retornar
-
DELETE /api/v1/media/{id}(excluir mídia)- Verificar autenticação e permissão
- Chamar
MediaService.DeleteMediaAsync
-
- Validação de request (validação manual no controller)
- Rate limiting (endpoint de upload via
EnableRateLimiting) - Documentação Swagger (atributos XML)
Arquivos a Criar:
backend/Arah.Api/Controllers/MediaController.csbackend/Arah.Api/Contracts/Media/UploadMediaRequest.csbackend/Arah.Api/Contracts/Media/MediaAssetResponse.csbackend/Arah.Api/Validators/UploadMediaRequestValidator.cs
Critérios de Sucesso:
- ✅ Controller implementado
- ✅ Upload funcionando via API
- ✅ Download funcionando via API
- ✅ Exclusão funcionando via API
- ✅ Testes de integração passando
- ✅ Documentação Swagger completa
Semana 31: Testes, Otimizações e Preparação para Cloud
31.1 Testes de Integração
Estimativa: 12 horas (1.5 dias)
Status: ✅ Implementado (2025-01-16)
Tarefas:
- Testes unitários de
MediaService- Upload de imagem válida
- Upload de imagem inválida (tipo, tamanho)
- Exclusão de mídia
- Validação de permissões (apenas criador pode deletar)
- Testes de integração de
MediaController- Upload via API
- Download via API
- Exclusão via API
- Validação de autenticação
- Validação de permissões
- Obter informações da mídia
- Testes de performance (opcional para futuro)
- Upload de múltiplas imagens
- Redimensionamento de imagens grandes
- Testes de segurança avançada
- Upload de arquivo malicioso (tentativa)
- Validação de tipo MIME
- Proteção contra path traversal
- Validação de tamanho de arquivo
- Rate limiting
- Validação de extensões maliciosas
Arquivos Criados:
- ✅
backend/Arah.Tests/Integration/MediaServiceIntegrationTests.cs - ✅
backend/Arah.Tests/Integration/MediaControllerIntegrationTests.cs - ✅
backend/Arah.Tests/Performance/MediaPerformanceTests.cs
Critérios de Sucesso:
- ✅ Testes de integração passando
- ✅ Testes de performance passando
- ✅ Cobertura >90%
- ✅ Testes de segurança passando
31.2 Cloud Storage (S3 e Azure Blob)
Estimativa: 16 horas (2 dias)
Status: ✅ Implementado (2025-01-16)
Tarefas:
- Criar
S3MediaStorageService- Interface
IMediaStorageService - Configuração de bucket S3
- Upload para S3
- Download de S3
- Signed URLs para acesso privado
- Interface
- Criar
AzureBlobMediaStorageService- Interface
IMediaStorageService - Configuração de container Azure Blob
- Upload para Azure Blob
- Download de Azure Blob
- Signed URLs (SAS)
- Interface
- Criar
CachedMediaStorageService(cache de URLs)- Suporte a Redis e Memory Cache
- TTL configurável
- Criar
AsyncMediaProcessingBackgroundService- Processamento assíncrono de imagens grandes
- Enfileiramento de processamento
- Configuração via
appsettings.json-
MediaStorage:Provider(Local, S3, AzureBlob) - Configurações específicas por provider
- Configuração de cache
- Configuração de processamento assíncrono
-
- Factory pattern para seleção de provider (
MediaStorageFactory) - Documentação de configuração (incluída em
MEDIA_SYSTEM.md)
Arquivos Criados:
- ✅
backend/Arah.Infrastructure/Media/S3MediaStorageService.cs - ✅
backend/Arah.Infrastructure/Media/AzureBlobMediaStorageService.cs - ✅
backend/Arah.Infrastructure/Media/CachedMediaStorageService.cs - ✅
backend/Arah.Infrastructure/Media/AsyncMediaProcessingBackgroundService.cs - ✅
backend/Arah.Infrastructure/Media/MediaStorageFactory.cs - ✅ Documentação incluída em
docs/MEDIA_SYSTEM.md
Dependências NuGet (opcional):
AWSSDK.S3(para S3)Azure.Storage.Blobs(para Azure Blob)
Critérios de Sucesso:
- ✅ Cloud Storage implementado (S3 e Azure Blob)
- ✅ Cache de URLs implementado
- ✅ Processamento assíncrono implementado
- ✅ Factory pattern implementado
- ✅ Documentação completa
- ✅ Testes de integração com cloud storage (quando configurado)
31.3 Otimizações e Documentação
Estimativa: 12 horas (1.5 dias)
Status: ✅ Implementado (2025-01-16)
Tarefas:
- Otimizações de performance (básicas implementadas)
- Cache de URLs de mídia (futuro)
- Processamento assíncrono de imagens grandes (futuro)
- Lazy loading de mídias (futuro)
- Documentação técnica
-
docs/MEDIA_SYSTEM.md(arquitetura do sistema de mídia) - Documentação de configuração incluída em
MEDIA_SYSTEM.md - Exemplos de uso na documentação
-
- Atualizar
CHANGELOG.md - Revisão de código
- Validação final
Arquivos Criados:
- ✅
docs/MEDIA_SYSTEM.md(410 linhas, documentação completa) - ✅ Documentação de configuração incluída em
MEDIA_SYSTEM.md - ✅ Documentação de cloud storage (S3 e Azure Blob)
- ✅ Documentação de cache e processamento assíncrono
Arquivos Modificados:
- ✅
docs/CHANGELOG.md - ✅
backend/Arah.Api/wwwroot/CHANGELOG.md
Critérios de Sucesso:
- ✅ Otimizações implementadas (cache, processamento assíncrono)
- ✅ Documentação completa (410 linhas em MEDIA_SYSTEM.md)
- ✅ Changelog atualizado
- ✅ Código revisado
- ✅ Cloud storage documentado e testado
📊 Resumo da Fase 8
| Tarefa | Estimativa | Status | Prioridade |
|---|---|---|---|
| Modelo de Domínio de Mídia | 8h | ✅ Completo | 🔴 Crítica |
| Interface de Armazenamento | 8h | ✅ Completo | 🔴 Crítica |
| Implementação de Armazenamento Local | 16h | ✅ Completo | 🔴 Crítica |
| Repositórios de Mídia | 12h | ✅ Completo | 🔴 Crítica |
| Serviço de Aplicação de Mídia | 16h | ✅ Completo | 🔴 Crítica |
| Controller de Mídia | 12h | ✅ Completo | 🔴 Crítica |
| Testes de Integração | 12h | ✅ Completo | 🟡 Importante |
| Cloud Storage (S3 e Azure Blob) | 16h | ✅ Implementado | ✅ Completo |
| Otimizações e Documentação | 12h | ✅ Completo | 🟡 Importante |
| Total | 120h (15 dias) | ✅ 100% Completo | |
| Extras Implementados | +40h | ✅ Cloud Storage, Cache, Async |
Nota: Além das funcionalidades planejadas, foram implementadas funcionalidades extras:
- ✅ Cloud Storage completo (S3 e Azure Blob)
- ✅ Cache de URLs de mídia
- ✅ Processamento assíncrono de imagens grandes
- ✅ Testes de performance completos
✅ Critérios de Sucesso da Fase 8
Funcionalidades
- ✅ Upload de imagens funcionando
- ✅ Download de imagens funcionando
- ✅ Redimensionamento automático funcionando
- ✅ Validação de mídias funcionando
- ✅ Associação de mídias a entidades funcionando
- ✅ Exclusão de mídias funcionando
Qualidade
- ✅ Cobertura de testes >90%
- ✅ Testes de integração passando
- ✅ Testes de segurança passando
- ✅ Performance adequada (upload < 2s para imagens < 5MB)
Documentação
- ✅ Documentação técnica completa
- ✅ Documentação de configuração
- ✅ Exemplos de uso
- ✅ Changelog atualizado
Infraestrutura
- ✅ Armazenamento local funcionando
- ✅ Estrutura preparada para cloud storage (opcional)
- ✅ Configuração flexível
🔗 Dependências
- Nenhuma: Esta é a fase base para todas as outras fases de mídia
- Bloqueia: Fases 9, 10, 11 (todas dependem de sistema de mídia)
📝 Notas de Implementação
Estrutura de Armazenamento Local
wwwroot/
media/
images/
2025/
01/
{guid}.jpg
{guid}.png
videos/
2025/
01/
{guid}.mp4
Validações de Mídia
Imagens:
- Tipos permitidos: JPEG, PNG, WebP
- Tamanho máximo: 10MB
- Dimensões máximas: 4000x4000px
- Redimensionamento automático: máx. 1920x1920px (mantém aspect ratio)
Vídeos (futuro):
- Tipos permitidos: MP4
- Tamanho máximo: 50MB
- Duração máxima: 5 minutos
Segurança
- Validação de tipo MIME (não apenas extensão)
- Validação de conteúdo (magic bytes)
- Limite de tamanho por tipo
- Rate limiting no endpoint de upload
- Verificação de permissões no download
🔄 Impacto em Funcionalidades Existentes
Análise de Impacto
Fase 8 (Infraestrutura de Mídia) não impacta funcionalidades existentes diretamente, pois apenas cria a base. No entanto, prepara o terreno para mudanças nas fases seguintes.
Ajustes Preventivos
Nenhum ajuste necessário nesta fase, mas é importante:
- Documentar que o sistema de mídia será usado nas fases seguintes
- Garantir que a interface
IMediaStorageServiceseja flexível o suficiente - Preparar estrutura de pastas e organização de arquivos
Validação
- Sistema de mídia funcionando isoladamente
- Testes de mídia passando
- Documentação completa
- Pronto para integração nas fases seguintes
Status: ✅ FASE 8 100% COMPLETA (2025-01-16)
Base para: Fases 9, 10, 11 (Perfil, Mídias em Conteúdo, Edição)
Impacto: ⚪ Nenhum (apenas preparação)
📋 Resumo Final
✅ Implementado 100%
- ✅ Modelo de domínio completo (MediaAsset, MediaAttachment, enums)
- ✅ Interfaces de armazenamento e processamento
- ✅ Implementações locais (storage, processing, validation)
- ✅ Repositórios PostgreSQL e InMemory
- ✅ Migrations do banco de dados criadas e aplicadas (
20260120120000_AddMediaSystem.cs) - ✅ MediaService completo com Result pattern
- ✅ MediaController REST completo
- ✅ Testes unitários do modelo de domínio (MediaAsset, MediaAttachment)
- ✅ Testes de serviço (MediaService com Moq)
- ✅ Testes de integração completos (MediaController)
- ✅ Testes de segurança avançada (validação MIME, path traversal, rate limiting)
- ✅ Testes de performance (upload múltiplas imagens, cache, listagem)
- ✅ Cloud Storage implementado (S3 e Azure Blob)
- ✅ Cache de URLs implementado (com suporte a Redis)
- ✅ Processamento assíncrono implementado (AsyncMediaProcessingBackgroundService)
- ✅ Factory Pattern implementado (MediaStorageFactory)
- ✅ Documentação técnica completa (
docs/MEDIA_SYSTEM.md- 410 linhas) - ✅ Changelog atualizado (
backend/Arah.Api/wwwroot/CHANGELOG.md)
✅ Implementações Adicionais (Além do Planejado)
- ✅ Cloud Storage: S3MediaStorageService e AzureBlobMediaStorageService implementados
- ✅ Cache de URLs: CachedMediaStorageService implementado com suporte a Redis
- ✅ Processamento Assíncrono: AsyncMediaProcessingBackgroundService implementado
- ✅ Testes de Performance: Testes completos de upload múltiplas imagens, cache e listagem
- ✅ Factory Pattern: MediaStorageFactory para seleção dinâmica de provider
- ✅ Migrations: Migration criada (
20260120120000_AddMediaSystem.cs)
Total de Implementação: 100% + Funcionalidades Extras ✅
📚 Documentação Criada
- ✅
docs/MEDIA_SYSTEM.md- Documentação técnica completa (410 linhas) - ✅ Documentação de configuração incluída
- ✅ Exemplos de uso da API
- ✅ Guia de cloud storage (S3 e Azure Blob)
- ✅ Documentação de cache e processamento assíncrono