diff --git a/backend/app/Http/Controllers/Api/SchemaController.php b/backend/app/Http/Controllers/Api/SchemaController.php
new file mode 100644
index 0000000..d67eef2
--- /dev/null
+++ b/backend/app/Http/Controllers/Api/SchemaController.php
@@ -0,0 +1,63 @@
+databaseService = $databaseService;
+ }
+
+ protected function initializeDriver(Request $request)
+ {
+ // In a real app, these would come from encrypted session or token
+ $config = $request->only(['host', 'username', 'password', 'database', 'port']);
+ $driver = new MySqlDriver();
+
+ if (!$driver->connect($config)) {
+ throw new \Exception("Could not connect to database.");
+ }
+
+ $this->databaseService->setDriver($driver);
+ }
+
+ public function databases(Request $request)
+ {
+ try {
+ $this->initializeDriver($request);
+ return Response::json($this->databaseService->getDatabases());
+ } catch (\Exception $e) {
+ return Response::json(['error' => $e->getMessage()], 400);
+ }
+ }
+
+ public function tables(Request $request, $database)
+ {
+ try {
+ $request->merge(['database' => $database]);
+ $this->initializeDriver($request);
+ return Response::json($this->databaseService->getTables());
+ } catch (\Exception $e) {
+ return Response::json(['error' => $e->getMessage()], 400);
+ }
+ }
+
+ public function schema(Request $request, $table)
+ {
+ try {
+ $this->initializeDriver($request);
+ return Response::json($this->databaseService->getTableSchema($table));
+ } catch (\Exception $e) {
+ return Response::json(['error' => $e->getMessage()], 400);
+ }
+ }
+}
diff --git a/backend/routes/api.php b/backend/routes/api.php
index ccc387f..d1c00a0 100644
--- a/backend/routes/api.php
+++ b/backend/routes/api.php
@@ -2,7 +2,14 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
+use App\Http\Controllers\Api\SchemaController;
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('auth:sanctum');
+
+Route::prefix('schema')->group(function () {
+ Route::get('/databases', [SchemaController::class, 'databases']);
+ Route::get('/tables/{database}', [SchemaController::class, 'tables']);
+ Route::get('/{table}', [SchemaController::class, 'schema']);
+});
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index a66b5ef..1e2559f 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -1,122 +1,35 @@
-import { useState } from 'react'
-import reactLogo from './assets/react.svg'
-import viteLogo from './assets/vite.svg'
-import heroImg from './assets/hero.png'
-import './App.css'
+import React, { useMemo, useEffect } from 'react';
+import { ThemeProvider, CssBaseline, Box } from '@mui/material';
+import { getTheme } from './theme/theme';
+import { useAppStore } from './store/useAppStore';
+import Sidebar from './components/Sidebar';
+import MainContent from './components/MainContent';
+import Header from './components/Header';
-function App() {
- const [count, setCount] = useState(0)
+const App: React.FC = () => {
+ const darkMode = useAppStore((state) => state.darkMode);
+ const theme = useMemo(() => getTheme(darkMode ? 'dark' : 'light'), [darkMode]);
+
+ useEffect(() => {
+ if (darkMode) {
+ document.body.classList.add('dark');
+ } else {
+ document.body.classList.remove('dark');
+ }
+ }, [darkMode]);
return (
- <>
-
- Edit
-
-
-
Get started
- src/App.tsx and save to test HMR
-
Connect with us
-Join the Vite community
---
-
-
- GitHub
-
-
- -
-
-
- Discord
-
-
- -
-
-
- X.com
-
-
- -
-
-
- Bluesky
-
-
-
-