Compare commits

..

No commits in common. "529918c37b25314420269e5046d85867b9e5e57f" and "f6db7ada63b9d76c1bdbd913dcf597732140ce49" have entirely different histories.

5 changed files with 71 additions and 151 deletions

31
.gitignore vendored
View File

@ -75,34 +75,3 @@ dist
dist-ssr
*.local
### Backend module ###
/backend/HELP.md
/backend/**/build/
!/backend/**/src/main/**/build/
!/backend/**/src/test/**/build/
!/backend/gradle/wrapper/gradle-wrapper.jar
/backend/.apt_generated
/backend/.factorypath
/backend/.sts4-cache
/backend/.idea/
/backend/**/bin/
!/backend/**/src/main/**/bin/
!/backend/**/src/test/**/bin/
/backend/**/out/
!/backend/**/src/main/**/out/
!/backend/**/src/test/**/out/
/backend/nbproject/private/
/backend/nbbuild/
/backend/dist/
/backend/nbdist/
/backend/.nb-gradle/
/backend/data/
### Frontend module ###
/frontend/.vscode/*
!/frontend/.vscode/extensions.json
/frontend/.idea/
/frontend/**/*.suo
/frontend/**/*.ntvs*
/frontend/**/*.njsproj
/frontend/**/*.sln

View File

@ -1,43 +0,0 @@
# Guia para agentes
Orientações rápidas para agentes ou automações que atuam neste repositório.
## Contexto do projeto
- Servers Manager: catálogo interno de servidores e usuários.
- Backend: Spring Boot 4 (Java 21), JWT stateless com refresh em cookie HttpOnly.
- Frontend: React 19 + Vite (TS), Tailwind, axios com `withCredentials`.
- Desenvolvimento local: `./gradlew bootRun` em `backend/` e `yarn dev` em `frontend/` (copie `.env.example` antes).
## Padrões de código
- Em componentes React com Tailwind, mova classnames para uma constante `Styles` ao final do arquivo sempre que um elemento tiver mais de 5 classes (referência: `Login.tsx`).
- Em componentes React com Tailwind, mova classnames para uma constante `Styles` ao final do arquivo sempre que um elemento tiver mais de 5 classes (referência: `Login.tsx`).
- Quando houverem classnames que se repetem muitas vezes em vários elementos/componentes, mova esses grupos repetidos para a constante `Styles` mesmo que possuam menos de 5 classes — isso ajuda a evitar duplicação e facilita manutenção.
## Padrão para mensagens de commit
**Instrução:** Gere um comando `git commit -m` completo, em português, seguindo o padrão **Conventional Commits**, com base no `diff` abaixo.
**Regras:**
1. Identifique automaticamente o tipo de commit (`feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `style`, `perf`, etc.).
2. Estruture a mensagem em duas partes:
- **Título:** `tipo(escopo): descrição breve` (modo imperativo, até 72 caracteres)
- **Corpo:** lista em markdown com `-` destacando as principais alterações.
3. Retorne **apenas o comando completo** no formato:
```
git commit -m "tipo(escopo): descrição breve
- detalhe 1
- detalhe 2
- detalhe 3"
```
4. O escopo deve ser inferido a partir do contexto dos arquivos alterados.
5. **Não escreva nada além do comando final.**
6. **Entrada:**
```diff
[cole aqui o diff]
```
**Exemplo adaptado ao projeto:**
```
git commit -m "feat(servers): habilitar filtros de busca
- Adiciona filtros de status e localidade ao endpoint GET /api/servers
- Ajusta DTOs e mappers para incluir status normalizado e apelido
- Atualiza listagem React para aplicar filtros e exibir feedback com toast"
```

45
backend/.gitignore vendored 100644
View File

@ -0,0 +1,45 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Environment ###
.env
*.env
**/*.env
### Database ###
data/

24
frontend/.gitignore vendored 100644
View File

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

View File

@ -1,78 +1,3 @@
import { useEffect, useState } from "react";
import api from "../Api";
import { Layout } from "../components/Layout";
import type { Server } from "../types/Server";
export const Dashboard = () => {
const [servers, setServers] = useState<Server[]>([]);
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
const fetchServers = async () => {
try {
const { data } = await api.get<Server[]>("/api/servers");
setServers(data);
} catch (err: any) {
const message = err?.response?.data?.message || "Falha ao carregar servidores.";
setError(message);
} finally {
setLoading(false);
}
};
fetchServers();
}, []);
return (
<Layout className="h-screen py-10">
<div className="space-y-6">
<h1 className="text-2xl font-semibold text-text">Servidores</h1>
<div className={Styles.card}>
{loading && <div className="p-4 text-text-secondary text-sm">Carregando servidores...</div>}
{error && <div className="p-4 text-red-600 text-sm">{error}</div>}
{!loading && !error && servers.length === 0 && (
<div className="p-4 text-text-secondary text-sm">Nenhum servidor encontrado.</div>
)}
{!loading && !error && servers.length > 0 && (
<div className="overflow-x-auto">
<table className="min-w-full divide-y divide-cardBorder">
<thead className="bg-gray-50">
<tr>
<th className={Styles.tableHeadCell}>Nome</th>
<th className={Styles.tableHeadCell}>IP</th>
<th className={Styles.tableHeadCell}>Porta</th>
<th className={Styles.tableHeadCell}>Usuário</th>
<th className={Styles.tableHeadCell}>Tipo</th>
<th className={Styles.tableHeadCell}>Aplicação</th>
<th className={Styles.tableHeadCell}>Banco</th>
</tr>
</thead>
<tbody className="divide-y divide-cardBorder bg-white">
{servers.map((server) => (
<tr key={server.id} className="hover:bg-gray-50 transition-colors">
<td className={Styles.rowCell}>{server.name}</td>
<td className={Styles.rowCell}>{server.ip}</td>
<td className={Styles.rowCell}>{server.port}</td>
<td className={Styles.rowCell}>{server.user}</td>
<td className={`${Styles.rowCell} capitalize`}>{server.type.toLowerCase()}</td>
<td className={`${Styles.rowCell} capitalize`}>{server.application.toLowerCase()}</td>
<td className={`${Styles.rowCell} capitalize`}>{server.dbType.toLowerCase()}</td>
</tr>
))}
</tbody>
</table>
</div>
)}
</div>
</div>
</Layout>
);
};
const Styles = {
card: "bg-card border border-cardBorder shadow-sm rounded-lg overflow-hidden",
tableHeadCell: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-text-secondary",
rowCell: "px-4 py-3 text-sm text-text",
};
return <div>Dashboard Page</div>;
};