diff --git a/src/api/routes/guilds/#guild_id/invites.ts b/src/api/routes/guilds/#guild_id/invites.ts index a0ffa3f4..f190b021 100644 --- a/src/api/routes/guilds/#guild_id/invites.ts +++ b/src/api/routes/guilds/#guild_id/invites.ts @@ -40,6 +40,12 @@ router.get( relations: PublicInviteRelation, }); + await invites + .filter((i) => i.isExpired()) + .forEachAsync(async (i) => { + await Invite.delete({ code: i.code }); + }); + return res.json(invites); }, ); diff --git a/src/util/entities/Invite.ts b/src/util/entities/Invite.ts index 4bf43b94..9dbdd04f 100644 --- a/src/util/entities/Invite.ts +++ b/src/util/entities/Invite.ts @@ -16,7 +16,7 @@ along with this program. If not, see . */ -import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm"; +import { AfterLoad, Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm"; import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass"; import { Channel } from "./Channel"; import { Guild } from "./Guild"; @@ -104,10 +104,19 @@ export class Invite extends BaseClassWithoutId { @Column() flags: number; + isExpired() { + if (this.max_age !== 0 && this.expires_at && this.expires_at < new Date()) return true; + if (this.max_uses !== 0 && this.uses >= this.max_uses) return true; + return false; + } + static async joinGuild(user_id: string, code: string) { const invite = await Invite.findOneOrFail({ where: { code } }); - if (invite.uses++ >= invite.max_uses && invite.max_uses !== 0) + if (invite.isExpired()) { await Invite.delete({ code }); + throw new Error("Invite is expired"); + } + if (invite.uses++ >= invite.max_uses && invite.max_uses !== 0) await Invite.delete({ code }); else await invite.save(); await Member.addToGuild(user_id, invite.guild_id);