Have got error 'Cannot read properties of undefined (reading 'joinColumns')' How to implement: user can have only one assigned role with permissions to resources?
I used sequilize before, in typeorm I'm newbee
user_roles table entity:
@Entity({ name: 'user_roles' })
export class UserRoleEnitity extends DateAudit implements IUserRole {
@Column('varchar')
name: string;
@Column('varchar', {
nullable: true,
})
description?: string;
@Column('boolean', {
name: 'is_active',
default: false
})
isActive?: boolean;
@OneToMany(() => RolePermissionsEnitity, permission => permission.id)
permissions: IUserRolePermission[];
}
and users entity:
@Entity({ name: 'users' })
export class UserEnitity extends DateAudit implements IUser {
@JoinColumn({ name: 'role_id' })
roleId: string;
@OneToMany(() => UserRoleEnitity, role => role.id)
role: UserRoleEnitity;
@Column('varchar', {
unique: true,
})
username: string;
@Column('varchar')
password: string;
@Column('varchar', {
nullable: true,
})
email?: string;
@Column('varchar', {
name: 'mobile_number',
nullable: true,
})
modileNumber?: string;
@Column('varchar', {
nullable: true,
})
name?: string;
@Column('varchar', {
nullable: true
})
position?: string;
@Column({
name: 'is_verified',
default: true
})
isVerified?: boolean;
@Column('timestamp', {
name: 'password_modified_at',
default: new Date()
})
passwordModifiedAt?: Date;
}
and role_permissions
@Entity({ name: 'user_role_permissions' })
export class RolePermissionsEnitity extends DateAudit implements IUserRolePermission {
@JoinColumn({ name: 'role_id' })
roleId: string;
@ManyToOne(() => UserRoleEnitity)
role: IUserRole;
@Column({
type: 'enum',
enum: Actions,
default: Actions.READ
})
action: Actions;
@JoinColumn({ name: 'resource_id' })
resourceId: string;
@ManyToOne(() => ResourceEntity, resource => resource.id)
resource: IResource;
}
When i query repository like this:
const userEntity = await this._userRepository.findOne({
where: {
username,
},
relations: ['role']
});
Your parent entity should not refer to an ID, you should have a relation to a field that defines your user entity. like this :
UsersRoleEntity
@OneToMany(() => RolePermissionsEnitity, permission => permission.role)
permissions: IUserRolePermission[];
UsersEntity
@OneToMany(() => UserRoleEnitity, role => role.id)
role: UserRoleEnitity;
You don't need to use JoinColumn() in ManyToOne and OneToMany relations.
You can find more information here: