diff --git a/api/assets/openapi.json b/api/assets/openapi.json
index a49e4165..5244da36 100644
--- a/api/assets/openapi.json
+++ b/api/assets/openapi.json
@@ -25,46 +25,26 @@
"operationId": "",
"responses": {
"200": {
- "description": "user found",
+ "description": "User found",
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPublic" } } }
},
- "401": {
- "description": "Unauthorized",
+ "404": {
+ "description": "User not found",
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
- },
- "429": {
- "description": "Rate limit exceeded",
- "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } },
- "headers": {
- "X-RateLimit-Bucket": {
- "description": "A unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path)",
- "schema": { "type": "string" }
- },
- "X-Rate-Limit-Limit": {
- "description": "The number of allowed requests in the current period",
- "schema": { "type": "integer" }
- },
- "X-Rate-Limit-Remaining": {
- "description": "The number of remaining requests in the current period",
- "schema": { "type": "integer" }
- },
- "X-Rate-Limit-Reset": {
- "description": "Date when current period is over in seconds since the Unix epoch",
- "schema": { "type": "integer" }
- },
- "X-Rate-Limit-Reset-After": {
- "description": "Number of seconds when current period will reset (can have decimal)",
- "schema": { "type": "number" }
- },
- "Retry-After": {
- "description": "Same as X-Rate-Limit-Reset-After but an integer",
- "schema": { "type": "integer" }
- },
- "X-RateLimit-Global": {
- "description": "Indicates whether or not all requests from your ip are rate limited",
- "schema": { "type": "boolean" }
- }
- }
+ }
+ }
+ }
+ },
+ "/users/@me": {
+ "get": {
+ "summary": "",
+ "description": "",
+ "parameters": [],
+ "operationId": "",
+ "responses": {
+ "200": {
+ "description": "Authenticated user",
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPublic" } } }
}
}
}
@@ -542,6 +522,7 @@
"Member": {
"type": "object",
"properties": {
+ "user_id": { "type": "string" },
"user": { "$ref": "#/components/schemas/User" },
"guild_id": { "type": "string" },
"guild": { "$ref": "#/components/schemas/Guild" },
@@ -555,7 +536,7 @@
"settings": { "$ref": "#/components/schemas/UserGuildSettings" },
"id": { "type": "string" }
},
- "required": ["deaf", "guild", "guild_id", "id", "joined_at", "mute", "pending", "roles", "settings", "user"]
+ "required": ["deaf", "guild", "guild_id", "id", "joined_at", "mute", "pending", "roles", "settings", "user", "user_id"]
},
"Role": {
"type": "object",
@@ -1078,545 +1059,417 @@
"bot": { "type": "boolean" }
},
"required": ["bio", "bot", "discriminator", "id", "public_flags", "username"]
- }
- },
- "requestBodies": {
- "BanCreateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": { "delete_message_days": { "type": "string" }, "reason": { "type": "string" } }
- }
- }
+ },
+ "UserPrivate": {
+ "type": "object",
+ "properties": {
+ "locale": { "type": "string" },
+ "disabled": { "type": "boolean" },
+ "username": { "type": "string" },
+ "discriminator": { "type": "string" },
+ "id": { "type": "string" },
+ "public_flags": { "type": "string" },
+ "avatar": { "type": "string" },
+ "accent_color": { "type": "integer" },
+ "banner": { "type": "string" },
+ "bio": { "type": "string" },
+ "bot": { "type": "boolean" },
+ "flags": { "type": "string" },
+ "mfa_enabled": { "type": "boolean" },
+ "email": { "type": "string" },
+ "phone": { "type": "string" },
+ "verified": { "type": "boolean" },
+ "nsfw_allowed": { "type": "boolean" },
+ "premium": { "type": "boolean" },
+ "premium_type": { "type": "integer" }
},
- "description": ""
+ "required": [
+ "bio",
+ "bot",
+ "disabled",
+ "discriminator",
+ "flags",
+ "id",
+ "locale",
+ "mfa_enabled",
+ "nsfw_allowed",
+ "premium",
+ "premium_type",
+ "public_flags",
+ "username",
+ "verified"
+ ]
+ },
+ "BanCreateSchema": {
+ "type": "object",
+ "properties": { "delete_message_days": { "type": "string" }, "reason": { "type": "string" } }
},
"DmChannelCreateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": { "type": "string" },
- "recipients": { "type": "array", "items": { "type": "string" } }
- },
- "required": ["recipients"]
- }
- }
- },
- "description": ""
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "recipients": { "type": "array", "items": { "type": "string" } } },
+ "required": ["recipients"]
},
"ChannelModifySchema": {
- "content": {
- "application/json": {
- "schema": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "type": { "type": "integer" },
+ "topic": { "type": "string" },
+ "bitrate": { "type": "integer" },
+ "user_limit": { "type": "integer" },
+ "rate_limit_per_user": { "type": "integer" },
+ "position": { "type": "integer" },
+ "permission_overwrites": {
+ "type": "array",
+ "items": {
"type": "object",
"properties": {
- "name": { "type": "string" },
- "type": { "type": "integer" },
- "topic": { "type": "string" },
- "bitrate": { "type": "integer" },
- "user_limit": { "type": "integer" },
- "rate_limit_per_user": { "type": "integer" },
- "position": { "type": "integer" },
- "permission_overwrites": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "id": { "type": "string" },
- "type": { "type": "integer" },
- "allow": { "type": "number" },
- "deny": { "type": "number" }
- },
- "additionalProperties": false,
- "required": ["allow", "deny", "id", "type"]
- }
- },
- "parent_id": { "type": "string" },
"id": { "type": "string" },
- "nsfw": { "type": "boolean" },
- "rtc_region": { "type": "string" },
- "default_auto_archive_duration": { "type": "integer" }
+ "type": { "type": "integer" },
+ "allow": { "type": "number" },
+ "deny": { "type": "number" }
},
- "required": ["name", "type"]
+ "additionalProperties": false,
+ "required": ["allow", "deny", "id", "type"]
}
- }
+ },
+ "parent_id": { "type": "string" },
+ "id": { "type": "string" },
+ "nsfw": { "type": "boolean" },
+ "rtc_region": { "type": "string" },
+ "default_auto_archive_duration": { "type": "integer" }
},
- "description": ""
+ "required": ["name", "type"]
},
"ChannelGuildPositionUpdateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": { "id": { "type": "string" }, "position": { "type": "integer" } },
- "additionalProperties": false,
- "required": ["id"]
- }
- }
- }
- },
- "description": ""
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": { "id": { "type": "string" }, "position": { "type": "integer" } },
+ "additionalProperties": false,
+ "required": ["id"]
+ }
},
"EmojiCreateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": { "type": "string" },
- "image": { "type": "string" },
- "roles": { "type": "array", "items": { "type": "string" } }
- },
- "required": ["image", "name"]
- }
- }
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "image": { "type": "string" },
+ "roles": { "type": "array", "items": { "type": "string" } }
},
- "description": ""
+ "required": ["image", "name"]
},
"GuildCreateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": { "type": "string" },
- "region": { "type": "string" },
- "icon": { "type": "string" },
- "channels": { "type": "array", "items": { "$ref": "#/components/requestBodies/ChannelModifySchema" } },
- "guild_template_code": { "type": "string" },
- "system_channel_id": { "type": "string" },
- "rules_channel_id": { "type": "string" }
- },
- "required": ["name"]
- }
- }
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "region": { "type": "string" },
+ "icon": { "type": "string" },
+ "channels": { "type": "array", "items": { "$ref": "#/components/requestBodies/ChannelModifySchema" } },
+ "guild_template_code": { "type": "string" },
+ "system_channel_id": { "type": "string" },
+ "rules_channel_id": { "type": "string" }
},
- "description": ""
+ "required": ["name"]
},
"GuildUpdateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "banner": { "type": "string" },
- "splash": { "type": "string" },
- "description": { "type": "string" },
- "features": { "type": "array", "items": { "type": "string" } },
- "verification_level": { "type": "integer" },
- "default_message_notifications": { "type": "integer" },
- "system_channel_flags": { "type": "integer" },
- "explicit_content_filter": { "type": "integer" },
- "public_updates_channel_id": { "type": "string" },
- "afk_timeout": { "type": "integer" },
- "afk_channel_id": { "type": "string" },
- "preferred_locale": { "type": "string" },
- "name": { "type": "string" },
- "region": { "type": "string" },
- "icon": { "type": "string" },
- "guild_template_code": { "type": "string" },
- "system_channel_id": { "type": "string" },
- "rules_channel_id": { "type": "string" }
- },
- "required": ["name"]
- }
- }
+ "type": "object",
+ "properties": {
+ "banner": { "type": "string" },
+ "splash": { "type": "string" },
+ "description": { "type": "string" },
+ "features": { "type": "array", "items": { "type": "string" } },
+ "verification_level": { "type": "integer" },
+ "default_message_notifications": { "type": "integer" },
+ "system_channel_flags": { "type": "integer" },
+ "explicit_content_filter": { "type": "integer" },
+ "public_updates_channel_id": { "type": "string" },
+ "afk_timeout": { "type": "integer" },
+ "afk_channel_id": { "type": "string" },
+ "preferred_locale": { "type": "string" },
+ "name": { "type": "string" },
+ "region": { "type": "string" },
+ "icon": { "type": "string" },
+ "guild_template_code": { "type": "string" },
+ "system_channel_id": { "type": "string" },
+ "rules_channel_id": { "type": "string" }
},
- "description": ""
+ "required": ["name"]
},
"GuildTemplateCreateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": { "name": { "type": "string" }, "avatar": { "type": "string" } },
- "required": ["name"]
- }
- }
- },
- "description": ""
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "avatar": { "type": "string" } },
+ "required": ["name"]
},
"GuildUpdateWelcomeScreenSchema": {
- "content": {
- "application/json": {
- "schema": {
+ "type": "object",
+ "properties": {
+ "welcome_channels": {
+ "type": "array",
+ "items": {
"type": "object",
"properties": {
- "welcome_channels": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "channel_id": { "type": "string" },
- "description": { "type": "string" },
- "emoji_id": { "type": "string" },
- "emoji_name": { "type": "string" }
- },
- "additionalProperties": false,
- "required": ["channel_id", "description", "emoji_name"]
- }
- },
- "enabled": { "type": "boolean" },
- "description": { "type": "string" }
- }
+ "channel_id": { "type": "string" },
+ "description": { "type": "string" },
+ "emoji_id": { "type": "string" },
+ "emoji_name": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["channel_id", "description", "emoji_name"]
}
- }
- },
- "description": ""
+ },
+ "enabled": { "type": "boolean" },
+ "description": { "type": "string" }
+ }
},
- "Number": { "content": { "application/json": { "schema": { "type": "object" } } }, "description": "" },
- "Boolean": { "content": { "application/json": { "schema": { "type": "object" } } }, "description": "" },
"InviteCreateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "target_user_id": { "type": "string" },
- "target_type": { "type": "string" },
- "validate": { "type": "string" },
- "max_age": { "type": "integer" },
- "max_uses": { "type": "integer" },
- "temporary": { "type": "boolean" },
- "unique": { "type": "boolean" },
- "target_user": { "type": "string" },
- "target_user_type": { "type": "integer" }
- }
- }
- }
- },
- "description": ""
+ "type": "object",
+ "properties": {
+ "target_user_id": { "type": "string" },
+ "target_type": { "type": "string" },
+ "validate": { "type": "string" },
+ "max_age": { "type": "integer" },
+ "max_uses": { "type": "integer" },
+ "temporary": { "type": "boolean" },
+ "unique": { "type": "boolean" },
+ "target_user": { "type": "string" },
+ "target_user_type": { "type": "integer" }
+ }
},
"MemberCreateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "id": { "type": "string" },
- "nick": { "type": "string" },
- "guild_id": { "type": "string" },
- "joined_at": { "type": "string", "format": "date-time" }
- },
- "required": ["guild_id", "id", "joined_at", "nick"]
- }
- }
- },
- "description": ""
- },
- "MemberNickChangeSchema": {
- "content": {
- "application/json": {
- "schema": { "type": "object", "properties": { "nick": { "type": "string" } }, "required": ["nick"] }
- }
- },
- "description": ""
- },
- "MemberChangeSchema": {
- "content": {
- "application/json": {
- "schema": { "type": "object", "properties": { "roles": { "type": "array", "items": { "type": "string" } } } }
- }
- },
- "description": ""
- },
- "EmbedType": {
- "content": {
- "application/json": { "schema": { "enum": ["article", "gifv", "image", "link", "rich", "video"], "type": "string" } }
- },
- "description": ""
- },
- "EmbedImage": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "url": { "type": "string" },
- "proxy_url": { "type": "string" },
- "height": { "type": "integer" },
- "width": { "type": "integer" }
- }
- }
- }
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "nick": { "type": "string" },
+ "guild_id": { "type": "string" },
+ "joined_at": { "type": "string", "format": "date-time" }
},
- "description": ""
+ "required": ["guild_id", "id", "joined_at", "nick"]
},
+ "MemberNickChangeSchema": { "type": "object", "properties": { "nick": { "type": "string" } }, "required": ["nick"] },
+ "MemberChangeSchema": { "type": "object", "properties": { "roles": { "type": "array", "items": { "type": "string" } } } },
"MessageCreateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "content": { "type": "string" },
- "nonce": { "type": "string" },
- "tts": { "type": "boolean" },
- "flags": { "type": "string" },
- "embed": {
- "additionalProperties": false,
- "type": "object",
- "properties": {
- "title": { "type": "string" },
- "type": { "$ref": "#/components/requestBodies/EmbedType" },
- "description": { "type": "string" },
- "url": { "type": "string" },
- "timestamp": { "type": "string" },
- "color": { "type": "integer" },
- "footer": {
- "type": "object",
- "properties": {
- "text": { "type": "string" },
- "icon_url": { "type": "string" },
- "proxy_icon_url": { "type": "string" }
- },
- "additionalProperties": false,
- "required": ["text"]
- },
- "image": { "$ref": "#/components/requestBodies/EmbedImage" },
- "thumbnail": { "$ref": "#/components/requestBodies/EmbedImage" },
- "video": { "$ref": "#/components/requestBodies/EmbedImage" },
- "provider": {
- "type": "object",
- "properties": { "name": { "type": "string" }, "url": { "type": "string" } },
- "additionalProperties": false
- },
- "author": {
- "type": "object",
- "properties": {
- "name": { "type": "string" },
- "url": { "type": "string" },
- "icon_url": { "type": "string" },
- "proxy_icon_url": { "type": "string" }
- },
- "additionalProperties": false
- },
- "fields": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "name": { "type": "string" },
- "value": { "type": "string" },
- "inline": { "type": "boolean" }
- },
- "additionalProperties": false,
- "required": ["name", "value"]
- }
- }
- }
+ "type": "object",
+ "properties": {
+ "content": { "type": "string" },
+ "nonce": { "type": "string" },
+ "tts": { "type": "boolean" },
+ "flags": { "type": "string" },
+ "embed": {
+ "additionalProperties": false,
+ "type": "object",
+ "properties": {
+ "title": { "type": "string" },
+ "type": { "$ref": "#/components/requestBodies/EmbedType" },
+ "description": { "type": "string" },
+ "url": { "type": "string" },
+ "timestamp": { "type": "string" },
+ "color": { "type": "integer" },
+ "footer": {
+ "type": "object",
+ "properties": {
+ "text": { "type": "string" },
+ "icon_url": { "type": "string" },
+ "proxy_icon_url": { "type": "string" }
},
- "allowed_mentions": {
- "type": "object",
- "properties": {
- "parse": { "type": "array", "items": { "type": "string" } },
- "roles": { "type": "array", "items": { "type": "string" } },
- "users": { "type": "array", "items": { "type": "string" } },
- "replied_user": { "type": "boolean" }
- },
- "additionalProperties": false
+ "additionalProperties": false,
+ "required": ["text"]
+ },
+ "image": { "$ref": "#/components/requestBodies/EmbedImage" },
+ "thumbnail": { "$ref": "#/components/requestBodies/EmbedImage" },
+ "video": { "$ref": "#/components/requestBodies/EmbedImage" },
+ "provider": {
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "url": { "type": "string" } },
+ "additionalProperties": false
+ },
+ "author": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "url": { "type": "string" },
+ "icon_url": { "type": "string" },
+ "proxy_icon_url": { "type": "string" }
},
- "message_reference": {
+ "additionalProperties": false
+ },
+ "fields": {
+ "type": "array",
+ "items": {
"type": "object",
"properties": {
- "message_id": { "type": "string" },
- "channel_id": { "type": "string" },
- "guild_id": { "type": "string" },
- "fail_if_not_exists": { "type": "boolean" }
+ "name": { "type": "string" },
+ "value": { "type": "string" },
+ "inline": { "type": "boolean" }
},
"additionalProperties": false,
- "required": ["channel_id", "message_id"]
- },
- "payload_json": { "type": "string" },
- "file": {}
+ "required": ["name", "value"]
+ }
}
}
- }
- },
- "description": ""
+ },
+ "allowed_mentions": {
+ "type": "object",
+ "properties": {
+ "parse": { "type": "array", "items": { "type": "string" } },
+ "roles": { "type": "array", "items": { "type": "string" } },
+ "users": { "type": "array", "items": { "type": "string" } },
+ "replied_user": { "type": "boolean" }
+ },
+ "additionalProperties": false
+ },
+ "message_reference": {
+ "type": "object",
+ "properties": {
+ "message_id": { "type": "string" },
+ "channel_id": { "type": "string" },
+ "guild_id": { "type": "string" },
+ "fail_if_not_exists": { "type": "boolean" }
+ },
+ "additionalProperties": false,
+ "required": ["channel_id", "message_id"]
+ },
+ "payload_json": { "type": "string" },
+ "file": {}
+ }
},
"RoleModifySchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": { "type": "string" },
- "permissions": { "type": "number" },
- "color": { "type": "integer" },
- "hoist": { "type": "boolean" },
- "mentionable": { "type": "boolean" },
- "position": { "type": "integer" }
- }
- }
- }
- },
- "description": ""
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "permissions": { "type": "number" },
+ "color": { "type": "integer" },
+ "hoist": { "type": "boolean" },
+ "mentionable": { "type": "boolean" },
+ "position": { "type": "integer" }
+ }
},
"TemplateCreateSchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": { "name": { "type": "string" }, "description": { "type": "string" } },
- "required": ["name"]
- }
- }
- },
- "description": ""
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "description": { "type": "string" } },
+ "required": ["name"]
},
"TemplateModifySchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": { "name": { "type": "string" }, "description": { "type": "string" } },
- "required": ["name"]
- }
- }
- },
- "description": ""
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "description": { "type": "string" } },
+ "required": ["name"]
},
"UserModifySchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "username": { "type": "string" },
- "avatar": { "type": "string" },
- "bio": { "type": "string" },
- "accent_color": { "type": "integer" },
- "banner": { "type": "string" },
- "password": { "type": "string" },
- "new_password": { "type": "string" },
- "code": { "type": "string" }
- }
- }
- }
- },
- "description": ""
+ "type": "object",
+ "properties": {
+ "username": { "type": "string" },
+ "avatar": { "type": "string" },
+ "bio": { "type": "string" },
+ "accent_color": { "type": "integer" },
+ "banner": { "type": "string" },
+ "password": { "type": "string" },
+ "new_password": { "type": "string" },
+ "code": { "type": "string" }
+ }
},
"UserSettingsSchema": {
- "content": {
- "application/json": {
- "schema": {
+ "type": "object",
+ "properties": {
+ "afk_timeout": { "type": "integer" },
+ "allow_accessibility_detection": { "type": "boolean" },
+ "animate_emoji": { "type": "boolean" },
+ "animate_stickers": { "type": "integer" },
+ "contact_sync_enabled": { "type": "boolean" },
+ "convert_emoticons": { "type": "boolean" },
+ "custom_status": {
+ "type": "object",
+ "properties": {
+ "emoji_id": { "type": "string" },
+ "emoji_name": { "type": "string" },
+ "expires_at": { "type": "integer" },
+ "text": { "type": "string" }
+ },
+ "additionalProperties": false
+ },
+ "default_guilds_restricted": { "type": "boolean" },
+ "detect_platform_accounts": { "type": "boolean" },
+ "developer_mode": { "type": "boolean" },
+ "disable_games_tab": { "type": "boolean" },
+ "enable_tts_command": { "type": "boolean" },
+ "explicit_content_filter": { "type": "integer" },
+ "friend_source_flags": {
+ "type": "object",
+ "properties": { "all": { "type": "boolean" } },
+ "additionalProperties": false,
+ "required": ["all"]
+ },
+ "gateway_connected": { "type": "boolean" },
+ "gif_auto_play": { "type": "boolean" },
+ "guild_folders": {
+ "type": "array",
+ "items": {
"type": "object",
"properties": {
- "afk_timeout": { "type": "integer" },
- "allow_accessibility_detection": { "type": "boolean" },
- "animate_emoji": { "type": "boolean" },
- "animate_stickers": { "type": "integer" },
- "contact_sync_enabled": { "type": "boolean" },
- "convert_emoticons": { "type": "boolean" },
- "custom_status": {
- "type": "object",
- "properties": {
- "emoji_id": { "type": "string" },
- "emoji_name": { "type": "string" },
- "expires_at": { "type": "integer" },
- "text": { "type": "string" }
- },
- "additionalProperties": false
- },
- "default_guilds_restricted": { "type": "boolean" },
- "detect_platform_accounts": { "type": "boolean" },
- "developer_mode": { "type": "boolean" },
- "disable_games_tab": { "type": "boolean" },
- "enable_tts_command": { "type": "boolean" },
- "explicit_content_filter": { "type": "integer" },
- "friend_source_flags": {
- "type": "object",
- "properties": { "all": { "type": "boolean" } },
- "additionalProperties": false,
- "required": ["all"]
- },
- "gateway_connected": { "type": "boolean" },
- "gif_auto_play": { "type": "boolean" },
- "guild_folders": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "color": { "type": "integer" },
- "guild_ids": { "type": "array", "items": { "type": "string" } },
- "id": { "type": "integer" },
- "name": { "type": "string" }
- },
- "additionalProperties": false,
- "required": ["color", "guild_ids", "id", "name"]
- }
- },
- "guild_positions": { "type": "array", "items": { "type": "string" } },
- "inline_attachment_media": { "type": "boolean" },
- "inline_embed_media": { "type": "boolean" },
- "locale": { "type": "string" },
- "message_display_compact": { "type": "boolean" },
- "native_phone_integration_enabled": { "type": "boolean" },
- "render_embeds": { "type": "boolean" },
- "render_reactions": { "type": "boolean" },
- "restricted_guilds": { "type": "array", "items": { "type": "string" } },
- "show_current_game": { "type": "boolean" },
- "status": { "enum": ["dnd", "idle", "offline", "online"], "type": "string" },
- "stream_notifications_enabled": { "type": "boolean" },
- "theme": { "enum": ["dark", "white"], "type": "string" },
- "timezone_offset": { "type": "integer" }
+ "color": { "type": "integer" },
+ "guild_ids": { "type": "array", "items": { "type": "string" } },
+ "id": { "type": "integer" },
+ "name": { "type": "string" }
},
- "required": [
- "afk_timeout",
- "allow_accessibility_detection",
- "animate_emoji",
- "animate_stickers",
- "contact_sync_enabled",
- "convert_emoticons",
- "custom_status",
- "default_guilds_restricted",
- "detect_platform_accounts",
- "developer_mode",
- "disable_games_tab",
- "enable_tts_command",
- "explicit_content_filter",
- "friend_source_flags",
- "gateway_connected",
- "gif_auto_play",
- "guild_folders",
- "guild_positions",
- "inline_attachment_media",
- "inline_embed_media",
- "locale",
- "message_display_compact",
- "native_phone_integration_enabled",
- "render_embeds",
- "render_reactions",
- "restricted_guilds",
- "show_current_game",
- "status",
- "stream_notifications_enabled",
- "theme",
- "timezone_offset"
- ]
+ "additionalProperties": false,
+ "required": ["color", "guild_ids", "id", "name"]
}
- }
+ },
+ "guild_positions": { "type": "array", "items": { "type": "string" } },
+ "inline_attachment_media": { "type": "boolean" },
+ "inline_embed_media": { "type": "boolean" },
+ "locale": { "type": "string" },
+ "message_display_compact": { "type": "boolean" },
+ "native_phone_integration_enabled": { "type": "boolean" },
+ "render_embeds": { "type": "boolean" },
+ "render_reactions": { "type": "boolean" },
+ "restricted_guilds": { "type": "array", "items": { "type": "string" } },
+ "show_current_game": { "type": "boolean" },
+ "status": { "enum": ["dnd", "idle", "offline", "online"], "type": "string" },
+ "stream_notifications_enabled": { "type": "boolean" },
+ "theme": { "enum": ["dark", "white"], "type": "string" },
+ "timezone_offset": { "type": "integer" }
},
- "description": ""
+ "required": [
+ "afk_timeout",
+ "allow_accessibility_detection",
+ "animate_emoji",
+ "animate_stickers",
+ "contact_sync_enabled",
+ "convert_emoticons",
+ "custom_status",
+ "default_guilds_restricted",
+ "detect_platform_accounts",
+ "developer_mode",
+ "disable_games_tab",
+ "enable_tts_command",
+ "explicit_content_filter",
+ "friend_source_flags",
+ "gateway_connected",
+ "gif_auto_play",
+ "guild_folders",
+ "guild_positions",
+ "inline_attachment_media",
+ "inline_embed_media",
+ "locale",
+ "message_display_compact",
+ "native_phone_integration_enabled",
+ "render_embeds",
+ "render_reactions",
+ "restricted_guilds",
+ "show_current_game",
+ "status",
+ "stream_notifications_enabled",
+ "theme",
+ "timezone_offset"
+ ]
},
"WidgetModifySchema": {
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": { "enabled": { "type": "boolean" }, "channel_id": { "type": "string" } },
- "required": ["channel_id", "enabled"]
- }
- }
- },
- "description": ""
+ "type": "object",
+ "properties": { "enabled": { "type": "boolean" }, "channel_id": { "type": "string" } },
+ "required": ["channel_id", "enabled"]
}
},
+ "requestBodies": {},
"securitySchemes": {},
"links": {},
"callbacks": {}
diff --git a/api/package-lock.json b/api/package-lock.json
index 1242dc06..da41d26d 100644
--- a/api/package-lock.json
+++ b/api/package-lock.json
@@ -7,6 +7,7 @@
"": {
"name": "@fosscord/api",
"version": "1.0.0",
+ "hasInstallScript": true,
"license": "ISC",
"dependencies": {
"@fosscord/util": "file:../util",
@@ -29,7 +30,7 @@
"i18next-node-fs-backend": "^2.1.3",
"jsonwebtoken": "^8.5.1",
"lambert-server": "^1.2.10",
- "missing-native-js-functions": "^1.2.11",
+ "missing-native-js-functions": "^1.2.15",
"mongoose": "^5.12.3",
"mongoose-autopopulate": "^0.12.3",
"mongoose-long": "^0.3.2",
@@ -78,7 +79,7 @@
"env-paths": "^2.2.1",
"jsonwebtoken": "^8.5.1",
"lambert-server": "^1.2.10",
- "missing-native-js-functions": "^1.2.13",
+ "missing-native-js-functions": "^1.2.14",
"node-fetch": "^2.6.1",
"patch-package": "^6.4.7",
"pg": "^8.7.1",
@@ -7421,9 +7422,9 @@
}
},
"node_modules/missing-native-js-functions": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.11.tgz",
- "integrity": "sha512-U97IscNBL4Wg9adYjEBT46Hb0Ld5dPT8vbdwFX+TNzGrFQCc4WqoGAZouaLNFwUqxzzHZ9DVg59unwnQyeIIQg=="
+ "version": "1.2.15",
+ "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.15.tgz",
+ "integrity": "sha512-NNsxPSHnG22xellXsdGkzmF/SSzYNRgZcWQt2OKG+I3Wv8p37kTax13trTMthVkEOhvNv8M2l4A4JwK1p42ZHg=="
},
"node_modules/mixin-deep": {
"version": "1.3.2",
@@ -12976,7 +12977,7 @@
"jest": "^27.0.6",
"jsonwebtoken": "^8.5.1",
"lambert-server": "^1.2.10",
- "missing-native-js-functions": "^1.2.13",
+ "missing-native-js-functions": "^1.2.14",
"node-fetch": "^2.6.1",
"patch-package": "^6.4.7",
"pg": "^8.7.1",
@@ -18555,9 +18556,9 @@
}
},
"missing-native-js-functions": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.11.tgz",
- "integrity": "sha512-U97IscNBL4Wg9adYjEBT46Hb0Ld5dPT8vbdwFX+TNzGrFQCc4WqoGAZouaLNFwUqxzzHZ9DVg59unwnQyeIIQg=="
+ "version": "1.2.15",
+ "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.15.tgz",
+ "integrity": "sha512-NNsxPSHnG22xellXsdGkzmF/SSzYNRgZcWQt2OKG+I3Wv8p37kTax13trTMthVkEOhvNv8M2l4A4JwK1p42ZHg=="
},
"mixin-deep": {
"version": "1.3.2",
diff --git a/api/package.json b/api/package.json
index bff625b2..497065cb 100644
--- a/api/package.json
+++ b/api/package.json
@@ -78,7 +78,7 @@
"i18next-node-fs-backend": "^2.1.3",
"jsonwebtoken": "^8.5.1",
"lambert-server": "^1.2.10",
- "missing-native-js-functions": "^1.2.11",
+ "missing-native-js-functions": "^1.2.15",
"mongoose": "^5.12.3",
"mongoose-autopopulate": "^0.12.3",
"mongoose-long": "^0.3.2",
diff --git a/api/scripts/generate_openapi_schema.ts b/api/scripts/generate_openapi_schema.ts
index c45a43eb..329aeaf4 100644
--- a/api/scripts/generate_openapi_schema.ts
+++ b/api/scripts/generate_openapi_schema.ts
@@ -19,41 +19,14 @@ const compilerOptions: TJS.CompilerOptions = {
const openapiPath = path.join(__dirname, "..", "assets", "openapi.json");
var specification = JSON.parse(fs.readFileSync(openapiPath, { encoding: "utf8" }));
-async function generateSchemas() {
+async function utilSchemas() {
const program = TJS.getProgramFromFiles([path.join(__dirname, "..", "..", "util", "src", "index.ts")], compilerOptions);
const generator = TJS.buildGenerator(program, settings);
- const schemas = [
- "Application",
- "Attachment",
- "Message",
- "AuditLog",
- "Ban",
- "Channel",
- "Emoji",
- "Guild",
- "Invite",
- "ReadState",
- "Recipient",
- "Relationship",
- "Role",
- "Sticker",
- "Team",
- "TeamMember",
- "Template",
- "VoiceState",
- "Webhook",
- "User",
- "UserPublic"
- ];
+ const schemas = ["UserPublic", "UserPrivate", "PublicConnectedAccount"];
// @ts-ignore
- const definitions = combineSchemas({ schemas, generator, program });
-
- for (const key in definitions) {
- specification.components.schemas[key] = definitions[key];
- delete definitions[key].additionalProperties;
- }
+ combineSchemas({ schemas, generator, program });
}
function combineSchemas(opts: { program: TJS.Program; generator: TJS.JsonSchemaGenerator; schemas: string[] }) {
@@ -63,13 +36,19 @@ function combineSchemas(opts: { program: TJS.Program; generator: TJS.JsonSchemaG
const part = TJS.generateSchema(opts.program, name, settings, [], opts.generator as TJS.JsonSchemaGenerator);
if (!part) continue;
- definitions = { ...definitions, ...part.definitions, [name]: { ...part, definitions: undefined, $schema: undefined } };
+ definitions = { ...definitions, [name]: { ...part, definitions: undefined, $schema: undefined } };
+ }
+
+ for (const key in definitions) {
+ specification.components.schemas[key] = definitions[key];
+ delete definitions[key].additionalProperties;
+ delete definitions[key].$schema;
}
return definitions;
}
-function generateBodies() {
+function apiSchemas() {
const program = TJS.getProgramFromFiles([path.join(__dirname, "..", "src", "schema", "index.ts")], compilerOptions);
const generator = TJS.buildGenerator(program, settings);
@@ -94,97 +73,26 @@ function generateBodies() {
"TemplateModifySchema",
"UserModifySchema",
"UserSettingsSchema",
- "WidgetModifySchema"
+ "WidgetModifySchema",
+ ""
];
// @ts-ignore
- const definitions = combineSchemas({ schemas, generator, program });
-
- for (const key in definitions) {
- specification.components.requestBodies[key] = {
- content: {
- "application/json": { schema: definitions[key] }
- },
- description: ""
- };
-
- delete definitions[key].additionalProperties;
- delete definitions[key].$schema;
- }
+ combineSchemas({ schemas, generator, program });
}
function addDefaultResponses() {
- Object.values(specification.paths).forEach((path: any) =>
- Object.values(path).forEach((request: any) => {
- if (!request.responses?.["401"]) {
- request.responses["401"] = {
- description: "Unauthorized",
- content: { "application/json": { schema: { $ref: "#/components/schemas/Error" } } }
- };
- }
- if (!request.responses?.["429"]) {
- request.responses["429"] = {
- description: "Rate limit exceeded",
- content: { "application/json": { schema: { $ref: "#/components/schemas/Error" } } },
- headers: {
- "X-RateLimit-Bucket": {
- description:
- "A unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path)",
- schema: { type: "string" }
- },
- "X-Rate-Limit-Limit": {
- description: "The number of allowed requests in the current period",
- schema: {
- type: "integer"
- }
- },
- "X-Rate-Limit-Remaining": {
- description: "The number of remaining requests in the current period",
- schema: {
- type: "integer"
- }
- },
- "X-Rate-Limit-Reset": {
- description: "Date when current period is over in seconds since the Unix epoch",
- schema: {
- type: "integer"
- }
- },
- "X-Rate-Limit-Reset-After": {
- description: "Number of seconds when current period will reset (can have decimal)",
- schema: {
- type: "number"
- }
- },
- "Retry-After": {
- description: "Same as X-Rate-Limit-Reset-After but an integer",
- schema: {
- type: "integer"
- }
- },
- "X-RateLimit-Global": {
- description: "Indicates whether or not all requests from your ip are rate limited",
- schema: {
- type: "boolean"
- }
- }
- }
- };
- }
- })
- );
+ Object.values(specification.paths).forEach((path: any) => Object.values(path).forEach((request: any) => {}));
}
function main() {
addDefaultResponses();
- generateSchemas();
- specification = JSON.parse(JSON.stringify(specification).replaceAll("#/definitions", "#/components/schemas"));
-
- generateBodies();
+ utilSchemas();
+ apiSchemas();
fs.writeFileSync(
openapiPath,
- JSON.stringify(specification, null, 4).replaceAll("#/definitions", "#/components/requestBodies").replaceAll("bigint", "number")
+ JSON.stringify(specification, null, 4).replaceAll("#/definitions", "#/components/schemas").replaceAll("bigint", "number")
);
}
|