summary refs log tree commit diff
diff options
context:
space:
mode:
authorErkin Alp Güney <erkinalp9035@gmail.com>2023-01-14 11:15:35 +0300
committerGitHub <noreply@github.com>2023-01-14 19:15:35 +1100
commit876c15b1a9ed8ee9343cc0c00743b42c69712a6c (patch)
tree3ea7c6c211c7b39aa8582980dbccee1dcac9869a
parentMerge pull request #929 from fosscord/dev/fix-client-script (diff)
downloadserver-876c15b1a9ed8ee9343cc0c00743b42c69712a6c.tar.xz
Add /users/:id/delete (#926)
-rw-r--r--src/api/routes/users/#id/delete.ts39
-rw-r--r--src/util/interfaces/Event.ts10
-rw-r--r--src/util/schemas/UserDeleteSchema.ts3
-rw-r--r--src/util/schemas/index.ts1
4 files changed, 53 insertions, 0 deletions
diff --git a/src/api/routes/users/#id/delete.ts b/src/api/routes/users/#id/delete.ts
new file mode 100644
index 00000000..2c08635b
--- /dev/null
+++ b/src/api/routes/users/#id/delete.ts
@@ -0,0 +1,39 @@
+import { route } from "@fosscord/api";
+import {
+	emitEvent,
+	Member,
+	PrivateUserProjection,
+	User,
+	UserDeleteEvent,
+	UserDeleteSchema,
+} from "@fosscord/util";
+import { Request, Response, Router } from "express";
+
+const router = Router();
+
+router.post(
+	"/",
+	route({ right: "MANAGE_USERS" }),
+	async (req: Request, res: Response) => {
+		
+		let user = await User.findOneOrFail({
+			where: { id: req.params.id },
+			select: [...PrivateUserProjection, "data"],
+		});
+		await Promise.all([
+			Member.delete({ id: req.params.id }),
+			User.delete({ id: req.params.id }),
+		]);
+
+		// TODO: respect intents as USER_DELETE has potential to cause privacy issues
+		await emitEvent({
+			event: "USER_DELETE",
+			user_id: req.user_id,
+			data: { user_id: req.params.id },
+		} as UserDeleteEvent);
+
+		res.sendStatus(204);
+	},
+);
+
+export default router;
diff --git a/src/util/interfaces/Event.ts b/src/util/interfaces/Event.ts
index b772c3e4..c88d5750 100644
--- a/src/util/interfaces/Event.ts
+++ b/src/util/interfaces/Event.ts
@@ -393,6 +393,13 @@ export interface UserUpdateEvent extends Event {
 	data: User;
 }
 
+export interface UserDeleteEvent extends Event {
+	event: "USER_DELETE";
+	data: {
+		user_id: string;
+	};
+}
+
 export interface VoiceStateUpdateEvent extends Event {
 	event: "VOICE_STATE_UPDATE";
 	data: VoiceState & {
@@ -533,6 +540,7 @@ export type EventData =
 	| PresenceUpdateEvent
 	| TypingStartEvent
 	| UserUpdateEvent
+	| UserDeleteEvent
 	| VoiceStateUpdateEvent
 	| VoiceServerUpdateEvent
 	| WebhooksUpdateEvent
@@ -583,6 +591,7 @@ export enum EVENTEnum {
 	PresenceUpdate = "PRESENCE_UPDATE",
 	TypingStart = "TYPING_START",
 	UserUpdate = "USER_UPDATE",
+	UserDelete = "USER_DELETE",
 	WebhooksUpdate = "WEBHOOKS_UPDATE",
 	InteractionCreate = "INTERACTION_CREATE",
 	VoiceStateUpdate = "VOICE_STATE_UPDATE",
@@ -633,6 +642,7 @@ export type EVENT =
 	| "PRESENCE_UPDATE"
 	| "TYPING_START"
 	| "USER_UPDATE"
+	| "USER_DELETE"
 	| "USER_NOTE_UPDATE"
 	| "WEBHOOKS_UPDATE"
 	| "INTERACTION_CREATE"
diff --git a/src/util/schemas/UserDeleteSchema.ts b/src/util/schemas/UserDeleteSchema.ts
new file mode 100644
index 00000000..dddba4e2
--- /dev/null
+++ b/src/util/schemas/UserDeleteSchema.ts
@@ -0,0 +1,3 @@
+export interface UserDeleteSchema {
+	user_id: string;
+}
diff --git a/src/util/schemas/index.ts b/src/util/schemas/index.ts
index e4f565c9..b58c08a1 100644
--- a/src/util/schemas/index.ts
+++ b/src/util/schemas/index.ts
@@ -40,6 +40,7 @@ export * from "./TotpDisableSchema";
 export * from "./TotpEnableSchema";
 export * from "./VoiceIdentifySchema";
 export * from "./TotpSchema";
+export * from "./UserDeleteSchema";
 export * from "./UserModifySchema";
 export * from "./UserProfileModifySchema";
 export * from "./UserSettingsSchema";