@long2ice/relayx-backend 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/app.d.ts +8592 -0
- package/dist/bullmq/index.d.ts +1 -0
- package/dist/bullmq/jobs.d.ts +34 -0
- package/dist/bullmq/queue.d.ts +6 -0
- package/dist/bullmq/queuedash.d.ts +12 -0
- package/dist/bullmq/worker.d.ts +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/db.d.ts +3 -0
- package/dist/generated/prisma/zod/index.d.ts +2289 -0
- package/dist/index.d.ts +1 -0
- package/dist/middlewares/auth.d.ts +3 -0
- package/dist/middlewares/ip.d.ts +2 -0
- package/dist/middlewares/license.d.ts +2 -0
- package/dist/middlewares/plan.d.ts +2 -0
- package/dist/routes/admin/license.d.ts +90 -0
- package/dist/routes/admin/node.d.ts +919 -0
- package/dist/routes/admin/node_group.d.ts +2115 -0
- package/dist/routes/admin/pay.d.ts +261 -0
- package/dist/routes/admin/plan.d.ts +198 -0
- package/dist/routes/admin/plan_coupon.d.ts +92 -0
- package/dist/routes/admin/stats.d.ts +77 -0
- package/dist/routes/admin/system_config.d.ts +68 -0
- package/dist/routes/admin/ticket.d.ts +113 -0
- package/dist/routes/admin/topup.d.ts +88 -0
- package/dist/routes/admin/topup_activity.d.ts +84 -0
- package/dist/routes/admin/tunnel.d.ts +566 -0
- package/dist/routes/admin/user.d.ts +299 -0
- package/dist/routes/admin/user_plan.d.ts +109 -0
- package/dist/routes/bot.d.ts +13 -0
- package/dist/routes/dns_provider.d.ts +240 -0
- package/dist/routes/health.d.ts +3 -0
- package/dist/routes/in_node_group_dns.d.ts +132 -0
- package/dist/routes/license.d.ts +50 -0
- package/dist/routes/node.d.ts +148 -0
- package/dist/routes/node_group.d.ts +1498 -0
- package/dist/routes/pay.d.ts +34 -0
- package/dist/routes/plan.d.ts +148 -0
- package/dist/routes/plan_coupon.d.ts +22 -0
- package/dist/routes/system_config.d.ts +87 -0
- package/dist/routes/ticket.d.ts +129 -0
- package/dist/routes/topup.d.ts +93 -0
- package/dist/routes/tunnel.d.ts +742 -0
- package/dist/routes/user.d.ts +293 -0
- package/dist/schemas/context.d.ts +9 -0
- package/dist/schemas/license.d.ts +7 -0
- package/dist/schemas/request.d.ts +1181 -0
- package/dist/schemas/response.d.ts +2439 -0
- package/dist/schemas/socket.io.d.ts +33 -0
- package/dist/schemas/tunnel.d.ts +10 -0
- package/dist/services/dns/cloudflare.d.ts +12 -0
- package/dist/services/dns/huawei.d.ts +12 -0
- package/dist/services/dns/index.d.ts +4 -0
- package/dist/services/dns/interface.d.ts +8 -0
- package/dist/services/dns_provider.d.ts +46 -0
- package/dist/services/email.d.ts +11 -0
- package/dist/services/fernet.d.ts +2 -0
- package/dist/services/in_node_group_dns.d.ts +65 -0
- package/dist/services/license.d.ts +87 -0
- package/dist/services/logger.d.ts +7 -0
- package/dist/services/node.d.ts +39 -0
- package/dist/services/node_group.d.ts +75 -0
- package/dist/services/notify.d.ts +44 -0
- package/dist/services/order.d.ts +3 -0
- package/dist/services/pay.d.ts +6 -0
- package/dist/services/plan.d.ts +119 -0
- package/dist/services/plan_coupon.d.ts +16 -0
- package/dist/services/redis.d.ts +59 -0
- package/dist/services/stackauth.d.ts +25 -0
- package/dist/services/sysinfo.d.ts +7 -0
- package/dist/services/system_config.d.ts +7 -0
- package/dist/services/telegram.d.ts +8 -0
- package/dist/services/ticket.d.ts +134 -0
- package/dist/services/topup.d.ts +37 -0
- package/dist/services/topup_activity.d.ts +21 -0
- package/dist/services/tunnel.d.ts +1235 -0
- package/dist/services/user.d.ts +25 -0
- package/dist/socket-io/events.d.ts +13 -0
- package/dist/socket-io/handlers/disconnect.d.ts +2 -0
- package/dist/socket-io/handlers/listen.d.ts +3 -0
- package/dist/socket-io/handlers/register.d.ts +2 -0
- package/dist/socket-io/handlers/sysinfo.d.ts +2 -0
- package/dist/socket-io/index.d.ts +3 -0
- package/dist/socket-io/utils.d.ts +8 -0
- package/dist/utils/date.d.ts +1 -0
- package/dist/utils/ip.d.ts +2 -0
- package/dist/utils/uuid.d.ts +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Redlock, type RedlockUsingContext } from "@sesamecare-oss/redlock";
|
|
2
|
+
import { Redis as RedisClient } from "ioredis";
|
|
3
|
+
import _ from "lodash";
|
|
4
|
+
import type { TunnelType } from "@/generated/prisma/client";
|
|
5
|
+
import type { License } from "../schemas/license";
|
|
6
|
+
import type { Sysinfo } from "../schemas/socket.io";
|
|
7
|
+
import type { TunnelTraffic } from "../schemas/tunnel";
|
|
8
|
+
export declare enum RedisKey {
|
|
9
|
+
USER_SUB = "user:sub",
|
|
10
|
+
USER_SUBSCRIBE = "user:subscribe",
|
|
11
|
+
USER_TUNNEL = "user:tunnel",
|
|
12
|
+
TUNNEL_TRAFFIC = "tunnel:traffic",
|
|
13
|
+
TUNNEL_TRAFFIC_COST = "tunnel:traffic_cost",
|
|
14
|
+
TUNNEL_OUT_LISTEN = "tunnel:out_listen",
|
|
15
|
+
SYSINFO = "sysinfo",
|
|
16
|
+
NODE_GROUP_CONFIG_HASH = "node_group:config_hash",
|
|
17
|
+
TOPUP_ORDER = "topup:order",
|
|
18
|
+
LICENSE = "license",
|
|
19
|
+
LATEST_AGENT_VERSION = "latest_agent_version",
|
|
20
|
+
SOCKET_ID_NODE_ID = "socket_id:node_id",
|
|
21
|
+
NODE_UPGRADE = "node_upgrade",
|
|
22
|
+
NODE_INFO = "node:info"
|
|
23
|
+
}
|
|
24
|
+
export declare const client: RedisClient;
|
|
25
|
+
export declare const lock: Redlock;
|
|
26
|
+
export declare class RedisService {
|
|
27
|
+
private readonly LOCK_EXPIRE;
|
|
28
|
+
setNodeInfo(node_id: string, node: any): Promise<void>;
|
|
29
|
+
getNodeInfo(node_id: string): Promise<any>;
|
|
30
|
+
setNodeConfigHash(node_group_id: number, hash: string): Promise<void>;
|
|
31
|
+
getNodeConfigHash(node_group_id: number): Promise<string | null>;
|
|
32
|
+
setUserSub(sub: string, id: number): Promise<void>;
|
|
33
|
+
getUserSub(sub: string): Promise<number | null>;
|
|
34
|
+
lockUserSubscribe(id: number, callback: (signal: AbortSignal, context: RedlockUsingContext) => Promise<void>): Promise<void>;
|
|
35
|
+
lockUserTunnel(id: number, callback: (signal: AbortSignal, context: RedlockUsingContext) => Promise<void>): Promise<void>;
|
|
36
|
+
incrTunnelTraffics(traffics: TunnelTraffic[]): Promise<void>;
|
|
37
|
+
getTunnelTraffic(is_cost: boolean, tunnel_ids?: number[]): Promise<_.Dictionary<any>>;
|
|
38
|
+
clearTunnelTraffic(tunnel_ids?: number[]): Promise<void>;
|
|
39
|
+
getLatestAgentVersion(): Promise<any>;
|
|
40
|
+
setSysinfo(node_group_id: number, node_id: number, sysinfo: Record<string, Sysinfo>): Promise<void>;
|
|
41
|
+
delNodeGroupOfflineSysinfo(node_group_id: number): Promise<void>;
|
|
42
|
+
delSysinfoByNodeGroups(node_group_ids: number[]): Promise<void>;
|
|
43
|
+
delNodeSysinfo(node_group_id: number, node_id: number): Promise<void>;
|
|
44
|
+
getNodeSysinfo(node_group_id: number, node_id: number): Promise<any>;
|
|
45
|
+
getSysinfo(): Promise<Record<number, Sysinfo[]>>;
|
|
46
|
+
lockTopupOrder(user_id: number, callback: (signal: AbortSignal, context: RedlockUsingContext) => Promise<void>): Promise<void>;
|
|
47
|
+
setOutListen(node_id: number, listen: number, type: TunnelType): Promise<void>;
|
|
48
|
+
getOutListen(node_id: number, type: TunnelType): Promise<string | null>;
|
|
49
|
+
getAllOutListens(): Promise<Record<string, string>>;
|
|
50
|
+
setLicense(license: License): Promise<void>;
|
|
51
|
+
getLicense(): Promise<License | null>;
|
|
52
|
+
delLicense(): Promise<void>;
|
|
53
|
+
setSocketIdNodeId(socket_id: string, node_id: number): Promise<void>;
|
|
54
|
+
getSocketIdNodeId(socket_id: string): Promise<string | null>;
|
|
55
|
+
delSocketIdNodeId(socket_id: string): Promise<void>;
|
|
56
|
+
setNodeUpgrade(version: string): Promise<void>;
|
|
57
|
+
getNodeUpgrade(): Promise<string | null>;
|
|
58
|
+
nodeIsAlive(node_group_id: number, node_id: number): Promise<boolean>;
|
|
59
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
interface CreateUserRequest {
|
|
2
|
+
primary_email: string;
|
|
3
|
+
password: string;
|
|
4
|
+
primary_email_auth_enabled: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface CreateUserResponse {
|
|
7
|
+
id: string;
|
|
8
|
+
primary_email: string;
|
|
9
|
+
}
|
|
10
|
+
export interface UpdateUserRequest {
|
|
11
|
+
password?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface UserMeResponse {
|
|
14
|
+
id: string;
|
|
15
|
+
primary_email: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class StackAuthService {
|
|
18
|
+
private readonly http;
|
|
19
|
+
constructor();
|
|
20
|
+
createUser(data: CreateUserRequest): Promise<CreateUserResponse>;
|
|
21
|
+
updateUser(uid: string, data: UpdateUserRequest): Promise<void>;
|
|
22
|
+
getUserMe(accessToken: string): Promise<UserMeResponse>;
|
|
23
|
+
getJWKSUrl(): string;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SystemConfigName } from "@/generated/prisma/client";
|
|
2
|
+
export declare class SystemConfigService {
|
|
3
|
+
getConfig(name: SystemConfigName): Promise<any>;
|
|
4
|
+
setConfigs(configs: Record<SystemConfigName, string>): Promise<void>;
|
|
5
|
+
getConfigs(names: SystemConfigName[]): Promise<Record<import("../generated/prisma/client").$Enums.SystemConfigName, string | number | boolean>>;
|
|
6
|
+
getAllConfigs(): Promise<Record<import("../generated/prisma/client").$Enums.SystemConfigName, string>>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { TicketStatus } from "@/generated/prisma/client";
|
|
2
|
+
import { NotifyService } from "../services/notify";
|
|
3
|
+
export declare class TicketService {
|
|
4
|
+
private readonly notifyService;
|
|
5
|
+
constructor(notifyService: NotifyService);
|
|
6
|
+
createTicket(userId: number, title: string, content: string): Promise<{
|
|
7
|
+
id: number;
|
|
8
|
+
created_at: Date;
|
|
9
|
+
updated_at: Date;
|
|
10
|
+
user_id: number;
|
|
11
|
+
status: import("../generated/prisma/client").$Enums.TicketStatus;
|
|
12
|
+
title: string;
|
|
13
|
+
content: string;
|
|
14
|
+
}>;
|
|
15
|
+
getUserTickets(userId: number, page: number, perPage: number, sort?: Array<{
|
|
16
|
+
id: string;
|
|
17
|
+
desc: boolean;
|
|
18
|
+
}>, status?: TicketStatus): Promise<{
|
|
19
|
+
data: {
|
|
20
|
+
id: number;
|
|
21
|
+
created_at: Date;
|
|
22
|
+
updated_at: Date;
|
|
23
|
+
user_id: number;
|
|
24
|
+
status: import("../generated/prisma/client").$Enums.TicketStatus;
|
|
25
|
+
title: string;
|
|
26
|
+
content: string;
|
|
27
|
+
}[];
|
|
28
|
+
total: number;
|
|
29
|
+
}>;
|
|
30
|
+
getUserTicket(userId: number, ticketId: number): Promise<{
|
|
31
|
+
replies: ({
|
|
32
|
+
user: {
|
|
33
|
+
email: string;
|
|
34
|
+
};
|
|
35
|
+
} & {
|
|
36
|
+
id: number;
|
|
37
|
+
created_at: Date;
|
|
38
|
+
updated_at: Date;
|
|
39
|
+
user_id: number;
|
|
40
|
+
content: string;
|
|
41
|
+
is_admin: boolean;
|
|
42
|
+
ticket_id: number;
|
|
43
|
+
})[];
|
|
44
|
+
} & {
|
|
45
|
+
id: number;
|
|
46
|
+
created_at: Date;
|
|
47
|
+
updated_at: Date;
|
|
48
|
+
user_id: number;
|
|
49
|
+
status: import("../generated/prisma/client").$Enums.TicketStatus;
|
|
50
|
+
title: string;
|
|
51
|
+
content: string;
|
|
52
|
+
}>;
|
|
53
|
+
updateUserTicketStatus(userId: number, ticketId: number, status: TicketStatus): Promise<{
|
|
54
|
+
id: number;
|
|
55
|
+
created_at: Date;
|
|
56
|
+
updated_at: Date;
|
|
57
|
+
user_id: number;
|
|
58
|
+
status: import("../generated/prisma/client").$Enums.TicketStatus;
|
|
59
|
+
title: string;
|
|
60
|
+
content: string;
|
|
61
|
+
}>;
|
|
62
|
+
userReply(userId: number, ticketId: number, content: string): Promise<{
|
|
63
|
+
id: number;
|
|
64
|
+
created_at: Date;
|
|
65
|
+
updated_at: Date;
|
|
66
|
+
user_id: number;
|
|
67
|
+
content: string;
|
|
68
|
+
is_admin: boolean;
|
|
69
|
+
ticket_id: number;
|
|
70
|
+
}>;
|
|
71
|
+
adminGetTickets(page: number, perPage: number, sort?: Array<{
|
|
72
|
+
id: string;
|
|
73
|
+
desc: boolean;
|
|
74
|
+
}>, status?: TicketStatus): Promise<{
|
|
75
|
+
data: ({
|
|
76
|
+
user: {
|
|
77
|
+
email: string;
|
|
78
|
+
};
|
|
79
|
+
} & {
|
|
80
|
+
id: number;
|
|
81
|
+
created_at: Date;
|
|
82
|
+
updated_at: Date;
|
|
83
|
+
user_id: number;
|
|
84
|
+
status: import("../generated/prisma/client").$Enums.TicketStatus;
|
|
85
|
+
title: string;
|
|
86
|
+
content: string;
|
|
87
|
+
})[];
|
|
88
|
+
total: number;
|
|
89
|
+
}>;
|
|
90
|
+
adminGetTicket(ticketId: number): Promise<{
|
|
91
|
+
user: {
|
|
92
|
+
email: string;
|
|
93
|
+
};
|
|
94
|
+
replies: ({
|
|
95
|
+
user: {
|
|
96
|
+
email: string;
|
|
97
|
+
};
|
|
98
|
+
} & {
|
|
99
|
+
id: number;
|
|
100
|
+
created_at: Date;
|
|
101
|
+
updated_at: Date;
|
|
102
|
+
user_id: number;
|
|
103
|
+
content: string;
|
|
104
|
+
is_admin: boolean;
|
|
105
|
+
ticket_id: number;
|
|
106
|
+
})[];
|
|
107
|
+
} & {
|
|
108
|
+
id: number;
|
|
109
|
+
created_at: Date;
|
|
110
|
+
updated_at: Date;
|
|
111
|
+
user_id: number;
|
|
112
|
+
status: import("../generated/prisma/client").$Enums.TicketStatus;
|
|
113
|
+
title: string;
|
|
114
|
+
content: string;
|
|
115
|
+
}>;
|
|
116
|
+
adminReply(adminId: number, ticketId: number, content: string): Promise<{
|
|
117
|
+
id: number;
|
|
118
|
+
created_at: Date;
|
|
119
|
+
updated_at: Date;
|
|
120
|
+
user_id: number;
|
|
121
|
+
content: string;
|
|
122
|
+
is_admin: boolean;
|
|
123
|
+
ticket_id: number;
|
|
124
|
+
}>;
|
|
125
|
+
adminUpdateStatus(ticketId: number, status: TicketStatus): Promise<{
|
|
126
|
+
id: number;
|
|
127
|
+
created_at: Date;
|
|
128
|
+
updated_at: Date;
|
|
129
|
+
user_id: number;
|
|
130
|
+
status: import("../generated/prisma/client").$Enums.TicketStatus;
|
|
131
|
+
title: string;
|
|
132
|
+
content: string;
|
|
133
|
+
}>;
|
|
134
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Prisma } from "@/generated/prisma/client";
|
|
2
|
+
import { TopupOrderQuerySchema } from "../schemas/request";
|
|
3
|
+
import { LicenseService } from "../services/license";
|
|
4
|
+
import { SystemConfigService } from "../services/system_config";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export declare class TopupService {
|
|
7
|
+
private readonly licenseService;
|
|
8
|
+
private readonly systemConfig;
|
|
9
|
+
constructor(licenseService: LicenseService, systemConfig: SystemConfigService);
|
|
10
|
+
processReferralCommission(tx: Prisma.TransactionClient, userId: number, amount: number, commissionRate?: number): Promise<void>;
|
|
11
|
+
getTopupOrders(query: z.infer<typeof TopupOrderQuerySchema>, user_id?: number): Promise<{
|
|
12
|
+
data: ({
|
|
13
|
+
user: {
|
|
14
|
+
email: string;
|
|
15
|
+
};
|
|
16
|
+
payment: {
|
|
17
|
+
name: string;
|
|
18
|
+
};
|
|
19
|
+
} & {
|
|
20
|
+
id: number;
|
|
21
|
+
created_at: Date;
|
|
22
|
+
updated_at: Date;
|
|
23
|
+
user_id: number;
|
|
24
|
+
balance: number;
|
|
25
|
+
status: import("../generated/prisma/client").$Enums.TopupOrderStatus;
|
|
26
|
+
price: number;
|
|
27
|
+
bonus: number;
|
|
28
|
+
payment_id: number;
|
|
29
|
+
pay_url: string;
|
|
30
|
+
order_id: string;
|
|
31
|
+
trade_id: string | null;
|
|
32
|
+
})[];
|
|
33
|
+
total: number;
|
|
34
|
+
}>;
|
|
35
|
+
cancel(id: number, user_id?: number): Promise<void>;
|
|
36
|
+
markAsPaid(id: number): Promise<void>;
|
|
37
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TopupActivity } from "@/generated/prisma/client";
|
|
2
|
+
import { TopupActivityQuerySchema } from "../schemas/request";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
export declare class TopupActivityService {
|
|
5
|
+
getTopupActivities(query: z.infer<typeof TopupActivityQuerySchema>): Promise<{
|
|
6
|
+
data: {
|
|
7
|
+
id: number;
|
|
8
|
+
created_at: Date;
|
|
9
|
+
updated_at: Date;
|
|
10
|
+
type: import("../generated/prisma/client").$Enums.TopupActivityType;
|
|
11
|
+
value: number;
|
|
12
|
+
min_amount: number | null;
|
|
13
|
+
max_amount: number | null;
|
|
14
|
+
valid_start: Date | null;
|
|
15
|
+
valid_end: Date | null;
|
|
16
|
+
}[];
|
|
17
|
+
total: number;
|
|
18
|
+
}>;
|
|
19
|
+
getActiveTopupActivities(): Promise<TopupActivity[]>;
|
|
20
|
+
calculateBonus(price: number): Promise<number>;
|
|
21
|
+
}
|