138 lines
5.0 KiB
TypeScript
138 lines
5.0 KiB
TypeScript
import {BaseController} from "./BaseController";
|
|
import {HttpRequest, HttpResponse, TemplatedApp} from "uWebSockets.js";
|
|
import {ADMIN_API_TOKEN} from "../Enum/EnvironmentVariable";
|
|
import {apiClientRepository} from "../Services/ApiClientRepository";
|
|
import {AdminRoomMessage, WorldFullWarningToRoomMessage, RefreshRoomPromptMessage} from "../Messages/generated/messages_pb";
|
|
|
|
|
|
export class AdminController extends BaseController{
|
|
|
|
constructor(private App : TemplatedApp) {
|
|
super();
|
|
this.App = App;
|
|
this.receiveGlobalMessagePrompt();
|
|
this.receiveRoomEditionPrompt();
|
|
}
|
|
|
|
receiveRoomEditionPrompt() {
|
|
this.App.options("/room/refresh", (res: HttpResponse, req: HttpRequest) => {
|
|
this.addCorsHeaders(res);
|
|
res.end();
|
|
});
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
this.App.post("/room/refresh", async (res: HttpResponse, req: HttpRequest) => {
|
|
res.onAborted(() => {
|
|
console.warn('/message request was aborted');
|
|
})
|
|
|
|
const token = req.getHeader('admin-token');
|
|
const body = await res.json();
|
|
|
|
if (token !== ADMIN_API_TOKEN) {
|
|
console.error('Admin access refused for token: '+token)
|
|
res.writeStatus("401 Unauthorized").end('Incorrect token');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
if (typeof body.roomId !== 'string') {
|
|
throw 'Incorrect roomId parameter'
|
|
}
|
|
const roomId: string = body.roomId;
|
|
|
|
await apiClientRepository.getClient(roomId).then((roomClient) =>{
|
|
return new Promise((res, rej) => {
|
|
const roomMessage = new RefreshRoomPromptMessage();
|
|
roomMessage.setRoomid(roomId);
|
|
|
|
roomClient.sendRefreshRoomPrompt(roomMessage, (err) => {
|
|
err ? rej(err) : res();
|
|
});
|
|
});
|
|
});
|
|
} catch (err) {
|
|
this.errorToResponse(err, res);
|
|
return;
|
|
}
|
|
|
|
res.writeStatus("200");
|
|
res.end('ok');
|
|
|
|
|
|
});
|
|
}
|
|
|
|
receiveGlobalMessagePrompt() {
|
|
this.App.options("/message", (res: HttpResponse, req: HttpRequest) => {
|
|
this.addCorsHeaders(res);
|
|
res.end();
|
|
});
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
this.App.post("/message", async (res: HttpResponse, req: HttpRequest) => {
|
|
|
|
res.onAborted(() => {
|
|
console.warn('/message request was aborted');
|
|
})
|
|
|
|
|
|
const token = req.getHeader('admin-token');
|
|
const body = await res.json();
|
|
|
|
if (token !== ADMIN_API_TOKEN) {
|
|
console.error('Admin access refused for token: '+token)
|
|
res.writeStatus("401 Unauthorized").end('Incorrect token');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
if (typeof body.text !== 'string') {
|
|
throw 'Incorrect text parameter'
|
|
}
|
|
if (body.type !== 'capacity' && body.type !== 'message') {
|
|
throw 'Incorrect type parameter'
|
|
}
|
|
if (!body.targets || typeof body.targets !== 'object') {
|
|
throw 'Incorrect targets parameter'
|
|
}
|
|
const text: string = body.text;
|
|
const type: string = body.type;
|
|
const targets: string[] = body.targets;
|
|
|
|
await Promise.all(targets.map((roomId) => {
|
|
return apiClientRepository.getClient(roomId).then((roomClient) =>{
|
|
return new Promise((res, rej) => {
|
|
if (type === 'message') {
|
|
const roomMessage = new AdminRoomMessage();
|
|
roomMessage.setMessage(text);
|
|
roomMessage.setRoomid(roomId);
|
|
|
|
roomClient.sendAdminMessageToRoom(roomMessage, (err) => {
|
|
err ? rej(err) : res();
|
|
});
|
|
} else if (type === 'capacity') {
|
|
const roomMessage = new WorldFullWarningToRoomMessage();
|
|
roomMessage.setRoomid(roomId);
|
|
|
|
roomClient.sendWorldFullWarningToRoom(roomMessage, (err) => {
|
|
err ? rej(err) : res();
|
|
});
|
|
}
|
|
|
|
});
|
|
});
|
|
}));
|
|
|
|
} catch (err) {
|
|
this.errorToResponse(err, res);
|
|
return;
|
|
}
|
|
|
|
res.writeStatus("200");
|
|
this.addCorsHeaders(res);
|
|
res.end('ok');
|
|
});
|
|
}
|
|
}
|