1
0
mirror of https://gitlab.com/comunic/comunicapiv2 synced 2025-02-18 15:02:43 +00:00
comunicapiv2/src/entities/BaseRequestsHandler.ts

224 lines
5.7 KiB
TypeScript
Raw Normal View History

2020-03-31 14:03:26 +02:00
/**
* Base requests handler
*
* @author Pierre Hubert
*/
2020-03-31 14:06:07 +02:00
import { UserHelper } from "../helpers/UserHelper";
import { removeHTMLNodes, checkMail } from "../utils/StringUtils";
2020-03-31 14:03:26 +02:00
export abstract class BaseRequestsHandler {
2020-03-31 14:16:04 +02:00
protected abstract get userID() : number;
2020-03-31 14:03:26 +02:00
protected abstract getPostParam(name : string) : any;
public abstract hasPostParameter(name: string) : boolean;
public abstract error(code : number, message : string) : void;
public abstract success(message: string) : void;
public abstract send(data: any): void;
2020-03-31 14:16:04 +02:00
/**
* Get information about current user
*/
public getUserId() : number {
if(this.userID < 1)
throw Error("Trying to get user ID but none are available!");
return this.userID;
}
/**
* Get the ID of the current user (if any)
* or 0 if the user is not signed in
*/
public get optionnalUserID(): number {
return this.userID >= 1 ? this.userID : 0;
}
/**
* Check out whether user is signed in or not
*/
public get signedIn() : boolean {
return this.userID > 0;
}
2020-03-31 14:06:07 +02:00
/**
* Check out whether a POST string is present in the request or not
*
* @param name The name of the POST field to check
* @param minLength Minimal length of the parameter
*/
public hasPostString(name: string, minLength: number = 0) : boolean {
return this.hasPostParameter(name) && this.getPostParam(name).length >= minLength;
}
2020-03-31 14:03:26 +02:00
/**
* Get a String from the request
*
* @param name The name of the string to get
* @param minLength Minimal required size of the string
* @param required If set to true (true by default), an error will
* be thrown if the string is not included in the request
*/
public postString(name : string, minLength : number = 1, required : boolean = true) : string {
const param = this.getPostParam(name);
// Check if parameter was not found
if(param == undefined) {
if(required)
this.error(400, "Could not find required string: '"+name+"'");
return "";
}
if(param.length < minLength)
this.error(400, "Parameter "+name+" is too short!");
return param;
}
2020-03-31 14:06:07 +02:00
/**
* Get some content for post and satinize it (remove HTML nodes)
*
* @param name The name of the POST field
* @param minLength Optionnal minimal length for the post
*/
public postContent(name: string, minLength ?: number) : string {
const content = this.postString(name, minLength);
if(content.match(/data:image/))
this.error(401, "Please do not include inline images!");
return removeHTMLNodes(content);
}
/**
* Get an email address included in a post request
*
* @param name The name of the POST filed
*/
public postEmail(name: string) : string {
const email = this.postString(name, 3);
if(!checkMail(email))
this.error(400, email + " is not a valid email address!");
return email;
}
/**
* Get an integer included in the request
*
* @param name Name of POST field
* @param fallback Fallback value (if none, throw an error)
* @returns The number (throws in case of error)
*/
public postInt(name: string, fallback ?: number) : number {
const param = this.getPostParam(name);
if(param == undefined) {
if(fallback == undefined)
this.error(400, "Missing integer '"+name+"' in the request!");
return fallback;
}
// Check number
if(Number.parseInt(param).toString() !== param.toString())
this.error(400, "'"+name+"' is an invalid integer!");
return Number.parseInt(param);
}
/**
* Get a list of integeres included in the request
*
* @param name The name of the post field
* @param minEntries Specify the minimum number of entries required
*/
public postNumbersList(name: string, minEntries : number = 1) : Array<number> {
const param = this.postString(name, minEntries < 1 ? 0 : minEntries, minEntries > 0);
let list = [];
for (const el of param.split(",")) {
if(el == "")
continue;
if(Number.parseInt(el).toString() != el)
this.error(400, "Invalid number detected in '"+name+"'!");
list.push(Number.parseInt(el));
}
if(list.length < minEntries)
this.error(400, "Not enough entries in '" + name + "'!")
return list;
}
/**
* Turn a list of string into a Set object
*
* @param name Name of POST field
* @param minEntries Minimum number of entries to specify
*/
public postNumbersSet(name : string, minEntries : number = 1) : Set<number> {
return new Set(this.postNumbersList(name, minEntries));
}
/**
* Attempt to decode JSON included in a POST request
*
* @param name Name of POST field
*/
public postJSON(name: string) : any {
const src = this.getPostParam(name);
if(src == undefined)
this.error(400, "Missing JSON '" + name + "' in the request!");
try {
const response = JSON.parse(src);
return response;
} catch(e) {
this.error(500, "'" + name + "' is not a valid JSON !");
}
}
/**
* Get a boolean included in the request
*
* @param name The name of the POST field
* @param fallback Fallback value to use if the value is not
* found in the request
*/
public postBool(name: string, fallback ?: boolean) : boolean {
const param = this.getPostParam(name);
if(param == undefined) {
if(fallback != undefined)
return fallback;
this.error(400, "Missing boolean '" + name + "' in the request!");
}
return param === "true" || param === true;
}
/**
* Get the ID of a user specified in a POST request
*
* @param name Name of the POST field
*/
public async postUserId(name: string) : Promise<number> {
const userID = this.postInt(name);
if(userID < 1)
this.error(400, "Invalid user ID specified in '" + name +"'!");
if(!await UserHelper.Exists(userID))
this.error(404, "User with ID " + userID + " not found!");
return userID;
}
2020-03-31 14:03:26 +02:00
}