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

Пользователь (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