Магазин приложений
Магазин приложений - это способ, которым кооператив берет из экосистемы то, что ему нужно. Магазин предоставляет приложения, которые расширяют Навигатор новыми рабочими столами, а также включают фоновые утилиты для автоматизации бизнес-процессов в кооперации.

При установке приложений с рабочими столами, все пайщики кооператива немедленно получают к ним доступ согласно своей роли в кооперативе. Страницы рабочих столов, которые должны быть доступны только председателю и членам совета, будут видны только председателю и членам совета.
При установке приложений без рабочих столов, цифровой кооператив получает новые маршруты API (например, для приема платежей через Yookassa или интеграции с 1С), включает фоновые задания и т.д. и т.п. Такие приложения являются утилитами и служат для автоматизации процессов. Их можно только установить, настроить и включить/отключить, при этом, визуально в Навигаторе они не видны.

Доступом к магазину приложений обладает только председатель совета. Председатель совета устанавливает приложения с рабочими столами, тем самым, расширяя Навигатор и функционал своего цифрового кооператива. А редактируя Стартовые страницы, председатель устанавливает то, что увидят пайщики при входе на сайт.
Таким образом, с помощью магазина приложений председатель цифрового кооператива может взять в свой кооператив только то, что ему нужно, и отобразить так, как ему нужно, настроив главную страницу, например, как "Стол заказов - Витрина". Тогда все посетители сайта будут видеть витрину стола заказов при входе на сайт.
О том, что это будет
Мы исследуем возможность создания магазина PWA-приложений (которые устанавливаются нажатием на кнопку "добавить на домашний экран"). Он позволит пайщикам устанавливать на рабочие столы своих устройств кооперативные приложения из магазина кооператива, которые не будут содержать избыточной информации о других установленных в кооперативе рабочих столах. Например, таким приложеним может быть "Стол заказов", которое при установке на устройство пайщика добавит иконку, организовав прямой и быстрый доступ только на стол заказов конкретного цифрового кооператива, и скрыв все другие столы. На текущий момент мы только исследуем эту возможность. Шагов по реализации пока не предпринимается.
Разработчикам¶
Канонические имена полей и типов — в файле components/controller/schema.gql монорепозитория; интерактивно — в документации GraphQL-API.
Список расширений¶
🛠️ SDK: Queries.Extensions.GetExtensions | Query.getExtensions
Получить список расширений Требуемые роли: chairman.
import { Queries } from '@coopenomics/sdk';
const variables: Queries.Extensions.GetExtensions.IInput = {
data: {
enabled?: <null | boolean>; // Фильтр включенных расширений
is_available?: <null | boolean>; // Фильтр активности
is_desktop?: <null | boolean>; // Фильтр рабочих столов
is_installed?: <null | boolean>; // Фильтр установленных расширений
name?: <null | string>; // Фильтр по имени
};
};
const { [Queries.Extensions.GetExtensions.name]: result } = await client.Query(
Queries.Extensions.GetExtensions.query,
{ variables }
);
Результат:
interface IOutput {
getExtensions: <{
config?: <unknown>; // Настройки конфигурации для расширения
created_at: <unknown>; // Дата создания расширения
description?: <null | string>; // Описание расширения
desktops?: <{
defaultRoute?: <null | string>; // Маршрут по умолчанию
icon?: <null | string>; // Иконка для меню
name: <string>; // Уникальное имя workspace
title: <string>; // Отображаемое название workspace
}[]>; // Массив рабочих столов, которые предоставляет расширение
enabled: <boolean>; // Показывает, включено ли расширение
external_url?: <null | string>; // Внешняя ссылка на iframe-интерфейс расширения
image?: <null | string>; // Изображение для расширения
instructions: <string>; // Поле инструкция для установки (INSTALL)
is_available: <boolean>; // Показывает, доступно ли расширение
is_builtin: <boolean>; // Показывает, встроенное ли это расширение
is_installed: <boolean>; // Показывает, установлено ли расширение
is_internal: <boolean>; // Показывает, внутреннее ли это расширение
name: <string>; // Уникальное имя расширения
readme: <string>; // Поле подробного текстового описания (README)
schema?: <unknown>; // Схема настроек конфигурации для расширения
tags: <string[]>; // Массив тегов для расширения
title?: <null | string>; // Заголовок расширения
updated_at: <unknown>; // Дата последнего обновления расширения
}[]>; // Получить список расширений
Требуемые роли: chairman.
}
Логи расширений¶
🛠️ SDK: Queries.Extensions.GetExtensionLogs | Query.getExtensionLogs
Получить логи расширений с фильтрацией и пагинацией Требуемые роли: chairman, member.
import { Queries } from '@coopenomics/sdk';
const variables: Queries.Extensions.GetExtensionLogs.IInput = {
data?: {
createdFrom?: <any>; // Фильтр по дате создания (от)
createdTo?: <any>; // Фильтр по дате создания (до)
name?: <null | string>; // Фильтр по имени расширения
};
options?: {
limit: <number>; // Количество элементов на странице
page: <number>; // Номер страницы
sortBy?: <null | string>; // Ключ сортировки (например, "name")
sortOrder: <string>; // Направление сортировки ("ASC" или "DESC")
};
};
const { [Queries.Extensions.GetExtensionLogs.name]: result } = await client.Query(
Queries.Extensions.GetExtensionLogs.query,
{ variables }
);
Результат:
interface IOutput {
getExtensionLogs: {
currentPage: <number>; // Текущая страница
items: <{
created_at: <unknown>; // Дата создания записи
data?: <null | string>; // Данные лога в формате JSON
extension_local_id: <number>; // Локальный ID записи лога в рамках расширения
id: <number>; // Глобальный ID записи лога
name: <string>; // Имя расширения
updated_at: <unknown>; // Дата последнего обновления записи
}[]>; // Элементы текущей страницы
totalCount: <number>; // Общее количество элементов
totalPages: <number>; // Общее количество страниц
};
}
Рабочие столы (контекст магазина)¶
🛠️ SDK: Queries.Desktop.GetDesktop | Query.getDesktop
Получить состав приложений рабочего стола
import { Queries } from '@coopenomics/sdk';
const variables: Queries.Desktop.GetDesktop.IInput = {
};
const { [Queries.Desktop.GetDesktop.name]: result } = await client.Query(
Queries.Desktop.GetDesktop.query,
{ variables }
);
Результат:
interface IOutput {
getDesktop: {
authorizedHome: <string>; // Домашняя страница для авторизованных пользователей
coopname: <string>; // Имя аккаунта кооператива
layout: <string>; // Имя шаблона рабочих столов
nonAuthorizedHome: <string>; // Домашняя страница для неавторизованных пользователей
workspaces: <{
defaultRoute?: <null | string>; // Маршрут по умолчанию для этого workspace
extension_name: <string>; // Имя расширения, которому принадлежит этот workspace
icon?: <null | string>; // Иконка для меню
name: <string>; // Уникальное имя workspace
title: <string>; // Отображаемое название workspace
}[]>; // Состав приложений рабочего стола
};
}
Установить расширение¶
🛠️ SDK: Mutations.Extensions.InstallExtension | Mutation.installExtension
Установить расширение Требуемые роли: chairman.
import { Mutations } from '@coopenomics/sdk';
const variables: Mutations.Extensions.InstallExtension.IInput = {
data: {
config: <any>; // Объект конфигурации расширения
created_at?: <any>; // Дата установки расширения
enabled: <boolean>; // Флаг того, включено ли расширение сейчас
name: <string>; // Уникальное имя расширения (является идентификатором)
updated_at?: <any>; // Дата обновления расширения
};
};
const { [Mutations.Extensions.InstallExtension.name]: result } = await client.Mutation(
Mutations.Extensions.InstallExtension.mutation,
{ variables }
);
Результат:
interface IOutput {
installExtension: {
config?: <unknown>; // Настройки конфигурации для расширения
created_at: <unknown>; // Дата создания расширения
description?: <null | string>; // Описание расширения
desktops?: <{
defaultRoute?: <null | string>; // Маршрут по умолчанию
icon?: <null | string>; // Иконка для меню
name: <string>; // Уникальное имя workspace
title: <string>; // Отображаемое название workspace
}[]>; // Массив рабочих столов, которые предоставляет расширение
enabled: <boolean>; // Показывает, включено ли расширение
external_url?: <null | string>; // Внешняя ссылка на iframe-интерфейс расширения
image?: <null | string>; // Изображение для расширения
instructions: <string>; // Поле инструкция для установки (INSTALL)
is_available: <boolean>; // Показывает, доступно ли расширение
is_builtin: <boolean>; // Показывает, встроенное ли это расширение
is_installed: <boolean>; // Показывает, установлено ли расширение
is_internal: <boolean>; // Показывает, внутреннее ли это расширение
name: <string>; // Уникальное имя расширения
readme: <string>; // Поле подробного текстового описания (README)
schema?: <unknown>; // Схема настроек конфигурации для расширения
tags: <string[]>; // Массив тегов для расширения
title?: <null | string>; // Заголовок расширения
updated_at: <unknown>; // Дата последнего обновления расширения
};
}
Обновить расширение¶
🛠️ SDK: Mutations.Extensions.UpdateExtension | Mutation.updateExtension
Обновить расширение Требуемые роли: chairman.
import { Mutations } from '@coopenomics/sdk';
const variables: Mutations.Extensions.UpdateExtension.IInput = {
data: {
config: <any>; // Объект конфигурации расширения
created_at?: <any>; // Дата установки расширения
enabled: <boolean>; // Флаг того, включено ли расширение сейчас
name: <string>; // Уникальное имя расширения (является идентификатором)
updated_at?: <any>; // Дата обновления расширения
};
};
const { [Mutations.Extensions.UpdateExtension.name]: result } = await client.Mutation(
Mutations.Extensions.UpdateExtension.mutation,
{ variables }
);
Результат:
interface IOutput {
updateExtension: {
config?: <unknown>; // Настройки конфигурации для расширения
created_at: <unknown>; // Дата создания расширения
description?: <null | string>; // Описание расширения
desktops?: <{
defaultRoute?: <null | string>; // Маршрут по умолчанию
icon?: <null | string>; // Иконка для меню
name: <string>; // Уникальное имя workspace
title: <string>; // Отображаемое название workspace
}[]>; // Массив рабочих столов, которые предоставляет расширение
enabled: <boolean>; // Показывает, включено ли расширение
external_url?: <null | string>; // Внешняя ссылка на iframe-интерфейс расширения
image?: <null | string>; // Изображение для расширения
instructions: <string>; // Поле инструкция для установки (INSTALL)
is_available: <boolean>; // Показывает, доступно ли расширение
is_builtin: <boolean>; // Показывает, встроенное ли это расширение
is_installed: <boolean>; // Показывает, установлено ли расширение
is_internal: <boolean>; // Показывает, внутреннее ли это расширение
name: <string>; // Уникальное имя расширения
readme: <string>; // Поле подробного текстового описания (README)
schema?: <unknown>; // Схема настроек конфигурации для расширения
tags: <string[]>; // Массив тегов для расширения
title?: <null | string>; // Заголовок расширения
updated_at: <unknown>; // Дата последнего обновления расширения
};
}
Удалить расширение¶
🛠️ SDK: Mutations.Extensions.UninstallExtension | Mutation.uninstallExtension
Удалить расширение Требуемые роли: chairman.
import { Mutations } from '@coopenomics/sdk';
const variables: Mutations.Extensions.UninstallExtension.IInput = {
data: {
name: <string>; // Фильтр по имени
};
};
const { [Mutations.Extensions.UninstallExtension.name]: result } = await client.Mutation(
Mutations.Extensions.UninstallExtension.mutation,
{ variables }
);
Результат:
interface IOutput {
uninstallExtension: <boolean>; // Удалить расширение
Требуемые роли: chairman.
}