Files
Datacenter-Control-Complete/src/services/vlanService.ts
2026-02-09 21:51:31 -08:00

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;
}
}