diff --git a/website/server/controllers/api-v3/chat.js b/website/server/controllers/api-v3/chat.js
index fd3b26815f..4835ceca4c 100644
--- a/website/server/controllers/api-v3/chat.js
+++ b/website/server/controllers/api-v3/chat.js
@@ -20,6 +20,12 @@ const FLAG_REPORT_EMAILS = nconf.get('FLAG_REPORT_EMAIL').split(',').map((email)
/**
* @apiDefine MessageNotFound
* @apiError (404) {NotFound} MessageNotFound The specified message could not be found.
+ *
+ * @apiDefine GroupIdRequired
+ * @apiError (404) {badRequest} groupIdRequired A group ID is required
+ *
+ * @apiDefine ChatIdRequired
+ * @apiError (404) {badRequest} chatIdRequired A chat ID is required
*/
let api = {};
@@ -44,12 +50,14 @@ async function getAuthorEmailFromMessage (message) {
* @api {get} /api/v3/groups/:groupId/chat Get chat messages from a group
* @apiName GetChat
* @apiGroup Chat
+ * @apiDescription Fetches an array of messages from a group
*
- * @apiParam {String} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
+ * @apiParam (Path) {String} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
*
- * @apiSuccess {Array} data An array of chat messages
+ * @apiSuccess {Array} data An array of chat messages
*
* @apiUse GroupNotFound
+ * @apiUse GroupIdRequired
*/
api.getChat = {
method: 'GET',
@@ -74,14 +82,17 @@ api.getChat = {
* @api {post} /api/v3/groups/:groupId/chat Post chat message to a group
* @apiName PostChat
* @apiGroup Chat
+ * @apiDescription Posts a chat message to a group
*
- * @apiParam {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
- * @apiParam {String} message Body parameter - message The message to post
- * @apiParam {UUID} previousMsg Query parameter - The previous chat message which will force a return of the full group chat
+ * @apiParam (Path) {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
+ * @apiParam (Body) {String} message Message The message to post
+ * @apiParam (Query) {UUID} previousMsg The previous chat message's UUID which will force a return of the full group chat
*
- * @apiSuccess data An array of chat messages if a new message was posted after previousMsg, otherwise the posted message
+ * @apiSuccess data An array of chat messages if a new message was posted after previousMsg, otherwise the posted message
*
* @apiUse GroupNotFound
+ * @apiUse GroupIdRequired
+ * @apiError (400) {NotFound} ChatPriviledgesRevoked Your chat privileges have been revoked
*/
api.postChat = {
method: 'POST',
@@ -141,14 +152,18 @@ api.postChat = {
* @api {post} /api/v3/groups/:groupId/chat/:chatId/like Like a group chat message
* @apiName LikeChat
* @apiGroup Chat
+ * @apiDescription Likes a chat message from a group
*
- * @apiParam {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
- * @apiParam {UUID} chatId The chat message _id
+ * @apiParam (Path) {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
+ * @apiParam (Path) {UUID} chatId The chat message _id
*
- * @apiSuccess {Object} data The liked chat message
+ * @apiSuccess {Object} data The liked chat message
*
* @apiUse GroupNotFound
* @apiUse MessageNotFound
+ * @apiUse GroupIdRequired
+ * @apiUse ChatIdRequired
+ * @apiError (400) {NotFound} messageGroupChatLikeOwnMessage A user can't like their own message
*/
api.likeChat = {
method: 'POST',
@@ -193,8 +208,8 @@ api.likeChat = {
* @apiName FlagChat
* @apiGroup Chat
*
- * @apiParam {UUID} groupId The group id ('party' for the user party and 'habitrpg' for tavern are accepted)
- * @apiParam {UUID} chatId The chat message id
+ * @apiParam (Path) {UUID} groupId The group id ('party' for the user party and 'habitrpg' for tavern are accepted)
+ * @apiParam (Path) {UUID} chatId The chat message id
*
* @apiSuccess {Object} data The flagged chat message
* @apiSuccess {UUID} data.id The id of the message
@@ -208,8 +223,10 @@ api.likeChat = {
*
* @apiUse GroupNotFound
* @apiUse MessageNotFound
- * @apiError FlagOwnMessage Chat messages cannot be flagged by the author of the message
- * @apiError AlreadyFlagged Chat messages cannot be flagged more than once by a user
+ * @apiUse GroupIdRequired
+ * @apiUse ChatIdRequired
+ * @apiError (404) {NotFound} AlreadyFlagged Chat messages cannot be flagged more than once by a user
+ * @apiError (404) {NotFound} messageGroupChatFlagAlreadyReported The message has already been flagged
*/
api.flagChat = {
method: 'POST',
@@ -301,14 +318,16 @@ api.flagChat = {
* @apiName ClearFlags
* @apiGroup Chat
*
- * @apiParam {UUID} groupId The group id ('party' for the user party and 'habitrpg' for tavern are accepted)
- * @apiParam {UUID} chatId The chat message id
+ * @apiParam (Path) {UUID} groupId The group id ('party' for the user party and 'habitrpg' for tavern are accepted)
+ * @apiParam (Path) {UUID} chatId The chat message id
*
* @apiSuccess {Object} data An empty object
*
* @apiUse GroupNotFound
* @apiUse MessageNotFound
- * @apiError MustBeAdmin Must be a moderator to use this route
+ * @apiUse GroupIdRequired
+ * @apiUse ChatIdRequired
+ * @apiError (404) {NotAuthorized} MustBeAdmin Must be a moderator to use this route
*/
api.clearChatFlags = {
method: 'Post',
@@ -379,9 +398,10 @@ api.clearChatFlags = {
* @apiName SeenChat
* @apiGroup Chat
*
- * @apiParam {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
+ * @apiParam (Path) {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
*
* @apiSuccess {Object} data An empty object
+ * @apiUse GroupIdRequired
*/
api.seenChat = {
method: 'POST',
@@ -412,16 +432,20 @@ api.seenChat = {
* @api {delete} /api/v3/groups/:groupId/chat/:chatId Delete chat message from a group
* @apiName DeleteChat
* @apiGroup Chat
+ * @apiDescription Delete's a chat message from a group
*
- * @apiParam {String} previousMsg Query parameter - The last message fetched by the client so that the whole chat will be returned only if new messages have been posted in the meantime
- * @apiParam {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
- * @apiParam {UUID} chatId The chat message id
+ * @apiParam (Query) {UUID} previousMsg The last message's ID fetched by the client so that the whole chat will be returned only if new messages have been posted in the meantime
+ * @apiParam (Path) {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
+ * @apiParam (Path) {UUID} chatId The chat message id
*
* @apiSuccess data The updated chat array or an empty object if no message was posted after previousMsg
* @apiSuccess {Object} data An empty object when the previous message was deleted
*
* @apiUse GroupNotFound
* @apiUse MessageNotFound
+ * @apiUse GroupIdRequired
+ * @apiUse ChatIdRequired
+ * @apiError (400) onlyCreatorOrAdminCanDeleteChat Only the creator of the message and admins can delete a chat message
*/
api.deleteChat = {
method: 'DELETE',