Перейти к содержанию

Магазин приложений

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

запросы одобрений

При установке приложений с рабочими столами, все пайщики кооператива немедленно получают к ним доступ согласно своей роли в кооперативе. Страницы рабочих столов, которые должны быть доступны только председателю и членам совета, будут видны только председателю и членам совета.

При установке приложений без рабочих столов, цифровой кооператив получает новые маршруты 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.
}