1
0
mirror of https://github.com/spacebarchat/server.git synced 2024-11-10 04:32:35 +01:00

implement PATCH connection

This commit is contained in:
Puyodead1 2022-12-22 11:08:03 -05:00
parent 6a52e65e27
commit 5c682137b2
No known key found for this signature in database
GPG Key ID: A4FA4FEC0DD353FC
8 changed files with 705 additions and 4 deletions

View File

@ -36,6 +36,16 @@
],
"$schema": "http://json-schema.org/draft-07/schema#"
},
"ConnectionUpdateSchema": {
"type": "object",
"properties": {
"visibility": {
"type": "boolean"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
},
"SMTPConnection.CustomAuthenticationResponse": {
"type": "object",
"properties": {
@ -2790,6 +2800,639 @@
},
"$schema": "http://json-schema.org/draft-07/schema#"
},
"ConnectedAccountSchema": {
"type": "object",
"properties": {
"external_id": {
"type": "string"
},
"user_id": {
"type": "string"
},
"access_token": {
"type": "string"
},
"friend_sync": {
"type": "boolean"
},
"name": {
"type": "string"
},
"revoked": {
"type": "boolean"
},
"show_activity": {
"type": "boolean"
},
"type": {
"type": "string"
},
"verified": {
"type": "boolean"
},
"visibility": {
"type": "integer"
},
"integrations": {
"type": "array",
"items": {
"type": "string"
}
},
"metadata_": {},
"metadata_visibility": {
"type": "integer"
},
"two_way_link": {
"type": "boolean"
}
},
"additionalProperties": false,
"required": [
"external_id",
"name",
"type",
"user_id"
],
"definitions": {
"ChannelPermissionOverwriteType": {
"enum": [
0,
1,
2
],
"type": "number"
},
"ChannelModifySchema": {
"type": "object",
"properties": {
"name": {
"maxLength": 100,
"type": "string"
},
"type": {
"enum": [
0,
1,
10,
11,
12,
13,
14,
15,
2,
255,
3,
33,
34,
35,
4,
5,
6,
64,
7,
8,
9
],
"type": "number"
},
"topic": {
"type": "string"
},
"icon": {
"type": [
"null",
"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": {
"$ref": "#/definitions/ChannelPermissionOverwriteType"
},
"allow": {
"type": "string"
},
"deny": {
"type": "string"
}
},
"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"
},
"default_reaction_emoji": {
"type": [
"null",
"string"
]
},
"flags": {
"type": "integer"
},
"default_thread_rate_limit_per_user": {
"type": "integer"
},
"video_quality_mode": {
"type": "integer"
}
},
"additionalProperties": false
},
"ActivitySchema": {
"type": "object",
"properties": {
"afk": {
"type": "boolean"
},
"status": {
"$ref": "#/definitions/Status"
},
"activities": {
"type": "array",
"items": {
"$ref": "#/definitions/Activity"
}
},
"since": {
"type": "integer"
}
},
"additionalProperties": false,
"required": [
"status"
]
},
"Status": {
"enum": [
"dnd",
"idle",
"invisible",
"offline",
"online"
],
"type": "string"
},
"Activity": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"type": {
"$ref": "#/definitions/ActivityType"
},
"url": {
"type": "string"
},
"created_at": {
"type": "integer"
},
"timestamps": {
"type": "object",
"properties": {
"start": {
"type": "integer"
},
"end": {
"type": "integer"
}
},
"additionalProperties": false,
"required": [
"end",
"start"
]
},
"application_id": {
"type": "string"
},
"details": {
"type": "string"
},
"state": {
"type": "string"
},
"emoji": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"id": {
"type": "string"
},
"animated": {
"type": "boolean"
}
},
"additionalProperties": false,
"required": [
"animated",
"name"
]
},
"party": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"size": {
"type": "array",
"items": [
{
"type": "integer"
}
],
"minItems": 1,
"maxItems": 1
}
},
"additionalProperties": false
},
"assets": {
"type": "object",
"properties": {
"large_image": {
"type": "string"
},
"large_text": {
"type": "string"
},
"small_image": {
"type": "string"
},
"small_text": {
"type": "string"
}
},
"additionalProperties": false
},
"secrets": {
"type": "object",
"properties": {
"join": {
"type": "string"
},
"spectate": {
"type": "string"
},
"match": {
"type": "string"
}
},
"additionalProperties": false
},
"instance": {
"type": "boolean"
},
"flags": {
"type": "string"
},
"id": {
"type": "string"
},
"sync_id": {
"type": "string"
},
"metadata": {
"type": "object",
"properties": {
"context_uri": {
"type": "string"
},
"album_id": {
"type": "string"
},
"artist_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false,
"required": [
"album_id",
"artist_ids"
]
},
"session_id": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"flags",
"name",
"session_id",
"type"
]
},
"ActivityType": {
"enum": [
0,
1,
2,
4,
5
],
"type": "number"
},
"Record<string,[number,number][]>": {
"type": "object",
"additionalProperties": false
},
"Embed": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"type": {
"enum": [
"article",
"gifv",
"image",
"link",
"rich",
"video"
],
"type": "string"
},
"description": {
"type": "string"
},
"url": {
"type": "string"
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"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": "#/definitions/EmbedImage"
},
"thumbnail": {
"$ref": "#/definitions/EmbedImage"
},
"video": {
"$ref": "#/definitions/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"
]
}
}
},
"additionalProperties": false
},
"EmbedImage": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"proxy_url": {
"type": "string"
},
"height": {
"type": "integer"
},
"width": {
"type": "integer"
}
},
"additionalProperties": false
},
"Partial<ChannelOverride>": {
"type": "object",
"properties": {
"message_notifications": {
"type": "integer"
},
"mute_config": {
"$ref": "#/definitions/MuteConfig"
},
"muted": {
"type": "boolean"
},
"channel_id": {
"type": [
"null",
"string"
]
}
},
"additionalProperties": false
},
"MuteConfig": {
"type": "object",
"properties": {
"end_time": {
"type": "integer"
},
"selected_time_window": {
"type": "integer"
}
},
"additionalProperties": false,
"required": [
"end_time",
"selected_time_window"
]
},
"CustomStatus": {
"type": "object",
"properties": {
"emoji_id": {
"type": "string"
},
"emoji_name": {
"type": "string"
},
"expires_at": {
"type": "integer"
},
"text": {
"type": "string"
}
},
"additionalProperties": false
},
"FriendSourceFlags": {
"type": "object",
"properties": {
"all": {
"type": "boolean"
}
},
"additionalProperties": false,
"required": [
"all"
]
},
"GuildFolder": {
"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"
]
},
"Partial<GenerateWebAuthnCredentialsSchema>": {
"type": "object",
"properties": {
"password": {
"type": "string"
}
},
"additionalProperties": false
},
"Partial<CreateWebAuthnCredentialSchema>": {
"type": "object",
"properties": {
"credential": {
"type": "string"
},
"name": {
"type": "string"
},
"ticket": {
"type": "string"
}
},
"additionalProperties": false
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
},
"ConnectionCallbackSchema": {
"type": "object",
"properties": {

View File

@ -0,0 +1,51 @@
import { route } from "@fosscord/api";
import { Request, Response, Router } from "express";
import {
ConnectedAccount,
DiscordApiErrors,
OrmUtils,
} from "../../../../../../../util";
const router = Router();
// TODO: connection update schema
router.patch(
"/",
route({ body: "ConnectionUpdateSchema" }),
async (req: Request, res: Response) => {
const { connection_name, connection_id } = req.params;
const connection = await ConnectedAccount.findOne({
where: {
user_id: req.user_id,
external_id: connection_id,
type: connection_name,
},
select: [
"external_id",
"type",
"name",
"verified",
"visibility",
"show_activity",
"revoked",
"friend_sync",
"integrations",
],
});
if (!connection) return DiscordApiErrors.UNKNOWN_CONNECTION;
// TODO: do we need to do anything if the connection is revoked?
OrmUtils.mergeDeep(connection, req.body);
await ConnectedAccount.update(
{
user_id: req.user_id,
external_id: connection_id,
type: connection_name,
},
connection,
);
res.json(connection.toJSON());
},
);
export default router;

View File

@ -32,10 +32,12 @@ export class ConnectedAccountDTO {
this.show_activity = connectedAccount.show_activity;
this.type = connectedAccount.type;
this.verified = connectedAccount.verified;
this.visibility = connectedAccount.visibility;
this.visibility = +(connectedAccount.visibility || false);
this.integrations = connectedAccount.integrations;
this.metadata_ = connectedAccount.metadata_;
this.metadata_visibility = connectedAccount.metadata_visibility;
this.metadata_visibility = +(
connectedAccount.metadata_visibility || false
);
this.two_way_link = connectedAccount.two_way_link;
}
}

View File

@ -62,7 +62,7 @@ export class ConnectedAccount extends BaseClass {
verified?: boolean = true;
@Column({ select: false })
visibility?: number = 0;
visibility?: boolean = false;
@Column({ type: "simple-array" })
integrations?: string[] = [];
@ -71,7 +71,7 @@ export class ConnectedAccount extends BaseClass {
metadata_?: any;
@Column()
metadata_visibility?: number = 0;
metadata_visibility?: boolean = false;
@Column()
two_way_link?: boolean = false;

View File

@ -0,0 +1,3 @@
export interface ConnectionUpdateSchema {
visibility?: boolean;
}

View File

@ -28,6 +28,7 @@ export * from "./ClientRelease";
export * from "./Config";
export * from "./ConnectedAccount";
export * from "./ConnectionConfigEntity";
export * from "./ConnectionUpdateSchema";
export * from "./EmbedCache";
export * from "./Emoji";
export * from "./Encryption";

View File

@ -578,6 +578,7 @@ export const DiscordApiErrors = {
UNKNOWN_EMOJI: new ApiError("Unknown emoji", 10014),
UNKNOWN_WEBHOOK: new ApiError("Unknown webhook", 10015),
UNKNOWN_WEBHOOK_SERVICE: new ApiError("Unknown webhook service", 10016),
UNKNOWN_CONNECTION: new ApiError("Unknown connection", 10017, 400),
UNKNOWN_SESSION: new ApiError("Unknown session", 10020),
UNKNOWN_BAN: new ApiError("Unknown ban", 10026),
UNKNOWN_SKU: new ApiError("Unknown SKU", 10027),