diff --git a/assets/openapi.json b/assets/openapi.json index 19447b1..c8624a1 100644 --- a/assets/openapi.json +++ b/assets/openapi.json @@ -16117,13 +16117,151 @@ ] } }, - "/reporting/menu/message/": { + "/reporting/menu/": { "get": { "security": [ { "bearer": [] } ], + "description": "[EXT] Get available reporting menu types.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Array" + } + } + } + } + }, + "tags": [ + "reporting" + ] + } + }, + "/reporting/menu/guild": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for guild reports.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportingMenuResponse" + } + } + } + }, + "204": { + "description": "No description available" + } + }, + "tags": [ + "reporting" + ] + } + }, + "/reporting/menu/guild_discovery": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for guild_discovery reports.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportingMenuResponse" + } + } + } + }, + "204": { + "description": "No description available" + } + }, + "tags": [ + "reporting" + ] + } + }, + "/reporting/menu/guild_directory_entry": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for guild_directory_entry reports.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportingMenuResponse" + } + } + } + }, + "204": { + "description": "No description available" + } + }, + "tags": [ + "reporting" + ] + } + }, + "/reporting/menu/guild_scheduled_event": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for guild_scheduled_event reports.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportingMenuResponse" + } + } + } + }, + "204": { + "description": "No description available" + } + }, + "tags": [ + "reporting" + ] + } + }, + "/reporting/menu/message": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for message reports.", "responses": { "200": { "description": "", @@ -16150,6 +16288,146 @@ ] } }, + "/reporting/menu/stage_channel": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for stage_channel reports.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportingMenuResponse" + } + } + } + }, + "204": { + "description": "No description available" + } + }, + "tags": [ + "reporting" + ] + } + }, + "/reporting/menu/first_dm": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for first_dm reports.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportingMenuResponse" + } + } + } + }, + "204": { + "description": "No description available" + } + }, + "tags": [ + "reporting" + ] + } + }, + "/reporting/menu/user": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for user reports.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportingMenuResponse" + } + } + } + }, + "204": { + "description": "No description available" + } + }, + "tags": [ + "reporting" + ] + } + }, + "/reporting/menu/application": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for application reports.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportingMenuResponse" + } + } + } + }, + "204": { + "description": "No description available" + } + }, + "tags": [ + "reporting" + ] + } + }, + "/reporting/menu/widget": { + "get": { + "security": [ + { + "bearer": [] + } + ], + "description": "Get reporting menu options for widget reports.", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportingMenuResponse" + } + } + } + }, + "204": { + "description": "No description available" + } + }, + "tags": [ + "reporting" + ] + } + }, "/read-states/ack-bulk/": { "post": { "security": [ diff --git a/src/api/routes/reporting/menu.ts b/src/api/routes/reporting/menu.ts new file mode 100644 index 0000000..b1ac252 --- /dev/null +++ b/src/api/routes/reporting/menu.ts @@ -0,0 +1,63 @@ +/* + Spacebar: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2025 Spacebar and Spacebar Contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +import { route } from "@spacebar/api"; +import { Request, Response, Router } from "express"; +import { ReportMenuTypeNames } from "../../../schemas/api/reports/ReportMenu"; + +const router = Router({ mergeParams: true }); + +console.log("[Server] Registering reporting menu routes..."); +router.get( + "/", + route({ + description: "[EXT] Get available reporting menu types.", + responses: { + 200: { + body: "Array", + }, + }, + }), + (req: Request, res: Response) => { + res.json(Object.values(ReportMenuTypeNames)); + }, +); + +for (const type of Object.values(ReportMenuTypeNames)) { + console.log(`[Server] Route /reporting/menu/${type} registered (reports).`); + router.get( + `/${type}`, + route({ + description: `Get reporting menu options for ${type} reports.`, + query: { + variant: { type: "string", required: false, description: "Version variant of the menu to retrieve (max 256 characters, default active)" }, + }, + responses: { + 200: { + body: "ReportingMenuResponse", + }, + 204: {}, + }, + }), + (req: Request, res: Response) => { + // TODO: implement + // res.send([] as ReportingMenuResponseSchema); + }, + ); +} +export default router; diff --git a/src/api/routes/reporting/menu/index.ts b/src/api/routes/reporting/menu/index.ts deleted file mode 100644 index 55de140..0000000 --- a/src/api/routes/reporting/menu/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - Spacebar: A FOSS re-implementation and extension of the Discord.com backend. - Copyright (C) 2025 Spacebar and Spacebar Contributors - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -import { route } from "@spacebar/api"; -import { Request, Response, Router } from "express"; - -const router = Router({ mergeParams: true }); - -for (const type of [ - "guild", - "guild_discovery", - "guild_directory_entry", - "guild_scheduled_event", - "message", - "stage_channel", - "first_dm", - "user", - "application", - "widget", -] as const) { - router.get( - `/${type}`, - route({ - description: `Get reporting menu options for ${type} reports.`, - responses: { - 200: { - body: "ReportingMenuResponse", - }, - 204: {}, - }, - }), - (req: Request, res: Response) => { - // TODO: implement - //res.send([] as ReportingMenuResponseSchema); - }, - ); -} -export default router; diff --git a/src/schemas/api/reports/ReportMenu.ts b/src/schemas/api/reports/ReportMenu.ts new file mode 100644 index 0000000..3396dd5 --- /dev/null +++ b/src/schemas/api/reports/ReportMenu.ts @@ -0,0 +1,43 @@ +/* + Spacebar: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2025 Spacebar and Spacebar Contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +export enum ReportMenuType { + GUILD, + GUILD_DISCOVERY, + GUILD_DIRECTORY_ENTRY, + GUILD_SCHEDULED_EVENT, + MESSAGE, + STAGE_CHANNEL, + FIRST_DM, + USER, + APPLICATION, + WIDGET, +} + +export const ReportMenuTypeNames: Record = { + [ReportMenuType.GUILD]: "guild", + [ReportMenuType.GUILD_DISCOVERY]: "guild_discovery", + [ReportMenuType.GUILD_DIRECTORY_ENTRY]: "guild_directory_entry", + [ReportMenuType.GUILD_SCHEDULED_EVENT]: "guild_scheduled_event", + [ReportMenuType.MESSAGE]: "message", + [ReportMenuType.STAGE_CHANNEL]: "stage_channel", + [ReportMenuType.FIRST_DM]: "first_dm", + [ReportMenuType.USER]: "user", + [ReportMenuType.APPLICATION]: "application", + [ReportMenuType.WIDGET]: "widget", +};