Skip to content

V3.0.1 fix/chore#7

Merged
Xcode-sketcher merged 54 commits intomainfrom
v3.0.0-dev
Feb 25, 2026
Merged

V3.0.1 fix/chore#7
Xcode-sketcher merged 54 commits intomainfrom
v3.0.0-dev

Conversation

@Xcode-sketcher
Copy link
Copy Markdown
Owner

Ajuste no tempo de timeout

…revizualização de imagem, e melhorias na responsividade e posição do formulário
… como melhorias na interface de criação, e edição, e visualização de contato
- Novos modelos: TenantMembership, TenantInvite, TenantRole, ContactPhone,
  ContactEmail, ContactAddress, Tag, ContactTag, ContactAuditLog
- Serviços: InviteService, TagService, FileUploadService (CRUD + cache)
- TenantService reescrito com sessão + IMemoryCache (workspace switcher)
- ContatoService reescrito com suporte multi-tenant agregado e projeções
- Autorização por papel no tenant (TenantRoleHandler + políticas)
- ApplicationDbContext com 10 DbSet, relacionamentos e índices compostos
- DbInitializer cria roles Identity (Owner, Admin, User)
- Nova migration InitialCreate com todas as tabelas
- Compressão de resposta (Brotli + GZip)
- Sanitização de comentários redundantes em todo o código-fonte
- ContatoController com filtros, favoritos e policies TenantUser/TenantAdmin
- AdminController com membros, convites e audit log paginado
- ProfileController com upload de foto e edição de perfil
- TagController com CRUD e endpoint JSON para AJAX
- WorkspaceController para alternar entre tenants
- InviteController para aceitar convites via link
- Views: Admin (Members, Invites, AuditLog, CreateInvite), Profile, Tag
- Views de Contato reescritas com campos dinâmicos e seleção de tags
- Layout atualizado com workspace switcher, foto de perfil e links admin
- ContactViewModel com AvailableTags e Label renomeado para 'Rótulo (opcional)'
- ContactListItemViewModel com PrimaryPhoneLabel e PrimaryEmailLabel
…Lançado]

- Documentadas todas as features implementadas: multi-tenant, convites,
  tags, audit log, upload de arquivos, workspace switcher, painel admin,
  perfil, rótulos, filtros avançados, compressão
- Documentada sanitização de comentários em todo o código-fonte
- Adicionado .gitignore para .idea e bin\Debug
- ImageMigrationService idempotente executa na inicialização
- Detecta base64 em ProfilePictureUrl e Tenant.LogoUrl
- Decodifica e salva como arquivo estático em uploads/profiles e uploads/tenants
- Atualiza URLs no banco para caminhos relativos
- Limpeza automática de arquivos antigos com extensão diferente
- Sidebar fixa à esquerda (64px compacta, 220px ao hover) com ícones
- Navegação: Dashboard, Contatos, Tags + Admin condicional (Membros, Convites, Histórico)
- Profile dropdown fixo no rodapé da sidebar (sempre visível)
- Topbar com workspace switcher, busca e toggle de tema
- Layout público (visitantes) com topbar simples sem sidebar
- Toggle mobile: sidebar desliza com botão hambúrguer
- CSS responsivo com media queries e transições suaves
- JS: sidebar toggle com click-outside para fechar no mobile
- Partial _Pager.cshtml com botões Anterior/Próxima, input 'Ir para' e seletor pageSize (10/20/30/50)
- Contato/List.cshtml usa _Pager via ViewData com filtros preservados na URL
- Padrão de 20 itens por página
- ContatoService retorna lista vazia ao invés de lançar exceção quando não há tenants
- GetUpcomingBirthdaysAsync retorna vazio ao invés de exceção
- ContatoController.List exibe mensagem de erro ao invés de redirecionar para AccessDenied
- 4 cards KPI: Total, Ativos (%), Favoritos, Grupos
- Gráfico de barras (Chart.js) com contatos por grupo — cores distintas, dark mode
- Nuvem de tags clicável — tamanho proporcional à frequência, redireciona para listagem filtrada
- Aniversariantes clicáveis com badge de grupo e link para detalhes
- HomeController com queries diretas otimizadas (GroupBy, projeções)
- HomeDashboardViewModel expandido com TagCloudItem e GroupContactCount
- ContatoController carrega AvailableTags via TagService nos GETs Create/Edit
- Checkboxes com badges coloridas nos formulários Create e Edit
- Tags pré-selecionadas no Edit baseadas nos TagIds do contato existente
- Adicionado using System.Security.Claims no ContatoController
- Canvas envolto em container com altura fixa (260px) via CSS
- Chart.getChart() destrói instância existente antes de criar nova
- Mantém maintainAspectRatio:false com container limitado
- Chart.js: container com altura fixa (260px) e Chart.getChart() destrói instância antes de recriar
- Sidebar: exibe FullName do usuário (query única com ProfilePictureUrl) ao invés do email
- CSS: sidebar-label com text-overflow:ellipsis e max-width:140px
- Removido BOM duplicado no _Layout.cshtml
- Otimização: 2 queries de usuário mescladas em 1 (Select ProfilePictureUrl + FullName)
- _Pager renderiza quando totalCount > 0 (não apenas totalPages > 1)
- TagIds preservados nas URLs do pager
- Dropdown de tags com checkboxes no formulário de filtros
- ContatoController.List carrega AvailableTags para popular o filtro
- PagerTotalCount passado via ViewData
- TagViewModel com propriedade Scope (string: 'Local' ou 'Grupo')
- TagService projeta Scope na query
- Manage.cshtml: coluna Escopo com badge e ícone (Local = pessoa, Grupo = pessoas)
- Tooltip explicativo em cada badge
- UpdateContactAsync detecta diffs em: Nome, Anotações, Ativo, Favorito, Data de Nascimento, Telefones, E-mails, Endereços e Tags
- Telefones/emails/endereços comparados como strings ordenadas
- Tags comparadas por IDs com resolução de nomes
- AuditLog.cshtml: resumo com primeiro campo + 'e mais N campo(s)'
- Botão Detalhes abre modal com tabela Campo/Anterior/Novo
- Formatação visual: anterior em vermelho (del), novo em verde
…Denied

- TenantRoleHandler com ILogger para debug de falhas de autorização
- Logs indicam userId, tenantId, minRole e resultado da verificação
- AccessDenied.cshtml com dica sobre workspace e botões de navegação
…, tags, audit log e access

- Registradas todas as correções e features desta rodada em [Não Lançado]
- Novas entradas: escopo visual de tags, filtro por tags, chart fix, sidebar FullName,
  pager sempre visível, audit log completo, AccessDenied melhorado
…aginação

- ContactFilterViewModel: Page mínimo 1, PageSize entre 1-100 com fallback
- Evita consultas massivas acidentais (OOM/slow queries)
- Contact: índices compostos (TenantId, IsActive, Name), (TenantId, IsFavorite)
- ContactTag: índice em TagId para performance de joins
- TenantMembership: índice (UserId, IsActive) para lookups de membros
- Nota: gerar migration em ambiente de deploy
- Models/Contact.cs: propriedade [Timestamp] RowVersion
- Data/ApplicationDbContext: configurado IsRowVersion() (commit anterior)
- Nota: gerar migration para RowVersion
- Phones/Emails/Addresses: atualiza existentes por Id, adiciona novos, remove ausentes
- Tags: adiciona/remove apenas TagIds alterados (diff por conjunto)
- Captura DbUpdateConcurrencyException com mensagem amigável
- Evita DELETE+INSERT massivo em cada edição de contato
- Services/IEmailSender.cs: interface para envio de e-mails
- Services/EmailSettings.cs: POCO com Host, Port, User, Password, UseSsl, From
- Services/EmailSenderSmtp.cs: implementação SMTP com fallback para log em dev
- appsettings.json: seção EmailSettings com valores padrão (sem credenciais)
- Credenciais configuradas via dotnet user-secrets (Brevo SMTP)
…redefinir senha

- ViewModels/AccountSecurityViewModels.cs: VMs de ForgotPassword, ResetPassword, ChangePassword, ChangeEmail
- Controllers/AccountController.cs: IEmailSender injetado, novas actions para todos os fluxos de segurança
- Views/Account: ForgotPassword, ForgotPasswordConfirmation, ResetPassword, ResetPasswordConfirmation, ChangePassword, ChangeEmail
- Views/Account/Login.cshtml: link 'Esqueci minha senha' + fix nullable
- Tokens gerados via Identity (GeneratePasswordResetTokenAsync, GenerateChangeEmailTokenAsync)
- E-mails enviados via IEmailSender (Brevo SMTP)
- Services/IDashboardCacheService.cs: interface + DashboardCacheEntry DTO
- Services/DashboardCacheService.cs: cache em memória com TTL curto e invalidação por tenant
- Controllers/HomeController.cs: usa cache para KPIs, consulta DB apenas em cache miss
…l e vCard

- Services/IExportService.cs, ExportService.cs: exporta para CSV (CsvHelper), Excel (ClosedXML) e vCard 3.0
- Services/IImportService.cs, ImportService.cs: importa de CSV/Excel/vCard com preview e dedupe (e-mail/telefone)
- Controllers/ImportExportController.cs: Export (GET/POST por formato), Import com upload e confirmação
- Views/ImportExport/Export.cshtml: cards com botões para os 3 formatos de exportação
- Views/ImportExport/Import.cshtml: formulário de upload com opção de ignorar duplicados
- Views/ImportExport/ImportPreview.cshtml: tabela de preview com detecção de duplicados
- ControleContatos.csproj: adicionados CsvHelper 33.0.1 e ClosedXML 0.104.2
…rag-and-drop

- Models: Pipeline.cs, Stage.cs, Deal.cs, DealTask.cs — modelo de dados CRM com RowVersion
- Data/ApplicationDbContext.cs: DbSets + configurações EF Core (índices, relacionamentos, decimal)
- ViewModels/KanbanViewModels.cs: Board, Column, Card, Pipeline, Deal e MoveDeal DTOs
- Controllers/DealsController.cs: board Kanban, CRUD de Pipeline e Deal, endpoint AJAX MoveDeal
- Views/Deals/Index.cshtml: board responsivo com drag & drop HTML5 nativo
- Views/Deals/CreatePipeline.cshtml: criação de pipeline com estágios (um por linha)
- Views/Deals/CreateDeal.cshtml: formulário de deal com seleção de contato e valor
- Nota: gerar migration (dotnet ef migrations add AddKanbanModels)
… real

- Hubs/RealtimeHub.cs: hub com grupos por tenant, eventos CardMoved, DealCreated, DealDeleted, ContactChanged
- Program.cs: AddSignalR(), MapHub('/realtime'), registro de todos os serviços (Email, Cache, Import/Export)
- DealsController.cs: broadcast via IHubContext ao mover card no kanban
- Observação: single-server (in-process), para multi-server integrar Redis backplane
…obais

- AccountController: registro exige confirmação por e-mail (EmailConfirmed=false)
- AccountController: nova action ConfirmEmail com token do Identity
- AccountController: envio de e-mail de confirmação via IEmailSender (Brevo)
- Program.cs: RequireConfirmedEmail = true no Identity
- DevController: endpoint GET /Dev/SendTestEmail?to= (somente Development)
- Login.cshtml: exibe TempData Message/Error (confirmação, erros)
- _Layout.cshtml: removidos links alterar senha/email do dropdown
- Profile/Index.cshtml: seção Segurança com botões Alterar Senha e Alterar E-mail
- site.css: corrigido logo desalinhado na sidebar compacta (flex-shrink no SVG)
- site.js: autocomplete=off global em todos os inputs/textareas/selects
…ir card

- Views/Deals/Index.cshtml: cliente SignalR conecta ao hub /realtime com tenantId
- Handlers: CardMoved (mover DOM), DealCreated (reload), DealDeleted (remover card)
- DealsController: ViewBag.TenantId para JS, broadcast em CreateDeal e DeleteDeal
- Renomeado 'Deal' para 'Card' nos labels do Kanban
- Removida exibição do campo Value nos cards
…mpleto com subtarefas

- ViewModels/KanbanViewModels.cs: StageInputDto, SubtaskInputDto, DealPriority enum, campos StartDate/EndDate/Priority no DealViewModel, removido Value
- Models/Deal.cs: removido Value, adicionados StartDate, EndDate, Priority
- Data/ApplicationDbContext.cs: Priority como string, removido decimal Value
- Controllers/DealsController.cs: CreatePipeline aceita List<StageInputDto>, CreateDeal com subtarefas e tags
- Views/Deals/CreatePipeline.cshtml: UI interativa com estágios editáveis (cor + nome + adicionar/remover), padrão A Fazer/Em Progresso/Concluído
- Views/Deals/CreateDeal.cshtml: renomeado para Novo Card, campos prioridade/datas/tags/subtarefas inline
- Nota: gerar migration para remover Value e adicionar StartDate/EndDate/Priority
…fone nos formulários

- Views/Contato/List.cshtml: campos redimensionados (col-md-2/1), Tags como dropdown compacto, botão Filtrar e X inline (col-auto)
- Views/Contato/Create.cshtml: phone-mask + inputmode=tel nos inputs de telefone (estático e dinâmico)
- Views/Contato/Edit.cshtml: phone-mask + inputmode=tel nos inputs de telefone (estático e dinâmico)
- PhoneMask.attach() chamado ao adicionar telefones dinamicamente
…e e Priority no Deal

- Migration: AtualizarDealRemoverValueAdicionarCampos
- DropColumn Value (decimal), AddColumn EndDate, StartDate (timestamp), Priority (varchar 10)
- Executar: dotnet ef database update
…as via AJAX

- Views/Deals/Index.cshtml: badge de prioridade (cores), data de fim, contagem de subtarefas
- Controllers/DealsController.cs: endpoints ToggleTask, AddTask, DeleteTask (AJAX, protegidos por tenant)
- ViewModels/KanbanViewModels.cs: DTOs ToggleTaskDto, AddTaskDto, DeleteTaskDto
…release v3.0.0

- Services/EmailTemplates.cs: novo template HTML responsivo com CSS inline — cabeçalho azul (#0d6efd), botão CTA, rodapé padronizado. Métodos: ConfirmacaoConta, RedefinirSenha, ConfirmarAlteracaoEmail, TesteSmtp
- Controllers/AccountController.cs: substituídos 3 corpos HTML inline por chamadas a EmailTemplates; removido XML doc da classe
- Controllers/DevController.cs: substituído corpo HTML inline por EmailTemplates.TesteSmtp; removidos XML docs
- Controllers/DealsController.cs: removido XML doc da classe
- Hubs/RealtimeHub.cs: removidos todos os XML docs redundantes; simplificadas assinaturas de OnDisconnectedAsync e métodos Notify*
- Authorization/TenantRoleHandler.cs: XML doc substituído por comentário conciso de uma linha
- Authorization/TenantRoleRequirement.cs: removido XML doc redundante
- Mappings/ContactMappingProfile.cs: removido XML doc redundante
- ViewModels/KanbanViewModels.cs: removidos todos os XML docs redundantes; separadores de seção simplificados
- ViewModels/ContactFilterViewModel.cs: removido XML doc redundante
- ViewModels/ContactDetailsViewModel.cs: removido XML doc redundante
- ViewModels/ContactViewModel.cs: removido XML doc redundante
- Services/IEmailSender.cs: removido XML doc redundante
- Services/EmailSettings.cs: removido XML doc redundante
- Services/EmailSenderSmtp.cs: removido XML doc redundante
- CHANGELOG.md: seção [Não Lançado] movida para [3.0.0] - 2026-02-25 com resumo completo das features, correções e refactors da versão
…oteção de secrets

- Dockerfile: build multi-stage (sdk:10.0 → aspnet:10.0), publica em Release, expõe porta 8080, respeita variável PORT do Render, diretório /app/wwwroot/uploads criado no runtime
- .dockerignore: exclui bin/, obj/, .env, uploads locais, launchSettings.json e Migrations Designer dos layers do Docker
- .env.example: template documentado com todas as variáveis necessárias (ConnectionStrings, EmailSettings, ASPNETCORE_ENVIRONMENT, DataProtection)
- .env: arquivo real com secrets — NÃO commitado (ignorado pelo .gitignore)
- .gitignore: adicionadas entradas para .env, **/bin/, **/obj/, .vs/, .idea/, *.log e diretórios de uploads gerados em runtime
# Conflicts:
#	ControleContatos/Controllers/AccountController.cs
#	ControleContatos/Controllers/ContatoController.cs
#	ControleContatos/Mappings/ContactMappingProfile.cs
#	ControleContatos/Services/ContatoService.cs
#	ControleContatos/ViewModels/ContactDetailsViewModel.cs
#	ControleContatos/Views/Account/Login.cshtml
#	ControleContatos/Views/Contato/Create.cshtml
#	ControleContatos/Views/Contato/Delete.cshtml
#	ControleContatos/Views/Contato/Details.cshtml
#	ControleContatos/Views/Contato/Edit.cshtml
#	ControleContatos/Views/Contato/List.cshtml
#	ControleContatos/Views/Shared/_Layout.cshtml
#	ControleContatos/wwwroot/css/site.css
#	ControleContatos/wwwroot/js/site.js
# Conflicts:
#	ControleContatos/Services/EmailSenderSmtp.cs
@gitguardian
Copy link
Copy Markdown

gitguardian Bot commented Feb 25, 2026

⚠️ GitGuardian has uncovered 1 secret following the scan of your pull request.

Please consider investigating the findings and remediating the incidents. Failure to do so may lead to compromising the associated services or software components.

🔎 Detected hardcoded secret in your pull request
GitGuardian id GitGuardian status Secret Commit Filename
27590802 Triggered Username Password e1c467a .env.example View secret
🛠 Guidelines to remediate hardcoded secrets
  1. Understand the implications of revoking this secret by investigating where it is used in your code.
  2. Replace and store your secret safely. Learn here the best practices.
  3. Revoke and rotate this secret.
  4. If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.

To avoid such incidents in the future consider


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

@Xcode-sketcher Xcode-sketcher merged commit b8e76d7 into main Feb 25, 2026
1 check failed
@Xcode-sketcher Xcode-sketcher deleted the v3.0.0-dev branch February 25, 2026 06:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant