mirror of
https://github.com/spacebarchat/server.git
synced 2024-11-11 05:02:37 +01:00
🎨 remove unused imports
This commit is contained in:
parent
9b4457424d
commit
dcc3ae6a14
@ -6,7 +6,6 @@ import "missing-native-js-functions";
|
|||||||
import { generateToken } from "./login";
|
import { generateToken } from "./login";
|
||||||
import { getIpAdress, IPAnalysis, isProxy } from "@fosscord/api";
|
import { getIpAdress, IPAnalysis, isProxy } from "@fosscord/api";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { In } from "typeorm";
|
|
||||||
|
|
||||||
const router: Router = Router();
|
const router: Router = Router();
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Router, Response, Request } from "express";
|
import { Router, Response, Request } from "express";
|
||||||
import { Attachment, Channel, ChannelType, Embed, getPermission, Message } from "@fosscord/util";
|
import { Attachment, Channel, ChannelType, Embed, getPermission, Message } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { instanceOf, Length, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import multer from "multer";
|
import multer from "multer";
|
||||||
import { sendMessage } from "@fosscord/api";
|
import { sendMessage } from "@fosscord/api";
|
||||||
import { uploadFile } from "@fosscord/api";
|
import { uploadFile } from "@fosscord/api";
|
||||||
@ -61,17 +61,12 @@ router.get("/", async (req: Request, res: Response) => {
|
|||||||
if (!channel) throw new HTTPError("Channel not found", 404);
|
if (!channel) throw new HTTPError("Channel not found", 404);
|
||||||
|
|
||||||
isTextChannel(channel.type);
|
isTextChannel(channel.type);
|
||||||
|
const around = `${req.query.around}`;
|
||||||
|
const before = `${req.query.before}`;
|
||||||
|
const after = `${req.query.after}`;
|
||||||
|
const limit = Number(req.query.limit) || 50;
|
||||||
|
if (limit < 1 || limit > 100) throw new HTTPError("limit must be between 1 and 100");
|
||||||
|
|
||||||
try {
|
|
||||||
instanceOf({ $around: String, $after: String, $before: String, $limit: new Length(Number, 1, 100) }, req.query, {
|
|
||||||
path: "query",
|
|
||||||
req
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
return res.status(400).json({ code: 50035, message: "Invalid Query", success: false, errors: error });
|
|
||||||
}
|
|
||||||
var { around, after, before, limit }: { around?: string; after?: string; before?: string; limit?: number } = req.query;
|
|
||||||
if (!limit) limit = 50;
|
|
||||||
var halfLimit = Math.floor(limit / 2);
|
var halfLimit = Math.floor(limit / 2);
|
||||||
|
|
||||||
const permissions = await getPermission(req.user_id, channel.guild_id, channel_id);
|
const permissions = await getPermission(req.user_id, channel.guild_id, channel_id);
|
||||||
|
@ -2,7 +2,7 @@ import { Channel, ChannelPermissionOverwrite, ChannelUpdateEvent, emitEvent, get
|
|||||||
import { Router, Response, Request } from "express";
|
import { Router, Response, Request } from "express";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
|
|
||||||
import { check, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
const router: Router = Router();
|
const router: Router = Router();
|
||||||
|
|
||||||
// TODO: Only permissions your bot has in the guild or channel can be allowed/denied (unless your bot has a MANAGE_ROLES overwrite in the channel)
|
// TODO: Only permissions your bot has in the guild or channel can be allowed/denied (unless your bot has a MANAGE_ROLES overwrite in the channel)
|
||||||
|
@ -9,14 +9,14 @@ router.post("/", route({ permission: "SEND_MESSAGES" }), async (req: Request, re
|
|||||||
const user_id = req.user_id;
|
const user_id = req.user_id;
|
||||||
const timestamp = Date.now();
|
const timestamp = Date.now();
|
||||||
const channel = await Channel.findOneOrFail({ id: channel_id });
|
const channel = await Channel.findOneOrFail({ id: channel_id });
|
||||||
const member = await Member.findOneOrFail({ id: user_id });
|
const member = await Member.findOneOrFail({ where: { id: user_id }, relations: ["roles"] });
|
||||||
|
|
||||||
await emitEvent({
|
await emitEvent({
|
||||||
event: "TYPING_START",
|
event: "TYPING_START",
|
||||||
channel_id: channel_id,
|
channel_id: channel_id,
|
||||||
data: {
|
data: {
|
||||||
// this is the paylod
|
// this is the paylod
|
||||||
member: { ...member, roles: member.roles.map((x) => x.id) },
|
member: { ...member, roles: member.roles?.map((x) => x.id) },
|
||||||
channel_id,
|
channel_id,
|
||||||
timestamp,
|
timestamp,
|
||||||
user_id,
|
user_id,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Router, Response, Request } from "express";
|
import { Router, Response, Request } from "express";
|
||||||
import { check, Length, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { Channel, Config, getPermission, trimSpecial, Webhook } from "@fosscord/util";
|
import { Channel, Config, getPermission, trimSpecial, Webhook } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { isTextChannel } from "./messages/index";
|
import { isTextChannel } from "./messages/index";
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Request, Response, Router } from "express";
|
import { Request, Response, Router } from "express";
|
||||||
import { emitEvent, getPermission, GuildBanAddEvent, GuildBanRemoveEvent, Guild, Ban, User, Member } from "@fosscord/util";
|
import { emitEvent, getPermission, GuildBanAddEvent, GuildBanRemoveEvent, Guild, Ban, User, Member } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { getIpAdress, check, route } from "@fosscord/api";
|
import { getIpAdress, route } from "@fosscord/api";
|
||||||
|
|
||||||
export interface BanCreateSchema {
|
export interface BanCreateSchema {
|
||||||
delete_message_days?: string;
|
delete_message_days?: string;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Router, Response, Request } from "express";
|
import { Router, Response, Request } from "express";
|
||||||
import { Channel, ChannelUpdateEvent, getPermission, emitEvent } from "@fosscord/util";
|
import { Channel, ChannelUpdateEvent, getPermission, emitEvent } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { check, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { ChannelModifySchema } from "../../channels/#channel_id";
|
import { ChannelModifySchema } from "../../channels/#channel_id";
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Request, Response, Router } from "express";
|
import { Request, Response, Router } from "express";
|
||||||
import { emitEvent, getPermission, Guild, GuildUpdateEvent, Member } from "@fosscord/util";
|
import { emitEvent, getPermission, Guild, GuildUpdateEvent, Member } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { check, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { handleFile } from "@fosscord/api";
|
import { handleFile } from "@fosscord/api";
|
||||||
import "missing-native-js-functions";
|
import "missing-native-js-functions";
|
||||||
import { GuildCreateSchema } from "../index";
|
import { GuildCreateSchema } from "../index";
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Request, Response, Router } from "express";
|
import { Request, Response, Router } from "express";
|
||||||
import { Member, getPermission, Role, GuildMemberUpdateEvent, emitEvent } from "@fosscord/util";
|
import { Member, getPermission, Role, GuildMemberUpdateEvent, emitEvent } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { check, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import { Request, Response, Router } from "express";
|
import { Request, Response, Router } from "express";
|
||||||
import { Guild, Member, PublicMemberProjection } from "@fosscord/util";
|
import { Guild, Member, PublicMemberProjection } from "@fosscord/util";
|
||||||
import { instanceOf, Length, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { MoreThan } from "typeorm";
|
import { MoreThan } from "typeorm";
|
||||||
|
import { HTTPError } from "lambert-server";
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
@ -11,26 +12,17 @@ const router = Router();
|
|||||||
|
|
||||||
router.get("/", route({}), async (req: Request, res: Response) => {
|
router.get("/", route({}), async (req: Request, res: Response) => {
|
||||||
const { guild_id } = req.params;
|
const { guild_id } = req.params;
|
||||||
const guild = await Guild.findOneOrFail({ id: guild_id });
|
const limit = Number(req.query.limit) || 1;
|
||||||
await Member.IsInGuildOrFail(req.user_id, guild_id);
|
if (limit > 1000 || limit < 1) throw new HTTPError("Limit must be between 1 and 1000");
|
||||||
|
const after = `${req.query.after}`;
|
||||||
try {
|
|
||||||
instanceOf({ $limit: new Length(Number, 1, 1000), $after: String }, req.query, {
|
|
||||||
path: "query",
|
|
||||||
req,
|
|
||||||
ref: { obj: null, key: "" }
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
return res.status(400).json({ code: 50035, message: "Invalid Query", success: false, errors: error });
|
|
||||||
}
|
|
||||||
|
|
||||||
const { limit, after } = (<unknown>req.query) as { limit?: number; after?: string };
|
|
||||||
const query = after ? { id: MoreThan(after) } : {};
|
const query = after ? { id: MoreThan(after) } : {};
|
||||||
|
|
||||||
|
await Member.IsInGuildOrFail(req.user_id, guild_id);
|
||||||
|
|
||||||
const members = await Member.find({
|
const members = await Member.find({
|
||||||
where: { guild_id, ...query },
|
where: { guild_id, ...query },
|
||||||
select: PublicMemberProjection,
|
select: PublicMemberProjection,
|
||||||
take: limit || 1,
|
take: limit,
|
||||||
order: { id: "ASC" }
|
order: { id: "ASC" }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -11,8 +11,7 @@ import {
|
|||||||
DiscordApiErrors
|
DiscordApiErrors
|
||||||
} from "@fosscord/util";
|
} from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { check, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { In } from "typeorm";
|
|
||||||
|
|
||||||
const router: Router = Router();
|
const router: Router = Router();
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Channel, ChannelType, getPermission, Guild, Invite, trimSpecial } from "@fosscord/util";
|
import { Channel, ChannelType, getPermission, Guild, Invite, trimSpecial } from "@fosscord/util";
|
||||||
import { Router, Request, Response } from "express";
|
import { Router, Request, Response } from "express";
|
||||||
import { check, Length, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Channel, ChannelType, DiscordApiErrors, emitEvent, getPermission, VoiceState, VoiceStateUpdateEvent } from "@fosscord/util";
|
import { Channel, ChannelType, DiscordApiErrors, emitEvent, getPermission, VoiceState, VoiceStateUpdateEvent } from "@fosscord/util";
|
||||||
import { check, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { Request, Response, Router } from "express";
|
import { Request, Response, Router } from "express";
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { Request, Response, Router } from "express";
|
import { Request, Response, Router } from "express";
|
||||||
import { getPermission, Guild } from "@fosscord/util";
|
import { Guild } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { route } from "@fosscord/api";
|
||||||
import { check, route } from "@fosscord/api";
|
|
||||||
|
|
||||||
export interface WidgetModifySchema {
|
export interface WidgetModifySchema {
|
||||||
enabled: boolean; // whether the widget is enabled
|
enabled: boolean; // whether the widget is enabled
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { Router, Request, Response } from "express";
|
import { Router, Request, Response } from "express";
|
||||||
import { Role, Guild, Snowflake, Config, User, Member, Channel } from "@fosscord/util";
|
import { Role, Guild, Snowflake, Config, User, Member, Channel } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { route } from "@fosscord/api";
|
||||||
import { check, route } from "@fosscord/api";
|
|
||||||
import { DiscordApiErrors } from "@fosscord/util";
|
import { DiscordApiErrors } from "@fosscord/util";
|
||||||
import { ChannelModifySchema } from "../channels/#channel_id";
|
import { ChannelModifySchema } from "../channels/#channel_id";
|
||||||
|
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
import { Request, Response, Router } from "express";
|
import { Request, Response, Router } from "express";
|
||||||
const router: Router = Router();
|
const router: Router = Router();
|
||||||
import { Template, Guild, Role, Snowflake, Config, User, Member } from "@fosscord/util";
|
import { Template, Guild, Role, Snowflake, Config, User, Member } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { route } from "@fosscord/api";
|
||||||
import { check, route } from "@fosscord/api";
|
|
||||||
import { DiscordApiErrors } from "@fosscord/util";
|
import { DiscordApiErrors } from "@fosscord/util";
|
||||||
|
|
||||||
export interface GuildTemplateCreateSchema {
|
export interface GuildTemplateCreateSchema {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Router, Request, Response } from "express";
|
import { Router, Request, Response } from "express";
|
||||||
import { User, PrivateUserProjection } from "@fosscord/util";
|
import { User, PrivateUserProjection } from "@fosscord/util";
|
||||||
import { check, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { handleFile } from "@fosscord/api";
|
import { handleFile } from "@fosscord/api";
|
||||||
|
|
||||||
const router: Router = Router();
|
const router: Router = Router();
|
||||||
|
25
api/src/util/FieldError.ts
Normal file
25
api/src/util/FieldError.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import "missing-native-js-functions";
|
||||||
|
|
||||||
|
export function FieldErrors(fields: Record<string, { code?: string; message: string }>) {
|
||||||
|
return new FieldError(
|
||||||
|
50035,
|
||||||
|
"Invalid Form Body",
|
||||||
|
fields.map(({ message, code }) => ({
|
||||||
|
_errors: [
|
||||||
|
{
|
||||||
|
message,
|
||||||
|
code: code || "BASE_TYPE_INVALID"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: implement Image data type: Data URI scheme that supports JPG, GIF, and PNG formats. An example Data URI format is: data:image/jpeg;base64,BASE64_ENCODED_JPEG_IMAGE_DATA
|
||||||
|
// Ensure you use the proper content type (image/jpeg, image/png, image/gif) that matches the image data being provided.
|
||||||
|
|
||||||
|
export class FieldError extends Error {
|
||||||
|
constructor(public code: string | number, public message: string, public errors?: any) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -1,14 +1,16 @@
|
|||||||
import { Request } from "express";
|
import { Request } from "express";
|
||||||
import { ntob } from "./Base64";
|
import { ntob } from "./Base64";
|
||||||
import { FieldErrors } from "./instanceOf";
|
import { FieldErrors } from "./FieldError";
|
||||||
|
export const EMAIL_REGEX =
|
||||||
|
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||||
|
|
||||||
export function checkLength(str: string, min: number, max: number, key: string, req: Request) {
|
export function checkLength(str: string, min: number, max: number, key: string, req: Request) {
|
||||||
if (str.length < min || str.length > max) {
|
if (str.length < min || str.length > max) {
|
||||||
throw FieldErrors({
|
throw FieldErrors({
|
||||||
[key]: {
|
[key]: {
|
||||||
code: "BASE_TYPE_BAD_LENGTH",
|
code: "BASE_TYPE_BAD_LENGTH",
|
||||||
message: req.t("common:field.BASE_TYPE_BAD_LENGTH", { length: `${min} - ${max}` }),
|
message: req.t("common:field.BASE_TYPE_BAD_LENGTH", { length: `${min} - ${max}` })
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
export * from "./Base64";
|
export * from "./Base64";
|
||||||
export * from "./cdn";
|
export * from "./cdn";
|
||||||
export * from "./instanceOf";
|
export * from "./FieldError";
|
||||||
export * from "./ipAddress";
|
export * from "./ipAddress";
|
||||||
export * from "./Message";
|
export * from "./Message";
|
||||||
export * from "./passwordStrength";
|
export * from "./passwordStrength";
|
||||||
|
@ -1,214 +0,0 @@
|
|||||||
// different version of lambert-server instanceOf with discord error format
|
|
||||||
|
|
||||||
import { NextFunction, Request, Response } from "express";
|
|
||||||
import { Tuple } from "lambert-server";
|
|
||||||
import "missing-native-js-functions";
|
|
||||||
|
|
||||||
export const OPTIONAL_PREFIX = "$";
|
|
||||||
export const EMAIL_REGEX =
|
|
||||||
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
||||||
|
|
||||||
export function check(schema: any) {
|
|
||||||
return (req: Request, res: Response, next: NextFunction) => {
|
|
||||||
try {
|
|
||||||
const result = instanceOf(schema, req.body, { path: "body", req, ref: { obj: null, key: "" } });
|
|
||||||
if (result === true) return next();
|
|
||||||
throw result;
|
|
||||||
} catch (error) {
|
|
||||||
return res.status(400).json({ code: 50035, message: "Invalid Form Body", success: false, errors: error });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export function FieldErrors(fields: Record<string, { code?: string; message: string }>) {
|
|
||||||
return new FieldError(
|
|
||||||
50035,
|
|
||||||
"Invalid Form Body",
|
|
||||||
fields.map(({ message, code }) => ({
|
|
||||||
_errors: [
|
|
||||||
{
|
|
||||||
message,
|
|
||||||
code: code || "BASE_TYPE_INVALID"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: implement Image data type: Data URI scheme that supports JPG, GIF, and PNG formats. An example Data URI format is: data:image/jpeg;base64,BASE64_ENCODED_JPEG_IMAGE_DATA
|
|
||||||
// Ensure you use the proper content type (image/jpeg, image/png, image/gif) that matches the image data being provided.
|
|
||||||
|
|
||||||
export class FieldError extends Error {
|
|
||||||
constructor(public code: string | number, public message: string, public errors?: any) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class Email {
|
|
||||||
constructor(public email: string) {}
|
|
||||||
check() {
|
|
||||||
return !!this.email.match(EMAIL_REGEX);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class Length {
|
|
||||||
constructor(public type: any, public min: number, public max: number) {}
|
|
||||||
|
|
||||||
check(value: string) {
|
|
||||||
if (typeof value === "string" || Array.isArray(value)) return value.length >= this.min && value.length <= this.max;
|
|
||||||
if (typeof value === "number" || typeof value === "bigint") return value >= this.min && value <= this.max;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function instanceOf(
|
|
||||||
type: any,
|
|
||||||
value: any,
|
|
||||||
{
|
|
||||||
path = "",
|
|
||||||
optional = false,
|
|
||||||
errors = {},
|
|
||||||
req,
|
|
||||||
ref
|
|
||||||
}: { path?: string; optional?: boolean; errors?: any; req: Request; ref?: { key: string | number; obj: any } }
|
|
||||||
): Boolean {
|
|
||||||
if (!ref) ref = { obj: null, key: "" };
|
|
||||||
if (!path) path = "body";
|
|
||||||
if (!type) return true; // no type was specified
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (value == null) {
|
|
||||||
if (optional) return true;
|
|
||||||
throw new FieldError("BASE_TYPE_REQUIRED", req.t("common:field.BASE_TYPE_REQUIRED"));
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case String:
|
|
||||||
value = `${value}`;
|
|
||||||
ref.obj[ref.key] = value;
|
|
||||||
if (typeof value === "string") return true;
|
|
||||||
throw new FieldError("BASE_TYPE_STRING", req.t("common:field.BASE_TYPE_STRING"));
|
|
||||||
case Number:
|
|
||||||
value = Number(value);
|
|
||||||
ref.obj[ref.key] = value;
|
|
||||||
if (typeof value === "number" && !isNaN(value)) return true;
|
|
||||||
throw new FieldError("BASE_TYPE_NUMBER", req.t("common:field.BASE_TYPE_NUMBER"));
|
|
||||||
case BigInt:
|
|
||||||
try {
|
|
||||||
value = BigInt(value);
|
|
||||||
ref.obj[ref.key] = value;
|
|
||||||
if (typeof value === "bigint") return true;
|
|
||||||
} catch (error) {}
|
|
||||||
throw new FieldError("BASE_TYPE_BIGINT", req.t("common:field.BASE_TYPE_BIGINT"));
|
|
||||||
case Boolean:
|
|
||||||
if (value == "true") value = true;
|
|
||||||
if (value == "false") value = false;
|
|
||||||
ref.obj[ref.key] = value;
|
|
||||||
if (typeof value === "boolean") return true;
|
|
||||||
throw new FieldError("BASE_TYPE_BOOLEAN", req.t("common:field.BASE_TYPE_BOOLEAN"));
|
|
||||||
|
|
||||||
case Email:
|
|
||||||
if (new Email(value).check()) return true;
|
|
||||||
throw new FieldError("EMAIL_TYPE_INVALID_EMAIL", req.t("common:field.EMAIL_TYPE_INVALID_EMAIL"));
|
|
||||||
case Date:
|
|
||||||
value = new Date(value);
|
|
||||||
ref.obj[ref.key] = value;
|
|
||||||
// value.getTime() can be < 0, if it is before 1970
|
|
||||||
if (!isNaN(value)) return true;
|
|
||||||
throw new FieldError("DATE_TYPE_PARSE", req.t("common:field.DATE_TYPE_PARSE"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof type === "object") {
|
|
||||||
if (Array.isArray(type)) {
|
|
||||||
if (!Array.isArray(value)) throw new FieldError("BASE_TYPE_ARRAY", req.t("common:field.BASE_TYPE_ARRAY"));
|
|
||||||
if (!type.length) return true; // type array didn't specify any type
|
|
||||||
|
|
||||||
return (
|
|
||||||
value.every((val, i) => {
|
|
||||||
errors[i] = {};
|
|
||||||
|
|
||||||
if (
|
|
||||||
instanceOf(type[0], val, {
|
|
||||||
path: `${path}[${i}]`,
|
|
||||||
optional,
|
|
||||||
errors: errors[i],
|
|
||||||
req,
|
|
||||||
ref: { key: i, obj: value }
|
|
||||||
}) === true
|
|
||||||
) {
|
|
||||||
delete errors[i];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}) || errors
|
|
||||||
);
|
|
||||||
} else if (type?.constructor?.name != "Object") {
|
|
||||||
if (type instanceof Tuple) {
|
|
||||||
if ((<Tuple>type).types.some((x) => instanceOf(x, value, { path, optional, errors, req, ref }))) return true;
|
|
||||||
throw new FieldError("BASE_TYPE_CHOICES", req.t("common:field.BASE_TYPE_CHOICES", { types: type.types }));
|
|
||||||
} else if (type instanceof Length) {
|
|
||||||
let length = <Length>type;
|
|
||||||
if (instanceOf(length.type, value, { path, optional, req, ref, errors }) !== true) return errors;
|
|
||||||
let val = ref.obj[ref.key];
|
|
||||||
if ((<Length>type).check(val)) return true;
|
|
||||||
throw new FieldError(
|
|
||||||
"BASE_TYPE_BAD_LENGTH",
|
|
||||||
req.t("common:field.BASE_TYPE_BAD_LENGTH", {
|
|
||||||
length: `${type.min} - ${type.max}`
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (value instanceof type) return true;
|
|
||||||
} catch (error) {
|
|
||||||
throw new FieldError("BASE_TYPE_CLASS", req.t("common:field.BASE_TYPE_CLASS", { type }));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof value !== "object") throw new FieldError("BASE_TYPE_OBJECT", req.t("common:field.BASE_TYPE_OBJECT"));
|
|
||||||
|
|
||||||
const diff = Object.keys(value).missing(
|
|
||||||
Object.keys(type).map((x) => (x.startsWith(OPTIONAL_PREFIX) ? x.slice(OPTIONAL_PREFIX.length) : x))
|
|
||||||
);
|
|
||||||
|
|
||||||
if (diff.length) throw new FieldError("UNKOWN_FIELD", req.t("common:field.UNKOWN_FIELD", { key: diff }));
|
|
||||||
|
|
||||||
return (
|
|
||||||
Object.keys(type).every((key) => {
|
|
||||||
let newKey = key;
|
|
||||||
const OPTIONAL = key.startsWith(OPTIONAL_PREFIX);
|
|
||||||
if (OPTIONAL) newKey = newKey.slice(OPTIONAL_PREFIX.length);
|
|
||||||
errors[newKey] = {};
|
|
||||||
|
|
||||||
if (
|
|
||||||
instanceOf(type[key], value[newKey], {
|
|
||||||
path: `${path}.${newKey}`,
|
|
||||||
optional: OPTIONAL,
|
|
||||||
errors: errors[newKey],
|
|
||||||
req,
|
|
||||||
ref: { key: newKey, obj: value }
|
|
||||||
}) === true
|
|
||||||
) {
|
|
||||||
delete errors[newKey];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}) || errors
|
|
||||||
);
|
|
||||||
} else if (typeof type === "number" || typeof type === "string" || typeof type === "boolean") {
|
|
||||||
if (value === type) return true;
|
|
||||||
throw new FieldError("BASE_TYPE_CONSTANT", req.t("common:field.BASE_TYPE_CONSTANT", { value: type }));
|
|
||||||
} else if (typeof type === "bigint") {
|
|
||||||
if (BigInt(value) === type) return true;
|
|
||||||
throw new FieldError("BASE_TYPE_CONSTANT", req.t("common:field.BASE_TYPE_CONSTANT", { value: type }));
|
|
||||||
}
|
|
||||||
|
|
||||||
return type == value;
|
|
||||||
} catch (error) {
|
|
||||||
let e = error as FieldError;
|
|
||||||
errors._errors = [{ message: e.message, code: e.code }];
|
|
||||||
return errors;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user