import * as bcrypt from "bcrypt"; import { MobilettoOrmError, MobilettoOrmFindOpts, MobilettoOrmIdArg, MobilettoOrmObject, MobilettoOrmRepository } from "mobiletto-orm"; import { AccountType, AccountTypeDef } from "yuebing-model"; import { ybRepo } from "~/server/utils/system"; import { bcryptRounds } from "~/server/utils/config"; import {MobilettoOrmPurgeOpts, MobilettoOrmPurgeResults} from "mobiletto-orm-typedef"; export type AccountRepositoryType = MobilettoOrmRepository & { findByUsernameOrEmail: (usernameOrEmail: string, opts?: MobilettoOrmFindOpts) => Promise; }; const ServerAccountTypeDef = AccountTypeDef.extend({ fields: { password: { normalize: async (v: unknown): Promise => await bcrypt.hash(`${v}`, await bcryptRounds()), }, }, }); export const accountRepository = (): AccountRepositoryType => { const baseRepo = ybRepo(ServerAccountTypeDef); return { ...baseRepo, findByUsernameOrEmail: async ( usernameOrEmail: string, opts?: MobilettoOrmFindOpts, ): Promise => { try { return await (usernameOrEmail.includes("@") ? baseRepo.safeFindFirstBy("email", usernameOrEmail, opts) : baseRepo.safeFindFirstBy("username", usernameOrEmail, opts)); } catch (e) { throw new MobilettoOrmError(`findByUsernameOrEmail: ${e}`); } }, }; };