chore: housekeeping and documentation - #11
Open
Guajir0-code wants to merge 2 commits into
Open
Conversation
The app points Eloquent at an existing WordPress database, so no migration creates wp_posts, wp_users, wp_terms and friends. Any test that touched the database therefore could not run, and the single feature test in the repo (GET / asserting 200) failed on a missing database. Add a schema builder for the wp_* tables the app reads, small row builders, and smoke coverage for all seven routes in routes/web.php, including the highlighted-post exclusion, search, and the published/scheduled filtering the global scope is responsible for. withoutVite() keeps the suite independent of `npm run build`. ExampleTest is dropped: RoutesTest covers GET / properly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Small fixes collected from a read through the codebase, none of which warrant a pull request of their own. Behaviour: * register HandleAppearance. It existed but was never added to the middleware stack, so the cookie the theme switcher writes was never read back and anyone who picked light or dark explicitly saw a flash of the other theme on every full page load * Inertia SSR is now env driven and off by default. Hardcoding it to true means every request pays for a failed connection to 127.0.0.1:13714 whenever the SSR process is not running, which is the case under `composer dev` * WpCategoryService filters by taxonomy. Slugs are only unique within a taxonomy, so a tag could be returned where a category was asked for * carousel pagination dots follow the number of slides instead of a hardcoded 5 * the search input no longer fires a request on blur * useAppearance keeps its ref at module scope, so the desktop and mobile theme buttons cannot disagree Cleanup: * Sidebar renders nothing instead of a 500px grey placeholder block * drop the Inspiring quote from the shared Inertia props, and its type: it was computed on every request and never rendered * group the OR in the search scope explicitly Docs: * README covering setup, the WordPress coupling, the conventions that live in content rather than code, and the testing story * document the Advanced Custom Fields dependency. The post subtitle comes from a meta key that ACF owns; if the field is reconfigured the subtitle silently disappears with no error anywhere Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que é
Correções pequenas reunidas a partir de uma leitura do código, nenhuma delas grande o bastante para um PR próprio, mais a documentação que faltava.
Organizado em três blocos abaixo. Cada item é independente — se algum não fizer sentido, dá para retirar sem afetar os demais.
Comportamento
HandleAppearancenunca foi registradaapp/Http/Middleware/HandleAppearance.phpexiste, lê o cookieappearancee o compartilha com a view raiz. Masbootstrap/app.phpsó registravaHandleInertiaRequestseAddLinkHeadersForPreloadedAssets.Resultado:
useAppearance.tsgrava o cookie (com o comentário// Store in cookie for SSR) e ninguém nunca o leu.$appearancechegava sempre nulo no Blade, que caía no padrão'system'. Quem escolhia claro ou escuro explicitamente via o tema errado piscar a cada carregamento completo.SSR ligado por hardcode
Sem
env(). Em qualquer ambiente onde o processo de SSR não esteja rodando — o que incluicomposer dev, que não o inicia — toda requisição paga uma tentativa de conexão que falha antes de cair no render do cliente.Passa a ser
env('INERTIA_SSR_ENABLED', false).WpCategoryServicenão filtrava por taxonomiaSlugs só são únicos dentro de uma taxonomia. Uma tag com o mesmo slug de uma categoria podia ser devolvida no lugar dela. Agora há join com
wp_term_taxonomye filtro portaxonomy = 'category'.Dots do carrossel fixos em 5
totalCountjá era calculado a partir deapi.scrollSnapList(). Com menos de cinco destaques sobravam bolinhas que não levavam a lugar nenhum.Busca disparada no blur
HeaderSearchForm.vuesubmetia uma busca completa sempre que o input perdia o foco e o valor tinha mudado. Clicar fora do campo virava requisição. Removido; o submit do formulário continua funcionando.useAppearancecom estado por instânciaO
refera criado dentro da função, então cada chamada gerava um estado próprio. O header renderiza umThemeButtonpara desktop e outro para mobile — os dois podiam discordar sobre o tema atual. Movido para escopo de módulo.Limpeza
Sidebar.vueera um placeholder cinza em produçãoRenderizado em toda página desktop. Passa a não renderizar nada, com um comentário explicando o porquê. Um painel cinza falso comunica menos que uma coluna vazia.
Vale o registro: o tema WordPress que este projeto substitui preenchia essa coluna com um anúncio. Se essa posição voltar é decisão de quem mantém o site, e por isso deixei o comentário no arquivo em vez de simplesmente apagá-lo.
Citação do
Inspiringnos props compartilhadosComputada em toda requisição, serializada em todo payload do Inertia, e renderizada em lugar nenhum. Removida, junto com o tipo correspondente em
index.d.ts.ORsem agrupamento explícito no scope de buscaIsto não é um bug hoje. Verifiquei dumpando o SQL gerado: o
callScopedo Laravel aninha automaticamente as condições que um scope nomeado adiciona, e a saída sai corretamente parentizada:Mas essa é uma propriedade de como o scope é invocado, não deste código. No dia em que a condição for copiada para dentro de uma query, a precedência do SQL faz o
ANDganhar doORe os filtros deixam de valer. O agrupamento explícito custa três linhas e remove a armadilha.Documentação
README.mdO repositório não tinha nenhum. Ninguém sobe o projeto sem ler o código-fonte, porque o
.env.exampledizDB_CONNECTION=sqliteenquanto a aplicação exige um MySQL com as tabelas do WordPress populadas.O README cobre stack, requisitos, instalação, o acoplamento com o WordPress, as convenções que vivem no conteúdo (categoria
destaques, menu chamadoMenu, slug da política de privacidade), como rodar os testes e os quatro comandos de qualidade.Inclui também um aviso sobre rodar
php artisan migratecontra o banco do WordPress: as migrations do esqueleto criamusers,cacheejobsdentro do mesmo schema, e comCACHE_STORE=databaseo Laravel passa a escrever no banco do WP.A dependência de Advanced Custom Fields
O subtítulo exibido na capa do post vem de
wp_postmetacommeta_key = 'subtitle'. Esse campo é criado pelo ACF — o tema WordPress anterior o lia comget_field("subtitle").Nenhum dos dois repositórios declarava isso em lugar nenhum. Se o campo for movido para dentro de um group ou repeater no ACF, o formato do
meta_keymuda e o subtítulo desaparece do site sem erro algum, em nenhum log.Está documentado no README, com a orientação de começar a investigação pelo ACF caso o subtítulo suma.
Como validar
php artisan testvue-tsc --noEmitlimpo. Nenhum teste novo aqui: os itens são pequenos e a suíte existente cobre as sete rotas, que continuam passando.Impacto
INERTIA_SSR_ENABLED=true. É a única mudança deste PR que exige ação em deploy.quotesome dos props compartilhados.Fora de escopo
O esqueleto de autenticação do Laravel não foi removido, apesar de o projeto não ter login próprio. Comecei a remover
app/Models/User.php,UserFactorye a migration deusers, e recuei:config/auth.phpaponta paraApp\Models\UsereHandleInertiaRequests::share()ainda chama$request->user(), que resolve o guard e o provider. Desatar isso significa decidir o que fazer com o propauth.user— decisão de quem mantém o projeto, não limpeza de rotina, ainda mais considerando que um trabalho futuro sobre a barra de admin pode querer usar essa estrutura.Os itens de higiene de
WpAuthService(chamadas deLog::debuga cada requisição despejando conteúdo de cookie, query redundante,@unserializesemallowed_classes) também ficaram de fora. Eles moram no mesmo arquivo que precisa de uma revisão mais séria da validação do cookie do WordPress, e tocá-lo duas vezes seria desperdício.