summary refs log tree commit diff
path: root/src/api/routes/users/@me/connections/#connection_name/#connection_id/index.ts
blob: 9d5f517d0ba9ab994e3390d7573f2c5b3cdc957b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { route } from "@fosscord/api";
import { ConnectedAccount, DiscordApiErrors, emitEvent, ConnectionUpdateSchema } from "@fosscord/util";
import { Request, Response, Router } from "express";
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 body = req.body as ConnectionUpdateSchema;

		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?

		//@ts-ignore For some reason the client sends this as a boolean, even tho docs say its a number?
		if (typeof body.visibility === "boolean") body.visibility = body.visibility ? 1 : 0;

		connection.assign(req.body);

		await ConnectedAccount.update(
			{
				user_id: req.user_id,
				external_id: connection_id,
				type: connection_name,
			},
			connection,
		);
		res.json(connection.toJSON());
	},
);

router.delete("/", route({}), async (req: Request, res: Response) => {
	const { connection_name, connection_id } = req.params;

	const account = await ConnectedAccount.findOneOrFail({
		where: {
			user_id: req.user_id,
			external_id: connection_id,
			type: connection_name,
		}
	});

	await Promise.all([
		ConnectedAccount.remove(account),
		emitEvent({
			event: "USER_CONNECTIONS_UPDATE",
			data: account,
			user_id: req.user_id,
		})
	]);

	return res.sendStatus(200);
});

export default router;