8.1 KiB
8.1 KiB
Реализация системы аппрувов мастера проекта
Обзор
Реализована переиспользуемая система одобрений (аппрувов) для контракта Capital, которая позволяет мастеру проекта одобрять или отклонять коммиты через единообразный интерфейс.
Архитектурные изменения
1. Переиспользуемая базовая структура (lib/shared_approver.hpp)
Создана базовая структура approval_base, которая не привязана к конкретному контракту и может быть переиспользована:
struct approval_base {
uint64_t id;
eosio::name coopname;
eosio::name username;
eosio::name type;
document2 document;
checksum256 approval_hash;
eosio::name callback_contract;
eosio::name callback_action_approve;
eosio::name callback_action_decline;
std::string meta;
eosio::time_point_sec created_at;
// ... индексы
};
Добавлены макросы для создания специализированных версий:
DEFINE_APPROVAL_STRUCT(name, contract)- создает структуру для конкретного контрактаDEFINE_APPROVALS_INDEX(index_name, struct_name)- создает мультииндекс
2. Библиотека для Capital (lib/shared_capital.hpp)
Создан новый файл с:
- Сигнатурами действий для аппрувов мастера
- Namespace
Masterс таблицей аппрувов для контракта Capital - Функцией
Master::create_approval()для создания аппрувов
3. Действия в контракте Capital
Добавлены три новых действия в capital.hpp:
createapprv - Создание аппрува
- Авторизация:
_capital - Создает запись в таблице аппрувов мастера
- Используется внутренне при создании коммита
confirmapprv - Подтверждение аппрува
- Авторизация:
coopname - Находит аппрув по хешу
- Вызывает колбэк одобрения
- Удаляет аппрув из таблицы
declineapprv - Отклонение аппрува
- Авторизация:
coopname - Находит аппрув по хешу
- Вызывает колбэк отклонения
- Удаляет аппрув из таблицы
4. Интеграция с процессом создания коммитов
Изменения в createcmmt
Теперь при создании коммита:
- Создается запись коммита в таблице
- Создается аппрув через
Master::create_approval()с:type= "commit"approval_hash=commit_hashcallback_action_approve= "approvecmmt"callback_action_decline= "declinecmmt"
Изменения в approvecmmt
Теперь работает как колбэк:
- Авторизация:
_capital(вместоcoopname) - Сигнатура:
(coopname, commit_hash, approved_document) - Вызывается автоматически из
confirmapprv - Убрана проверка мастера (она выполняется на уровне фронтенда)
Изменения в declinecmmt
Теперь работает как колбэк:
- Авторизация:
_capital(вместоcoopname) - Сигнатура:
(coopname, commit_hash, reason) - Вызывается автоматически из
declineapprv - Убрана проверка мастера (она выполняется на уровне фронтенда)
Структура файлов
contracts/cpp/
├── lib/
│ ├── shared_approver.hpp # Переиспользуемая базовая структура
│ ├── shared_capital.hpp # NEW: Методы для аппрувов мастера
│ └── common.hpp # Обновлен: добавлен include shared_capital.hpp
└── capital/
├── capital.hpp # Обновлен: добавлены действия createapprv/confirmapprv/declineapprv
├── capital.cpp # Обновлен: добавлены includes для master_approval
└── app/
├── master_approval/ # NEW: Директория с аппрувами мастера
│ ├── createapprv.cpp
│ ├── confirmapprv.cpp
│ ├── declineapprv.cpp
│ └── master-approval-process.dox # Документация процесса
└── generation/
└── create_commit/
├── createcmmt.cpp # Обновлен: добавлено создание аппрува
├── approvecmmt.cpp # Обновлен: теперь колбэк
├── declinecmmt.cpp # Обновлен: теперь колбэк
└── commit-creation-process.dox # Обновлена документация
Процесс работы
Создание коммита
Исполнитель → createcmmt → Создание коммита → Master::create_approval() → Аппрув в таблице
Одобрение коммита
Мастер → confirmapprv → Поиск аппрува → Колбэк approvecmmt → Обработка коммита → Удаление аппрува
Отклонение коммита
Мастер → declineapprv → Поиск аппрува → Колбэк declinecmmt → Удаление коммита → Удаление аппрува
Преимущества реализации
- Переиспользуемость: Базовая структура
approval_baseможет быть использована в любых других контрактах - Единообразие: Аппрувы председателя и мастера используют одинаковую структуру и логику
- Разделение ответственности: Таблицы аппрувов разделены (soviet и capital), данные не перемешиваются
- Гибкость: Легко добавить новые типы аппрувов в будущем
- Колбэки: Унифицированный механизм обратных вызовов при одобрении/отклонении
Дальнейшее использование
Для создания аналогичной системы в других контрактах:
- Определить сигнатуры действий в
lib/shared_<contract>.hpp - Использовать макросы
DEFINE_APPROVAL_STRUCTиDEFINE_APPROVALS_INDEX - Реализовать действия
createapprv,confirmapprv,declineapprv - Создать функцию
create_approval()в namespace контракта - Интегрировать с бизнес-процессами через колбэки
Миграция данных
Не требуется - это новая функциональность, существующие данные не затронуты.
Тестирование
Рекомендуется протестировать:
- Создание коммита и аппрува
- Одобрение коммита мастером
- Отклонение коммита мастером
- Проверку прав доступа (только кооператив может подтверждать/отклонять)
- Корректность колбэков
- Удаление аппрувов после обработки