Skip to content

romankurnovskii/rustore

rustore CLI

rustore
CLI для работы с RuStore API

Командная строка для взаимодействия с RuStore API

English | Русский | हिंदी | 中文

NPM version npm-typescript License

🌟 Возможности

  • 🔐 Авторизация через приватный ключ из RuStore Консоль
  • 🔑 Автоматическое управление токенами доступа
  • 📦 Работа с API RuStore (платежи, подписки, приложения)
  • 📄 Вывод результатов в формате JSON (--json) для удобной интеграции и обработки
  • ⚙️ Сохранение конфигурации в ~/.rustore/config.json
  • 🧪 Полное покрытие тестами

🛠️ Установка

Глобальная установка

npm install -g rustore

После установки используйте команду:

rustore --help

Использование через npx (без установки)

Вы можете использовать CLI без установки через npx:

npx rustore --help
npx rustore login --key-id <keyId> --key <privateKey>
npx rustore apps list

Локальная установка

npm install rustore

📖 Использование

Первоначальная настройка

Перед использованием CLI необходимо получить приватный ключ в RuStore Консоль.

Авторизация

Параметр keyId — это числовой ID ключа из таблицы ключей в RuStore Консоль (вкладка «Компания» или «Разработчик»). Указывайте именно ID ключа, а не его название. Подробнее: Получение токена авторизации.

# Авторизация с указанием keyId и приватного ключа
rustore login --key-id <keyId> --key <base64-ключ>

# Или короткая форма
rustore login -i <keyId> -k <base64-ключ>

Пример (keyId — число из консоли, например 1275328):

rustore login --key-id 1275328 --key MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC...

Если появляется ошибка «Invalid request format. Unexpected value», проверьте, что передаёте числовой ID ключа, а не название ключа (например, не dev-03-all, а ID из таблицы ключей).

Проверка статуса

# Показать информацию о текущей авторизации
rustore whoami

Выход из системы

# Удалить токен (ключи остаются в конфиге)
rustore logout

Работа с приложениями

# Получить список приложений
rustore apps list

# Получить все приложения (с пагинацией)
rustore apps list --all

# Вывести результат в формате JSON (удобно для скриптов и интеграций)
rustore apps list --json

# Комбинирование опций: получить все приложения в JSON формате
rustore apps list --all --json

# Фильтрация с JSON выводом
rustore apps list --app-name "MyApp" --json
rustore apps list --app-status PUBLISHED --json

# Создать черновую версию приложения
rustore apps create-draft --app-id 123456 --version-name "1.0.0" --version-code 1

# Создать черновую версию с JSON выводом
rustore apps create-draft --app-id 123456 --version-name "2.0.0" --version-code 2 --json

# Загрузить APK файл для версии (обязательно указать is-main-apk)
rustore apps upload-apk --package-name com.example.app --version-id 789 --file ./app-release.apk --is-main-apk true

# Загрузить APK файл с Huawei Mobile Services
rustore apps upload-apk --package-name com.example.app --version-id 789 --file ./app-release.apk --is-main-apk false --services-type HMS

# Загрузить APK файл с JSON выводом
rustore apps upload-apk --package-name com.example.app --version-id 789 --file ./app-release.apk --is-main-apk true --json

Работа с отзывами

# Получить отзывы приложения
rustore feedback list --package-name com.example.app

# Получить все отзывы (с пагинацией)
rustore feedback list --package-name com.example.app --all

# Получить отзывы в JSON формате
rustore feedback list --package-name com.example.app --json

# Оставить ответ на отзыв
rustore feedback answer --package-name com.example.app --comment-id 123456 --text "Спасибо за отзыв!"

# Получить статус ответа на отзыв
rustore feedback status --package-name com.example.app --feedback-id 789

# Получить все ответы на отзывы
rustore feedback status --package-name com.example.app

# Изменить ответ на отзыв
rustore feedback update --package-name com.example.app --feedback-id 789 --text "Обновлённый ответ"

# Удалить ответ на отзыв
rustore feedback delete --package-name com.example.app --feedback-id 789

💡 Совет: Флаг --json полезен для:

  • Автоматизации и скриптов
  • Интеграции с другими инструментами
  • Обработки данных через jq или другие JSON-парсеры
  • Сохранения результатов в файл: rustore apps list --json > apps.json

📁 Конфигурация

CLI сохраняет конфигурацию в ~/.rustore/config.json:

{
  "keyId": "ваш-key-id",
  "privateKey": "ваш-приватный-ключ-base64",
  "token": "jwe-токен",
  "tokenExpiresAt": 1234567890
}

🔧 Разработка

Установка зависимостей

npm install

Сборка

npm run build

Запуск в режиме разработки

npm start

Тестирование

# Запустить все тесты
npm test

# Тесты в watch режиме
npm run test:watch

# С покрытием
npm run test:coverage

Как протестировать текущие изменения

  1. Сборка проекта:

    npm run build
  2. Проверка типов:

    npm run type-check
    # или
    ./node_modules/.bin/tsc --noEmit
  3. Запуск тестов:

    npm test
  4. Тестирование CLI локально:

    # Запуск без установки (через tsx)
    npm start -- login <keyId> --key <key>
    
    # Или после сборки
    node dist/bin.js whoami
  5. Линтинг:

    npm run lint
    npm run lint:fix

Проверка типов

npm run type-check

Линтинг

npm run lint
npm run lint:fix

📚 API

Структура API

API организовано по категориям, как в документации RuStore:

  • Apps API (appsApi) - Загрузка и публикация приложений (общие методы)
  • Payments API (paymentsApi) - Работа с платежами и подписками (общие методы)
  • Payments App API (paymentsAppApi) - Работа с платежами и подписками (методы приложений)
  • Catalog API (catalogApi) - API для работы с продуктовым каталогом

Программный доступ

import {login, appsApi, paymentsApi, catalogApi, feedbackApi} from 'rustore';

// Авторизация
await login('keyId', 'privateKey');

// Получить список приложений
const appsResponse = await appsApi.getAppList();
console.log(appsResponse.body.content);

// Получить все приложения (с автоматической пагинацией)
const allApps = await appsApi.getAllApps();

// Создать черновую версию приложения
const draftVersion = await appsApi.createDraftVersion(123456, {
  versionName: '1.0.0',
  versionCode: 1,
});

// Загрузить APK файл для версии
const uploadResult = await appsApi.uploadApkFile(
  'com.example.app', // packageName вместо appId
  draftVersion.body?.versionId || 789,
  './app-release.apk',
  {
    isMainApk: true, // обязательный параметр
    servicesType: 'Unknown', // опциональный: 'HMS' или 'Unknown'
  },
);

// Получить отзывы приложения
const feedbackResponse = await feedbackApi.getFeedback('com.example.app');

// Оставить ответ на отзыв
const answerResponse = await feedbackApi.createFeedbackAnswer('com.example.app', 123456, {
  text: 'Спасибо за отзыв!',
});

// Получить статус ответа на отзыв
const statusResponse = await feedbackApi.getFeedbackAnswerStatus('com.example.app', 789);

// Использование других API категорий
// await paymentsApi.refund(...);
// await catalogApi.getProducts(...);

🔗 Полезные ссылки

📋 TODO: API Endpoints Implementation Status

Статус реализации всех endpoints RuStore API. См. TODO_API_ENDPOINTS.md для подробной информации.

✅ Реализовано (Implemented & Tested)

Authorization (Авторизация)

  • ✅ 🧪 Get Authorization Token - POST /public/auth/

Upload & Publication App (Загрузка и публикация приложений)

  • ✅ 🧪 Get App List - GET /public/v1/application
  • ✅ 🧪 Create Draft Version - POST /public/v1/application/{packageName}/version
  • ✅ 🧪 Upload APK File - POST /public/v1/application/{packageName}/version/{versionId}/apk
  • ✅ 🧪 Send Draft for Moderation - POST /public/v1/application/{packageName}/version/{versionId}/commit
  • ✅ 🧪 Get Version Info - GET /public/v1/application/{packageName}/version/{versionId}
  • ✅ 🧪 Get Version List - GET /public/v1/application/{packageName}/version
  • ✅ 🧪 Get App Tag List - GET /public/v1/application/tag
  • ✅ 🧪 Upload AAB File - POST /public/v1/application/{packageName}/version/{versionId}/aab
  • ✅ 🧪 Update Draft Version - PUT /public/v1/application/{packageName}/version/{versionId}
  • ✅ 🧪 Delete Draft Version - DELETE /public/v1/application/{packageName}/version/{versionId}
  • ✅ 🧪 Upload Screens - POST /public/v1/application/{packageName}/version/{versionId}/screens
  • ✅ 🧪 Get Version Status - GET /public/v1/application/{packageName}/version/{versionId}/status

Feedback Process (Работа с отзывами)

  • ✅ 🧪 Get Feedback - GET /public/v1/application/{packageName}/feedback
  • ✅ 🧪 Create Feedback Answer - POST /public/v1/application/{packageName}/feedback/{commentId}/answer
  • ✅ 🧪 Get Feedback Answer Status - GET /public/v1/application/{packageName}/feedback/{feedbackId}
  • ✅ 🧪 Update Feedback Answer - PUT /public/v1/application/{packageName}/feedback/{feedbackId}
  • ✅ 🧪 Delete Feedback Answer - DELETE /public/v1/application/{packageName}/feedback/{feedbackId}

❌ Не реализовано (Not Implemented)

Upload & Publication App

  • Все основные endpoints реализованы ✅

Payments & Subscriptions (Общие методы)

Base URL: https://www.rustore.ru/help/work-with-rustore-api/api-payments-subscriptions

  • ✅ 🧪 Get Payment - GET /public/v1/payment/{paymentId}
  • ✅ 🧪 Get Subscription - GET /public/v1/subscription/{subscriptionId}
  • ✅ 🧪 Get Subscription List - GET /public/v1/subscription
  • ❌ Refund - POST /public/v1/payment/refund
  • ❌ Cancel Subscription - POST /public/v1/subscription/{subscriptionId}/cancel

Payments & Subscriptions App (Методы приложений)

Base URL: https://www.rustore.ru/help/work-with-rustore-api/api-payments-subscriptions-app

  • ✅ 🧪 Get Invoices - GET /public/v1/application/{packageName}/invoice
  • ✅ 🧪 Get Purchase - GET /public/v1/application/{packageName}/purchase/{purchaseId}
  • ✅ 🧪 Get Purchase List - GET /public/v1/application/{packageName}/purchase
  • ❌ Confirm Purchase - POST /public/v1/application/{packageName}/purchase/confirm
  • ❌ Cancel Purchase - POST /public/v1/application/{packageName}/purchase/cancel

Catalog (Продуктовый каталог)

Base URL: https://www.rustore.ru/help/work-with-rustore-api/api-catalog

  • ✅ 🧪 Get Products - GET /public/v1/catalog/product
  • ✅ 🧪 Get Product - GET /public/v1/catalog/product/{productId}
  • ❌ Create Product - POST /public/v1/catalog/product
  • ❌ Update Product - PUT /public/v1/catalog/product/{productId}
  • ❌ Delete Product - DELETE /public/v1/catalog/product/{productId}

Легенда статусов:

  • Implemented - Полностью реализовано, протестировано и задокументировано
  • 🧪 Tested - Реализовано и имеет тесты
  • ⚠️ Issues - Реализовано, но есть известные проблемы
  • 🚧 Beta - Реализовано, но требует дополнительного тестирования/верификации
  • Not Implemented - Еще не реализовано

Приоритеты реализации:

  1. High Priority: Upload AAB File, Update Draft Version, Delete Draft Version - Реализовано
  2. Medium Priority: POST/PUT/DELETE Payment/Subscription endpoints
  3. Low Priority: POST/PUT/DELETE Catalog endpoints, advanced payment operations

📝 Лицензия

MIT