Import source: src/api/services/panel-service
Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
This commit is contained in:
@@ -0,0 +1,244 @@
|
||||
import { addMinutes } from "date-fns";
|
||||
import type { ApiResponse, JobProgress, QueryParams } from "@/api/contracts/common";
|
||||
import type {
|
||||
DatabaseAdminTool,
|
||||
DnsRecord,
|
||||
SystemDiscovery,
|
||||
Website,
|
||||
} from "@/api/contracts/models";
|
||||
import { mockResponse } from "@/api/client";
|
||||
import { hasConfiguredHttpApi, httpPanelService } from "@/api/services/http-panel-service";
|
||||
import {
|
||||
accounts,
|
||||
auditEntries,
|
||||
automations,
|
||||
backups,
|
||||
currentUser,
|
||||
databases,
|
||||
dnsRecords,
|
||||
domains,
|
||||
files,
|
||||
mailboxes,
|
||||
metrics,
|
||||
notifications,
|
||||
resourceUsage,
|
||||
runtimes,
|
||||
securityFindings,
|
||||
servers,
|
||||
services,
|
||||
websites,
|
||||
} from "@/api/mocks/seed";
|
||||
|
||||
function searchBy<T>(items: T[], params: QueryParams | undefined, keys: Array<keyof T>) {
|
||||
if (!params?.search) return items;
|
||||
const term = params.search.toLowerCase();
|
||||
return items.filter((item) =>
|
||||
keys.some((key) =>
|
||||
String(item[key] ?? "")
|
||||
.toLowerCase()
|
||||
.includes(term),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
export const mockPanelService = {
|
||||
auth: {
|
||||
me: () => mockResponse(currentUser),
|
||||
login: (email: string, password?: string, code?: string) => {
|
||||
void password;
|
||||
void code;
|
||||
return mockResponse({
|
||||
user: currentUser,
|
||||
challenge: email.includes("2fa") ? "totp" : null,
|
||||
sessionExpiresAt: addMinutes(new Date(), 45).toISOString(),
|
||||
});
|
||||
},
|
||||
logout: () => mockResponse({ ok: true }),
|
||||
},
|
||||
dashboard: {
|
||||
summary: () =>
|
||||
mockResponse({
|
||||
user: currentUser,
|
||||
account: accounts[0],
|
||||
server: servers[0],
|
||||
accounts,
|
||||
servers,
|
||||
resources: resourceUsage,
|
||||
services,
|
||||
notifications,
|
||||
metrics,
|
||||
}),
|
||||
},
|
||||
websites: {
|
||||
list: (params?: QueryParams) =>
|
||||
mockResponse(searchBy(websites, params, ["name", "domain", "runtime"])),
|
||||
create: (payload: Partial<Website>) =>
|
||||
mockResponse({
|
||||
id: `site-${Date.now()}`,
|
||||
name: payload.name ?? "New website",
|
||||
domain: payload.domain ?? "new.example.com",
|
||||
runtime: payload.runtime ?? "PHP",
|
||||
status: "healthy",
|
||||
ssl: "healthy",
|
||||
environment: "production",
|
||||
cpuLimit: "1 vCPU",
|
||||
memoryLimit: "1 GB",
|
||||
lastDeployment: new Date().toISOString(),
|
||||
} satisfies Website),
|
||||
},
|
||||
domains: {
|
||||
list: (params?: QueryParams) => mockResponse(searchBy(domains, params, ["name", "type"])),
|
||||
records: () => mockResponse(dnsRecords),
|
||||
saveRecord: (record: Partial<DnsRecord>) =>
|
||||
mockResponse({
|
||||
id: record.id ?? `dns-${Date.now()}`,
|
||||
name: record.name ?? "new.example.com.",
|
||||
ttl: record.ttl ?? 14400,
|
||||
class: "IN",
|
||||
type: record.type ?? "A",
|
||||
record: record.record ?? "198.51.100.40",
|
||||
priority: record.priority,
|
||||
} satisfies DnsRecord),
|
||||
},
|
||||
files: {
|
||||
list: (params?: QueryParams) =>
|
||||
mockResponse(searchBy(files, params, ["name", "path", "mime"])),
|
||||
operation: (operation: string): Promise<ApiResponse<JobProgress>> =>
|
||||
mockResponse({
|
||||
id: `job-${Date.now()}`,
|
||||
label: operation,
|
||||
status: "running",
|
||||
progress: 64,
|
||||
startedAt: new Date().toISOString(),
|
||||
message: "Mock operation is staged and will not touch the host filesystem.",
|
||||
}),
|
||||
},
|
||||
databases: {
|
||||
list: (params?: QueryParams) =>
|
||||
mockResponse(searchBy(databases, params, ["name", "engine"])),
|
||||
create: (name: string) => mockResponse({ id: `db-${Date.now()}`, name, status: "created" }),
|
||||
adminTools: () =>
|
||||
mockResponse<DatabaseAdminTool[]>([
|
||||
{
|
||||
id: "phpmyadmin",
|
||||
name: "phpMyAdmin",
|
||||
engine: "MySQL/MariaDB",
|
||||
status: "available",
|
||||
launchUrl: "/phpmyadmin/",
|
||||
sso: false,
|
||||
note: "Launches the local phpMyAdmin deployment in a separate browser tab.",
|
||||
},
|
||||
{
|
||||
id: "adminer",
|
||||
name: "Adminer",
|
||||
engine: "MySQL, MariaDB, PostgreSQL",
|
||||
status: "planned",
|
||||
launchUrl: null,
|
||||
sso: false,
|
||||
note: "Ready in the API contract, not exposed on this host.",
|
||||
},
|
||||
{
|
||||
id: "pgadmin",
|
||||
name: "pgAdmin",
|
||||
engine: "PostgreSQL",
|
||||
status: "planned",
|
||||
launchUrl: null,
|
||||
sso: false,
|
||||
note: "Ready in the API contract, not exposed on this host.",
|
||||
},
|
||||
]),
|
||||
},
|
||||
email: {
|
||||
list: (params?: QueryParams) =>
|
||||
mockResponse(searchBy(mailboxes, params, ["address", "domain"])),
|
||||
create: (address: string) =>
|
||||
mockResponse({ id: `mail-${Date.now()}`, address, status: "created" }),
|
||||
},
|
||||
metrics: {
|
||||
history: () => mockResponse(metrics),
|
||||
},
|
||||
security: {
|
||||
findings: () => mockResponse(securityFindings),
|
||||
},
|
||||
backups: {
|
||||
list: () => mockResponse(backups),
|
||||
create: (scope: string) =>
|
||||
mockResponse<JobProgress>({
|
||||
id: `job-${Date.now()}`,
|
||||
label: `Create ${scope} backup`,
|
||||
status: "queued",
|
||||
progress: 0,
|
||||
startedAt: new Date().toISOString(),
|
||||
}),
|
||||
},
|
||||
automation: {
|
||||
list: () => mockResponse(automations),
|
||||
},
|
||||
notifications: {
|
||||
list: () => mockResponse(notifications),
|
||||
},
|
||||
audit: {
|
||||
list: () => mockResponse(auditEntries),
|
||||
},
|
||||
software: {
|
||||
runtimes: () => mockResponse(runtimes),
|
||||
},
|
||||
servers: {
|
||||
list: () => mockResponse(servers),
|
||||
services: () => mockResponse(services),
|
||||
},
|
||||
system: {
|
||||
discovery: () =>
|
||||
mockResponse<SystemDiscovery>({
|
||||
detectedAt: new Date().toISOString(),
|
||||
nginx: {
|
||||
available: true,
|
||||
sites: [
|
||||
{
|
||||
id: "mock-panel-site",
|
||||
serverNames: ["cp.asabbagh.com"],
|
||||
listens: ["443 ssl", "80"],
|
||||
root: null,
|
||||
proxyPasses: ["http://127.0.0.1:3110", "http://127.0.0.1:3020"],
|
||||
tls: true,
|
||||
source: "mock",
|
||||
},
|
||||
],
|
||||
proxiedSites: [
|
||||
{
|
||||
id: "mock-panel-site",
|
||||
serverNames: ["cp.asabbagh.com"],
|
||||
listens: ["443 ssl", "80"],
|
||||
root: null,
|
||||
proxyPasses: ["http://127.0.0.1:3110", "http://127.0.0.1:3020"],
|
||||
tls: true,
|
||||
source: "mock",
|
||||
},
|
||||
],
|
||||
},
|
||||
docker: {
|
||||
available: true,
|
||||
containers: [
|
||||
{
|
||||
id: "mock-phpmyadmin",
|
||||
name: "coaxyspanel-phpmyadmin",
|
||||
image: "phpmyadmin:latest",
|
||||
status: "Up",
|
||||
ports: "127.0.0.1:8089->80/tcp",
|
||||
},
|
||||
],
|
||||
},
|
||||
currentPanel: {
|
||||
hostname: "cp.asabbagh.com",
|
||||
frontend: "http://127.0.0.1:3110",
|
||||
backend: "http://127.0.0.1:3020",
|
||||
},
|
||||
}),
|
||||
},
|
||||
};
|
||||
|
||||
export type PanelService = typeof mockPanelService;
|
||||
|
||||
export const panelService: PanelService = hasConfiguredHttpApi
|
||||
? (httpPanelService as PanelService)
|
||||
: mockPanelService;
|
||||
Reference in New Issue
Block a user