mirror of
https://github.com/spacebarchat/server.git
synced 2026-03-30 22:35:40 +00:00
Try to enforce channel limts?
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -17,7 +17,19 @@
|
||||
*/
|
||||
|
||||
import { route } from "@spacebar/api";
|
||||
import { Channel, ChannelDeleteEvent, ChannelUpdateEvent, Recipient, emitEvent, handleFile } from "@spacebar/util";
|
||||
import {
|
||||
Channel,
|
||||
ChannelDeleteEvent,
|
||||
ChannelUpdateEvent,
|
||||
Recipient,
|
||||
emitEvent,
|
||||
handleFile,
|
||||
Config,
|
||||
FieldError,
|
||||
ErrorList,
|
||||
ObjectErrorContent,
|
||||
makeObjectErrorContent,
|
||||
} from "@spacebar/util";
|
||||
import { Request, Response, Router } from "express";
|
||||
import { ChannelModifySchema, ChannelType } from "@spacebar/schemas";
|
||||
|
||||
@@ -174,6 +186,7 @@ router.patch(
|
||||
channel.available_tags = channel.available_tags.filter((_) => filter.has(_.id));
|
||||
}
|
||||
}
|
||||
|
||||
if (payload.applied_tags) {
|
||||
if (channel.isThread()) {
|
||||
const parent = await Channel.findOneOrFail({
|
||||
@@ -201,6 +214,19 @@ router.patch(
|
||||
|
||||
if (payload.icon) payload.icon = await handleFile(`/channel-icons/${channel_id}`, payload.icon);
|
||||
|
||||
const channelLimits = Config.get().limits.channel;
|
||||
|
||||
const errors: ErrorList = {};
|
||||
if (payload.name && (payload.name.length < 1 || payload.name.length > channelLimits.maxName))
|
||||
errors["name"] = makeObjectErrorContent("BASE_TYPE_BAD_LENGTH", `Channel name must be between 1 and ${channelLimits.maxName} characters`);
|
||||
if (payload.topic !== undefined && payload.topic.length > channelLimits.maxTopic)
|
||||
errors["topic"] = makeObjectErrorContent("BASE_TYPE_BAD_LENGTH", `Channel topic must be less than ${channelLimits.maxTopic} characters`);
|
||||
if (payload.user_limit !== undefined && payload.user_limit < 0) errors["user_limit"] = makeObjectErrorContent("BASE_TYPE_BAD_VALUE", "User limit must be 0 or higher");
|
||||
|
||||
if (Object.keys(errors).length) {
|
||||
throw new FieldError(400, "Invalid form body", errors);
|
||||
}
|
||||
|
||||
channel.assign(payload);
|
||||
if (channel.thread_metadata) {
|
||||
if (payload.archived !== undefined) {
|
||||
|
||||
@@ -19,9 +19,6 @@
|
||||
import { ChannelPermissionOverwriteType, ChannelType, TagCreateSchema } from "@spacebar/schemas";
|
||||
|
||||
export interface ChannelModifySchema {
|
||||
/**
|
||||
* @maxLength 100
|
||||
*/
|
||||
name?: string;
|
||||
type?: ChannelType;
|
||||
topic?: string;
|
||||
|
||||
@@ -20,4 +20,5 @@ export class ChannelLimits {
|
||||
maxPins: number = 500;
|
||||
maxTopic: number = 1024;
|
||||
maxWebhooks: number = 100;
|
||||
maxName: number = 32;
|
||||
}
|
||||
|
||||
@@ -28,6 +28,10 @@ export type ErrorList = Record<string, ObjectErrorContent>;
|
||||
export type ErrorContent = { code: string; message: string };
|
||||
export type ObjectErrorContent = { _errors: ErrorContent[] };
|
||||
|
||||
export function makeObjectErrorContent(code: string, message: string): ObjectErrorContent {
|
||||
return { _errors: [{ code, message }] };
|
||||
}
|
||||
|
||||
export function FieldErrors(fields: Record<string, { code?: string; message: string }>, errors?: ErrorObject[]) {
|
||||
const errorObj: ErrorList = {};
|
||||
for (const [key, { message, code }] of Object.entries(fields)) {
|
||||
|
||||
Reference in New Issue
Block a user