diff --git a/util/src/entities/User.ts b/src/util/entities/User.ts
index 35aeea52..84a8a674 100644
--- a/util/src/entities/User.ts
+++ b/src/util/entities/User.ts
@@ -1,4 +1,4 @@
-import { Column, Entity, FindOneOptions, JoinColumn, OneToMany } from "typeorm";
+import { BeforeInsert, BeforeUpdate, Column, Entity, FindOneOptions, JoinColumn, OneToMany } from "typeorm";
import { BaseClass } from "./BaseClass";
import { BitField } from "../util/BitField";
import { Relationship } from "./Relationship";
@@ -59,23 +59,9 @@ export class User extends BaseClass {
@Column()
username: string; // username max length 32, min 2 (should be configurable)
- setUsername(val: string) {
- if (BannedWords.find(val)) throw FieldErrors({ username: { message: "Bad username", code: "INVALID_USERNAME" } });
- this.username = val;
- }
-
@Column()
discriminator: string; // opaque string: 4 digits on discord.com
- setDiscriminator(val: string) {
- const number = Number(val);
- if (val.length > 4) throw new Error("invalid discriminator");
- if (isNaN(number)) throw new Error("invalid discriminator");
- if (number <= 0 || number >= 10000) throw new Error("discriminator must be between 1 and 9999");
- val = Number(val).toString();
- this.discriminator = val.toString().padStart(4, "0");
- }
-
@Column({ nullable: true })
avatar?: string; // hash of the user avatar
@@ -139,13 +125,6 @@ export class User extends BaseClass {
@Column({ nullable: true, select: false })
email?: string; // email of the user
- setEmail(val?: string) {
- val = adjustEmail(val);
- if (!val) throw FieldErrors({ email: { message: "Invalid email", code: "EMAIL_INVALID" } });
- if (!val.match(/([a-z\d.-]{3,})@([a-z\d.-]+).([a-z]{2,})/g)) throw FieldErrors({ email: { message: "Invalid email", code: "EMAIL_INVALID" } });
- this.email = val;
- }
-
@Column()
flags: string; // UserFlags
@@ -194,6 +173,22 @@ export class User extends BaseClass {
@Column({ type: "simple-json", select: false })
extended_settings: string;
+ @BeforeUpdate()
+ @BeforeInsert()
+ validate() {
+ this.email = adjustEmail(this.email);
+ if (!this.email) throw FieldErrors({ email: { message: "Invalid email", code: "EMAIL_INVALID" } });
+ if (!this.email.match(/([a-z\d.-]{3,})@([a-z\d.-]+).([a-z]{2,})/g)) throw FieldErrors({ email: { message: "Invalid email", code: "EMAIL_INVALID" } });
+
+ const discrim = Number(this.discriminator);
+ if (this.discriminator.length > 4) throw FieldErrors({ email: { message: "Discriminator cannot be more than 4 digits.", code: "DISCRIMINATOR_INVALID" } });
+ if (isNaN(discrim)) throw FieldErrors({ email: { message: "Discriminator must be a number.", code: "DISCRIMINATOR_INVALID" } });
+ if (discrim <= 0 || discrim >= 10000) throw FieldErrors({ email: { message: "Discriminator must be a number.", code: "DISCRIMINATOR_INVALID" } });
+ this.discriminator = discrim.toString().padStart(4, "0");
+
+ if (BannedWords.find(this.username)) throw FieldErrors({ username: { message: "Bad username", code: "INVALID_USERNAME" } });
+ }
+
toPublicUser() {
const user: any = {};
PublicUserProjection.forEach((x) => {
@@ -203,13 +198,12 @@ export class User extends BaseClass {
}
static async getPublicUser(user_id: string, opts?: FindOneOptions<User>) {
- return await User.findOneOrFail(
- { id: user_id },
- {
- ...opts,
- select: [...PublicUserProjection, ...(opts?.select || [])],
- }
- );
+ return await User.findOneOrFail({
+ where: { id: user_id },
+ ...opts,
+ //@ts-ignore
+ select: [...PublicUserProjection, ...(opts?.select || [])], // TODO: fix
+ });
}
private static async generateDiscriminator(username: string): Promise<string | undefined> {
@@ -273,7 +267,7 @@ export class User extends BaseClass {
// if nsfw_allowed is null/undefined it'll require date_of_birth to set it to true/false
const language = req.language === "en" ? "en-US" : req.language || "en-US";
- const user = new User({
+ const user = User.create({
created_at: new Date(),
username: username,
discriminator,
@@ -293,7 +287,7 @@ export class User extends BaseClass {
email: email,
rights: Config.get().security.defaultRights,
nsfw_allowed: true, // TODO: depending on age
- public_flags: "0",
+ public_flags: 0,
flags: "0", // TODO: generate
data: {
hash: password,
@@ -302,9 +296,8 @@ export class User extends BaseClass {
settings: { ...defaultSettings, locale: language },
purchased_flags: 5, // TODO: idk what the values for this are
premium_usage_flags: 2, // TODO: idk what the values for this are
- extended_settings: {},
+ extended_settings: "", // TODO: was {}
fingerprints: [],
- notes: {},
});
await user.save();
|