diff --git a/api/src/schema/Ban.ts b/api/src/schema/Ban.ts
new file mode 100644
index 00000000..947a60ea
--- /dev/null
+++ b/api/src/schema/Ban.ts
@@ -0,0 +1,9 @@
+export const BanCreateSchema = {
+ $delete_message_days: String,
+ $reason: String,
+};
+
+export interface BanCreateSchema {
+ delete_message_days?: string;
+ reason?: string;
+}
diff --git a/api/src/schema/Channel.ts b/api/src/schema/Channel.ts
new file mode 100644
index 00000000..48c3a1d2
--- /dev/null
+++ b/api/src/schema/Channel.ts
@@ -0,0 +1,62 @@
+import { ChannelType } from "@fosscord/server-util";
+import { Length } from "../util/instanceOf";
+
+export const ChannelModifySchema = {
+ name: new Length(String, 2, 100),
+ type: new Length(Number, 0, 13),
+ $topic: new Length(String, 0, 1024),
+ $bitrate: Number,
+ $user_limit: Number,
+ $rate_limit_per_user: new Length(Number, 0, 21600),
+ $position: Number,
+ $permission_overwrites: [
+ {
+ id: String,
+ type: new Length(Number, 0, 1), // either 0 (role) or 1 (member)
+ allow: BigInt,
+ deny: BigInt
+ }
+ ],
+ $parent_id: String,
+ $nsfw: Boolean
+};
+
+export const DmChannelCreateSchema = {
+ $name: String,
+ recipients: new Length([String], 1, 10)
+};
+
+export interface DmChannelCreateSchema {
+ name?: string;
+ recipients: string[];
+}
+
+export interface ChannelModifySchema {
+ name: string;
+ type: number;
+ topic?: string;
+ bitrate?: number;
+ user_limit?: number;
+ rate_limit_per_user?: number;
+ position?: number;
+ permission_overwrites?: {
+ id: string;
+ type: number;
+ allow: bigint;
+ deny: bigint;
+ }[];
+ parent_id?: string;
+ nsfw?: boolean;
+}
+
+export const ChannelGuildPositionUpdateSchema = [
+ {
+ id: String,
+ $position: Number
+ }
+];
+
+export type ChannelGuildPositionUpdateSchema = {
+ id: string;
+ position?: number;
+}[];
diff --git a/api/src/schema/Guild.ts b/api/src/schema/Guild.ts
new file mode 100644
index 00000000..0443e64c
--- /dev/null
+++ b/api/src/schema/Guild.ts
@@ -0,0 +1,131 @@
+import { ChannelSchema, GuildChannel } from "@fosscord/server-util";
+import { Length } from "../util/instanceOf";
+
+export const GuildCreateSchema = {
+ name: new Length(String, 2, 100),
+ $region: String, // auto complete voice region of the user
+ $icon: String,
+ $channels: [Object],
+ $guild_template_code: String,
+ $system_channel_id: String,
+ $rules_channel_id: String
+};
+
+export interface GuildCreateSchema {
+ name: string;
+ region?: string;
+ icon?: string;
+ channels?: GuildChannel[];
+ guild_template_code?: string;
+ system_channel_id?: string;
+ rules_channel_id?: string;
+}
+
+export const GuildUpdateSchema = {
+ ...GuildCreateSchema,
+ name: undefined,
+ $name: new Length(String, 2, 100),
+ $banner: String,
+ $splash: String,
+ $description: String,
+ $features: [String],
+ $icon: String,
+ $verification_level: Number,
+ $default_message_notifications: Number,
+ $system_channel_flags: Number,
+ $system_channel_id: String,
+ $explicit_content_filter: Number,
+ $public_updates_channel_id: String,
+ $afk_timeout: Number,
+ $afk_channel_id: String,
+ $preferred_locale: String
+};
+// @ts-ignore
+delete GuildUpdateSchema.$channels;
+
+export interface GuildUpdateSchema extends Omit<GuildCreateSchema, "channels"> {
+ banner?: string;
+ splash?: string;
+ description?: string;
+ features?: [string];
+ verification_level?: number;
+ default_message_notifications?: number;
+ system_channel_flags?: number;
+ explicit_content_filter?: number;
+ public_updates_channel_id?: string;
+ afk_timeout?: number;
+ afk_channel_id?: string;
+ preferred_locale?: string;
+}
+
+export const GuildGetSchema = {
+ id: true,
+ name: true,
+ icon: true,
+ splash: true,
+ discovery_splash: true,
+ owner: true,
+ owner_id: true,
+ permissions: true,
+ region: true,
+ afk_channel_id: true,
+ afk_timeout: true,
+ widget_enabled: true,
+ widget_channel_id: true,
+ verification_level: true,
+ default_message_notifications: true,
+ explicit_content_filter: true,
+ roles: true,
+ emojis: true,
+ features: true,
+ mfa_level: true,
+ application_id: true,
+ system_channel_id: true,
+ system_channel_flags: true,
+ rules_channel_id: true,
+ joined_at: true,
+ // large: true,
+ // unavailable: true,
+ member_count: true,
+ // voice_states: true,
+ // members: true,
+ // channels: true,
+ // presences: true,
+ max_presences: true,
+ max_members: true,
+ vanity_url_code: true,
+ description: true,
+ banner: true,
+ premium_tier: true,
+ premium_subscription_count: true,
+ preferred_locale: true,
+ public_updates_channel_id: true,
+ max_video_channel_users: true,
+ approximate_member_count: true,
+ approximate_presence_count: true
+ // welcome_screen: true,
+};
+
+export const GuildTemplateCreateSchema = {
+ name: String,
+ $avatar: String
+};
+
+export interface GuildTemplateCreateSchema {
+ name: string;
+ avatar?: string;
+}
+
+export const GuildAddChannelToWelcomeScreenSchema = {
+ channel_id: String,
+ description: String,
+ $emoji_id: String,
+ emoji_name: String
+};
+
+export interface GuildAddChannelToWelcomeScreenSchema {
+ channel_id: string;
+ description: string;
+ emoji_id?: string;
+ emoji_name: string;
+}
diff --git a/api/src/schema/Invite.ts b/api/src/schema/Invite.ts
new file mode 100644
index 00000000..a22449ba
--- /dev/null
+++ b/api/src/schema/Invite.ts
@@ -0,0 +1,22 @@
+export const InviteCreateSchema = {
+ $target_user_id: String,
+ $target_type: String,
+ $validate: String, //? wtf is this
+ $max_age: Number,
+ $max_uses: Number,
+ $temporary: Boolean,
+ $unique: Boolean,
+ $target_user: String,
+ $target_user_type: Number
+};
+export interface InviteCreateSchema {
+ target_user_id?: String;
+ target_type?: String;
+ validate?: String; //? wtf is this
+ max_age?: Number;
+ max_uses?: Number;
+ temporary?: Boolean;
+ unique?: Boolean;
+ target_user?: String;
+ target_user_type?: Number;
+}
diff --git a/api/src/schema/Member.ts b/api/src/schema/Member.ts
new file mode 100644
index 00000000..607d0a06
--- /dev/null
+++ b/api/src/schema/Member.ts
@@ -0,0 +1,29 @@
+export const MemberCreateSchema = {
+ id: String,
+ nick: String,
+ guild_id: String,
+ joined_at: Date
+};
+
+export interface MemberCreateSchema {
+ id: string;
+ nick: string;
+ guild_id: string;
+ joined_at: Date;
+}
+
+export const MemberNickChangeSchema = {
+ nick: String
+};
+
+export interface MemberNickChangeSchema {
+ nick: string;
+}
+
+export const MemberChangeSchema = {
+ $roles: [String]
+};
+
+export interface MemberChangeSchema {
+ roles?: string[];
+}
diff --git a/api/src/schema/Message.ts b/api/src/schema/Message.ts
new file mode 100644
index 00000000..8423d706
--- /dev/null
+++ b/api/src/schema/Message.ts
@@ -0,0 +1,82 @@
+import { Embed, EmbedImage } from "@fosscord/server-util";
+import { Length } from "../util/instanceOf";
+
+export const MessageCreateSchema = {
+ $content: new Length(String, 0, 2000),
+ $nonce: String,
+ $tts: Boolean,
+ $flags: BigInt,
+ $embed: {
+ $title: new Length(String, 0, 256), //title of embed
+ $type: String, // type of embed (always "rich" for webhook embeds)
+ $description: new Length(String, 0, 2048), // description of embed
+ $url: String, // url of embed
+ $timestamp: String, // ISO8601 timestamp
+ $color: Number, // color code of the embed
+ $footer: {
+ text: new Length(String, 0, 2048),
+ icon_url: String,
+ proxy_icon_url: String
+ }, // footer object footer information
+ $image: EmbedImage, // image object image information
+ $thumbnail: EmbedImage, // thumbnail object thumbnail information
+ $video: EmbedImage, // video object video information
+ $provider: {
+ name: String,
+ url: String
+ }, // provider object provider information
+ $author: {
+ name: new Length(String, 0, 256),
+ url: String,
+ icon_url: String,
+ proxy_icon_url: String
+ }, // author object author information
+ $fields: new Length(
+ [
+ {
+ name: new Length(String, 0, 256),
+ value: new Length(String, 0, 1024),
+ $inline: Boolean
+ }
+ ],
+ 0,
+ 25
+ )
+ },
+ $allowed_mentions: {
+ $parse: [String],
+ $roles: [String],
+ $users: [String],
+ $replied_user: Boolean
+ },
+ $message_reference: {
+ message_id: String,
+ channel_id: String,
+ $guild_id: String,
+ $fail_if_not_exists: Boolean
+ },
+ $payload_json: String,
+ $file: Object
+};
+
+export interface MessageCreateSchema {
+ content?: string;
+ nonce?: string;
+ tts?: boolean;
+ flags?: bigint;
+ embed?: Embed & { timestamp?: string };
+ allowed_mentions?: {
+ parse?: string[];
+ roles?: string[];
+ users?: string[];
+ replied_user?: boolean;
+ };
+ message_reference?: {
+ message_id: string;
+ channel_id: string;
+ guild_id?: string;
+ fail_if_not_exists: boolean;
+ };
+ payload_json?: string;
+ file?: any;
+}
diff --git a/api/src/schema/Roles.ts b/api/src/schema/Roles.ts
new file mode 100644
index 00000000..f662e61b
--- /dev/null
+++ b/api/src/schema/Roles.ts
@@ -0,0 +1,17 @@
+export const RoleModifySchema = {
+ $name: String,
+ $permissions: BigInt,
+ $color: Number,
+ $hoist: Boolean, // whether the role should be displayed separately in the sidebar
+ $mentionable: Boolean, // whether the role should be mentionable
+ $position: Number
+};
+
+export interface RoleModifySchema {
+ name?: string;
+ permissions?: BigInt;
+ color?: number;
+ hoist?: boolean; // whether the role should be displayed separately in the sidebar
+ mentionable?: boolean; // whether the role should be mentionable
+ position?: number;
+}
diff --git a/api/src/schema/Template.ts b/api/src/schema/Template.ts
new file mode 100644
index 00000000..88e36c53
--- /dev/null
+++ b/api/src/schema/Template.ts
@@ -0,0 +1,19 @@
+export const TemplateCreateSchema = {
+ name: String,
+ $description: String,
+};
+
+export interface TemplateCreateSchema {
+ name: string;
+ description?: string;
+}
+
+export const TemplateModifySchema = {
+ name: String,
+ $description: String,
+};
+
+export interface TemplateModifySchema {
+ name: string;
+ description?: string;
+}
diff --git a/api/src/schema/User.ts b/api/src/schema/User.ts
new file mode 100644
index 00000000..c7478f8d
--- /dev/null
+++ b/api/src/schema/User.ts
@@ -0,0 +1,23 @@
+import { Length } from "../util/instanceOf";
+
+export const UserModifySchema = {
+ $username: new Length(String, 2, 32),
+ $avatar: String,
+ $bio: new Length(String, 0, 190),
+ $accent_color: Number,
+ $banner: String,
+ $password: String,
+ $new_password: String,
+ $code: String // 2fa code
+};
+
+export interface UserModifySchema {
+ username?: string;
+ avatar?: string | null;
+ bio?: string;
+ accent_color?: number | null;
+ banner?: string | null;
+ password?: string;
+ new_password?: string;
+ code?: string;
+}
diff --git a/api/src/schema/Widget.ts b/api/src/schema/Widget.ts
new file mode 100644
index 00000000..d37a38de
--- /dev/null
+++ b/api/src/schema/Widget.ts
@@ -0,0 +1,10 @@
+// https://discord.com/developers/docs/resources/guild#guild-widget-object
+export const WidgetModifySchema = {
+ enabled: Boolean, // whether the widget is enabled
+ channel_id: String // the widget channel id
+};
+
+export interface WidgetModifySchema {
+ enabled: boolean; // whether the widget is enabled
+ channel_id: string; // the widget channel id
+}
|