Add acot-server for getting data directly
This commit is contained in:
@@ -161,7 +161,6 @@ const DashboardLayout = () => {
|
||||
<Navigation />
|
||||
|
||||
<div className="p-4 space-y-4">
|
||||
|
||||
<div className="grid grid-cols-1 xl:grid-cols-6 gap-4">
|
||||
<div className="xl:col-span-4 col-span-6">
|
||||
<div className="space-y-4 h-full w-full">
|
||||
|
||||
133
dashboard/src/components/dashboard/AcotTest.jsx
Normal file
133
dashboard/src/components/dashboard/AcotTest.jsx
Normal file
@@ -0,0 +1,133 @@
|
||||
import React, { useState, useEffect } from "react";
|
||||
import axios from "axios";
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
|
||||
import { Loader2, AlertCircle, CheckCircle, RefreshCw } from "lucide-react";
|
||||
|
||||
const AcotTest = () => {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState(null);
|
||||
const [data, setData] = useState(null);
|
||||
const [connectionStatus, setConnectionStatus] = useState(null);
|
||||
|
||||
const testConnection = async () => {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
try {
|
||||
const response = await axios.get("/api/acot/test/test-connection");
|
||||
setConnectionStatus(response.data);
|
||||
} catch (err) {
|
||||
setError(err.response?.data?.error || err.message);
|
||||
setConnectionStatus(null);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const fetchOrderCount = async () => {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
try {
|
||||
const response = await axios.get("/api/acot/test/order-count");
|
||||
setData(response.data.data);
|
||||
} catch (err) {
|
||||
setError(err.response?.data?.error || err.message);
|
||||
setData(null);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
testConnection();
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<Card className="w-full max-w-md">
|
||||
<CardHeader>
|
||||
<CardTitle className="flex items-center justify-between">
|
||||
ACOT Server Test
|
||||
<Button
|
||||
size="icon"
|
||||
variant="outline"
|
||||
onClick={() => {
|
||||
testConnection();
|
||||
if (connectionStatus?.success) {
|
||||
fetchOrderCount();
|
||||
}
|
||||
}}
|
||||
disabled={loading}
|
||||
>
|
||||
{loading ? (
|
||||
<Loader2 className="h-4 w-4 animate-spin" />
|
||||
) : (
|
||||
<RefreshCw className="h-4 w-4" />
|
||||
)}
|
||||
</Button>
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4">
|
||||
{/* Connection Status */}
|
||||
<div className="space-y-2">
|
||||
<h3 className="text-sm font-medium">Connection Status</h3>
|
||||
{connectionStatus?.success ? (
|
||||
<Alert className="bg-green-50 border-green-200">
|
||||
<CheckCircle className="h-4 w-4 text-green-600" />
|
||||
<AlertTitle className="text-green-800">Connected</AlertTitle>
|
||||
<AlertDescription className="text-green-700">
|
||||
{connectionStatus.message}
|
||||
</AlertDescription>
|
||||
</Alert>
|
||||
) : error ? (
|
||||
<Alert variant="destructive">
|
||||
<AlertCircle className="h-4 w-4" />
|
||||
<AlertTitle>Connection Failed</AlertTitle>
|
||||
<AlertDescription>{error}</AlertDescription>
|
||||
</Alert>
|
||||
) : (
|
||||
<div className="text-sm text-muted-foreground">
|
||||
Testing connection...
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Order Count */}
|
||||
{connectionStatus?.success && (
|
||||
<div className="space-y-2">
|
||||
<Button
|
||||
onClick={fetchOrderCount}
|
||||
disabled={loading}
|
||||
className="w-full"
|
||||
>
|
||||
{loading ? (
|
||||
<>
|
||||
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
|
||||
Loading...
|
||||
</>
|
||||
) : (
|
||||
"Fetch Order Count"
|
||||
)}
|
||||
</Button>
|
||||
|
||||
{data && (
|
||||
<div className="p-4 bg-muted rounded-lg">
|
||||
<div className="text-sm text-muted-foreground">
|
||||
Total Orders in Database
|
||||
</div>
|
||||
<div className="text-2xl font-bold">
|
||||
{data.orderCount?.toLocaleString()}
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground mt-1">
|
||||
Last updated: {new Date(data.timestamp).toLocaleTimeString()}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</CardContent>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
||||
export default AcotTest;
|
||||
24
dashboard/src/pages/test-acot.jsx
Normal file
24
dashboard/src/pages/test-acot.jsx
Normal file
@@ -0,0 +1,24 @@
|
||||
import React from 'react';
|
||||
import DashboardLayout from '@/components/DashboardLayout';
|
||||
import AcotTest from '@/components/dashboard/AcotTest';
|
||||
|
||||
const TestAcotPage = () => {
|
||||
return (
|
||||
<DashboardLayout>
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-2xl font-bold">ACOT Server Test</h1>
|
||||
<p className="text-muted-foreground mt-1">
|
||||
Test connection to production database through ACOT server
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="flex justify-center">
|
||||
<AcotTest />
|
||||
</div>
|
||||
</div>
|
||||
</DashboardLayout>
|
||||
);
|
||||
};
|
||||
|
||||
export default TestAcotPage;
|
||||
@@ -203,6 +203,42 @@ export default defineConfig(({ mode }) => {
|
||||
});
|
||||
});
|
||||
},
|
||||
},
|
||||
"/api/acot": {
|
||||
target: "https://dashboard.kent.pw",
|
||||
changeOrigin: true,
|
||||
secure: false,
|
||||
rewrite: (path) => path.replace(/^\/api\/acot/, "/api/acot"),
|
||||
configure: (proxy, _options) => {
|
||||
proxy.on("error", (err, req, res) => {
|
||||
console.error("ACOT proxy error:", err);
|
||||
res.writeHead(500, {
|
||||
"Content-Type": "application/json",
|
||||
});
|
||||
res.end(
|
||||
JSON.stringify({
|
||||
error: "Proxy Error",
|
||||
message: err.message,
|
||||
details: err.stack
|
||||
})
|
||||
);
|
||||
});
|
||||
proxy.on("proxyReq", (proxyReq, req, _res) => {
|
||||
console.log("Outgoing ACOT request:", {
|
||||
method: req.method,
|
||||
url: req.url,
|
||||
path: proxyReq.path,
|
||||
headers: proxyReq.getHeaders(),
|
||||
});
|
||||
});
|
||||
proxy.on("proxyRes", (proxyRes, req, _res) => {
|
||||
console.log("ACOT proxy response:", {
|
||||
statusCode: proxyRes.statusCode,
|
||||
url: req.url,
|
||||
headers: proxyRes.headers,
|
||||
});
|
||||
});
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user