Saltar al contenido principal

Perfiles-usuarios

Ver en Git


Perfiles de usuarios

Los usuarios pueden elegir distintos perfiles en distintas categorías.

La nueva versión de perfiles (2024-01) reemplaza la versión anterior, siendo retrocompatible. Al final de este documento se encuentra la documentación de la versión anterior.

Perfiles y categorías de perfiles

  • Se definen múltiples categorías de perfiles.
  • Se definen perfiles, y cada uno corresponde a una categoría.
  • Cada usuario podrá elegir un perfil por cada categoría.
  • Para una categoría de perfil, los usuarios sólo pueden asignar perfiles de esa categoría. Es decir que un usuario no puede elegir en la categoría X, un perfil de categoría Y.
  • No es necesario tener perfil asignado en todos las categorías.
profile_categoryprofile
variabilidad_maquinasVARIABLE
variabilidad_maquinasNO_VARIABLE
metodo_cultivoEXTENSIVO
metodo_cultivoINTENSIVO
usuariosPRODUCTOR
usuariosASESOR
usuariostexto libre

Por ejemplo un usuario puede ser EXTENSIVO VARIABLE, mientras que otro puede ser ASESOR EXTENSIVO NO_VARIABLE y otro puede no tener ningún perfil asignado.

A la fecha se definen 3 profile_category. usuarios (la categoría de la primer versión), permite que el usuario ingrese el nombre del perfil como texto libre, mientras que las otros dos categorías tienen perfiles fijos.

APIs

Get user data

GET /api/getuserdata 

Este endpoint incluye en la respuesta una key perfil con el perfil de la categoría usuarios. Se mantiene aquí por retrocompatibilidad con la versión anterior.

Obtener perfiles del usuario

GET /api/users/v2/profile 

Respuesta:

{
"code": 0,
"data": {
"profiles": [
{"profile_id": 22, "profile": "EXTENSIVO", "profile_category": "metodo_cultivo"},
{"profile_id": 2, "profile": "PRODUCTOR", "profile_category": "usuarios"}
]
}
}

Asignar perfil a un usuario

POST /api/users/v2/profile 
Body: application/json

Este endpoint intentará asignar al usuario que realiza la consulta, el perfil indicado a la categoría indicada.

  • En caso que el perfil solicitado no exista para la categoría solicitada, el endpoint devolverá error.
  • Si el usuario ya tiene un perfil asignado para esa categoría, se reemplaza.

Body:

{
"profile": "NO_VARIABLE",
"profile_category": "variabilidad_maquinas"
}

Respuesta:

{
"code": 0,
"info": "user updated"
}

Base de datos

Las categorías de perfiles se definen bajo un type Enum usuarios_perfiles_categorias.

La tabla usuarios_perfiles define los perfiles y a que categoría corresponde cada uno. Allí se encuentra el profile_id de cada perfil.

La tabla usuarios_perfiles_asignados vincula a cada usuario con un perfil por categoría de perfil, habiendo una constraint UNIQUE (id_usuario, categoria). De manera que por usuario puede haber un único perfil por categoría.

La validación de que no se asigne un perfil de una categoría X bajo una categoría Y se hace a nivel aplicación, no habiendo restricciones en la base de datos.

Agregar nuevas categorías de perfiles

Para agregar nuevas categorías de perfiles, se debe agregar al Enum de la base de datos usando:

ALTER TYPE usuarios_perfiles_categorias ADD VALUE 'nuevo_categoria';

Las categorías de perfiles están hardcodeados en el código Python por lo que será necesario agregarla también al Enum UserProfileCategories.

Notar que postgresql no permite eliminar valores del Enum una vez agregados. En caso de querer eliminar un valor, es necesario crear una nueva categoría con los valores finales y reemplazar el tipo de la columna de ambas tablas.

Versión anterior

La tabla usuarios tiene la columna id_perfil que apunta a la tabla usuarios_perfiles.

esta columna queda deprecada con la nueva version

Hay dos perfiles básicos, 'PRODUCTOR' y 'ASESOR'.

La columna id_perfil de la tabla usuarios estará primeramente en NULL. El front permitirá elegir entre 'PRODUCTOR' y 'ASESOR' y una opción 'OTRO'. Ese 'otro' es un texto libre.

Por lo tanto el valor del perfil puede ser

  • PRODUCTOR
  • ASESOR
  • texto libre

APIS

Get user data

Ahora incluye el campo perfil con su valor.

Modificar perfil

/api/modificaruserdata 

Body application/form
perfil = XXX

Así como se envía nombre y apellido, se puede enviar un nuevo campo perfil

El valor de perfil puede ser

  • PRODUCTOR para indicar productor
  • ASESOR para indicar productor
  • cualquier otro valor se creará en la Base de datos como un nuevo perfil. HASTA 256 CARACTERES

Nota: los valores PRODUCTOR y ASESOR se le deben mostrar al usuario traducidos, pero la api debe recibir esos valores.

Para evitar duplicados por mayúsuclas, se verifica si existe el valor case insensitive.

La respuesta es un JSON. Ejemplo:

    {
"res": "Ok",
"code": 0,
"info": "Datos de usuario modificados satisfactoriamente",
"data": {"perfil": "PRODUCTOR"}
}

NOTA: El campo data es enviado sólo si se modifico el perfil.

Script Base de datos


create table usuarios_perfiles (
id_perfil serial not null PRIMARY KEY,
perfil varchar(256)
);

alter table usuarios add column id_perfil int4 null default null references usuarios_perfiles(id_perfil);

insert into usuarios_perfiles (id_perfil, perfil) values (default,'PRODUCTOR'),(default,'ASESOR');