change user model to login routine

This commit is contained in:
Julian Krauser 2025-05-03 09:09:52 +02:00
parent c35b99e0c4
commit 03a5bb3592
5 changed files with 56 additions and 3 deletions

View file

@ -55,6 +55,7 @@ import { QueryUpdatedAt1744795756230 } from "./migrations/1744795756230-QueryUpd
import { SettingsFromEnv1745059495808 } from "./migrations/1745059495808-settingsFromEnv"; import { SettingsFromEnv1745059495808 } from "./migrations/1745059495808-settingsFromEnv";
import { MemberCreatedAt1746006549262 } from "./migrations/1746006549262-memberCreatedAt"; import { MemberCreatedAt1746006549262 } from "./migrations/1746006549262-memberCreatedAt";
import { UserLoginRoutine1746252454922 } from "./migrations/1746252454922-UserLoginRoutine"; import { UserLoginRoutine1746252454922 } from "./migrations/1746252454922-UserLoginRoutine";
import { SettingsFromEnv_SET1745059495808 } from "./migrations/1745059495808-settingsFromEnv_set";
const dataSource = new DataSource({ const dataSource = new DataSource({
type: DB_TYPE as any, type: DB_TYPE as any,
@ -119,6 +120,7 @@ const dataSource = new DataSource({
SettingsFromEnv1745059495808, SettingsFromEnv1745059495808,
SettingsFromEnv_SET1745059495808, SettingsFromEnv_SET1745059495808,
MemberCreatedAt1746006549262, MemberCreatedAt1746006549262,
UserLoginRoutine1746252454922,
], ],
migrationsRun: true, migrationsRun: true,
migrationsTransactionMode: "each", migrationsTransactionMode: "each",

View file

@ -1,6 +1,7 @@
import { Column, Entity, JoinTable, ManyToMany, OneToMany, PrimaryColumn } from "typeorm"; import { Column, Entity, JoinTable, ManyToMany, OneToMany, PrimaryColumn } from "typeorm";
import { role } from "./role"; import { role } from "./role";
import { userPermission } from "./user_permission"; import { userPermission } from "./user_permission";
import { LoginRoutineEnum } from "../../enums/loginRoutineEnum";
@Entity() @Entity()
export class user { export class user {
@ -19,11 +20,23 @@ export class user {
@Column({ type: "varchar", length: 255 }) @Column({ type: "varchar", length: 255 })
lastname: string; lastname: string;
@Column({ type: "varchar", length: 255 }) @Column({ type: "text", select: false })
secret: string; secret: string;
@Column({ type: "boolean", default: false }) @Column({
static: boolean; type: "varchar",
length: "255",
default: LoginRoutineEnum.totp,
transformer: {
to(value: LoginRoutineEnum) {
return value.toString();
},
from(value: string) {
return LoginRoutineEnum[value as keyof typeof LoginRoutineEnum];
},
},
})
routine: LoginRoutineEnum;
@Column({ type: "boolean", default: false }) @Column({ type: "boolean", default: false })
isOwner: boolean; isOwner: boolean;

View file

@ -0,0 +1,4 @@
export enum LoginRoutineEnum {
password = "password", // login with self defined password
totp = "totp", // login with totp by auth apps
}

View file

@ -7,6 +7,7 @@ import UserService from "../service/management/userService";
import DatabaseActionException from "../exceptions/databaseActionException"; import DatabaseActionException from "../exceptions/databaseActionException";
import { availableTemplates } from "../type/templateTypes"; import { availableTemplates } from "../type/templateTypes";
import SettingHelper from "./settingsHelper"; import SettingHelper from "./settingsHelper";
import { LoginRoutineEnum } from "../enums/loginRoutineEnum";
export type BackupSection = export type BackupSection =
| "member" | "member"
@ -806,6 +807,7 @@ export default abstract class BackupHelper {
let roles = await this.transactionManager.getRepository("role").find(); let roles = await this.transactionManager.getRepository("role").find();
let dataWithMappedIds = (data?.["user"] ?? []).map((u) => ({ let dataWithMappedIds = (data?.["user"] ?? []).map((u) => ({
...u, ...u,
routine: u.routine ?? LoginRoutineEnum.totp,
roles: u.roles.map((r: any) => ({ roles: u.roles.map((r: any) => ({
...r, ...r,
id: roles.find((role) => role.role == r.role)?.id ?? undefined, id: roles.find((role) => role.role == r.role)?.id ?? undefined,

View file

@ -0,0 +1,32 @@
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
import { getDefaultByORM, getTypeByORM } from "./ormHelper";
export class UserLoginRoutine1746252454922 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
let users = await queryRunner.manager.getRepository("user").find({ select: ["id", "secret"] });
await queryRunner.dropColumns("user", ["secret", "static"]);
await queryRunner.addColumns("user", [
new TableColumn({ name: "secret", ...getTypeByORM("text") }),
new TableColumn({ name: "routine", ...getTypeByORM("varchar") }),
]);
await queryRunner.manager.getRepository("user").save(users.map((u) => ({ id: u.id, secret: u.secret })));
}
public async down(queryRunner: QueryRunner): Promise<void> {
let users = await queryRunner.manager.getRepository("user").find({ select: ["id", "secret"] });
await queryRunner.dropColumn("user", "secret");
await queryRunner.addColumns("user", [
new TableColumn({ name: "secret", ...getTypeByORM("varchar") }),
new TableColumn({ name: "static", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) }),
]);
await queryRunner.manager.getRepository("user").save(users.map((u) => ({ id: u.id, secret: u.secret })));
await queryRunner.dropColumn("user", "routine");
}
}