mirror of
https://github.com/i701/sarlink-portal.git
synced 2025-07-03 06:48:21 +00:00
Implement Omada device management and enhance payment processing
- Added new omada-actions.ts file to handle fetching and updating device groups in Omada. - Updated authMiddleware to include new payment routes. - Enhanced createPayment function to add devices to a group upon successful payment verification. - Improved payment verification process to include device management. - Refactored PaymentsTable and DevicesToPay components for better UI and state handling. - Removed unused hasSession function from auth-guard.ts for cleaner code.
This commit is contained in:
181
actions/omada-actions.ts
Normal file
181
actions/omada-actions.ts
Normal file
@ -0,0 +1,181 @@
|
||||
interface IpAddress {
|
||||
ip: string;
|
||||
mask: number;
|
||||
}
|
||||
|
||||
interface Ipv6Address {
|
||||
ip: string;
|
||||
prefix: number;
|
||||
}
|
||||
|
||||
interface MacAddress {
|
||||
ruleId?: number;
|
||||
name: string;
|
||||
macAddress: string;
|
||||
}
|
||||
|
||||
interface GroupProfile {
|
||||
groupId: string;
|
||||
site?: string;
|
||||
name: string;
|
||||
buildIn?: boolean;
|
||||
ipList?: IpAddress[];
|
||||
ipv6List?: Ipv6Address[];
|
||||
macAddressList?: MacAddress[];
|
||||
count: number;
|
||||
type: number;
|
||||
resource: number;
|
||||
}
|
||||
|
||||
interface OmadaResponse {
|
||||
errorCode: number;
|
||||
msg: string;
|
||||
result: {
|
||||
data: GroupProfile[];
|
||||
};
|
||||
}
|
||||
|
||||
async function fetchOmadaGroupProfiles(
|
||||
omadacId: string,
|
||||
siteId: string,
|
||||
): Promise<OmadaResponse> {
|
||||
if (!omadacId || !siteId) {
|
||||
throw new Error("omadacId and siteId are required parameters");
|
||||
}
|
||||
|
||||
const timestamp: number = Date.now();
|
||||
const baseUrl: string = "https://omada.sarlink.link";
|
||||
const url: string = `${baseUrl}/${omadacId}/api/v2/sites/${siteId}/setting/profiles/groups?_t=${timestamp}`;
|
||||
|
||||
const headers: HeadersInit = {
|
||||
accept: "application/json, text/plain, */*",
|
||||
"accept-language": "en-US,en;q=0.9",
|
||||
cookie: "TPOMADA_SESSIONID=f30bf82348784089ba90740e59e4aa99",
|
||||
"csrf-token": "fedc6283e9604372b402f82fdaeba0db",
|
||||
priority: "u=1, i",
|
||||
referer: baseUrl,
|
||||
refresh: "manual",
|
||||
"sec-ch-ua": '"Brave";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
|
||||
"sec-ch-ua-mobile": "?0",
|
||||
"sec-ch-ua-platform": '"Linux"',
|
||||
"sec-fetch-dest": "empty",
|
||||
"sec-fetch-mode": "cors",
|
||||
"sec-fetch-site": "same-origin",
|
||||
"sec-gpc": "1",
|
||||
"user-agent":
|
||||
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
||||
"x-requested-with": "XMLHttpRequest",
|
||||
};
|
||||
|
||||
try {
|
||||
const response: Response = await fetch(url, {
|
||||
method: "GET",
|
||||
headers: headers,
|
||||
credentials: "include",
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
const data: OmadaResponse = await response.json();
|
||||
return data;
|
||||
} catch (error) {
|
||||
console.error("Error fetching Omada group profiles:", error);
|
||||
throw error instanceof Error ? error : new Error("Unknown error occurred");
|
||||
}
|
||||
}
|
||||
|
||||
export { fetchOmadaGroupProfiles, type MacAddress };
|
||||
|
||||
export async function addDevicesToGroup({
|
||||
omadacId,
|
||||
siteId,
|
||||
groupId,
|
||||
newDevices,
|
||||
}: {
|
||||
omadacId?: string;
|
||||
siteId?: string;
|
||||
groupId?: string;
|
||||
newDevices: MacAddress[];
|
||||
}): Promise<void> {
|
||||
if (!omadacId || !siteId || !groupId) {
|
||||
throw new Error("omadacId, siteId, and groupId are required parameters");
|
||||
}
|
||||
|
||||
try {
|
||||
// Fetch the existing group profiles
|
||||
const groupProfiles: OmadaResponse = await fetchOmadaGroupProfiles(
|
||||
omadacId,
|
||||
siteId,
|
||||
);
|
||||
|
||||
// Find the group profile with the specified groupId
|
||||
const groupProfile: GroupProfile | undefined =
|
||||
groupProfiles.result.data.find((profile) => profile.groupId === groupId);
|
||||
|
||||
if (!groupProfile) {
|
||||
throw new Error(`Group with ID ${groupId} not found`);
|
||||
}
|
||||
|
||||
// Create a new array with the existing and new devices
|
||||
const updatedMacAddressList: MacAddress[] = [
|
||||
...(groupProfile.macAddressList || []),
|
||||
...newDevices,
|
||||
];
|
||||
|
||||
// Prepare the request payload
|
||||
const requestBody = {
|
||||
name: groupProfile.name,
|
||||
type: groupProfile.type,
|
||||
resource: groupProfile.resource,
|
||||
ipList: groupProfile.ipList,
|
||||
ipv6List: groupProfile.ipv6List,
|
||||
macAddressList: updatedMacAddressList,
|
||||
portList: null,
|
||||
countryList: null,
|
||||
portType: null,
|
||||
portMaskList: null,
|
||||
domainNamePort: null,
|
||||
};
|
||||
|
||||
const timestamp: number = Date.now();
|
||||
const baseUrl: string = "https://omada.sarlink.link";
|
||||
const url: string = `${baseUrl}/${omadacId}/api/v2/sites/${siteId}/setting/profiles/groups/2/${groupId}?_t=${timestamp}`;
|
||||
|
||||
const headers: HeadersInit = {
|
||||
accept: "application/json, text/plain, */*",
|
||||
"accept-language": "en-US,en;q=0.9",
|
||||
"content-type": "application/json;charset=UTF-8",
|
||||
cookie: "TPOMADA_SESSIONID=f30bf82348784089ba90740e59e4aa99",
|
||||
"csrf-token": "fedc6283e9604372b402f82fdaeba0db",
|
||||
origin: baseUrl,
|
||||
priority: "u=1, i",
|
||||
referer: baseUrl,
|
||||
refresh: "manual",
|
||||
"sec-ch-ua": '"Brave";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
|
||||
"sec-ch-ua-mobile": "?0",
|
||||
"sec-ch-ua-platform": '"Linux"',
|
||||
"sec-fetch-dest": "empty",
|
||||
"sec-fetch-mode": "cors",
|
||||
"sec-fetch-site": "same-origin",
|
||||
"sec-gpc": "1",
|
||||
"user-agent":
|
||||
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
||||
"x-requested-with": "XMLHttpRequest",
|
||||
};
|
||||
|
||||
const response: Response = await fetch(url, {
|
||||
method: "PATCH",
|
||||
headers: headers,
|
||||
body: JSON.stringify(requestBody),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error adding devices to group:", error);
|
||||
throw error instanceof Error ? error : new Error("Unknown error occurred");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user