diff --git a/util/src/entities/Guild.ts b/util/src/entities/Guild.ts
index 9ca4b1e4..e6a93824 100644
--- a/util/src/entities/Guild.ts
+++ b/util/src/entities/Guild.ts
@@ -158,7 +158,7 @@ export class Guild extends BaseClass {
vanity_url_code?: string;
@JoinColumn({ name: "vanity_url_code" })
- @OneToOne(() => Invite, (invite: Invite) => invite.code)
+ @ManyToOne(() => Invite)
vanity_url?: Invite;
@Column({ nullable: true })
diff --git a/util/src/entities/Message.ts b/util/src/entities/Message.ts
index 0c41a2eb..43d0f9d0 100644
--- a/util/src/entities/Message.ts
+++ b/util/src/entities/Message.ts
@@ -148,8 +148,8 @@ export class Message extends BaseClass {
party_id: string;
};
- @Column({ type: "bigint", nullable: true })
- flags?: bigint;
+ @Column({ nullable: true })
+ flags?: string;
@RelationId((message: Message) => message.stickers)
sticker_ids: string[];
diff --git a/util/src/entities/RateLimit.ts b/util/src/entities/RateLimit.ts
index 3ac35df3..49af0416 100644
--- a/util/src/entities/RateLimit.ts
+++ b/util/src/entities/RateLimit.ts
@@ -7,12 +7,8 @@ export class RateLimit extends BaseClass {
@Column()
id: "global" | "error" | string; // channel_239842397 | guild_238927349823 | webhook_238923423498
- @RelationId((rate_limit: RateLimit) => rate_limit.user)
- user_id: string;
-
- @JoinColumn({ name: "user_id" })
- @ManyToOne(() => User, (user) => user.id)
- user: User;
+ @Column() // no relation as it also
+ executor_id: string;
@Column()
hits: number;
diff --git a/util/src/entities/Role.ts b/util/src/entities/Role.ts
index 7c6ce64e..ddae7e40 100644
--- a/util/src/entities/Role.ts
+++ b/util/src/entities/Role.ts
@@ -1,4 +1,5 @@
import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
+
import { BaseClass } from "./BaseClass";
import { Guild } from "./Guild";
diff --git a/util/src/entities/User.ts b/util/src/entities/User.ts
index c5f870fa..73afba67 100644
--- a/util/src/entities/User.ts
+++ b/util/src/entities/User.ts
@@ -49,7 +49,7 @@ export class User extends BaseClass {
avatar?: string; // hash of the user avatar
@Column({ nullable: true })
- accent_color?: number = 0; // banner color of user
+ accent_color?: number; // banner color of user
@Column({ nullable: true })
banner?: string; // hash of the user banner
@@ -58,52 +58,52 @@ export class User extends BaseClass {
phone?: string; // phone number of the user
@Column()
- desktop: boolean = false; // if the user has desktop app installed
+ desktop: boolean; // if the user has desktop app installed
@Column()
- mobile: boolean = false; // if the user has mobile app installed
+ mobile: boolean; // if the user has mobile app installed
@Column()
- premium: boolean = false; // if user bought nitro
+ premium: boolean; // if user bought nitro
@Column()
- premium_type: number = 0; // nitro level
+ premium_type: number; // nitro level
@Column()
- bot: boolean = false; // if user is bot
+ bot: boolean; // if user is bot
@Column()
- bio: string = ""; // short description of the user (max 190 chars -> should be configurable)
+ bio: string; // short description of the user (max 190 chars -> should be configurable)
@Column()
- system: boolean = false; // shouldn't be used, the api sents this field type true, if the generated message comes from a system generated author
+ system: boolean; // shouldn't be used, the api sents this field type true, if the generated message comes from a system generated author
@Column()
- nsfw_allowed: boolean = false; // if the user is older than 18 (resp. Config)
+ nsfw_allowed: boolean; // if the user is older than 18 (resp. Config)
@Column()
- mfa_enabled: boolean = false; // if multi factor authentication is enabled
+ mfa_enabled: boolean; // if multi factor authentication is enabled
@Column()
created_at: Date = new Date(); // registration date
@Column()
- verified: boolean = false; // if the user is offically verified
+ verified: boolean; // if the user is offically verified
@Column()
- disabled: boolean = false; // if the account is disabled
+ disabled: boolean; // if the account is disabled
@Column()
- deleted: boolean = false; // if the user was deleted
+ deleted: boolean; // if the user was deleted
@Column({ nullable: true })
email?: string; // email of the user
- @Column({ type: "bigint" })
- flags: bigint = BigInt(0); // UserFlags
+ @Column()
+ flags: string; // UserFlags
- @Column({ type: "bigint" })
- public_flags: bigint = BigInt(0);
+ @Column()
+ public_flags: string;
@RelationId((user: User) => user.relationships)
relationship_ids: string[]; // array of guild ids the user is part of
@@ -123,13 +123,13 @@ export class User extends BaseClass {
data: {
valid_tokens_since: Date; // all tokens with a previous issue date are invalid
hash?: string; // hash of the password, salt is saved in password (bcrypt)
- } = { valid_tokens_since: new Date() };
+ };
@Column({ type: "simple-array" })
fingerprints: string[] = []; // array of fingerprints -> used to prevent multiple accounts
@Column({ type: "simple-json" })
- settings: UserSettings = defaultSettings;
+ settings: UserSettings;
static async getPublicUser(user_id: string, opts?: FindOneOptions<User>) {
const user = await User.findOne(user_id, {
diff --git a/util/src/entities/index.ts b/util/src/entities/index.ts
index b9e361c1..e0246a10 100644
--- a/util/src/entities/index.ts
+++ b/util/src/entities/index.ts
@@ -14,6 +14,7 @@ export * from "./RateLimit";
export * from "./ReadState";
export * from "./Relationship";
export * from "./Role";
+export * from "./Sticker";
export * from "./Team";
export * from "./TeamMember";
export * from "./Template";
diff --git a/util/src/interfaces/Event.ts b/util/src/interfaces/Event.ts
index bab6f4dc..e855095c 100644
--- a/util/src/interfaces/Event.ts
+++ b/util/src/interfaces/Event.ts
@@ -515,4 +515,4 @@ export type EVENT =
| "RELATIONSHIP_REMOVE"
| CUSTOMEVENTS;
-export type CUSTOMEVENTS = "INVALIDATED";
+export type CUSTOMEVENTS = "INVALIDATED" | "RATELIMIT";
diff --git a/util/src/util/Config.ts b/util/src/util/Config.ts
index f8574f38..f16921bd 100644
--- a/util/src/util/Config.ts
+++ b/util/src/util/Config.ts
@@ -6,6 +6,7 @@ var config: ConfigEntity;
export const Config = {
init: async function init() {
+ if (config) return config;
config = new ConfigEntity({}, { id: "0" });
return this.set((config.value || {}).merge(DefaultConfigOptions));
},
@@ -13,7 +14,8 @@ export const Config = {
return config.value as ConfigValue;
},
set: function set(val: any) {
- config.value = val.merge(config.value);
+ if (!config) return;
+ config.value = val.merge(config?.value || {});
return config.save();
},
};
diff --git a/util/src/util/Database.ts b/util/src/util/Database.ts
index f49fb04c..c22d8abd 100644
--- a/util/src/util/Database.ts
+++ b/util/src/util/Database.ts
@@ -1,5 +1,5 @@
import "reflect-metadata";
-import { Connection, createConnection } from "typeorm";
+import { Connection, createConnection, ValueTransformer } from "typeorm";
import * as Models from "../entities";
// UUID extension option is only supported with postgres
@@ -14,10 +14,10 @@ export function initDatabase() {
console.log("[Database] connecting ...");
// @ts-ignore
promise = createConnection({
- // type: "sqlite",
- // database: "database.db",
- type: "postgres",
- url: "postgres://fosscord:wb94SmuURM2Syv&@localhost/fosscord",
+ type: "sqlite",
+ database: "database.db",
+ // type: "postgres",
+ // url: "postgres://fosscord:wb94SmuURM2Syv&@localhost/fosscord",
//
entities: Object.values(Models).filter((x) => x.constructor.name !== "Object"),
synchronize: true,
@@ -25,6 +25,8 @@ export function initDatabase() {
cache: {
duration: 1000 * 3, // cache all find queries for 3 seconds
},
+ bigNumberStrings: false,
+ supportBigNumbers: true,
});
promise.then((connection) => {
diff --git a/util/src/util/checkToken.ts b/util/src/util/checkToken.ts
index 1e203006..8415e8c0 100644
--- a/util/src/util/checkToken.ts
+++ b/util/src/util/checkToken.ts
@@ -12,7 +12,8 @@ export function checkToken(token: string, jwtSecret: string): Promise<any> {
const user = await User.findOne({ id: decoded.id }, { select: ["data", "bot", "disabled", "deleted"] });
if (!user) return rej("Invalid Token");
// we need to round it to seconds as it saved as seconds in jwt iat and valid_tokens_since is stored in milliseconds
- if (decoded.iat * 1000 < user.data.valid_tokens_since.setSeconds(0, 0)) return rej("Invalid Token");
+ if (decoded.iat * 1000 < new Date(user.data.valid_tokens_since).setSeconds(0, 0))
+ return rej("Invalid Token");
if (user.disabled) return rej("User disabled");
if (user.deleted) return rej("User not found");
|