node.js - ¿Cómo consulto un arreglo en TypeORM?
Quiero crear la gestión de permisos de usuario. Uso TypeORM con PostgreSQL. Esta es la definición de la columna para los permisos dentro de la entidad de usuario:
@Column({
type: 'text',
array: true
})
permissions: UserPermission[] = [];
Este es el enumerado UserPermission:
export enum UserPermission {
APP_USER = 'APP_USER',
USER_ADMIN = 'USER_ADMIN',
SUPERADMIN = 'SUPERADMIN'
}
Quiero encontrar un usuario que tenga el permiso 'SUPERADMIN', pero no puedo encontrar el lugar correcto en la documentación o en los issues de GitHub que explique cómo hacerlo. Ya pasé más de una hora en esto y supongo que es una tarea sencilla.
¿Existe algo como "Includes" para verificar si el arreglo de permisos incluye un elemento específico y/o incluye múltiples elementos?
const user = await this.userRepository.findOne({
where: {
permissions: Includes('SUPERADMIN')
}
});
Estaría muy agradecido si alguien pudiera indicarme la página de documentación correcta :)
Editar :
Lo siguiente funciona para mí, pero creo que aún no es óptimo:
@Column('simple-json')
permissions: string[];
let user = await this.userRepository.createQueryBuilder('user')
.where('user.permissions like :permissions', { permissions: `%"${UserPermission.SUPERADMIN}"%` })
.getOne();
Respuesta #1
Como mencionó Mykhalio, puedes usar las funciones de arreglo de PostgreSQL para hacer el truco.
Agregando algunos puntos más.
- Si quieres verificar usuarios con permisos tanto de USER_ADMIN como de SUPER_ADMIN.
.where('user.permissions @> :permissions', { permissions:['USER_ADMIN', 'SUPER_ADMIN']})
- Si quieres verificar usuarios con permisos de USER_ADMIN o SUPER_ADMIN.
.where('user.permissions && :permissions', { permissions: ['USER_ADMIN', 'SUPER_ADMIN']})
Respuesta #2
también es posible buscar valores de matriz en tu celda de base de datos utilizando opciones avanzadas de búsqueda:
const found = await repo.findOne({
where: {
roles: ArrayContains([role]),
},
});
Respuesta #3
Por qué no usar este enfoque. Funciona para mí sin errores.
let roles = ['ADMIN', 'STUDENT', SECRETARY];
let user = await this.userRepository.createQueryBuilder('user')
.andWhere('user.roles IN (:...roles)')
.setParameter('roles', ...roles).count()
