Skip to content

chore(receitasapi-ui): aislop quality pass + hallmark integrity fix - #20

Merged
Gaalbu merged 1 commit into
mainfrom
refactor/quality-design-pass
Aug 16, 2026
Merged

chore(receitasapi-ui): aislop quality pass + hallmark integrity fix#20
Gaalbu merged 1 commit into
mainfrom
refactor/quality-design-pass

Conversation

@Gaalbu

@Gaalbu Gaalbu commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Escopo: só receitasapi-ui/. api/ (Spring Boot + SonarQube) não foi tocado.

O que mudou

aislop (score 54 → 100):

  • 18 correções mecânicas via aislop fix: comentários triviais, console.log/debug esquecidos, imports não usados (app-module.ts, favorites.service.ts), imports duplicados de @angular/* mesclados numa única declaração (feedback/meal-plan/recipe components, recipe.service.ts).
  • recipe.component.ts: removida variável url não usada e um handler complete() que só tinha um console.log.
  • local-store.service.ts: catch vazio em remove() agora documenta a intenção do mesmo jeito que o set() vizinho já fazia.
  • feedback.component.ts: submitRating() duplicava um bloco de 10 linhas nos handlers next/error (montar a mesma entrada de review) — extraí recordLocalRating().
  • favorites.component.ts/ratings.component.ts: os dois contornavam o campo privado LocalStoreService do respectivo service com (service as any) para editar o localStorage na mão. Adicionei updateFavoriteLocally()/updateRatingLocally() públicos nos services em vez de furar o encapsulamento com as any.

Atenção — achado de segurança que mudei de ideia no meio da investigação

src/index.html carregava o Bootstrap via CDN com integrity="sha384-" — hash SRI vazio/truncado. Antes de escrever isso no relatório como "o navbar está quebrado em produção", conferi a spec de verdade (W3C SRI, via WebFetch): um token de hash que não parseia é descartado, e um conjunto de metadata vazio faz o browser pular a checagem de integridade (não bloqueia o recurso). Ou seja, o CSS carregava normalmente — só que a proteção de integridade nunca funcionou (era um no-op silencioso). Baixei o bootstrap@5.3.2/dist/css/bootstrap.min.css de verdade, calculei o hash sha384 real com openssl dgst, e completei o atributo.

hallmark audit (só leitura, depois só correções pontuais)

  • O fix do SRI acima.
  • Ícones de nav em emoji (🍽️ 🔍 ☰ 🔑 ✍️ em navbar.component.html) é um anti-pattern nomeado pelo hallmark, mas lê como voz de marca real de um app pessoal, não como tell de IA — não removido, listado como decisão de redesign que cabe a você.
  • Verificado sem achados: nenhum outline:none removendo foco, sem cabeçalhos em itálico, sem métricas inventadas, sem nenhuma animação no projeto (nada para condicionar a prefers-reduced-motion).

stop-slop

Auditado README.md raiz, docs/casos-de-uso.md e docs/casos-de-teste.md (docs do repo inteiro, conforme escopo). Nenhum maneirismo de IA — documentação técnica direta e tabular. Nada alterado.

Test plan

  • npx tsc --noEmit -p tsconfig.app.json limpo
  • npx ng build ok
  • npm test -- --watch=false — 16 arquivos, 142 testes, passando

aislop, scoped to receitasapi-ui/ (score 54 -> 100):
- 18 mechanical fixes via aislop fix: trivial comments, leftover
  console.log/debug statements, unused imports (app-module.ts,
  favorites.service.ts), duplicate @angular imports merged into single
  statements (feedback/meal-plan/recipe components, recipe.service.ts).
- recipe.component.ts: removed an unused `url` local and a complete()
  handler that only logged success.
- local-store.service.ts: empty catch block in remove() now documents
  intent the same way the sibling set() method already does.
- feedback.component.ts: submitRating()'s next/error handlers duplicated
  a 10-line block building the same review entry; extracted
  recordLocalRating().
- favorites.component.ts / ratings.component.ts: both reached around
  their service's private LocalStoreService field with `(service as any)`
  to hand-edit localStorage state. Added public
  updateFavoriteLocally()/updateRatingLocally() methods on the services
  instead of poking at private internals through a type-safety hole.

hallmark audit, scoped to receitasapi-ui/ (read-only, then mechanical
fixes only):
- src/index.html loaded Bootstrap from a CDN with integrity="sha384-" --
  an empty/truncated SRI hash. Checked the actual SRI spec before
  concluding anything: an unparseable hash token is dropped during
  parsing, and an empty parsed-metadata set makes the integrity check a
  no-op (bypassed, not blocking) -- so the stylesheet was loading fine,
  just with no real integrity protection. Downloaded bootstrap@5.3.2's
  CSS and computed the real sha384 hash to complete the attribute.
- Emoji-as-nav-icon (navbar.component.html) is a named anti-pattern but
  reads as this app's actual voice, not an AI tell -- left alone, noted
  as a redesign-scope decision, not applied.
- No missing :focus-visible, no italic headers, no invented metrics, no
  motion in the project (nothing to gate behind prefers-reduced-motion).

stop-slop: audited root README.md, docs/casos-de-uso.md and
docs/casos-de-teste.md (repo-wide per scope). No AI writing patterns
found in the direct, tabular documentation style already in use; nothing
changed.

api/ (Spring Boot, SonarQube-managed) untouched, as scoped.
@Gaalbu
Gaalbu merged commit 5b06c5a into main Aug 16, 2026
6 checks passed
@Gaalbu
Gaalbu deleted the refactor/quality-design-pass branch August 16, 2026 15:16
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