feat: implement create functionality for WapServers across server, sysadmin, and CLI layers

This commit is contained in:
2026-07-30 17:45:45 -03:00
parent 146770a55d
commit cb830fcf01
12 changed files with 167 additions and 16 deletions
@@ -1,4 +1,5 @@
import {
CreateWapServerParams,
FindWapServerParams,
IWapServer,
IWapServerAdapter,
@@ -28,6 +29,10 @@ export class WapServerAdapterMongoose implements IWapServerAdapter {
this.serverList = model<IWapServerDocument>("WapServer", this.schema);
}
public async create(data: CreateWapServerParams): Promise<IWapServer> {
return await this.serverList.create(data);
}
public async find(data: FindWapServerParams): Promise<IWapServer[]> {
return this.serverList.find(data).exec();
}
@@ -114,6 +114,16 @@ export type UpdateWapServerParams = {
active?: boolean;
};
export type CreateWapServerParams = {
name: string;
ipv4: string;
port: number;
maxBots: number;
ipv6?: string;
description?: string;
active?: boolean;
};
export type PaginateWapServerParams = FindWapServerParams & {
page: number;
limit: number;
@@ -206,6 +216,10 @@ export type SysAdminGetWapServerParams = PaginateWapServerParams & {
payload: IPayload;
};
export type SysAdminCreateWapServerParams = CreateWapServerParams & {
payload: IPayload;
};
export type SysAdminUpdateWapServerParams = UpdateWapServerParams & {
payload: IPayload;
};
@@ -227,6 +241,7 @@ export type SysAdminWapServerOrganizationActionRequest = SysAdminWapServerOrgani
};
export interface IWapServerAdapter {
create(data: CreateWapServerParams): Promise<IWapServer>;
find(data: FindWapServerParams): Promise<IWapServer[]>;
findOne(data: FindWapServerParams): Promise<IWapServerDocument | null>;
delete(id: string): Promise<void>;
@@ -249,6 +264,7 @@ export interface IWapServerManager {
getQr(data: BotEventParams): Promise<string>;
sendMessage(data: SendBotMessageParams): Promise<void>;
sysAdminGetWapServers(data: PaginateWapServerParams): Promise<PaginateWapServerResults>;
sysAdminCreateWapServer(data: CreateWapServerParams): Promise<IWapServer>;
sysAdminUpdateWapServer(data: UpdateWapServerParams): Promise<IWapServer>;
sysAdminAuditWapServer(data: SysAdminWapServerAuditParams): Promise<SysAdminWapServerAuditResult>;
sysAdminRecalculateWapServerCount(data: SysAdminWapServerRecalculateCountParams): Promise<SysAdminWapServerRecalculateCountResult>;
+30
View File
@@ -29,6 +29,7 @@ import {
BOT_STATE,
SERVER_STATE,
BOT_SESSION_STATUS,
CreateWapServerParams,
VALIDATE_BOT_ENVENT_ERRORS,
PaginateWapServerResults,
PaginateWapServerParams,
@@ -981,6 +982,35 @@ class WapServerManager implements IWapServerManager {
return servers;
}
public async sysAdminCreateWapServer(data: CreateWapServerParams): Promise<IWapServer> {
if (!data.name || !String(data.name).trim()) {
throw new Error("Name is required");
}
if (!data.ipv4 || !String(data.ipv4).trim()) {
throw new Error("IPv4 is required");
}
if (!Number.isFinite(data.port) || data.port < 0) {
throw new Error("Port must be a finite non-negative number");
}
if (!Number.isFinite(data.maxBots) || data.maxBots < 0) {
throw new Error("Max bots must be a finite non-negative number");
}
return await this.servers.create({
name: String(data.name).trim(),
description: data.description ? String(data.description).trim() : "",
ipv4: this.normalizeBotAdminApiUrl(data.ipv4),
ipv6: data.ipv6 ? String(data.ipv6).trim() : "",
countBots: 0,
port: data.port,
maxBots: data.maxBots,
active: data.active === undefined ? true : Boolean(data.active),
} as CreateWapServerParams & { countBots: number });
}
public async sysAdminUpdateWapServer(data: UpdateWapServerParams): Promise<IWapServer> {
if (!data.serverId) {
throw new Error("Server id is required");
@@ -1,5 +1,6 @@
import {
PaginateWapServerResults,
SysAdminCreateWapServerParams,
SysAdminDeleteWapServerRequest,
SysAdminDeleteWapServerResult,
SysAdminAuditWapServerParams,
@@ -55,6 +56,27 @@ const getErrorDesc = (error: unknown): string => {
return fallback || "Unknown error while auditing WAP server";
};
@Route("sysadmin/wapserver/create")
export class SysAdminWapServerCreateController extends Controller {
@Response<ApiValidationError>(500, "Ha ocurrido un error")
@SuccessResponse(200, "Done")
@Post()
@Middlewares(sysAdminAuthMiddleware)
public async sysAdminCreateWapServer(
@Body() requestBody: SysAdminCreateWapServerParams,
): Promise<IWapServer | ApiValidationError> {
try {
const { payload, ...cleanRequestBody } = requestBody as any;
const result = await new SA_WapServerService().sysAdminCreateWapServer(cleanRequestBody);
this.setStatus(200);
return result;
} catch (e) {
this.setStatus(500);
return new ApiValidationError(500, getErrorDesc(e));
}
}
}
@Route("sysadmin/wapserver/get")
export class SysAdminWapServerGetController extends Controller {
@Response<ApiValidationError>(500, "Ha ocurrido un error")
@@ -1,6 +1,7 @@
import { connect } from "mongoose";
import {
CreateWapServerParams,
PaginateWapServerParams,
PaginateWapServerResults,
SysAdminDeleteWapServerParams,
@@ -23,6 +24,11 @@ export class SA_WapServerService {
return await WapServerList.sysAdminGetWapServers(data);
}
public async sysAdminCreateWapServer(data: CreateWapServerParams) {
await connect(`${process.env.DATABASE_CONNECTION}`);
return await WapServerList.sysAdminCreateWapServer(data);
}
public async sysAdminUpdateWapServer(data: UpdateWapServerParams) {
await connect(`${process.env.DATABASE_CONNECTION}`);
return await WapServerList.sysAdminUpdateWapServer(data);