feat(altyapı): yerel MongoDB, Axum backend ve Vite frontend iskeleti

- docker-compose.dev.yml: MongoDB 7, tek düğümlü replica set (port 27020)
- Backend: Axum + tokio, GET /api/health
- Frontend: React + TypeScript + Vite, /api proxy, geçici durum ekranı
- Kök package.json: npm run dev ile DB + backend + frontend
- backend/api.http örnek istekler

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-11 23:01:14 +03:00
parent 204c120f4f
commit af2c01dbee
23 changed files with 3103 additions and 9 deletions
+8
View File
@@ -0,0 +1,8 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": ["react", "typescript", "oxc"],
"rules": {
"react/rules-of-hooks": "error",
"react/only-export-components": ["warn", { "allowConstantExport": true }]
}
}
+13
View File
@@ -0,0 +1,13 @@
<!doctype html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Kakeibo</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
+1805
View File
File diff suppressed because it is too large Load Diff
+25
View File
@@ -0,0 +1,25 @@
{
"name": "kakeibo-frontend",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"lint": "oxlint",
"preview": "vite preview"
},
"dependencies": {
"react": "^19.3.1",
"react-dom": "^19.3.1"
},
"devDependencies": {
"@types/node": "^24.19.2",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
"@vitejs/plugin-react": "^6.1.2",
"oxlint": "^1.90.0",
"typescript": "~7.0.2",
"vite": "^8.3.6"
}
}
+29
View File
@@ -0,0 +1,29 @@
import { useEffect, useState } from 'react'
type Health = { status: string; version: string }
// Faz 0 geçici ekranı: frontend ↔ backend bağlantısını doğrular.
// Faz 2'de gerçek tasarım sistemi ve layout ile değiştirilecek.
export default function App() {
const [health, setHealth] = useState<Health | null>(null)
const [error, setError] = useState(false)
useEffect(() => {
fetch('/api/health')
.then((r) => (r.ok ? r.json() : Promise.reject()))
.then(setHealth)
.catch(() => setError(true))
}, [])
return (
<main className="placeholder">
<h1>📒 Kakeibo</h1>
<p>Kişisel Ev Finans Defteri</p>
<p className="status">
{error && '🔴 Backend\'e ulaşılamadı'}
{!error && !health && '⏳ Backend kontrol ediliyor…'}
{health && `🟢 Backend çalışıyor (v${health.version})`}
</p>
</main>
)
}
+37
View File
@@ -0,0 +1,37 @@
/* Faz 0 geçici stil. Faz 2'de TailwindCSS ile değiştirilecek. */
:root {
font-family: Inter, system-ui, sans-serif;
color-scheme: light dark;
background: #fafaf9;
color: #1c1917;
}
@media (prefers-color-scheme: dark) {
:root {
background: #1c1917;
color: #f5f5f4;
}
}
body {
margin: 0;
}
.placeholder {
min-height: 100dvh;
display: grid;
place-content: center;
text-align: center;
gap: 0.25rem;
padding: 1rem;
}
.placeholder h1 {
margin: 0;
font-size: 2.5rem;
}
.status {
margin-top: 1.5rem;
font-variant-numeric: tabular-nums;
}
+10
View File
@@ -0,0 +1,10 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.tsx'
createRoot(document.getElementById('root')!).render(
<StrictMode>
<App />
</StrictMode>,
)
+26
View File
@@ -0,0 +1,26 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "es2023",
"lib": ["ES2023", "DOM"],
"module": "esnext",
"types": ["vite/client"],
"allowArbitraryExtensions": true,
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"verbatimModuleSyntax": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"noUnusedLocals": true,
"noUnusedParameters": true,
"erasableSyntaxOnly": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"]
}
+7
View File
@@ -0,0 +1,7 @@
{
"files": [],
"references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
]
}
+23
View File
@@ -0,0 +1,23 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"target": "es2023",
"lib": ["ES2023"],
"types": ["node"],
"skipLibCheck": true,
/* Bundler mode */
"module": "nodenext",
"allowImportingTsExtensions": true,
"verbatimModuleSyntax": true,
"moduleDetection": "force",
"noEmit": true,
/* Linting */
"noUnusedLocals": true,
"noUnusedParameters": true,
"erasableSyntaxOnly": true,
"noFallthroughCasesInSwitch": true
},
"include": ["vite.config.ts"]
}
+15
View File
@@ -0,0 +1,15 @@
import react from '@vitejs/plugin-react'
import { defineConfig } from 'vite'
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
server: {
port: 5173,
strictPort: true,
// /api istekleri Rust backend'e yönlenir → aynı origin, CORS gerekmez
proxy: {
'/api': 'http://localhost:8080',
},
},
})