Usuarios del Proyecto

Administre el acceso y los permisos de los usuarios para los proyectos. Agregue usuarios a proyectos, actualice sus niveles de permiso y elimine el acceso cuando sea necesario.

Niveles de Permiso

Nivel Descripción
Propietario (isOwner: true) Control completo: puede modificar la configuración del proyecto, administrar usuarios, eliminar el proyecto
Miembro (isOwner: false) Puede ver y trabajar con el contenido del proyecto, no puede administrar usuarios ni eliminar

Listar Usuarios del Proyecto

GET /api/{tenantId}/project/{projectId}/users

Recupera todos los usuarios con acceso al proyecto.

Parámetros de Ruta

Parámetro Tipo Obligatorio Descripción
tenantId GUID Identificador del tenant
projectId GUID Identificador del proyecto

Respuesta (200 OK)

{
  "users": [
    {
      "permissionId": "11111111-1111-1111-1111-111111111111",
      "userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "email": "john.smith@example.com",
      "displayName": "John Smith",
      "isOwner": true,
      "dateAssigned": "2024-01-15T10:30:00Z"
    },
    {
      "permissionId": "22222222-2222-2222-2222-222222222222",
      "userId": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
      "email": "jane.doe@example.com",
      "displayName": "Jane Doe",
      "isOwner": false,
      "dateAssigned": "2024-01-20T14:00:00Z"
    }
  ],
  "totalCount": 2
}

Campos de Permiso de Usuario

Campo Tipo Descripción
permissionId GUID ID único del registro de permiso
userId GUID Identificador del usuario
email cadena Dirección de correo electrónico del usuario
displayName cadena Nombre para mostrar del usuario
isOwner booleano Indica si el usuario es propietario del proyecto
dateAssigned datetime Fecha en que se concedió el acceso

Agregar Usuario al Proyecto

POST /api/{tenantId}/project/{projectId}/users/{userId}

Agrega un usuario al proyecto con los permisos especificados.

Parámetros de Ruta

Parámetro Tipo Obligatorio Descripción
tenantId GUID Identificador del tenant
projectId GUID Identificador del proyecto
userId GUID Usuario a agregar

Cuerpo de la Solicitud (Opcional)

{
  "isOwner": false
}

Campos de la Solicitud

Campo Tipo Predeterminado Descripción
isOwner booleano false Conceder permisos de propietario

Respuesta (201 Created)

{
  "message": "User added to project successfully"
}

Respuestas de Error

Conflicto (409):

{
  "error": "User is already a member of this project"
}

No encontrado (404):

{
  "error": "User not found with ID '{userId}'"
}

Actualizar Permiso de Usuario

PUT /api/{tenantId}/project/{projectId}/users/{userId}

Actualiza el nivel de permiso de un usuario en el proyecto.

Parámetros de Ruta

Parámetro Tipo Obligatorio Descripción
tenantId GUID Identificador del tenant
projectId GUID Identificador del proyecto
userId GUID Usuario a actualizar

Cuerpo de la Solicitud

{
  "isOwner": true
}

Respuesta (200 OK)

{
  "message": "User permission updated successfully"
}

Eliminar Usuario del Proyecto

DELETE /api/{tenantId}/project/{projectId}/users/{userId}

Elimina el acceso de un usuario al proyecto.

Parámetros de Ruta

Parámetro Tipo Obligatorio Descripción
tenantId GUID Identificador del tenant
projectId GUID Identificador del proyecto
userId GUID Usuario a eliminar

Respuesta (200 OK)

{
  "message": "User removed from project successfully"
}

Respuestas de Error

No encontrado (404):

{
  "error": "User is not a member of this project"
}

Ejemplos de Implementación

cURL

# Listar usuarios del proyecto
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/users" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Agregar usuario al proyecto (como miembro)
curl -X POST "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/users/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"isOwner": false}'

# Agregar usuario como propietario
curl -X POST "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/users/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"isOwner": true}'

# Promover usuario a propietario
curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/users/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"isOwner": true}'

# Eliminar usuario del proyecto
curl -X DELETE "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/users/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Python

import requests

TENANT_ID = '12345678-1234-1234-1234-123456789012'
BASE_URL = 'https://your-mindzie-instance.com'

class ProjectUserManager:
    def __init__(self, token):
        self.headers = {
            'Authorization': f'Bearer {token}',
            'Content-Type': 'application/json'
        }

    def list_users(self, project_id):
        """Listado de todos los usuarios con acceso al proyecto."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/users'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def add_user(self, project_id, user_id, is_owner=False):
        """Agregar un usuario al proyecto."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/users/{user_id}'
        payload = {'isOwner': is_owner}
        response = requests.post(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def update_permission(self, project_id, user_id, is_owner):
        """Actualizar el nivel de permiso de un usuario."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/users/{user_id}'
        payload = {'isOwner': is_owner}
        response = requests.put(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def remove_user(self, project_id, user_id):
        """Eliminar un usuario del proyecto."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/users/{user_id}'
        response = requests.delete(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

# Uso
manager = ProjectUserManager('your-auth-token')
project_id = '87654321-4321-4321-4321-210987654321'

# Listar usuarios actuales
result = manager.list_users(project_id)
print(f"El proyecto tiene {result['totalCount']} usuarios:")

for user in result['users']:
    role = 'Propietario' if user['isOwner'] else 'Miembro'
    print(f"  - {user['displayName']} ({user['email']}) - {role}")

# Agregar un nuevo usuario como miembro
new_user_id = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'
manager.add_user(project_id, new_user_id, is_owner=False)
print(f"Usuario {new_user_id} agregado como miembro")

# Promover usuario a propietario
manager.update_permission(project_id, new_user_id, is_owner=True)
print(f"Usuario {new_user_id} promovido a propietario")

# Eliminar usuario
manager.remove_user(project_id, new_user_id)
print(f"Usuario {new_user_id} eliminado")

JavaScript/Node.js

const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const BASE_URL = 'https://your-mindzie-instance.com';

class ProjectUserManager {
  constructor(token) {
    this.headers = {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    };
  }

  async listUsers(projectId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}/users`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Fallo: ${response.status}`);
    return await response.json();
  }

  async addUser(projectId, userId, isOwner = false) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}/users/${userId}`;
    const response = await fetch(url, {
      method: 'POST',
      headers: this.headers,
      body: JSON.stringify({ isOwner })
    });
    if (!response.ok) throw new Error(`Fallo: ${response.status}`);
    return await response.json();
  }

  async updatePermission(projectId, userId, isOwner) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}/users/${userId}`;
    const response = await fetch(url, {
      method: 'PUT',
      headers: this.headers,
      body: JSON.stringify({ isOwner })
    });
    if (!response.ok) throw new Error(`Fallo: ${response.status}`);
    return await response.json();
  }

  async removeUser(projectId, userId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}/users/${userId}`;
    const response = await fetch(url, {
      method: 'DELETE',
      headers: this.headers
    });
    if (!response.ok) throw new Error(`Fallo: ${response.status}`);
    return await response.json();
  }
}

// Uso
const manager = new ProjectUserManager('your-auth-token');
const projectId = '87654321-4321-4321-4321-210987654321';

// Listar usuarios
const users = await manager.listUsers(projectId);
console.log(`El proyecto tiene ${users.totalCount} usuarios`);

users.users.forEach(user => {
  const role = user.isOwner ? 'Propietario' : 'Miembro';
  console.log(`  - ${user.displayName} (${role})`);
});

// Agregar usuario como miembro, luego promover a propietario
await manager.addUser(projectId, 'user-id-here', false);
await manager.updatePermission(projectId, 'user-id-here', true);

Mejores Prácticas

  1. Limitar Propietarios: Otorgue acceso de propietario solo a los usuarios que necesitan administrar el proyecto
  2. Auditar Accesos: Revise regularmente los usuarios del proyecto y elimine accesos innecesarios
  3. Usar Miembros para Analistas: Los analistas regulares deben ser miembros, no propietarios
  4. Documentar Cambios: Registre los cambios de permiso para fines de auditoría