Перейти к основному содержимому

Пользователь (User)

Поле типа Пользователь используется для ссылки на пользователей системы авторизации EMD Cloud.

Основные характеристики​

  • Тип данных: Ссылка на запись пользователя
  • Источник: Коллекция пользователей системы авторизации
  • Режимы: Одиночный выбор или множественный выбор
  • Автозаполнение: Может автоматически заполняться текущим пользователем
  • Отображение: Аватар, имя, email

Настройки поля​

При создании поля типа "Пользователь" доступны следующие настройки:

  • Название поля: Отображаемое имя поля
  • Системное имя: Уникальный идентификатор для API
  • Описание: Подсказка для пользователей
  • Обязательное поле: Требовать выбора пользователя
  • Множественный выбор: Разрешить выбор нескольких пользователей
  • Автозаполнение: Автоматически устанавливать текущего пользователя
  • Фильтр пользователей: Ограничение по ролям или группам

Примеры использования​

Автор записи​

{
"name": "created_by",
"type": "user",
"required": true,
"auto": "current_user",
"readonly": true
}

Ответственный​

{
"name": "assignee",
"type": "user",
"required": false
}

Команда проекта​

{
"name": "team_members",
"type": "user",
"multiple": true
}

Утверждающий​

{
"name": "approved_by",
"type": "user",
"filterByRole": ["admin", "manager"]
}

Работа через API​

Создание записи с текущим пользователем​

const record = await emd.database.collection('tasks').create({
title: 'Новая задача',
created_by: emd.auth.currentUser.id
});

Создание с выбранным пользователем​

const record = await emd.database.collection('tasks').create({
title: 'Задача',
assignee: 'user_123'
});

Создание с несколькими пользователями​

const record = await emd.database.collection('projects').create({
name: 'Проект',
team_members: ['user_123', 'user_456', 'user_789']
});

Получение информации о пользователе​

const record = await emd.database.collection('tasks').get(recordId);

console.log(record.created_by);
// {
// id: "user_123",
// name: "Иван Иванов",
// email: "ivan@example.com",
// avatar: "https://cdn.emd.one/avatars/user_123.jpg",
// role: "user"
// }

Поиск по пользователю​

// Задачи текущего пользователя
const myTasks = await emd.database.collection('tasks').find({
assignee: emd.auth.currentUser.id
});

// Задачи конкретного пользователя
const userTasks = await emd.database.collection('tasks').find({
assignee: 'user_123'
});

Обновление пользователя​

await emd.database.collection('tasks').update(recordId, {
assignee: 'user_456'
});

Автозаполнение​

Автор при создании​

{
"name": "created_by",
"type": "user",
"auto": "current_user",
"readonly": true
}
// created_by заполнится автоматически
const record = await emd.database.collection('tasks').create({
title: 'Задача'
});

console.log(record.created_by.id); // ID текущего пользователя

Последний редактор​

{
"name": "updated_by",
"type": "user",
"autoUpdate": "current_user"
}
// updated_by обновится автоматически при каждом изменении
await emd.database.collection('tasks').update(recordId, {
title: 'Обновленная задача'
});

Фильтрация пользователей​

По роли​

{
"name": "manager",
"type": "user",
"filterByRole": ["admin", "manager"]
}

По группе​

{
"name": "developer",
"type": "user",
"filterByGroup": ["developers", "tech_team"]
}

По отделу​

{
"name": "sales_rep",
"type": "user",
"filterByDepartment": ["sales"]
}

Множественный выбор​

Команда проекта​

const project = await emd.database.collection('projects').create({
name: 'Новый проект',
team_members: ['user_123', 'user_456', 'user_789']
});

// Получить всех участников
console.log(project.team_members);
// [
// { id: "user_123", name: "Иван Иванов", ... },
// { id: "user_456", name: "Петр Петров", ... },
// { id: "user_789", name: "Мария Сидорова", ... }
// ]

Добавление пользователя в команду​

const project = await emd.database.collection('projects').get(projectId);

await emd.database.collection('projects').update(projectId, {
team_members: [...project.team_members.map(u => u.id), 'user_999']
});

Удаление пользователя из команды​

const project = await emd.database.collection('projects').get(projectId);

const updatedTeam = project.team_members
.filter(u => u.id !== 'user_456')
.map(u => u.id);

await emd.database.collection('projects').update(projectId, {
team_members: updatedTeam
});

Поиск и фильтрация​

Задачи пользователя​

const userId = 'user_123';

const tasks = await emd.database.collection('tasks').find({
assignee: userId
});

Задачи команды​

const teamMemberIds = ['user_123', 'user_456', 'user_789'];

const tasks = await emd.database.collection('tasks').find({
assignee: { $in: teamMemberIds }
});

Проекты, где пользователь в команде​

const projects = await emd.database.collection('projects').find({
team_members: { $contains: 'user_123' }
});

Задачи без ответственного​

const unassignedTasks = await emd.database.collection('tasks').find({
assignee: { $exists: false }
});

Отображение в интерфейсе​

Аватар и имя​

const record = await emd.database.collection('tasks').get(recordId);
const user = record.assignee;

const userDisplay = `
<div class="user-info">
<img src="${user.avatar}" alt="${user.name}" class="avatar" />
<span class="name">${user.name}</span>
</div>
`;

Список пользователей​

const project = await emd.database.collection('projects').get(projectId);

const teamDisplay = project.team_members.map(user => `
<div class="team-member">
<img src="${user.avatar}" alt="${user.name}" />
<div>
<div class="name">${user.name}</div>
<div class="email">${user.email}</div>
</div>
</div>
`).join('');

Уведомления​

Уведомить ответственного​

const task = await emd.database.collection('tasks').get(taskId);

if (task.assignee) {
await emd.notifications.send({
userId: task.assignee.id,
title: 'Новая задача',
message: `Вам назначена задача: ${task.title}`,
link: `/tasks/${task.id}`
});
}

Уведомить команду​

const project = await emd.database.collection('projects').get(projectId);

for (const member of project.team_members) {
await emd.notifications.send({
userId: member.id,
title: 'Обновление проекта',
message: `Проект "${project.name}" обновлен`
});
}

Права доступа​

Проверка владельца​

const task = await emd.database.collection('tasks').get(taskId);
const currentUser = emd.auth.currentUser;

if (task.created_by.id === currentUser.id) {
// Пользователь является автором
console.log('Вы можете редактировать эту задачу');
}

Проверка участия в команде​

const project = await emd.database.collection('projects').get(projectId);
const currentUser = emd.auth.currentUser;

const isMember = project.team_members.some(u => u.id === currentUser.id);

if (isMember) {
// Пользователь в команде
console.log('У вас есть доступ к проекту');
}

Аналитика​

Количество задач по пользователям​

const tasksByUser = await emd.database.collection('tasks').aggregate([
{
$group: {
_id: '$assignee',
count: { $sum: 1 }
}
},
{
$sort: { count: -1 }
}
]);

Самый активный пользователь​

const mostActive = await emd.database.collection('tasks').aggregate([
{
$group: {
_id: '$created_by',
tasksCreated: { $sum: 1 }
}
},
{
$sort: { tasksCreated: -1 }
},
{
$limit: 1
}
]);

Рекомендации​

  • Используйте автозаполнение для полей created_by и updated_by
  • Делайте поля created_by только для чтения
  • Для команд используйте множественный выбор
  • Отправляйте уведомления при назначении задач
  • Проверяйте права доступа на основе пользовательских полей
  • Используйте фильтры по ролям для ограничения выбора
  • Отображайте аватары для лучшей визуализации

Интеграция с авторизацией​

Получение текущего пользователя​

const currentUser = emd.auth.currentUser;

console.log(currentUser);
// {
// id: "user_123",
// name: "Иван Иванов",
// email: "ivan@example.com",
// role: "user",
// avatar: "..."
// }

Проверка роли​

const task = await emd.database.collection('tasks').get(taskId);

if (task.assignee.role === 'admin') {
// Задача назначена администратору
}

Отличие от других типов​

  • User vs Relation: User специфичен для пользователей системы, Relation для любых коллекций
  • User vs String: User обеспечивает связь с системой авторизации и автозаполнение
  • User vs ObjectId: User предоставляет полную информацию о пользователе, не только ID