feat(api, agents): add agent node profile retrieval and update functionality
Implemented new API functions to fetch and update agent node profiles, enhancing the management capabilities for agent data. This addition improves the overall functionality of the admin agents console, allowing for better user interaction with agent profiles. Updated related types for improved type safety and clarity in the codebase.
This commit is contained in:
14
src/app/admin/(shell)/agents/layout.tsx
Normal file
14
src/app/admin/(shell)/agents/layout.tsx
Normal file
@@ -0,0 +1,14 @@
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
import { AgentsSubnav } from "@/modules/agents/agents-subnav";
|
||||
|
||||
export default function AdminAgentsLayout({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<div className="mx-auto flex w-full max-w-[1680px] min-w-0 flex-col gap-6 px-4 py-5 sm:px-6 lg:px-8 lg:py-6">
|
||||
<div className="sticky top-14 z-20 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/80">
|
||||
<AgentsSubnav />
|
||||
</div>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
5
src/app/admin/(shell)/agents/list/page.tsx
Normal file
5
src/app/admin/(shell)/agents/list/page.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export default function AgentsListPage() {
|
||||
redirect("/admin/agents");
|
||||
}
|
||||
@@ -9,7 +9,7 @@ export const metadata: Metadata = buildPageMetadata("agents", "title");
|
||||
|
||||
export default function AgentsPage() {
|
||||
return (
|
||||
<ModuleScaffold>
|
||||
<ModuleScaffold embedded>
|
||||
<AdminPermissionGate requiredAny={PRD_AGENTS_ACCESS_ANY}>
|
||||
<AgentsConsole />
|
||||
</AdminPermissionGate>
|
||||
|
||||
18
src/app/admin/(shell)/agents/provision/page.tsx
Normal file
18
src/app/admin/(shell)/agents/provision/page.tsx
Normal file
@@ -0,0 +1,18 @@
|
||||
import { ModuleScaffold } from "@/components/admin/module-scaffold";
|
||||
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
|
||||
import { AgentLineProvisionWizard } from "@/modules/agents/agent-line-provision-wizard";
|
||||
import { PRD_AGENT_LINE_PROVISION_ACCESS_ANY } from "@/lib/admin-prd";
|
||||
import { buildPageMetadata } from "@/lib/page-metadata";
|
||||
import type { Metadata } from "next";
|
||||
|
||||
export const metadata: Metadata = buildPageMetadata("agents", "lineProvision.title");
|
||||
|
||||
export default function AgentLineProvisionPage(): React.ReactElement {
|
||||
return (
|
||||
<ModuleScaffold embedded>
|
||||
<AdminPermissionGate requiredAny={PRD_AGENT_LINE_PROVISION_ACCESS_ANY}>
|
||||
<AgentLineProvisionWizard />
|
||||
</AdminPermissionGate>
|
||||
</ModuleScaffold>
|
||||
);
|
||||
}
|
||||
18
src/app/admin/(shell)/agents/settlement-bills/page.tsx
Normal file
18
src/app/admin/(shell)/agents/settlement-bills/page.tsx
Normal file
@@ -0,0 +1,18 @@
|
||||
import { ModuleScaffold } from "@/components/admin/module-scaffold";
|
||||
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
|
||||
import { AgentBillsConsole } from "@/modules/settlement/agent-bills-console";
|
||||
import { PRD_SETTLEMENT_AGENT_ACCESS_ANY } from "@/lib/admin-prd";
|
||||
import { buildPageMetadata } from "@/lib/page-metadata";
|
||||
import type { Metadata } from "next";
|
||||
|
||||
export const metadata: Metadata = buildPageMetadata("agents", "subnav.settlementBills");
|
||||
|
||||
export default function AgentSettlementBillsPage(): React.ReactElement {
|
||||
return (
|
||||
<ModuleScaffold embedded>
|
||||
<AdminPermissionGate requiredAny={PRD_SETTLEMENT_AGENT_ACCESS_ANY}>
|
||||
<AgentBillsConsole />
|
||||
</AdminPermissionGate>
|
||||
</ModuleScaffold>
|
||||
);
|
||||
}
|
||||
15
src/app/admin/(shell)/agents/sites/page.tsx
Normal file
15
src/app/admin/(shell)/agents/sites/page.tsx
Normal file
@@ -0,0 +1,15 @@
|
||||
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
|
||||
import { IntegrationSitesConsole } from "@/modules/integration/integration-sites-console";
|
||||
import { PRD_AGENT_SITES_ACCESS_ANY } from "@/lib/admin-prd";
|
||||
import { buildPageMetadata } from "@/lib/page-metadata";
|
||||
import type { Metadata } from "next";
|
||||
|
||||
export const metadata: Metadata = buildPageMetadata("agents", "sitesTitle");
|
||||
|
||||
export default function AgentLineSitesPage() {
|
||||
return (
|
||||
<AdminPermissionGate requiredAny={PRD_AGENT_SITES_ACCESS_ANY}>
|
||||
<IntegrationSitesConsole restrictCreateToSuperAdmin />
|
||||
</AdminPermissionGate>
|
||||
);
|
||||
}
|
||||
@@ -1,18 +1,6 @@
|
||||
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
|
||||
import { ModuleScaffold } from "@/components/admin/module-scaffold";
|
||||
import { IntegrationSitesConsole } from "@/modules/integration/integration-sites-console";
|
||||
import { buildPageMetadata } from "@/lib/page-metadata";
|
||||
import { PRD_INTEGRATION_ACCESS_ANY } from "@/lib/admin-prd";
|
||||
import type { Metadata } from "next";
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export const metadata: Metadata = buildPageMetadata("config", "integrationSites.title");
|
||||
|
||||
export default function AdminIntegrationSitesPage() {
|
||||
return (
|
||||
<ModuleScaffold>
|
||||
<AdminPermissionGate requiredAny={PRD_INTEGRATION_ACCESS_ANY}>
|
||||
<IntegrationSitesConsole />
|
||||
</AdminPermissionGate>
|
||||
</ModuleScaffold>
|
||||
);
|
||||
/** @deprecated 接入配置已并入「代理线路」目录 */
|
||||
export default function LegacyIntegrationSitesPage() {
|
||||
redirect("/admin/agents/sites");
|
||||
}
|
||||
|
||||
@@ -1,17 +1,9 @@
|
||||
import { RiskPoolsConsole } from "@/modules/risk/risk-pools-console";
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
/** 兼容旧链接:热门号码已并入风险池 Tab(筛选 >80%)。 */
|
||||
export default async function AdminDrawRiskHotPage(props: {
|
||||
params: Promise<{ drawId: string }>;
|
||||
}) {
|
||||
const { drawId } = await props.params;
|
||||
const id = Number(drawId);
|
||||
|
||||
return (
|
||||
<RiskPoolsConsole
|
||||
drawId={id}
|
||||
titleKey="hotPageTitle"
|
||||
soldOutOnly={false}
|
||||
defaultSort="usage_desc"
|
||||
/>
|
||||
);
|
||||
redirect(`/admin/draws/${drawId}/risk/pools?filter=high_risk`);
|
||||
}
|
||||
|
||||
@@ -1,17 +1,30 @@
|
||||
import { RiskPoolsConsole } from "@/modules/risk/risk-pools-console";
|
||||
import {
|
||||
RiskPoolsConsole,
|
||||
type RiskPoolListFilter,
|
||||
} from "@/modules/risk/risk-pools-console";
|
||||
|
||||
function parsePoolFilter(raw: string | undefined): RiskPoolListFilter {
|
||||
if (raw === "sold_out" || raw === "high_risk") {
|
||||
return raw;
|
||||
}
|
||||
return "all";
|
||||
}
|
||||
|
||||
export default async function AdminDrawRiskPoolsPage(props: {
|
||||
params: Promise<{ drawId: string }>;
|
||||
searchParams: Promise<{ filter?: string }>;
|
||||
}) {
|
||||
const { drawId } = await props.params;
|
||||
const { filter: filterRaw } = await props.searchParams;
|
||||
const id = Number(drawId);
|
||||
const filter = parsePoolFilter(filterRaw);
|
||||
|
||||
return (
|
||||
<RiskPoolsConsole
|
||||
drawId={id}
|
||||
titleKey="allPoolsPageTitle"
|
||||
soldOutOnly={false}
|
||||
defaultSort="number_asc"
|
||||
initialFilter={filter}
|
||||
defaultSort={filter === "high_risk" ? "usage_desc" : "number_asc"}
|
||||
allowSortChange
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -1,17 +1,9 @@
|
||||
import { RiskPoolsConsole } from "@/modules/risk/risk-pools-console";
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
/** 兼容旧链接:售罄号码已并入风险池 Tab(筛选售罄)。 */
|
||||
export default async function AdminDrawRiskSoldOutPage(props: {
|
||||
params: Promise<{ drawId: string }>;
|
||||
}) {
|
||||
const { drawId } = await props.params;
|
||||
const id = Number(drawId);
|
||||
|
||||
return (
|
||||
<RiskPoolsConsole
|
||||
drawId={id}
|
||||
titleKey="soldOutPageTitle"
|
||||
soldOutOnly
|
||||
defaultSort="number_asc"
|
||||
/>
|
||||
);
|
||||
redirect(`/admin/draws/${drawId}/risk/pools?filter=sold_out`);
|
||||
}
|
||||
|
||||
28
src/app/admin/(shell)/players/[playerId]/page.tsx
Normal file
28
src/app/admin/(shell)/players/[playerId]/page.tsx
Normal file
@@ -0,0 +1,28 @@
|
||||
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
|
||||
import { ModuleScaffold } from "@/components/admin/module-scaffold";
|
||||
import { PRD_PLAYERS_ACCESS_ANY } from "@/lib/admin-prd";
|
||||
import { buildPageMetadata } from "@/lib/page-metadata";
|
||||
import { InvalidPlayerId } from "@/modules/players/invalid-player-id";
|
||||
import { PlayerDetailConsole } from "@/modules/players/player-detail-console";
|
||||
import type { Metadata } from "next";
|
||||
|
||||
export const metadata: Metadata = buildPageMetadata("players", "detailTitle");
|
||||
|
||||
export default async function AdminPlayerDetailPage(props: {
|
||||
params: Promise<{ playerId: string }>;
|
||||
}) {
|
||||
const { playerId } = await props.params;
|
||||
const id = Number(playerId);
|
||||
|
||||
return (
|
||||
<ModuleScaffold>
|
||||
<AdminPermissionGate requiredAny={PRD_PLAYERS_ACCESS_ANY}>
|
||||
{Number.isFinite(id) && id > 0 ? (
|
||||
<PlayerDetailConsole playerId={id} />
|
||||
) : (
|
||||
<InvalidPlayerId />
|
||||
)}
|
||||
</AdminPermissionGate>
|
||||
</ModuleScaffold>
|
||||
);
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export default async function AdminRiskHotPage(props: {
|
||||
export default async function AdminRiskHotRedirectPage(props: {
|
||||
params: Promise<{ drawId: string }>;
|
||||
}) {
|
||||
const { drawId } = await props.params;
|
||||
redirect(`/admin/draws/${drawId}/risk/hot`);
|
||||
redirect(`/admin/draws/${drawId}/risk/pools?filter=high_risk`);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export default async function AdminRiskSoldOutPage(props: {
|
||||
export default async function AdminRiskSoldOutRedirectPage(props: {
|
||||
params: Promise<{ drawId: string }>;
|
||||
}) {
|
||||
const { drawId } = await props.params;
|
||||
redirect(`/admin/draws/${drawId}/risk/sold-out`);
|
||||
redirect(`/admin/draws/${drawId}/risk/pools?filter=sold_out`);
|
||||
}
|
||||
|
||||
5
src/app/admin/(shell)/settlement/agent-bills/page.tsx
Normal file
5
src/app/admin/(shell)/settlement/agent-bills/page.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export default function LegacyAgentBillsPage() {
|
||||
redirect("/admin/agents/settlement-bills");
|
||||
}
|
||||
@@ -1,15 +1,6 @@
|
||||
import { AdminPermissionGate } from "@/components/admin/admin-permission-gate";
|
||||
import { PRD_WALLET_PLAYER_ACCESS_ANY } from "@/lib/admin-prd";
|
||||
import { PlayerWalletPanel } from "@/modules/wallet/wallet-console";
|
||||
import { buildPageMetadata } from "@/lib/page-metadata";
|
||||
import type { Metadata } from "next";
|
||||
|
||||
export const metadata: Metadata = buildPageMetadata("wallet", "playerWalletQuery");
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
/** 玩家钱包已并入玩家详情;旧路径重定向到玩家列表 */
|
||||
export default function AdminWalletPlayerPage() {
|
||||
return (
|
||||
<AdminPermissionGate requiredAny={PRD_WALLET_PLAYER_ACCESS_ANY}>
|
||||
<PlayerWalletPanel />
|
||||
</AdminPermissionGate>
|
||||
);
|
||||
redirect("/admin/players");
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
}
|
||||
|
||||
.admin-list-toolbar {
|
||||
@apply flex w-full flex-row flex-wrap items-center gap-3 border-t border-border/60 pt-4;
|
||||
@apply flex w-full flex-row flex-wrap items-center gap-3;
|
||||
}
|
||||
|
||||
.admin-list-field {
|
||||
|
||||
Reference in New Issue
Block a user