@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,33 @@
|
|
|
1
|
+
import { Status } from "@/generated/prisma/client";
|
|
2
|
+
export interface Sysinfo {
|
|
3
|
+
node_id: number;
|
|
4
|
+
status: Status;
|
|
5
|
+
version: string;
|
|
6
|
+
cpu_usage_percent: number;
|
|
7
|
+
net_in: number;
|
|
8
|
+
net_out: number;
|
|
9
|
+
arch: string;
|
|
10
|
+
boot_time: number;
|
|
11
|
+
cpu_num: number;
|
|
12
|
+
hostname: string;
|
|
13
|
+
load_1: number;
|
|
14
|
+
load_15: number;
|
|
15
|
+
load_5: number;
|
|
16
|
+
memory_total: number;
|
|
17
|
+
memory_usage_percent: number;
|
|
18
|
+
memory_used: number;
|
|
19
|
+
program_memory: number;
|
|
20
|
+
os: string;
|
|
21
|
+
process_num: number;
|
|
22
|
+
uptime: number;
|
|
23
|
+
disk_total: number;
|
|
24
|
+
disk_usage_percent: number;
|
|
25
|
+
disk_used: number;
|
|
26
|
+
traffic_in: number;
|
|
27
|
+
traffic_out: number;
|
|
28
|
+
tcp_connections: number;
|
|
29
|
+
udp_connections: number;
|
|
30
|
+
last_active: string;
|
|
31
|
+
traffic_month_in: number;
|
|
32
|
+
traffic_month_out: number;
|
|
33
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DNSProvider, RecordType, TTL } from "../../services/dns/interface";
|
|
2
|
+
export default class CloudflareDNSProvider implements DNSProvider {
|
|
3
|
+
private readonly cloudflare;
|
|
4
|
+
private readonly domain;
|
|
5
|
+
private readonly rootDomain;
|
|
6
|
+
constructor(domain: string, config: Record<string, string>);
|
|
7
|
+
private getZoneId;
|
|
8
|
+
createRecord(ip: string, type: RecordType, ttl: TTL, weight: number, _line?: string): Promise<void>;
|
|
9
|
+
deleteRecord(ip: string): Promise<void>;
|
|
10
|
+
private getRecordId;
|
|
11
|
+
deleteRecords(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DNSProvider, RecordType, TTL } from "../../services/dns/interface";
|
|
2
|
+
export default class HuaweiDNSProvider implements DNSProvider {
|
|
3
|
+
private readonly domain;
|
|
4
|
+
private readonly client;
|
|
5
|
+
private readonly rootDomain;
|
|
6
|
+
constructor(domain: string, config: Record<string, string>);
|
|
7
|
+
private getZoneId;
|
|
8
|
+
createRecord(ip: string, type: RecordType, ttl: TTL, weight: number, line?: string): Promise<void>;
|
|
9
|
+
private getRecordsetId;
|
|
10
|
+
deleteRecord(ip: string): Promise<void>;
|
|
11
|
+
deleteRecords(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { DNSProviderType } from "@/generated/prisma/client";
|
|
2
|
+
import CloudflareDNSProvider from "../../services/dns/cloudflare";
|
|
3
|
+
import HuaweiDNSProvider from "../../services/dns/huawei";
|
|
4
|
+
export declare const getDNSProvider: (type: DNSProviderType, domain: string, config: Record<string, string>) => CloudflareDNSProvider | HuaweiDNSProvider;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type RecordType = "A" | "AAAA";
|
|
2
|
+
export type TTL = number | "auto";
|
|
3
|
+
export interface DNSProvider {
|
|
4
|
+
createRecord(ip: string, type: RecordType, ttl: TTL, weight: number, line?: string): Promise<void>;
|
|
5
|
+
deleteRecord(ip: string): Promise<void>;
|
|
6
|
+
deleteRecords(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function getRootDomain(domain: string): string;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Prisma } from "@/generated/prisma/client";
|
|
2
|
+
import { DNSProviderQuerySchema, DNSProviderRequestSchema } from "../schemas/request";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
export declare class DNSProviderService {
|
|
5
|
+
createDNSProvider(data: z.infer<typeof DNSProviderRequestSchema>): Promise<{
|
|
6
|
+
name: string;
|
|
7
|
+
id: number;
|
|
8
|
+
created_at: Date;
|
|
9
|
+
updated_at: Date;
|
|
10
|
+
type: import("../generated/prisma/client").$Enums.DNSProviderType;
|
|
11
|
+
config: Prisma.JsonValue;
|
|
12
|
+
}>;
|
|
13
|
+
getDNSProviders(query: z.infer<typeof DNSProviderQuerySchema>): Promise<{
|
|
14
|
+
data: {
|
|
15
|
+
name: string;
|
|
16
|
+
id: number;
|
|
17
|
+
created_at: Date;
|
|
18
|
+
updated_at: Date;
|
|
19
|
+
type: import("../generated/prisma/client").$Enums.DNSProviderType;
|
|
20
|
+
config: Prisma.JsonValue;
|
|
21
|
+
}[];
|
|
22
|
+
total: number;
|
|
23
|
+
}>;
|
|
24
|
+
getDNSProviderById(id: number): Promise<{
|
|
25
|
+
name: string;
|
|
26
|
+
id: number;
|
|
27
|
+
created_at: Date;
|
|
28
|
+
updated_at: Date;
|
|
29
|
+
type: import("../generated/prisma/client").$Enums.DNSProviderType;
|
|
30
|
+
config: Prisma.JsonValue;
|
|
31
|
+
} | null>;
|
|
32
|
+
updateDNSProvider(id: number, data: z.infer<typeof DNSProviderRequestSchema>): Promise<{
|
|
33
|
+
name: string;
|
|
34
|
+
id: number;
|
|
35
|
+
created_at: Date;
|
|
36
|
+
updated_at: Date;
|
|
37
|
+
type: import("../generated/prisma/client").$Enums.DNSProviderType;
|
|
38
|
+
config: Prisma.JsonValue;
|
|
39
|
+
}>;
|
|
40
|
+
deleteDNSProviders(ids: number[]): Promise<void>;
|
|
41
|
+
getDNSProviderSummary(): Promise<{
|
|
42
|
+
name: string;
|
|
43
|
+
id: number;
|
|
44
|
+
type: import("../generated/prisma/client").$Enums.DNSProviderType;
|
|
45
|
+
}[]>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SystemConfigService } from "../services/system_config";
|
|
2
|
+
export declare class EmailService {
|
|
3
|
+
private readonly systemConfigService;
|
|
4
|
+
private transporterCache?;
|
|
5
|
+
constructor(systemConfigService: SystemConfigService);
|
|
6
|
+
private getEmailConfig;
|
|
7
|
+
private getSmtpTransporter;
|
|
8
|
+
private isSmtpEnabled;
|
|
9
|
+
private isResendEnabled;
|
|
10
|
+
sendEmail(to: string, subject: string, text: string, html?: string): Promise<boolean>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import { type NodeGroup } from "@/generated/prisma/client";
|
|
3
|
+
import type { InNodeGroupDNSQuerySchema, InNodeGroupDNSRequestSchema } from "../schemas/request";
|
|
4
|
+
import { RedisService } from "../services/redis";
|
|
5
|
+
export declare class InNodeGroupDNSService {
|
|
6
|
+
private readonly redisService;
|
|
7
|
+
constructor(redisService: RedisService);
|
|
8
|
+
createInNodeGroupDNS(user_id: number, data: z.infer<typeof InNodeGroupDNSRequestSchema>): Promise<{
|
|
9
|
+
id: number;
|
|
10
|
+
created_at: Date;
|
|
11
|
+
updated_at: Date;
|
|
12
|
+
status: import("../generated/prisma/client").$Enums.Status;
|
|
13
|
+
in_node_group_id: number;
|
|
14
|
+
ipv6: boolean;
|
|
15
|
+
dns_provider_id: number;
|
|
16
|
+
ttl: number;
|
|
17
|
+
}>;
|
|
18
|
+
getInNodeGroupDNSList(user_id: number, query: z.infer<typeof InNodeGroupDNSQuerySchema>): Promise<{
|
|
19
|
+
data: ({
|
|
20
|
+
in_node_group: {
|
|
21
|
+
name: string;
|
|
22
|
+
id: number;
|
|
23
|
+
connect_ip: string | null;
|
|
24
|
+
nodes: {
|
|
25
|
+
id: number;
|
|
26
|
+
node_id: string;
|
|
27
|
+
custom_line: string | null;
|
|
28
|
+
dns_status: boolean;
|
|
29
|
+
}[];
|
|
30
|
+
};
|
|
31
|
+
dns_provider: {
|
|
32
|
+
name: string;
|
|
33
|
+
id: number;
|
|
34
|
+
type: import("../generated/prisma/client").$Enums.DNSProviderType;
|
|
35
|
+
};
|
|
36
|
+
} & {
|
|
37
|
+
id: number;
|
|
38
|
+
created_at: Date;
|
|
39
|
+
updated_at: Date;
|
|
40
|
+
status: import("../generated/prisma/client").$Enums.Status;
|
|
41
|
+
in_node_group_id: number;
|
|
42
|
+
ipv6: boolean;
|
|
43
|
+
dns_provider_id: number;
|
|
44
|
+
ttl: number;
|
|
45
|
+
})[];
|
|
46
|
+
total: number;
|
|
47
|
+
}>;
|
|
48
|
+
updateInNodeGroupDNS(user_id: number, id: number, data: z.infer<typeof InNodeGroupDNSRequestSchema>): Promise<{
|
|
49
|
+
id: number;
|
|
50
|
+
created_at: Date;
|
|
51
|
+
updated_at: Date;
|
|
52
|
+
status: import("../generated/prisma/client").$Enums.Status;
|
|
53
|
+
in_node_group_id: number;
|
|
54
|
+
ipv6: boolean;
|
|
55
|
+
dns_provider_id: number;
|
|
56
|
+
ttl: number;
|
|
57
|
+
}>;
|
|
58
|
+
private syncNodeCustomLines;
|
|
59
|
+
deleteInNodeGroupDNS(user_id: number, ids: number[]): Promise<void>;
|
|
60
|
+
nodeDnsRecords(in_node_group: NodeGroup, ips: string[], type: "create" | "delete", weight: number, nodeId?: number, customLine?: string | null): Promise<void>;
|
|
61
|
+
syncDNSRecords(user_id: number, id: number): Promise<{
|
|
62
|
+
synced: number;
|
|
63
|
+
}>;
|
|
64
|
+
cronSyncNodeDNS(): Promise<void>;
|
|
65
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export declare enum LicenseType {
|
|
2
|
+
Personal = "personal",
|
|
3
|
+
Business = "business"
|
|
4
|
+
}
|
|
5
|
+
export declare enum CouponValidCycle {
|
|
6
|
+
Month = "month",
|
|
7
|
+
Year = "year",
|
|
8
|
+
Lifetime = "lifetime"
|
|
9
|
+
}
|
|
10
|
+
export declare class LicenseService {
|
|
11
|
+
payLicense(payment_id: number, pay_type: string | null, cycle: CouponValidCycle, redirect_url: string, client_ip: string, type: LicenseType, coupon?: string): Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
|
|
12
|
+
200: {
|
|
13
|
+
pay_url: string;
|
|
14
|
+
};
|
|
15
|
+
400: {
|
|
16
|
+
readonly error: "商业授权无法降级为个人授权";
|
|
17
|
+
} | {
|
|
18
|
+
readonly error: "无效的周期";
|
|
19
|
+
} | {
|
|
20
|
+
readonly error: "无效的支付方式";
|
|
21
|
+
};
|
|
22
|
+
201: {
|
|
23
|
+
readonly pay_url: "";
|
|
24
|
+
};
|
|
25
|
+
422: {
|
|
26
|
+
type: "validation";
|
|
27
|
+
on: string;
|
|
28
|
+
summary?: string;
|
|
29
|
+
message?: string;
|
|
30
|
+
found?: unknown;
|
|
31
|
+
property?: string;
|
|
32
|
+
expected?: string;
|
|
33
|
+
};
|
|
34
|
+
}>>;
|
|
35
|
+
getLicenseFromServer(): Promise<{
|
|
36
|
+
expired_at: Date;
|
|
37
|
+
created_at: Date;
|
|
38
|
+
site_url: string;
|
|
39
|
+
type: "personal" | "business";
|
|
40
|
+
content: string;
|
|
41
|
+
} | null>;
|
|
42
|
+
getPay(): Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
|
|
43
|
+
200: {
|
|
44
|
+
payments: {
|
|
45
|
+
id: number;
|
|
46
|
+
method: string;
|
|
47
|
+
name: string;
|
|
48
|
+
percent_fee: number;
|
|
49
|
+
type: string | null;
|
|
50
|
+
}[];
|
|
51
|
+
price: {
|
|
52
|
+
personal: {
|
|
53
|
+
month: number;
|
|
54
|
+
lifetime: number;
|
|
55
|
+
enable_year: boolean;
|
|
56
|
+
};
|
|
57
|
+
business: {
|
|
58
|
+
month: number;
|
|
59
|
+
lifetime: number;
|
|
60
|
+
enable_year: boolean;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
}>>;
|
|
65
|
+
getCoupon(coupon: string, type: LicenseType, cycle: CouponValidCycle): Promise<{
|
|
66
|
+
type: string;
|
|
67
|
+
value: number;
|
|
68
|
+
validType: string;
|
|
69
|
+
validCycle: string;
|
|
70
|
+
} | null>;
|
|
71
|
+
getLicense(force?: boolean): Promise<import("../schemas/license").License | null>;
|
|
72
|
+
updateLicense(new_site_url: string): Promise<void>;
|
|
73
|
+
getHistory(): Promise<{
|
|
74
|
+
id: number;
|
|
75
|
+
price: number;
|
|
76
|
+
status: "pending" | "success" | "cancelled";
|
|
77
|
+
type: "personal" | "business";
|
|
78
|
+
expired_at: Date;
|
|
79
|
+
created_at: Date;
|
|
80
|
+
order_id: string;
|
|
81
|
+
coupon: {
|
|
82
|
+
code: string;
|
|
83
|
+
type: "percentage" | "fixed";
|
|
84
|
+
value: number;
|
|
85
|
+
} | null;
|
|
86
|
+
}[] | null>;
|
|
87
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { NodeQuerySchema } from "../schemas/request";
|
|
3
|
+
import { InNodeGroupDNSService } from "../services/in_node_group_dns";
|
|
4
|
+
import { RedisService } from "../services/redis";
|
|
5
|
+
export declare class NodeService {
|
|
6
|
+
private readonly redisService;
|
|
7
|
+
private readonly inNodeGroupDNSService;
|
|
8
|
+
constructor(redisService: RedisService, inNodeGroupDNSService: InNodeGroupDNSService);
|
|
9
|
+
checkNodeId(node_id: string): Promise<void>;
|
|
10
|
+
nodeIsAlive(node_group_id: number, node_id: number): Promise<boolean>;
|
|
11
|
+
deleteNodes(ids: number[], user_id?: number): Promise<void>;
|
|
12
|
+
getNodes(query: z.infer<typeof NodeQuerySchema>, user_id?: number): Promise<{
|
|
13
|
+
data: {
|
|
14
|
+
upgradeable: boolean;
|
|
15
|
+
last_active: any;
|
|
16
|
+
node_group: {
|
|
17
|
+
name: string;
|
|
18
|
+
node_type: import("../generated/prisma/client").$Enums.NodeType;
|
|
19
|
+
traffic_rate: number;
|
|
20
|
+
};
|
|
21
|
+
id: number;
|
|
22
|
+
connect_ip: string;
|
|
23
|
+
order_by: number;
|
|
24
|
+
created_at: Date;
|
|
25
|
+
updated_at: Date;
|
|
26
|
+
status: import("../generated/prisma/client").$Enums.Status;
|
|
27
|
+
weight: number;
|
|
28
|
+
node_id: string;
|
|
29
|
+
version: string;
|
|
30
|
+
backup: boolean;
|
|
31
|
+
custom_line: string | null;
|
|
32
|
+
dns_status: boolean;
|
|
33
|
+
node_group_id: number;
|
|
34
|
+
}[];
|
|
35
|
+
total: number;
|
|
36
|
+
}>;
|
|
37
|
+
updateNodeOrder(id: number, order_by: number, user_id?: number): Promise<void>;
|
|
38
|
+
upgradeAllNodes(user_id?: number): Promise<void>;
|
|
39
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Prisma, User } from "@/generated/prisma/client";
|
|
2
|
+
import { NodeGroupQuerySchema, NodeGroupRequestSchema } from "../schemas/request";
|
|
3
|
+
import { RedisService } from "../services/redis";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
export declare class NodeGroupService {
|
|
6
|
+
private readonly redisService;
|
|
7
|
+
constructor(redisService: RedisService);
|
|
8
|
+
checkUserNodeGroup(user: User, in_node_group_id: number, out_node_group_id: number | null): Promise<void>;
|
|
9
|
+
getUserNodeGroups(user: User): Promise<{
|
|
10
|
+
node_count: number | undefined;
|
|
11
|
+
name: string;
|
|
12
|
+
id: number;
|
|
13
|
+
node_type: import("../generated/prisma/client").$Enums.NodeType;
|
|
14
|
+
allow_listen_protocol: boolean;
|
|
15
|
+
allow_tunnel_types: Prisma.JsonValue;
|
|
16
|
+
admission: boolean;
|
|
17
|
+
block_protocols: Prisma.JsonValue;
|
|
18
|
+
traffic_rate: number;
|
|
19
|
+
need_out_node_group: boolean;
|
|
20
|
+
allow_out_node_groups: Prisma.JsonValue;
|
|
21
|
+
allow_in_node_groups: Prisma.JsonValue;
|
|
22
|
+
user_id: number;
|
|
23
|
+
}[]>;
|
|
24
|
+
getAdminNodeGroupSummary(): Promise<{
|
|
25
|
+
name: string;
|
|
26
|
+
id: number;
|
|
27
|
+
node_type: import("../generated/prisma/client").$Enums.NodeType;
|
|
28
|
+
allow_listen_protocol: boolean;
|
|
29
|
+
allow_tunnel_types: Prisma.JsonValue;
|
|
30
|
+
admission: boolean;
|
|
31
|
+
block_protocols: Prisma.JsonValue;
|
|
32
|
+
traffic_rate: number;
|
|
33
|
+
need_out_node_group: boolean;
|
|
34
|
+
allow_out_node_groups: Prisma.JsonValue;
|
|
35
|
+
allow_in_node_groups: Prisma.JsonValue;
|
|
36
|
+
}[]>;
|
|
37
|
+
createNodeGroup(user_id: number, data: z.infer<typeof NodeGroupRequestSchema>): Promise<void>;
|
|
38
|
+
getNodeGroups(query: z.infer<typeof NodeGroupQuerySchema>, user_id?: number): Promise<{
|
|
39
|
+
data: ({
|
|
40
|
+
user: {
|
|
41
|
+
email: string;
|
|
42
|
+
};
|
|
43
|
+
nodes: {
|
|
44
|
+
connect_ip: string;
|
|
45
|
+
}[];
|
|
46
|
+
} & {
|
|
47
|
+
name: string;
|
|
48
|
+
id: number;
|
|
49
|
+
token: string;
|
|
50
|
+
port_range: string | null;
|
|
51
|
+
connect_ip: string | null;
|
|
52
|
+
node_type: import("../generated/prisma/client").$Enums.NodeType;
|
|
53
|
+
load_balance_type: import("../generated/prisma/client").$Enums.LoadBalanceType;
|
|
54
|
+
allow_listen_protocol: boolean;
|
|
55
|
+
allow_tunnel_types: Prisma.JsonValue | null;
|
|
56
|
+
bypass_type: import("../generated/prisma/client").$Enums.BypassType;
|
|
57
|
+
bypass_list: Prisma.JsonValue | null;
|
|
58
|
+
admission: boolean;
|
|
59
|
+
block_protocols: Prisma.JsonValue | null;
|
|
60
|
+
traffic_rate: number;
|
|
61
|
+
need_out_node_group: boolean;
|
|
62
|
+
allow_out_node_groups: Prisma.JsonValue | null;
|
|
63
|
+
allow_in_node_groups: Prisma.JsonValue | null;
|
|
64
|
+
order_by: number;
|
|
65
|
+
created_at: Date;
|
|
66
|
+
updated_at: Date;
|
|
67
|
+
user_id: number;
|
|
68
|
+
})[];
|
|
69
|
+
total: number;
|
|
70
|
+
}>;
|
|
71
|
+
deleteNodeGroups(ids: number[], user_id?: number): Promise<void>;
|
|
72
|
+
updateNodeGroup(id: number, data: z.infer<typeof NodeGroupRequestSchema>, user_id?: number): Promise<void>;
|
|
73
|
+
updateNodeGroupOrder(id: number, order_by: number, user_id?: number): Promise<void>;
|
|
74
|
+
checkPortRange(port_range: string | null, port?: number): boolean | undefined;
|
|
75
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Plan, Ticket, TopupOrder, User } from "@/generated/prisma/client";
|
|
2
|
+
import { EmailService } from "../services/email";
|
|
3
|
+
import { TelegramService } from "../services/telegram";
|
|
4
|
+
import { UserService } from "../services/user";
|
|
5
|
+
export declare enum NotifyType {
|
|
6
|
+
topup = "topup",
|
|
7
|
+
subscribe_plan = "subscribe_plan",
|
|
8
|
+
node_register = "node_register",
|
|
9
|
+
renew_plan_failed = "renew_plan_failed",
|
|
10
|
+
node_disconnect = "node_disconnect",
|
|
11
|
+
plan_expire = "plan_expire",
|
|
12
|
+
ticket_created = "ticket_created",
|
|
13
|
+
ticket_replied = "ticket_replied"
|
|
14
|
+
}
|
|
15
|
+
export declare class NotifyService {
|
|
16
|
+
private readonly telegramService;
|
|
17
|
+
private readonly userService;
|
|
18
|
+
private readonly emailService;
|
|
19
|
+
constructor(telegramService: TelegramService, userService: UserService, emailService: EmailService);
|
|
20
|
+
private formatTopupMessage;
|
|
21
|
+
private formatUserTopupMessage;
|
|
22
|
+
private formatSubscribePlanMessage;
|
|
23
|
+
private formatRegisterMessage;
|
|
24
|
+
private formatRenewPlanFailedMessage;
|
|
25
|
+
private formatNodeDisconnectMessage;
|
|
26
|
+
private formatPlanExpireMessage;
|
|
27
|
+
private escapeHtml;
|
|
28
|
+
private renderEmailTemplate;
|
|
29
|
+
private createTopupEmail;
|
|
30
|
+
private createAdminTopupEmail;
|
|
31
|
+
private createSubscribePlanEmail;
|
|
32
|
+
private createNodeRegisterEmail;
|
|
33
|
+
private createRenewPlanFailedEmail;
|
|
34
|
+
private createNodeDisconnectEmail;
|
|
35
|
+
private createPlanExpireEmail;
|
|
36
|
+
notifyTopup(order: TopupOrder): Promise<void>;
|
|
37
|
+
notifySubscribePlan(user: User, plan: Plan, price: number, balance: number): Promise<void>;
|
|
38
|
+
notifyNodeRegister(node_id: string, group_name: string, user: User): Promise<void>;
|
|
39
|
+
notifyRenewPlanFailed(user: User, plan_name: string, reason: string, expire_at: Date): Promise<void>;
|
|
40
|
+
notifyNodeDisconnect(node_id: string, group_name: string, user: User, last_active: Date): Promise<void>;
|
|
41
|
+
notifyPlanExpire(user: User, plan_name: string, expire_at: Date): Promise<void>;
|
|
42
|
+
notifyTicketCreated(ticket: Ticket, user: User): Promise<void>;
|
|
43
|
+
notifyTicketReplied(ticket: Ticket, replierEmail: string, isAdmin: boolean): Promise<void>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Payment } from "@/generated/prisma/client";
|
|
2
|
+
import { pay } from "@relayx/shared";
|
|
3
|
+
export declare const getPayment: (payment: Payment) => pay.EPay | pay.BEPUSDT | pay.Heleket;
|
|
4
|
+
export declare class PaymentService {
|
|
5
|
+
updatePayOrder(id: number, order_by: number): Promise<void>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { User } from "@/generated/prisma/client";
|
|
2
|
+
import { PlanCouponService } from "../services/plan_coupon";
|
|
3
|
+
import { NotifyService } from "../services/notify";
|
|
4
|
+
import { RedisService } from "../services/redis";
|
|
5
|
+
import { SystemConfigService } from "../services/system_config";
|
|
6
|
+
import { TopupService } from "../services/topup";
|
|
7
|
+
import { SortingState } from "@tanstack/react-table";
|
|
8
|
+
export declare class PlanService {
|
|
9
|
+
private readonly planCouponService;
|
|
10
|
+
private readonly redisService;
|
|
11
|
+
private readonly notifyService;
|
|
12
|
+
private readonly systemConfigService;
|
|
13
|
+
private readonly topupService;
|
|
14
|
+
constructor(planCouponService: PlanCouponService, redisService: RedisService, notifyService: NotifyService, systemConfigService: SystemConfigService, topupService: TopupService);
|
|
15
|
+
deletePlans(ids: number[]): Promise<void>;
|
|
16
|
+
getUserPlan(user: User): Promise<({
|
|
17
|
+
plan: {
|
|
18
|
+
name: string;
|
|
19
|
+
id: number;
|
|
20
|
+
order_by: number;
|
|
21
|
+
created_at: Date;
|
|
22
|
+
updated_at: Date;
|
|
23
|
+
status: import("../generated/prisma/client").$Enums.Status;
|
|
24
|
+
ip_limit: number | null;
|
|
25
|
+
bandwidth_limit: number | null;
|
|
26
|
+
traffic: number | null;
|
|
27
|
+
price: number;
|
|
28
|
+
max_tunnels: number | null;
|
|
29
|
+
description: string | null;
|
|
30
|
+
original_price: number | null;
|
|
31
|
+
allow_custom_in_node_group: boolean;
|
|
32
|
+
allow_custom_out_node_group: boolean;
|
|
33
|
+
all_in_node_groups: boolean;
|
|
34
|
+
all_out_node_groups: boolean;
|
|
35
|
+
setup_fee: number | null;
|
|
36
|
+
billing_cycle: import("../generated/prisma/client").$Enums.BillingCycle;
|
|
37
|
+
renewable: boolean;
|
|
38
|
+
stock: number | null;
|
|
39
|
+
};
|
|
40
|
+
} & {
|
|
41
|
+
id: number;
|
|
42
|
+
created_at: Date;
|
|
43
|
+
updated_at: Date;
|
|
44
|
+
user_id: number;
|
|
45
|
+
traffic: number | null;
|
|
46
|
+
plan_id: number;
|
|
47
|
+
traffic_used: number;
|
|
48
|
+
max_tunnels: number | null;
|
|
49
|
+
expired_at: Date | null;
|
|
50
|
+
}) | null>;
|
|
51
|
+
checkUserPlan(user: User): Promise<{
|
|
52
|
+
plan: {
|
|
53
|
+
name: string;
|
|
54
|
+
id: number;
|
|
55
|
+
order_by: number;
|
|
56
|
+
created_at: Date;
|
|
57
|
+
updated_at: Date;
|
|
58
|
+
status: import("../generated/prisma/client").$Enums.Status;
|
|
59
|
+
ip_limit: number | null;
|
|
60
|
+
bandwidth_limit: number | null;
|
|
61
|
+
traffic: number | null;
|
|
62
|
+
price: number;
|
|
63
|
+
max_tunnels: number | null;
|
|
64
|
+
description: string | null;
|
|
65
|
+
original_price: number | null;
|
|
66
|
+
allow_custom_in_node_group: boolean;
|
|
67
|
+
allow_custom_out_node_group: boolean;
|
|
68
|
+
all_in_node_groups: boolean;
|
|
69
|
+
all_out_node_groups: boolean;
|
|
70
|
+
setup_fee: number | null;
|
|
71
|
+
billing_cycle: import("../generated/prisma/client").$Enums.BillingCycle;
|
|
72
|
+
renewable: boolean;
|
|
73
|
+
stock: number | null;
|
|
74
|
+
};
|
|
75
|
+
} & {
|
|
76
|
+
id: number;
|
|
77
|
+
created_at: Date;
|
|
78
|
+
updated_at: Date;
|
|
79
|
+
user_id: number;
|
|
80
|
+
traffic: number | null;
|
|
81
|
+
plan_id: number;
|
|
82
|
+
traffic_used: number;
|
|
83
|
+
max_tunnels: number | null;
|
|
84
|
+
expired_at: Date | null;
|
|
85
|
+
}>;
|
|
86
|
+
renewUsersPlan(): Promise<void>;
|
|
87
|
+
renewUserPlan(user: User): Promise<void>;
|
|
88
|
+
subscribePlan(user: User, plan_id: number, auto_renew?: boolean, code?: string, remaining_traffic?: number): Promise<void>;
|
|
89
|
+
getPlanOrders(page: number, perPage: number, user_id?: number, sort?: SortingState | null, plan_id?: number, email?: string): Promise<{
|
|
90
|
+
data: ({
|
|
91
|
+
user: {
|
|
92
|
+
email: string;
|
|
93
|
+
};
|
|
94
|
+
plan: {
|
|
95
|
+
name: string;
|
|
96
|
+
price: number;
|
|
97
|
+
};
|
|
98
|
+
coupon: {
|
|
99
|
+
type: import("../generated/prisma/client").$Enums.CouponType;
|
|
100
|
+
value: number;
|
|
101
|
+
} | null;
|
|
102
|
+
} & {
|
|
103
|
+
id: number;
|
|
104
|
+
created_at: Date;
|
|
105
|
+
updated_at: Date;
|
|
106
|
+
user_id: number;
|
|
107
|
+
balance: number;
|
|
108
|
+
plan_id: number;
|
|
109
|
+
price: number;
|
|
110
|
+
coupon_id: number | null;
|
|
111
|
+
})[];
|
|
112
|
+
total: number;
|
|
113
|
+
}>;
|
|
114
|
+
updatePlanOrder(id: number, order_by: number): Promise<void>;
|
|
115
|
+
getPlanSummary(): Promise<{
|
|
116
|
+
name: string;
|
|
117
|
+
id: number;
|
|
118
|
+
}[]>;
|
|
119
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BillingCycle } from "@/generated/prisma/client";
|
|
2
|
+
export declare class PlanCouponService {
|
|
3
|
+
getCoupon(code: string, cycle: BillingCycle, user_id: number): Promise<{
|
|
4
|
+
id: number;
|
|
5
|
+
created_at: Date;
|
|
6
|
+
updated_at: Date;
|
|
7
|
+
type: import("../generated/prisma/client").$Enums.CouponType;
|
|
8
|
+
value: number;
|
|
9
|
+
code: string;
|
|
10
|
+
valid_start: Date | null;
|
|
11
|
+
valid_end: Date | null;
|
|
12
|
+
valid_cycle: import("../generated/prisma/client").$Enums.BillingCycle | null;
|
|
13
|
+
max_use: number | null;
|
|
14
|
+
max_use_per_user: number | null;
|
|
15
|
+
}>;
|
|
16
|
+
}
|