Import source: src/api/services/http-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,125 @@
|
||||
import type { ApiResponse, JobProgress, QueryParams } from "@/api/contracts/common";
|
||||
import type { DnsRecord, Website } from "@/api/contracts/models";
|
||||
|
||||
const configuredApiBaseUrl = process.env.NEXT_PUBLIC_API_BASE_URL?.trim();
|
||||
export const hasConfiguredHttpApi = Boolean(configuredApiBaseUrl);
|
||||
const apiBaseUrl = configuredApiBaseUrl?.replace(/\/$/, "");
|
||||
|
||||
type RequestOptions = {
|
||||
method?: "GET" | "POST" | "PUT" | "DELETE";
|
||||
body?: unknown;
|
||||
params?: QueryParams;
|
||||
};
|
||||
|
||||
function queryString(params?: QueryParams) {
|
||||
const search = new URLSearchParams();
|
||||
if (params?.search) search.set("search", params.search);
|
||||
if (params?.pagination) {
|
||||
search.set("page", String(params.pagination.page));
|
||||
search.set("pageSize", String(params.pagination.pageSize));
|
||||
}
|
||||
const value = search.toString();
|
||||
return value ? `?${value}` : "";
|
||||
}
|
||||
|
||||
async function request<T>(path: string, options: RequestOptions = {}): Promise<ApiResponse<T>> {
|
||||
if (!apiBaseUrl) {
|
||||
throw new Error("NEXT_PUBLIC_API_BASE_URL is not configured.");
|
||||
}
|
||||
|
||||
const url =
|
||||
apiBaseUrl === "." || apiBaseUrl === "same-origin"
|
||||
? path
|
||||
: apiBaseUrl.endsWith("/api") && path.startsWith("/api/")
|
||||
? `${apiBaseUrl}${path.slice(4)}`
|
||||
: `${apiBaseUrl}${path}`;
|
||||
|
||||
const response = await fetch(`${url}${queryString(options.params)}`, {
|
||||
method: options.method ?? "GET",
|
||||
credentials: "include",
|
||||
headers:
|
||||
options.body === undefined
|
||||
? undefined
|
||||
: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: options.body === undefined ? undefined : JSON.stringify(options.body),
|
||||
cache: "no-store",
|
||||
});
|
||||
|
||||
const json = (await response.json()) as ApiResponse<T>;
|
||||
return json;
|
||||
}
|
||||
|
||||
export const httpPanelService = {
|
||||
auth: {
|
||||
me: () => request("/api/auth/me"),
|
||||
login: (email: string, password = "correct-password", code?: string) =>
|
||||
request("/api/auth/login", {
|
||||
method: "POST",
|
||||
body: { email, password, code },
|
||||
}),
|
||||
logout: () => request("/api/auth/logout", { method: "POST" }),
|
||||
},
|
||||
dashboard: {
|
||||
summary: () => request("/api/dashboard/summary"),
|
||||
},
|
||||
websites: {
|
||||
list: (params?: QueryParams) => request("/api/websites", { params }),
|
||||
create: (payload: Partial<Website>) =>
|
||||
request("/api/websites", { method: "POST", body: payload }),
|
||||
},
|
||||
domains: {
|
||||
list: (params?: QueryParams) => request("/api/domains", { params }),
|
||||
records: () => request("/api/domains/dom-1/dns"),
|
||||
saveRecord: (record: Partial<DnsRecord>) =>
|
||||
record.id
|
||||
? request(`/api/domains/dom-1/dns/${record.id}`, { method: "PUT", body: record })
|
||||
: request("/api/domains/dom-1/dns", { method: "POST", body: record }),
|
||||
},
|
||||
files: {
|
||||
list: (params?: QueryParams) => request("/api/files", { params }),
|
||||
operation: (operation: string): Promise<ApiResponse<JobProgress>> =>
|
||||
request("/api/files/operations", { method: "POST", body: { operation } }),
|
||||
},
|
||||
databases: {
|
||||
list: (params?: QueryParams) => request("/api/databases", { params }),
|
||||
create: (name: string) => request("/api/databases", { method: "POST", body: { name } }),
|
||||
adminTools: () => request("/api/databases/admin-tools"),
|
||||
},
|
||||
email: {
|
||||
list: (params?: QueryParams) => request("/api/email/accounts", { params }),
|
||||
create: (address: string) =>
|
||||
request("/api/email/accounts", { method: "POST", body: { address } }),
|
||||
},
|
||||
metrics: {
|
||||
history: () => request("/api/metrics/history"),
|
||||
},
|
||||
security: {
|
||||
findings: () => request("/api/security/findings"),
|
||||
},
|
||||
backups: {
|
||||
list: () => request("/api/backups"),
|
||||
create: (scope: string) =>
|
||||
request<JobProgress>("/api/backups", { method: "POST", body: { scope } }),
|
||||
},
|
||||
automation: {
|
||||
list: () => request("/api/automation"),
|
||||
},
|
||||
notifications: {
|
||||
list: () => request("/api/notifications"),
|
||||
},
|
||||
audit: {
|
||||
list: () => request("/api/audit-logs"),
|
||||
},
|
||||
software: {
|
||||
runtimes: () => request("/api/software/runtimes"),
|
||||
},
|
||||
servers: {
|
||||
list: () => request("/api/servers"),
|
||||
services: () => request("/api/servers/services"),
|
||||
},
|
||||
system: {
|
||||
discovery: () => request("/api/system/discovery"),
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user