Tengo una función que requiere que el usuario sea propietario o administrador. Algunos comandos solo están disponibles para los propietarios y no para los administradores, pero los propietarios también pueden ejecutar comandos de administrador.

Me parece que solo estoy repitiendo el mismo código para ambas partes. ¿Hay alguna manera de consolidar esto para que no viole la regla de repetirme?

Aquí hay un esquema general de lo que tengo:

request(checkPermissionRequest, function (error, response, body) {
    // Determine who is allowed to run the script
    switch (body[0].permission) {
        // Owner
        case 0:
            if (isOwner(user)) {
            // Script code
            }
            break;
        // Admin
        case 1:
            if (isOwner(user) || isAdmin(user)) {
                // Script code
            }
            break;
    }
});

Actualizar

Puedo ver cómo mi explicación anterior ha causado cierta confusión, así que intentaré aclararla. Hay varios scripts disponibles y algunos son para el propietario y otros para administradores (que también pueden ser ejecutados por el propietario). Estos permisos se guardan en una base de datos y los obtengo haciendo una solicitud. Es por eso que no puedo configurar cosas para propietarios y cosas para administradores y propietarios porque no sé qué permiso tiene el script hasta que obtengo el resultado de la base de datos. Estos permisos son establecidos por los propietarios y no puedo hacer un seguimiento de ellos. Modifiqué el código para intentar mostrar más claridad.

0
Mr.Smithyyy 30 oct. 2017 a las 19:22

3 respuestas

La mejor respuesta

La forma en que ha diseñado sus scripts, sus niveles de permisos están representados por enteros. Usemos eso para nuestra ventaja.

Definamos una función auxiliar como esta:

function getUserPermissions(user) {
    if(isOwner(user) return 0;
    if(isAdmin(user) return 1;
    return 2; // or some arbitrarily high value- heck, even Number.MAX_SAFE_INTEGER
}

Luego, en lugar de necesitar un interruptor y un montón de declaraciones if, simplemente puede hacer algo como esto:

request(checkPermissionRequest, function (error, response, body) {
    // Determine who is allowed to run the script
    if(getUserPermissions(user) < parseInt(body[0].permission) {
        // do the script
    }
});

Si sigue este patrón, también podría considerar cambiar el 0 y el 1, si puede, de modo que un valor numérico más alto indique un mayor nivel de permisos, aunque solo sea por la legibilidad, ya que permitiría un -1 valor para indicar a alguien sin permisos. En ese caso, desearía cambiar la condición if para verificar getUserPermissions(user) > parseInt(body[0].permission en lugar de <.

Por otro lado, si permanece con la opción < ligeramente menos legible, eso permite agregar otros niveles de permiso con menos acceso que el administrador como 3 y así sucesivamente, sin tener que incrementar el propietario existente y niveles de administrador.

1
Sam Hanley 30 oct. 2017 a las 19:15

Puede anidar el if y simplemente excluir 'admin' del primer fragmento de datos.

if (isOwner(user) || isAdmin(user)) { 
    //some permissions for both
    if(isOwner(user)) { 
        //more permissions just for owner 
    }
}
0
1stthomas 30 oct. 2017 a las 16:53
if (isOwner(user) || (isAdmin(user) && script.permission == 1)) {
    // Script code
}
0
Jermain Luong 30 oct. 2017 a las 16:33