153 lines
4.2 KiB
TypeScript
153 lines
4.2 KiB
TypeScript
import httpClient from '../lib/httpClient';
|
|
import { config } from '../config';
|
|
import { ensureAuthenticated } from './authService';
|
|
import logger from '../lib/logger';
|
|
import { OmadaApiResponse, OmadaVlan, OmadaVlanCreate } from '../types/omada';
|
|
|
|
const BASE_URL = `${config.omada.northboundBase}/openapi/v1/omada/${config.omada.id}`;
|
|
|
|
/**
|
|
* Lists all VLANs for a site
|
|
*/
|
|
export async function listVlans(siteId: string): Promise<OmadaVlan[]> {
|
|
await ensureAuthenticated();
|
|
|
|
try {
|
|
const url = `${BASE_URL}/sites/${siteId}/networks`;
|
|
logger.debug('Fetching VLANs', { siteId });
|
|
|
|
const response = await httpClient.get<OmadaApiResponse<OmadaVlan[]>>(url);
|
|
const data = response.data;
|
|
|
|
if (data.errorCode !== 0) {
|
|
throw new Error(`Failed to fetch VLANs: ${data.msg || 'Unknown error'}`);
|
|
}
|
|
|
|
const vlans = data.result || data.data || [];
|
|
logger.info(`Fetched ${vlans.length} VLANs for site ${siteId}`);
|
|
return vlans;
|
|
} catch (error) {
|
|
logger.error('Error fetching VLANs', { siteId, error });
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets a specific VLAN by ID
|
|
*/
|
|
export async function getVlan(siteId: string, vlanId: string): Promise<OmadaVlan> {
|
|
await ensureAuthenticated();
|
|
|
|
try {
|
|
const url = `${BASE_URL}/sites/${siteId}/networks/${vlanId}`;
|
|
logger.debug('Fetching VLAN', { siteId, vlanId });
|
|
|
|
const response = await httpClient.get<OmadaApiResponse<OmadaVlan>>(url);
|
|
const data = response.data;
|
|
|
|
if (data.errorCode !== 0) {
|
|
throw new Error(`Failed to fetch VLAN: ${data.msg || 'Unknown error'}`);
|
|
}
|
|
|
|
const vlan = data.result || data.data;
|
|
if (!vlan) {
|
|
throw new Error('No VLAN returned from fetch operation');
|
|
}
|
|
|
|
logger.info('VLAN fetched', { siteId, vlanId });
|
|
return vlan;
|
|
} catch (error) {
|
|
logger.error('Error fetching VLAN', { siteId, vlanId, error });
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates a new VLAN
|
|
*/
|
|
export async function createVlan(siteId: string, vlanConfig: OmadaVlanCreate): Promise<OmadaVlan> {
|
|
await ensureAuthenticated();
|
|
|
|
try {
|
|
const url = `${BASE_URL}/sites/${siteId}/networks`;
|
|
logger.info('Creating VLAN', { siteId, vlanConfig });
|
|
|
|
const response = await httpClient.post<OmadaApiResponse<OmadaVlan>>(url, vlanConfig);
|
|
const data = response.data;
|
|
|
|
if (data.errorCode !== 0) {
|
|
throw new Error(`Failed to create VLAN: ${data.msg || 'Unknown error'}`);
|
|
}
|
|
|
|
const vlan = data.result || data.data;
|
|
if (!vlan) {
|
|
throw new Error('No VLAN returned from create operation');
|
|
}
|
|
|
|
logger.info('VLAN created', { siteId, vlanId: vlan.id, vlanName: vlan.name });
|
|
return vlan;
|
|
} catch (error) {
|
|
logger.error('Error creating VLAN', { siteId, error });
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Updates an existing VLAN
|
|
*/
|
|
export async function updateVlan(
|
|
siteId: string,
|
|
vlanId: string,
|
|
vlanConfig: Partial<OmadaVlanCreate>
|
|
): Promise<OmadaVlan> {
|
|
await ensureAuthenticated();
|
|
|
|
try {
|
|
const url = `${BASE_URL}/sites/${siteId}/networks/${vlanId}`;
|
|
logger.info('Updating VLAN', { siteId, vlanId, vlanConfig });
|
|
|
|
const response = await httpClient.put<OmadaApiResponse<OmadaVlan>>(url, vlanConfig);
|
|
const data = response.data;
|
|
|
|
if (data.errorCode !== 0) {
|
|
throw new Error(`Failed to update VLAN: ${data.msg || 'Unknown error'}`);
|
|
}
|
|
|
|
const vlan = data.result || data.data;
|
|
if (!vlan) {
|
|
throw new Error('No VLAN returned from update operation');
|
|
}
|
|
|
|
logger.info('VLAN updated', { siteId, vlanId });
|
|
return vlan;
|
|
} catch (error) {
|
|
logger.error('Error updating VLAN', { siteId, vlanId, error });
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deletes a VLAN
|
|
*/
|
|
export async function deleteVlan(siteId: string, vlanId: string): Promise<void> {
|
|
await ensureAuthenticated();
|
|
|
|
try {
|
|
const url = `${BASE_URL}/sites/${siteId}/networks/${vlanId}`;
|
|
logger.info('Deleting VLAN', { siteId, vlanId });
|
|
|
|
const response = await httpClient.delete<OmadaApiResponse>(url);
|
|
const data = response.data;
|
|
|
|
if (data.errorCode !== 0) {
|
|
throw new Error(`Failed to delete VLAN: ${data.msg || 'Unknown error'}`);
|
|
}
|
|
|
|
logger.info('VLAN deleted', { siteId, vlanId });
|
|
} catch (error) {
|
|
logger.error('Error deleting VLAN', { siteId, vlanId, error });
|
|
throw error;
|
|
}
|
|
}
|
|
|