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