Skip to content

feat: painel de marca (white-label), correção de build e análise de p…#6

Open
impa365 wants to merge 2 commits into
getfy-opensource:mainfrom
impa365:main
Open

feat: painel de marca (white-label), correção de build e análise de p…#6
impa365 wants to merge 2 commits into
getfy-opensource:mainfrom
impa365:main

Conversation

@impa365
Copy link
Copy Markdown

@impa365 impa365 commented Mar 12, 2026

1. Correção de build — Case-sensitivity no Vite (Linux/Docker)

O build do frontend falhava no GitHub Actions (Linux) por causa de imports com letra maiúscula @/Components/ em vez de @/components/.

  • Index.vue: Corrigido 2 imports de @/Components/EmailProviderSidebar.vue@/components/EmailProviderSidebar.vue

2. Nova aba "Marca" nas Configurações (white-label completo)

Permite alterar nome, descrição, cor primária, logos e favicon da plataforma diretamente pelo painel admin, sem precisar mexer em variáveis de ambiente.

Backend:

  • SettingsController.php:
    • index() agora passa dados de branding do banco (com fallback para getfy.php)
    • update() salva campos de branding (app_name, app_description, theme_primary, logos, favicon)
    • Novo método uploadBranding() para upload de imagens via endpoint dedicado
  • web.php: Nova rota POST /configuracoes/branding/upload
  • HandleInertiaRequests.php: Branding agora lê do banco primeiro (Setting::get()) com fallback para config
  • PanelPwaController.php: Manifest PWA usa branding do banco
  • EmailTestController.php: Nome do app nos emails vem do banco
  • app.blade.php: Title, favicon e theme-color do HTML leem do banco

Frontend:

  • Index.vue:
    • Nova aba "Marca" com campos: nome, descrição, cor primária (color picker), 4 uploads de logo (horizontal claro/escuro, ícone claro/escuro) e favicon
    • Tamanhos recomendados exibidos em cada card de upload
    • Preview das imagens após upload

3. Restrição da aba "Marca" apenas para admin (master)

  • Frontend: A aba "Marca" só aparece se auth.user.role === 'admin'; tabs são computados dinamicamente
  • Backend: uploadBranding() retorna 403 se não for admin; update() ignora campos de branding se não for admin

Arquivos modificados

Arquivo Tipo de alteração
Index.vue Fix imports + nova aba Marca + restrição admin
SettingsController.php Branding CRUD + upload + guard admin
web.php Nova rota branding upload
HandleInertiaRequests.php Branding do banco com fallback
PanelPwaController.php PWA manifest do banco
EmailTestController.php App name do banco
app.blade.php HTML title/favicon/theme do banco

Notas

  • Sem migrations novas — usa a tabela settings existente (key-value com tenant_id)
  • Sem breaking changes — tudo tem fallback para os valores do getfy.php (variáveis de ambiente)
  • O sistema de plugins foi analisado e está completo, apenas desabilitado intencionalmente com overlay "Em breve.."

impa365 added 2 commits March 12, 2026 13:38
…lugins

1. Correção de build — Case-sensitivity no Vite (Linux/Docker)
O build do frontend falhava no GitHub Actions (Linux) por causa de imports com letra maiúscula @/Components/ em vez de @/components/.

Index.vue: Corrigido 2 imports de @/Components/EmailProviderSidebar.vue → @/components/EmailProviderSidebar.vue
2. Nova aba "Marca" nas Configurações (white-label completo)
Permite alterar nome, descrição, cor primária, logos e favicon da plataforma diretamente pelo painel admin, sem precisar mexer em variáveis de ambiente.

Backend:

SettingsController.php:
index() agora passa dados de branding do banco (com fallback para getfy.php)
update() salva campos de branding (app_name, app_description, theme_primary, logos, favicon)
Novo método uploadBranding() para upload de imagens via endpoint dedicado
web.php: Nova rota POST /configuracoes/branding/upload
HandleInertiaRequests.php: Branding agora lê do banco primeiro (Setting::get()) com fallback para config
PanelPwaController.php: Manifest PWA usa branding do banco
EmailTestController.php: Nome do app nos emails vem do banco
app.blade.php: Title, favicon e theme-color do HTML leem do banco
Frontend:

Index.vue:
Nova aba "Marca" com campos: nome, descrição, cor primária (color picker), 4 uploads de logo (horizontal claro/escuro, ícone claro/escuro) e favicon
Tamanhos recomendados exibidos em cada card de upload
Preview das imagens após upload
3. Restrição da aba "Marca" apenas para admin (master)
Frontend: A aba "Marca" só aparece se auth.user.role === 'admin'; tabs são computados dinamicamente
Backend: uploadBranding() retorna 403 se não for admin; update() ignora campos de branding se não for admin
Arquivos modificados
Arquivo	Tipo de alteração
Index.vue	Fix imports + nova aba Marca + restrição admin
SettingsController.php	Branding CRUD + upload + guard admin
web.php	Nova rota branding upload
HandleInertiaRequests.php	Branding do banco com fallback
PanelPwaController.php	PWA manifest do banco
EmailTestController.php	App name do banco
app.blade.php	HTML title/favicon/theme do banco
Notas
Sem migrations novas — usa a tabela settings existente (key-value com tenant_id)
Sem breaking changes — tudo tem fallback para os valores do getfy.php (variáveis de ambiente)
O sistema de plugins foi analisado e está completo, apenas desabilitado intencionalmente com overlay "Em breve.."
…-pagamentos

1. Conteúdo progressivo (Drip Content)
Implementa sistema completo de liberação progressiva de módulos na área de membros. O infoprodutor define quantos dias após a compra cada módulo será disponibilizado ao aluno, e pode desbloquear manualmente para alunos específicos.

Backend:

Nova migration: coluna release_after_days em member_modules + tabela member_content_unlocks para desbloqueios manuais
Novo model MemberContentUnlock com relacionamentos user, module e unlockedByUser
MemberModule ganha método dripUnlocksAt($userId) que calcula a data de liberação com base na data do pedido + dias configurados, respeitando desbloqueios manuais
MemberAreaAppController: módulos bloqueados retornam is_locked: true, unlocks_at e lessons: []; acesso direto via moduleContent() e lesson() é bloqueado com redirect
MemberBuilderController: storeModule e updateModule aceitam release_after_days; 3 novos endpoints para gerenciar desbloqueios manuais (listar, desbloquear, re-bloquear)
3 novas rotas: GET/POST/DELETE .../modules/{module}/unlock[s]
Frontend — Painel do infoprodutor (MemberBuilder):

Campo inline "Liberar após X dias" em cada módulo (seções do tipo courses)
Botão "Desbloqueios" abre modal com select de alunos → desbloquear; lista de desbloqueios existentes com opção de remover
Frontend — Área do aluno:

Show.vue, Modulos.vue, ModuleContent.vue: módulos bloqueados exibem cadeado (ícone Lock) com contagem regressiva ("Disponível em X dias", "Amanhã", "Em breve")
Módulos bloqueados não são clicáveis e aparecem com opacidade reduzida + thumbnail escurecida
Sidebar do player também indica módulos bloqueados
2. Fix página /docs/api-pagamentos
O .gitignore tinha a linha docs (sem / inicial) na linha 27, que funcionava como padrão global e ignorava qualquer pasta chamada docs em qualquer nível — incluindo Docs e docs. Isso impedia que os arquivos da documentação da API fossem commitados e, consequentemente, incluídos no build Docker.

Removidas linhas 27-28 (docs e Docs Gateways) do .gitignore
As linhas /docs e /Docs Gateways (com / inicial, só raiz) já existiam e foram mantidas
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