From e271f784b0945abd0472c5a686415dbf761d0866 Mon Sep 17 00:00:00 2001 From: xLima12 Date: Wed, 6 May 2026 20:11:43 -0300 Subject: [PATCH 1/4] fix(all): remediate SonarCloud issues, fix logo path, and stabilize CORS configuration --- .../src/main/resources/application.properties | 2 +- frontend/public/logo.svg | 3 + frontend/src/components/Footer.jsx | 8 +-- frontend/src/components/Navbar.jsx | 3 +- frontend/src/config.js | 7 ++- frontend/src/pages/Admin/ManageContent.jsx | 62 ++++++++++++------- frontend/src/pages/Admin/ManageEducation.jsx | 52 ++++++++++++---- frontend/src/pages/Admin/ManageExperience.jsx | 51 ++++++++++----- frontend/src/pages/Admin/ManageTechStack.jsx | 41 ++++++------ frontend/src/pages/Contact.jsx | 16 +++-- frontend/src/test/setup.js | 2 +- k8s/backend/deployment.yaml | 3 +- k8s/frontend/deployment.yaml | 2 +- load-test.js | 2 +- 14 files changed, 168 insertions(+), 86 deletions(-) create mode 100644 frontend/public/logo.svg diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 67775e2..3bdde52 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -33,7 +33,7 @@ mp.messaging.incoming.contact-in.dead-letter-queue.topic=contact-messages-dlq # -------------> CONFIGURAÇÕES HTTP / CORS <------------- quarkus.http.cors.enabled=true -quarkus.http.cors.origins=http://localhost:5173/, https://flima.dev/ +quarkus.http.cors.origins=http://localhost:5173,https://flima.dev quarkus.http.cors.methods=GET,PUT,POST,DELETE quarkus.http.cors.headers=accept, authorization, content-type, x-requested-with quarkus.http.cors.access-control-max-age=24h diff --git a/frontend/public/logo.svg b/frontend/public/logo.svg new file mode 100644 index 0000000..329f415 --- /dev/null +++ b/frontend/public/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/components/Footer.jsx b/frontend/src/components/Footer.jsx index 4e9e0d9..fbfac93 100644 --- a/frontend/src/components/Footer.jsx +++ b/frontend/src/components/Footer.jsx @@ -7,20 +7,20 @@ export default function Footer() {
- GitHub + GitHub git: [devflima] - LinkedIn + LinkedIn in: [felipe-lima] - Email + Email mail: [contato]
- Status: Operational + Status: Operational
diff --git a/frontend/src/components/Navbar.jsx b/frontend/src/components/Navbar.jsx index f6400ff..f9c80e4 100644 --- a/frontend/src/components/Navbar.jsx +++ b/frontend/src/components/Navbar.jsx @@ -1,5 +1,4 @@ import { Link, useLocation } from 'react-router-dom'; -import logo from '../assets/logo.svg'; export default function Navbar() { const location = useLocation(); @@ -18,7 +17,7 @@ export default function Navbar() {
- logo + logo
diff --git a/frontend/src/config.js b/frontend/src/config.js index 4e4ac86..feea82c 100644 --- a/frontend/src/config.js +++ b/frontend/src/config.js @@ -1,3 +1,4 @@ -export const API_URL = import.meta.env.VITE_API_URL - ? import.meta.env.VITE_API_URL - : (import.meta.env.MODE === 'test' ? 'http://localhost:8080' : ''); +const envApiUrl = import.meta.env.VITE_API_URL; +const isTestMode = import.meta.env.MODE === 'test'; + +export const API_URL = envApiUrl || (isTestMode ? 'http://localhost:8080' : 'http://localhost:8080'); diff --git a/frontend/src/pages/Admin/ManageContent.jsx b/frontend/src/pages/Admin/ManageContent.jsx index 8e2eef7..5839a1d 100644 --- a/frontend/src/pages/Admin/ManageContent.jsx +++ b/frontend/src/pages/Admin/ManageContent.jsx @@ -16,7 +16,7 @@ export default function ManageContent() { useEffect(() => { if (content) { - // eslint-disable-next-line + // eslint-disable-next-line react-hooks/exhaustive-deps setFormData({ homeTitle: content.home?.title || '', homeSubtitle: content.home?.subtitle || '', @@ -87,12 +87,16 @@ export default function ManageContent() {

HOME_PAGE

- - + +
- - + +
@@ -102,12 +106,16 @@ export default function ManageContent() {

PROJECTS_PAGE

- - + +
- - + +
@@ -117,12 +125,16 @@ export default function ManageContent() {

EXPERIENCE_PAGE

- - + +
- - + +
@@ -132,12 +144,16 @@ export default function ManageContent() {

EDUCATION_PAGE

- - + +
- - + +
@@ -147,12 +163,16 @@ export default function ManageContent() {

CONTACT_PAGE

- - + +
- - + +
diff --git a/frontend/src/pages/Admin/ManageEducation.jsx b/frontend/src/pages/Admin/ManageEducation.jsx index 380ac1c..4d9da5a 100644 --- a/frontend/src/pages/Admin/ManageEducation.jsx +++ b/frontend/src/pages/Admin/ManageEducation.jsx @@ -19,7 +19,7 @@ export default function ManageEducation() { e.preventDefault(); const payload = { ...formData }; if (payload.type === 'degree') { - payload.architectures = typeof payload.architectures === 'string' ? payload.architectures.split(',').map(a => a.trim()).filter(a => a) : payload.architectures; + payload.architectures = typeof payload.architectures === 'string' ? payload.architectures.split(',').map(a => a.trim()).filter(Boolean) : payload.architectures; } try { @@ -63,7 +63,7 @@ export default function ManageEducation() {

school - Manage Education + Manage Education

{/* Add Form */} @@ -80,30 +80,58 @@ export default function ManageEducation() {
-
- +
+ + +
{formData.type === 'degree' && ( <> - - - - - +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
)} {formData.type === 'cert' && ( <> - - - +
+ + +
+
+ + +
+
+ + +
)}
diff --git a/frontend/src/pages/Admin/ManageExperience.jsx b/frontend/src/pages/Admin/ManageExperience.jsx index 78c3900..bbde820 100644 --- a/frontend/src/pages/Admin/ManageExperience.jsx +++ b/frontend/src/pages/Admin/ManageExperience.jsx @@ -19,8 +19,8 @@ export default function ManageExperience() { e.preventDefault(); const payload = { ...formData, - bullets: typeof formData.bullets === 'string' ? formData.bullets.split('\\n').map(b => b.trim()).filter(b => b) : formData.bullets, - technologies: typeof formData.technologies === 'string' ? formData.technologies.split(',').map(t => t.trim()) : formData.technologies + bullets: typeof formData.bullets === 'string' ? formData.bullets.split(String.raw`\n`).map(b => b.trim()).filter(Boolean) : formData.bullets, + technologies: typeof formData.technologies === 'string' ? formData.technologies.split(',').map(t => t.trim()).filter(Boolean) : formData.technologies }; try { @@ -39,7 +39,7 @@ export default function ManageExperience() { const handleEdit = (exp) => { setFormData({ ...exp, - bullets: exp.bullets.join('\\n'), + bullets: exp.bullets.join(String.raw`\n`), technologies: exp.technologies.join(', ') }); setIsEditing(true); @@ -65,7 +65,7 @@ export default function ManageExperience() {

work - Manage Experience + Manage Experience

{/* Form */} @@ -82,18 +82,39 @@ export default function ManageExperience() {
- - - - - - +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
- diff --git a/frontend/src/pages/Admin/ManageTechStack.jsx b/frontend/src/pages/Admin/ManageTechStack.jsx index bfc3709..ef5c057 100644 --- a/frontend/src/pages/Admin/ManageTechStack.jsx +++ b/frontend/src/pages/Admin/ManageTechStack.jsx @@ -15,7 +15,7 @@ export default function ManageTechStack() { useEffect(() => { if (stack) { - // eslint-disable-next-line + // eslint-disable-next-line react-hooks/exhaustive-deps setFormData({ languages: stack.languages?.join(', ') || '', databases: stack.databases?.join(', ') || '', @@ -33,18 +33,13 @@ export default function ManageTechStack() { const handleSubmit = async (e) => { e.preventDefault(); const payload = { - languages: formData.languages.split(',').map(s => s.trim()).filter(s => s), - databases: formData.databases.split(',').map(s => s.trim()).filter(s => s), - infrastructure: formData.infrastructure.split(',').map(s => s.trim()).filter(s => s), - messaging: formData.messaging.split(',').map(s => s.trim()).filter(s => s) + languages: formData.languages.split(',').map(s => s.trim()).filter(Boolean), + databases: formData.databases.split(',').map(s => s.trim()).filter(Boolean), + infrastructure: formData.infrastructure.split(',').map(s => s.trim()).filter(Boolean), + messaging: formData.messaging.split(',').map(s => s.trim()).filter(Boolean) }; try { - // Backend expects a list of stacks or a specific structure? - // Based on my apiSlice, I'm sending the object. - // But the backend expects List. - // I should adjust apiSlice or transform here. - // For now, let's assume the backend takes individual posts or we send the list. await addTechStack(payload).unwrap(); } catch (err) { console.error('Failed to update Tech Stack', err); @@ -57,7 +52,7 @@ export default function ManageTechStack() {

terminal - Manage Tech Stack + Manage Tech Stack

@@ -65,20 +60,28 @@ export default function ManageTechStack() {

- - + +
- - + +
- - + +
- - + +
diff --git a/frontend/src/test/setup.js b/frontend/src/test/setup.js index a3eb7fb..43d5632 100644 --- a/frontend/src/test/setup.js +++ b/frontend/src/test/setup.js @@ -3,7 +3,7 @@ import '@testing-library/jest-dom'; import { fetch } from 'cross-fetch'; import { server } from './mocks/server'; -global.fetch = fetch; +globalThis.fetch = fetch; beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); afterEach(() => server.resetHandlers()); diff --git a/k8s/backend/deployment.yaml b/k8s/backend/deployment.yaml index 8c83099..0fa9afe 100644 --- a/k8s/backend/deployment.yaml +++ b/k8s/backend/deployment.yaml @@ -18,7 +18,7 @@ spec: automountServiceAccountToken: false containers: - name: flima-backend - image: ghcr.io/devflima/flima.dev-backend:latest + image: ghcr.io/devflima/flima.dev-backend:1.0.0 ports: - containerPort: 8080 envFrom: @@ -40,6 +40,7 @@ spec: ephemeral-storage: "1Gi" requests: memory: "256Mi" + cpu: "100m" ephemeral-storage: "512Mi" volumes: - name: jwt-keys diff --git a/k8s/frontend/deployment.yaml b/k8s/frontend/deployment.yaml index 1d7fe8c..7f33e97 100644 --- a/k8s/frontend/deployment.yaml +++ b/k8s/frontend/deployment.yaml @@ -18,7 +18,7 @@ spec: automountServiceAccountToken: false containers: - name: flima-frontend - image: ghcr.io/devflima/flima.dev:latest + image: ghcr.io/devflima/flima.dev:1.0.0 ports: - containerPort: 80 resources: diff --git a/load-test.js b/load-test.js index 15721d0..00f25d0 100644 --- a/load-test.js +++ b/load-test.js @@ -14,7 +14,7 @@ export const options = { const BASE_URL = 'https://flima.dev'; // Altere para seu domínio ou IP -export default function () { +export default function loadTest() { // Teste da Home const resHome = http.get(`${BASE_URL}/`); check(resHome, { From 817c7b4cb4fae6c75b584e2bc1a796c02e9b94c0 Mon Sep 17 00:00:00 2001 From: xLima12 Date: Wed, 6 May 2026 20:45:38 -0300 Subject: [PATCH 2/4] refactor: stabilize ci/cd quality gates and fix a11y/linting issues --- .github/workflows/backend-cd.yml | 10 +- .github/workflows/backend-ci.yml | 4 +- .github/workflows/frontend-cd.yml | 8 +- .github/workflows/frontend-ci.yml | 6 +- frontend/index.html | 2 +- frontend/package.json | 2 +- frontend/src/components/Footer.jsx | 9 +- frontend/src/pages/Admin/AdminLayout.jsx | 2 +- frontend/src/pages/Admin/Dashboard.jsx | 2 +- frontend/src/pages/Admin/ManageContent.jsx | 296 ++++++++---------- frontend/src/pages/Admin/ManageEducation.jsx | 3 +- frontend/src/pages/Admin/ManageExperience.jsx | 3 +- frontend/src/pages/Admin/ManageMessages.jsx | 5 + frontend/src/pages/Admin/ManageProjects.jsx | 33 +- frontend/src/pages/Admin/ManageStats.jsx | 3 +- frontend/src/pages/Admin/ManageTechStack.jsx | 118 +++---- frontend/src/pages/Contact.jsx | 12 +- frontend/src/pages/Education.jsx | 6 +- frontend/src/pages/Home.jsx | 3 +- frontend/src/test/setup.js | 2 +- 20 files changed, 261 insertions(+), 268 deletions(-) diff --git a/.github/workflows/backend-cd.yml b/.github/workflows/backend-cd.yml index beda9f7..f94a2d7 100644 --- a/.github/workflows/backend-cd.yml +++ b/.github/workflows/backend-cd.yml @@ -29,10 +29,10 @@ jobs: MAIL_FROM: test@flima.dev steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@8df1039502502c38075306913e1115b3c8597b95 # v4.5.0 with: java-version: '21' distribution: 'temurin' @@ -42,7 +42,7 @@ jobs: run: backend/mvnw package -DskipTests -f backend/pom.xml - name: Log in to the Container registry - uses: docker/login-action@v3 + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -50,7 +50,7 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@369ebfd91f94d124872d50b9100c302061f6c010 # v5.6.1 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | @@ -58,7 +58,7 @@ jobs: type=sha - name: Build and push Docker image - uses: docker/build-push-action@v5 + uses: docker/build-push-action@0565240e2d4ab88bba5387471f7bd7514b1f68af # v6.10.0 with: context: ./backend file: ./backend/src/main/docker/Dockerfile.jvm diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml index 3bb4ba4..f3a9be9 100644 --- a/.github/workflows/backend-ci.yml +++ b/.github/workflows/backend-ci.yml @@ -32,12 +32,12 @@ jobs: MAIL_FROM: test@flima.dev steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 # Necessário para o SonarCloud - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@8df1039502502c38075306913e1115b3c8597b95 # v4.5.0 with: java-version: '21' distribution: 'temurin' diff --git a/.github/workflows/frontend-cd.yml b/.github/workflows/frontend-cd.yml index d13cb09..a750937 100644 --- a/.github/workflows/frontend-cd.yml +++ b/.github/workflows/frontend-cd.yml @@ -19,10 +19,10 @@ jobs: packages: write steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Log in to the Container registry - uses: docker/login-action@v3 + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -30,7 +30,7 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@369ebfd91f94d124872d50b9100c302061f6c010 # v5.6.1 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | @@ -38,7 +38,7 @@ jobs: type=sha - name: Build and push Docker image - uses: docker/build-push-action@v5 + uses: docker/build-push-action@0565240e2d4ab88bba5387471f7bd7514b1f68af # v6.10.0 with: context: ./frontend push: true diff --git a/.github/workflows/frontend-ci.yml b/.github/workflows/frontend-ci.yml index 0304857..d9d9108 100644 --- a/.github/workflows/frontend-ci.yml +++ b/.github/workflows/frontend-ci.yml @@ -22,10 +22,10 @@ jobs: working-directory: ./frontend steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@39225d3d04c05c1172a4648c27c35f302c3351d6 # v4.1.0 with: node-version: '20' cache: 'npm' @@ -46,7 +46,7 @@ jobs: run: npm audit --audit-level=high - name: SonarCloud Scan - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarcloud-github-action@02efed3023910e4eaf908826303c75a7e183d213 # v3.1.0 with: projectBaseDir: frontend env: diff --git a/frontend/index.html b/frontend/index.html index 62461f3..37a9468 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,7 @@ - tmp-app + flima.dev
diff --git a/frontend/package.json b/frontend/package.json index 3ff7841..0097624 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,5 +1,5 @@ { - "name": "tmp-app", + "name": "flima.dev", "private": true, "version": "0.0.0", "type": "module", diff --git a/frontend/src/components/Footer.jsx b/frontend/src/components/Footer.jsx index fbfac93..7160ada 100644 --- a/frontend/src/components/Footer.jsx +++ b/frontend/src/components/Footer.jsx @@ -7,16 +7,13 @@ export default function Footer() {
- GitHub - git: [devflima] + GitHubgit: [devflima] - LinkedIn - in: [felipe-lima] + LinkedInin: [felipe-lima] - Email - mail: [contato] + Emailmail: [contato]
diff --git a/frontend/src/pages/Admin/AdminLayout.jsx b/frontend/src/pages/Admin/AdminLayout.jsx index 9999559..28eccea 100644 --- a/frontend/src/pages/Admin/AdminLayout.jsx +++ b/frontend/src/pages/Admin/AdminLayout.jsx @@ -22,7 +22,7 @@ export default function AdminLayout() {
admin_panel_settings - ADMIN_CONSOLE + ADMIN_CONSOLE