Compare commits
4 Commits
f6db7ada63
...
529918c37b
| Author | SHA1 | Date |
|---|---|---|
|
|
529918c37b | |
|
|
c34b4bc261 | |
|
|
085e2f2cee | |
|
|
ba3d386575 |
|
|
@ -75,3 +75,34 @@ dist
|
||||||
dist-ssr
|
dist-ssr
|
||||||
*.local
|
*.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
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
# 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"
|
||||||
|
```
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
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/
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
# 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?
|
|
||||||
|
|
@ -1,3 +1,78 @@
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import api from "../Api";
|
||||||
|
import { Layout } from "../components/Layout";
|
||||||
|
import type { Server } from "../types/Server";
|
||||||
|
|
||||||
export const Dashboard = () => {
|
export const Dashboard = () => {
|
||||||
return <div>Dashboard Page</div>;
|
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",
|
||||||
};
|
};
|
||||||
Loading…
Reference in New Issue