Sainan 3bcac1459b
Some checks failed
Build / build (push) Has been cancelled
Build Docker image / docker (push) Has been cancelled
feat: track LastLogin to provide it for friends & clan members (#2013)
Reviewed-on: #2013
Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com>
Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
2025-05-08 08:20:45 -07:00

57 lines
2.0 KiB
TypeScript

import { IAccountCreation } from "@/src/types/customTypes";
import { IDatabaseAccountRequiredFields } from "@/src/types/loginTypes";
import crypto from "crypto";
import { isString, parseEmail, parseString } from "../general";
const getWhirlpoolHash = (rawPassword: string): string => {
const whirlpool = crypto.createHash("whirlpool");
const data = whirlpool.update(rawPassword, "utf8");
const hash = data.digest("hex");
return hash;
};
const parsePassword = (passwordCandidate: unknown): string => {
// a different function could be called that checks whether the password has a certain shape
if (!isString(passwordCandidate)) {
throw new Error("incorrect password format");
}
return passwordCandidate;
};
const toAccountCreation = (accountCreation: unknown): IAccountCreation => {
if (!accountCreation || typeof accountCreation !== "object") {
throw new Error("incorrect or missing account creation data");
}
if (
"email" in accountCreation &&
"password" in accountCreation &&
"DisplayName" in accountCreation &&
"CountryCode" in accountCreation
) {
const rawPassword = parsePassword(accountCreation.password);
return {
email: parseEmail(accountCreation.email),
password: getWhirlpoolHash(rawPassword),
CountryCode: parseString(accountCreation.CountryCode),
DisplayName: parseString(accountCreation.DisplayName)
};
}
throw new Error("incorrect account creation data: incorrect properties");
};
const toDatabaseAccount = (createAccount: IAccountCreation): IDatabaseAccountRequiredFields => {
return {
...createAccount,
ClientType: "",
ConsentNeeded: false,
CrossPlatformAllowed: true,
ForceLogoutVersion: 0,
TrackedSettings: [],
Nonce: 0,
LastLogin: new Date()
} satisfies IDatabaseAccountRequiredFields;
};
export { toDatabaseAccount, toAccountCreation as toCreateAccount };