diff --git a/assets/openapi.json b/assets/openapi.json index 0eafe6cb..7cb270b1 100644 --- a/assets/openapi.json +++ b/assets/openapi.json @@ -2316,6 +2316,41 @@ "days" ] }, + "AckBulkSchema": { + "type": "object", + "properties": { + "read_states": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "channel_id": { + "type": "string" + }, + "message_id": { + "type": "string" + }, + "read_state_type": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "channel_id", + "message_id", + "read_state_type" + ] + } + ], + "minItems": 1, + "maxItems": 1 + } + }, + "required": [ + "read_states" + ] + }, "TransportMakeRequestResponse": { "type": "object", "properties": { @@ -7030,6 +7065,78 @@ "read-states" ] } + }, + "/users/@me/mfa/webauthn/credentials/": { + "get": { + "security": [ + { + "bearer": true + } + ], + "tags": [ + "users" + ] + }, + "post": { + "security": [ + { + "bearer": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebAuthnPostSchema" + } + } + } + }, + "tags": [ + "users" + ] + } + }, + "/users/@me/mfa/webauthn/credentials/{key_id}/": { + "delete": { + "security": [ + { + "bearer": true + } + ], + "parameters": [ + { + "name": "key_id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "key_id" + } + ], + "tags": [ + "users" + ] + } + }, + "/auth/mfa/webauthn/": { + "post": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebAuthnTotpSchema" + } + } + } + }, + "tags": [ + "auth" + ] + } } } } \ No newline at end of file diff --git a/assets/schemas.json b/assets/schemas.json index c840b261..f40bcd79 100644 --- a/assets/schemas.json +++ b/assets/schemas.json @@ -1,4 +1,41 @@ { + "AckBulkSchema": { + "type": "object", + "properties": { + "read_states": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "channel_id": { + "type": "string" + }, + "message_id": { + "type": "string" + }, + "read_state_type": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "channel_id", + "message_id", + "read_state_type" + ] + } + ], + "minItems": 1, + "maxItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "read_states" + ], + "$schema": "http://json-schema.org/draft-07/schema#" + }, "TransportMakeRequestResponse": { "type": "object", "properties": { diff --git a/src/api/routes/read-states/ack-bulk.ts b/src/api/routes/read-states/ack-bulk.ts new file mode 100644 index 00000000..f77ecedf --- /dev/null +++ b/src/api/routes/read-states/ack-bulk.ts @@ -0,0 +1,41 @@ +import { Router, Request, Response } from "express"; +import { route } from "@fosscord/api"; +import { AckBulkSchema, ReadState } from "@fosscord/util"; +const router = Router(); + +router.post( + "/", + route({ body: "AckBulkSchema" }), + async (req: Request, res: Response) => { + const body = req.body as AckBulkSchema; + + // TODO: what is read_state_type ? + + await Promise.all([ + // for every new state + ...body.read_states.map(async (x) => { + // find an existing one + const ret = + (await ReadState.findOne({ + where: { + user_id: req.user_id, + channel_id: x.channel_id, + }, + })) ?? + // if it doesn't exist, create it (not a promise) + ReadState.create({ + user_id: req.user_id, + channel_id: x.channel_id, + }); + + ret.last_message_id = x.message_id; + + return ret.save(); + }), + ]); + + return res.status(204); + }, +); + +export default router; diff --git a/src/util/schemas/AckBulkSchema.ts b/src/util/schemas/AckBulkSchema.ts new file mode 100644 index 00000000..8e20723f --- /dev/null +++ b/src/util/schemas/AckBulkSchema.ts @@ -0,0 +1,9 @@ +export interface AckBulkSchema { + read_states: [ + { + channel_id: string; + message_id: string; + read_state_type: number; // WHat is this? + }, + ]; +} diff --git a/src/util/schemas/index.ts b/src/util/schemas/index.ts index 65e8b3cd..603141b5 100644 --- a/src/util/schemas/index.ts +++ b/src/util/schemas/index.ts @@ -69,6 +69,21 @@ export * from "./VanityUrlSchema"; export * from "./VoiceIdentifySchema"; export * from "./VoiceStateUpdateSchema"; export * from "./VoiceVideoSchema"; +export * from "./IdentifySchema"; +export * from "./ActivitySchema"; +export * from "./LazyRequestSchema"; +export * from "./GuildUpdateSchema"; +export * from "./ChannelPermissionOverwriteSchema"; +export * from "./UserGuildSettingsSchema"; +export * from "./GatewayPayloadSchema"; +export * from "./RolePositionUpdateSchema"; +export * from "./ChannelReorderSchema"; +export * from "./UserSettingsSchema"; +export * from "./BotModifySchema"; +export * from "./ApplicationModifySchema"; +export * from "./ApplicationCreateSchema"; +export * from "./ApplicationAuthorizeSchema"; +export * from "./AckBulkSchema"; export * from "./WebAuthnSchema"; export * from "./WebhookCreateSchema"; export * from "./WidgetModifySchema";