diff --git "a/src/api/routes/guilds/\043guild_id/invites.ts" "b/src/api/routes/guilds/\043guild_id/invites.ts" index a0ffa3f..f190b02 100644 --- "a/src/api/routes/guilds/\043guild_id/invites.ts" +++ "b/src/api/routes/guilds/\043guild_id/invites.ts" @@ -40,6 +40,12 @@ 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 4bf43b9..9dbdd04 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 @@ @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);