export type User = { username: string; displayName: string; email: string; password: string; // SHOULD BE EXCLUDED FROM ANY API RESPONSE. AND WON'T BE STORED IN PLAINTEXT, I AM NOT STUPID. I THINK. id: Number; flags: { suspended: boolean; operator: boolean; // This is basically SU. This will be given out by DB access. }; } export type Group = { name: string; id: Number; flags: { suspended: boolean; }; members: User[]; contacts: { billing: User[]; support: User[]; technical: User[]; other: User[]; } billing: { method: string; frequency: string; total: Number; } } export type IP = { vlan: Number; // 20: Management, 30: Internal, 40: Guest, 99: Unused subnet: string; // /32, /30, /29, etc. Unlikely to be anything other than /32, but you never know. device: Number; // 192.168.VLAN.DEVICE/SUBNET } export type Node = { name: string; id: Number; status: string; mgmtIp: IP; type: string; cpu: { cores: Number; threads: Number; }; memory: { total: Number; }; storage: { total: Number; used: Number; }; } export type Instance = { name: string; id: Number; status: "running" | "stopped" | "suspended" | "error"; node: Node; ip: IP; assigned: User | Group; pve: { vmid: Number; type: "qemu" | "lxc"; }; history: { suspended: { reason: string; actionRequired: boolean | null; admin: User; date: Date; }; unsuspended: { reason: string; admin: User; date: Date; }; requested: { action: "creation" | "deletion" | "modification" | null; date: Date; completedDate: Date | null; }; }[]; config: { cpu: { cores: Number; threads: Number; shared: boolean; }; memory: { total: Number; // in MB }; storage: { total: Number; // in GB used: Number; // in GB host: string; // Will either be local or vaporygon (or whatever storage is added later) }[]; bandwidth: { total: Number; used: Number; speedCap: Number; // in kbps }; highAvailability: boolean; } }