Skip to content

Commit 4be2d7c

Browse files
Merge pull request #40 from Nerimity/server-clans
Server clans
2 parents f34bd3d + 80fe0b3 commit 4be2d7c

20 files changed

Lines changed: 308 additions & 43 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
-- CreateTable
2+
CREATE TABLE "server_member_clans" (
3+
"serverMemberId" TEXT NOT NULL,
4+
"userId" TEXT NOT NULL,
5+
"serverId" TEXT NOT NULL,
6+
7+
CONSTRAINT "server_member_clans_pkey" PRIMARY KEY ("serverMemberId")
8+
);
9+
10+
-- CreateTable
11+
CREATE TABLE "server_clans" (
12+
"serverId" TEXT NOT NULL,
13+
"tag" CHAR(4) NOT NULL,
14+
"icon" TEXT NOT NULL,
15+
16+
CONSTRAINT "server_clans_pkey" PRIMARY KEY ("serverId")
17+
);
18+
19+
-- CreateIndex
20+
CREATE UNIQUE INDEX "server_member_clans_userId_key" ON "server_member_clans"("userId");
21+
22+
-- CreateIndex
23+
CREATE UNIQUE INDEX "server_member_clans_serverMemberId_serverId_userId_key" ON "server_member_clans"("serverMemberId", "serverId", "userId");
24+
25+
-- AddForeignKey
26+
ALTER TABLE "server_member_clans" ADD CONSTRAINT "server_member_clans_serverMemberId_fkey" FOREIGN KEY ("serverMemberId") REFERENCES "server_members"("id") ON DELETE CASCADE ON UPDATE CASCADE;
27+
28+
-- AddForeignKey
29+
ALTER TABLE "server_member_clans" ADD CONSTRAINT "server_member_clans_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
30+
31+
-- AddForeignKey
32+
ALTER TABLE "server_member_clans" ADD CONSTRAINT "server_member_clans_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES "server_clans"("serverId") ON DELETE CASCADE ON UPDATE CASCADE;
33+
34+
-- AddForeignKey
35+
ALTER TABLE "server_clans" ADD CONSTRAINT "server_clans_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES "servers"("id") ON DELETE CASCADE ON UPDATE CASCADE;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "server_clans" ALTER COLUMN "tag" SET DATA TYPE TEXT;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
Warnings:
3+
4+
- You are about to drop the `server_member_clans` table. If the table is not empty, all the data it contains will be lost.
5+
6+
*/
7+
-- DropForeignKey
8+
ALTER TABLE "server_member_clans" DROP CONSTRAINT "server_member_clans_serverId_fkey";
9+
10+
-- DropForeignKey
11+
ALTER TABLE "server_member_clans" DROP CONSTRAINT "server_member_clans_serverMemberId_fkey";
12+
13+
-- DropForeignKey
14+
ALTER TABLE "server_member_clans" DROP CONSTRAINT "server_member_clans_userId_fkey";
15+
16+
-- AlterTable
17+
ALTER TABLE "users" ADD COLUMN "clanServerId" TEXT;
18+
19+
-- DropTable
20+
DROP TABLE "server_member_clans";
21+
22+
-- AddForeignKey
23+
ALTER TABLE "users" ADD CONSTRAINT "users_clanServerId_fkey" FOREIGN KEY ("clanServerId") REFERENCES "server_clans"("serverId") ON DELETE SET NULL ON UPDATE CASCADE;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
Warnings:
3+
4+
- You are about to drop the column `clanServerId` on the `users` table. All the data in the column will be lost.
5+
6+
*/
7+
-- DropForeignKey
8+
ALTER TABLE "users" DROP CONSTRAINT "users_clanServerId_fkey";
9+
10+
-- AlterTable
11+
ALTER TABLE "user_profiles" ADD COLUMN "clanServerId" TEXT;
12+
13+
-- AlterTable
14+
ALTER TABLE "users" DROP COLUMN "clanServerId";
15+
16+
-- AddForeignKey
17+
ALTER TABLE "user_profiles" ADD CONSTRAINT "user_profiles_clanServerId_fkey" FOREIGN KEY ("clanServerId") REFERENCES "server_clans"("serverId") ON DELETE SET NULL ON UPDATE CASCADE;

prisma/schema.prisma

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,9 @@ model User {
241241
ignoredTickets IgnoredTicket[]
242242
243243
244+
245+
246+
244247
@@unique([username, tag])
245248
@@index([joinedAt])
246249
@@ -369,6 +372,10 @@ model UserProfile {
369372
bgColorTwo String? // used for gradient background color
370373
primaryColor String?
371374
font Int?
375+
376+
377+
clan ServerClan? @relation(fields: [clanServerId], references: [serverId], onDelete: SetNull)
378+
clanServerId String?
372379
373380
374381
}
@@ -475,6 +482,8 @@ model Server {
475482
476483
477484
moderationAction ModeratorSuggestAction?
485+
clan ServerClan?
486+
478487
479488
@@index([createdAt])
480489
@@ -485,6 +494,21 @@ model Server {
485494

486495

487496

497+
model ServerClan {
498+
@@map("server_clans")
499+
serverId String @id
500+
501+
server Server? @relation(fields: [serverId], references: [id], onDelete: Cascade)
502+
503+
userProfiles UserProfile[]
504+
505+
506+
tag String
507+
icon String
508+
}
509+
510+
511+
488512
model ServerHourlyMessageCount {
489513
@@map("server_hourly_message_counts")
490514
@@ -698,6 +722,10 @@ model ServerMember {
698722
699723
answeredWelcomeQuestions AnsweredServerWelcomeQuestion[]
700724
725+
726+
727+
728+
701729
@@unique([userId, serverId])
702730
@@index([serverId])
703731
}

src/common/ClientEventNames.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ export const USER_PRESENCE_UPDATE = 'user:presence_update';
1717
export const USER_BLOCKED = 'user:blocked';
1818
export const USER_UNBLOCKED = 'user:unblocked';
1919

20+
export const USER_UPDATED_CLAN = 'user:updated_clan';
21+
2022
export const INBOX_OPENED = 'inbox:opened';
2123
export const INBOX_CLOSED = 'inbox:closed';
2224
export const NOTIFICATION_DISMISSED = 'notification:dismissed';
@@ -50,6 +52,8 @@ export const SERVER_CHANNEL_PERMISSIONS_UPDATED = 'server:channel_permissions_up
5052
export const SERVER_SCHEDULE_DELETE = 'server:schedule_delete';
5153
export const SERVER_REMOVE_SCHEDULE_DELETE = 'server:remove_schedule_delete';
5254

55+
export const SERVER_CLAN_UPDATED = 'server:clan_updated';
56+
5357
export const POST_MENTION = 'post:mention';
5458

5559
export const MESSAGE_CREATED = 'message:created';

src/common/database.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export function removeRoleIdFromServerMembers(roleId: string) {
8686
UPDATE "server_members"
8787
SET "roleIds"=(array_remove("roleIds", ${roleId}))
8888
WHERE ${roleId} = ANY("roleIds");
89-
`
89+
`,
9090
);
9191
}
9292

@@ -97,7 +97,7 @@ export function removeServerIdFromAccountOrder(accountId: string, serverId: stri
9797
UPDATE "accounts"
9898
SET "serverOrderIds"=(array_remove("serverOrderIds", ${serverId}))
9999
WHERE ${serverId} = ANY("serverOrderIds") AND "id" = ${accountId};
100-
`
100+
`,
101101
),
102102
removeServerIdFromFolders(accountId, serverId),
103103
]);
@@ -109,7 +109,7 @@ export function removeServerIdFromFolders(accountId: string, serverId: string) {
109109
UPDATE "server_folders"
110110
SET "serverIds"=(array_remove("serverIds", ${serverId}))
111111
WHERE ${serverId} = ANY("serverIds") AND "accountId" = ${accountId};
112-
`
112+
`,
113113
);
114114
}
115115

@@ -129,7 +129,7 @@ export const getPostLikesFromDeletedUsers = () => {
129129
)
130130
ORDER BY "id" ASC
131131
LIMIT 300;
132-
`
132+
`,
133133
);
134134
};
135135

src/emits/Server.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { MESSAGE_CREATED, MESSAGE_DELETED, MESSAGE_DELETED_BATCH, MESSAGE_REACTION_ADDED, MESSAGE_REACTION_REMOVED, MESSAGE_UPDATED, SERVER_CHANNEL_ORDER_UPDATED, SERVER_CHANNEL_PERMISSIONS_UPDATED, SERVER_EMOJI_ADD, SERVER_EMOJI_REMOVE, SERVER_EMOJI_UPDATE, SERVER_FOLDER_CREATED, SERVER_FOLDER_UPDATED, SERVER_JOINED, SERVER_LEFT, SERVER_MEMBER_JOINED, SERVER_MEMBER_LEFT, SERVER_MEMBER_UPDATED, SERVER_ORDER_UPDATED, SERVER_REMOVE_SCHEDULE_DELETE, SERVER_ROLE_CREATED, SERVER_ROLE_DELETED, SERVER_ROLE_ORDER_UPDATED, SERVER_ROLE_UPDATED, SERVER_SCHEDULE_DELETE, SERVER_UPDATED } from '../common/ClientEventNames';
1+
import { MESSAGE_CREATED, MESSAGE_DELETED, MESSAGE_DELETED_BATCH, MESSAGE_REACTION_ADDED, MESSAGE_REACTION_REMOVED, MESSAGE_UPDATED, SERVER_CHANNEL_ORDER_UPDATED, SERVER_CHANNEL_PERMISSIONS_UPDATED, SERVER_CLAN_UPDATED, SERVER_EMOJI_ADD, SERVER_EMOJI_REMOVE, SERVER_EMOJI_UPDATE, SERVER_FOLDER_CREATED, SERVER_FOLDER_UPDATED, SERVER_JOINED, SERVER_LEFT, SERVER_MEMBER_JOINED, SERVER_MEMBER_LEFT, SERVER_MEMBER_UPDATED, SERVER_ORDER_UPDATED, SERVER_REMOVE_SCHEDULE_DELETE, SERVER_ROLE_CREATED, SERVER_ROLE_DELETED, SERVER_ROLE_ORDER_UPDATED, SERVER_ROLE_UPDATED, SERVER_SCHEDULE_DELETE, SERVER_UPDATED } from '../common/ClientEventNames';
22
import { getIO } from '../socket/socket';
33
import { Presence, UserCache } from '../cache/UserCache';
44
import { UpdateServerOptions } from '../services/Server';
@@ -98,6 +98,11 @@ export const emitServerJoined = (opts: ServerJoinOpts) => {
9898
});
9999
};
100100

101+
export const emitServerClanUpdate = (serverId: string, clan: null | { tag: string; icon: string; serverId: string }) => {
102+
const io = getIO();
103+
io.in(serverId).emit(SERVER_CLAN_UPDATED, { clan, serverId });
104+
};
105+
101106
export const emitServerLeft = (opts: { userId?: string; serverId: string; serverDeleted?: boolean; channelIds?: string[] }) => {
102107
const io = getIO();
103108

src/routes/servers/Router.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,14 @@ import { serverChannelWebhookGetSingle } from './serverChannelWebhookGetSingle';
5656
import { serverChannelWebhookUpdate } from './serverChannelWebhookUpdate';
5757
import { serverMemberMute } from './serverMemberMute';
5858
import { serverMemberMuteRemove } from './serverMemberMuteRemove';
59+
import { serverClanUpdate } from './serverClanUpdate';
60+
import { serverClanDelete } from './serverClanDelete';
5961

6062
const ServersRouter = Router();
6163

64+
serverClanUpdate(ServersRouter);
65+
serverClanDelete(ServersRouter);
66+
6267
serverChannelWebhookUpdate(ServersRouter);
6368
serverChannelWebhookGetSingle(ServersRouter);
6469
serverChannelWebhookGet(ServersRouter);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { Request, Response, Router } from 'express';
2+
import { authenticate } from '../../middleware/authenticate';
3+
import { rateLimit } from '../../middleware/rateLimit';
4+
import { serverMemberVerification } from '../../middleware/serverMemberVerification';
5+
import { deleteClan } from '../../services/Server';
6+
7+
export function serverClanDelete(Router: Router) {
8+
Router.delete(
9+
'/servers/:serverId/clans',
10+
authenticate(),
11+
serverMemberVerification(),
12+
rateLimit({
13+
name: 'server_clan_update',
14+
restrictMS: 10000,
15+
requests: 10,
16+
}),
17+
route,
18+
);
19+
}
20+
21+
async function route(req: Request, res: Response) {
22+
const [status, error] = await deleteClan({
23+
userId: req.userCache.id,
24+
serverId: req.serverCache.id,
25+
});
26+
if (error) {
27+
return res.status(400).json(error);
28+
}
29+
res.json({ status });
30+
}

0 commit comments

Comments
 (0)