UNPKG

kawazu

Version:

kawazu CLI tool for real-time chat in your editor

250 lines (249 loc) 11.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.loginUser = loginUser; exports.logoutUser = logoutUser; exports.showCurrentUser = showCurrentUser; exports.showSubscriptionPlan = showSubscriptionPlan; const chalk_1 = __importDefault(require("chalk")); const inquirer_1 = __importDefault(require("inquirer")); const ora_1 = __importDefault(require("ora")); const node_fetch_1 = __importDefault(require("node-fetch")); const config_1 = require("../utils/config"); async function loginUser(options) { console.log(chalk_1.default.blue.bold('\n Kawazu ログイン\n')); try { // メールアドレスとパスワードを取得 const credentials = await getCredentials(options); const spinner = (0, ora_1.default)('ログイン中...').start(); // サーバー設定を取得 const config = await (0, config_1.loadConfig)(); // ログイン API を呼び出し const response = await (0, node_fetch_1.default)(`${config.server_url}/api/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: credentials.email, password: credentials.password }) }); const data = await response.json(); if (!response.ok) { spinner.fail('ログインに失敗しました'); console.error(chalk_1.default.red(`エラー: ${data.error || response.statusText}`)); return; } if (data.success) { spinner.succeed('ログイン成功!'); // トークンとユーザー情報を保存 await (0, config_1.saveConfig)({ auth_token: data.data.token, user_email: data.data.user.email, user_username: data.data.user.username, user_id: data.data.user.id }); console.log(chalk_1.default.green(` こんにちは、${data.data.user.username}さん!`)); console.log(chalk_1.default.gray(` ${data.data.user.email}`)); console.log(chalk_1.default.blue('\n プランを確認: ') + chalk_1.default.cyan('kawazu plan')); console.log(chalk_1.default.blue(' チャットを開始: ') + chalk_1.default.cyan('kawazu create "ルーム名"')); } else { spinner.fail('ログインに失敗しました'); console.error(chalk_1.default.red(`エラー: ${data.error}`)); } } catch (error) { console.error(chalk_1.default.red('ログインエラー:'), error.message); } } async function logoutUser() { console.log(chalk_1.default.yellow('ログアウトしています...')); try { // 認証情報をクリア await (0, config_1.saveConfig)({ auth_token: undefined, user_email: undefined, user_username: undefined, user_id: undefined }); console.log(chalk_1.default.green(' ログアウトしました')); console.log(chalk_1.default.blue(' 再度ログインするには: ') + chalk_1.default.cyan('kawazu login')); } catch (error) { console.error(chalk_1.default.red('ログアウトエラー:'), error.message); } } async function showCurrentUser() { try { const config = await (0, config_1.loadConfig)(); if (!config.auth_token || !config.user_email) { console.log(chalk_1.default.yellow(' ログインしていません')); console.log(chalk_1.default.blue(' ログインするには: ') + chalk_1.default.cyan('kawazu login')); return; } console.log(chalk_1.default.blue.bold('\n 現在のユーザー\n')); console.log(chalk_1.default.green(` ログイン済み`)); console.log(chalk_1.default.gray(` メール: ${config.user_email}`)); console.log(chalk_1.default.gray(` ユーザー名: ${config.user_username}`)); console.log(chalk_1.default.gray(` ID: ${config.user_id}`)); // サーバーで最新の情報を確認 const spinner = (0, ora_1.default)('最新情報を確認中...').start(); try { const response = await (0, node_fetch_1.default)(`${config.server_url}/api/auth/verify`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${config.auth_token}` }, body: JSON.stringify({ token: config.auth_token }) }); const data = await response.json(); if (response.ok && data.success) { spinner.succeed('認証状態: 有効'); console.log(chalk_1.default.green(` トークン有効期限内`)); } else { spinner.warn('認証状態: 期限切れ'); console.log(chalk_1.default.yellow(` トークンが期限切れです`)); console.log(chalk_1.default.blue(' 再ログインしてください: ') + chalk_1.default.cyan('kawazu login')); } } catch (error) { spinner.fail('認証確認に失敗'); console.log(chalk_1.default.red(` サーバー接続エラー: ${error.message}`)); } } catch (error) { console.error(chalk_1.default.red('ユーザー情報取得エラー:'), error.message); } } async function showSubscriptionPlan() { try { const config = await (0, config_1.loadConfig)(); if (!config.auth_token) { console.log(chalk_1.default.yellow(' ログインが必要です')); console.log(chalk_1.default.blue(' ログインするには: ') + chalk_1.default.cyan('kawazu login')); return; } const spinner = (0, ora_1.default)('サブスクリプション情報を取得中...').start(); try { // 現在のサブスクリプションを取得 const response = await (0, node_fetch_1.default)(`${config.server_url}/api/subscriptions/current`, { headers: { 'Authorization': `Bearer ${config.auth_token}` } }); const data = await response.json(); if (!response.ok) { spinner.fail('プラン情報の取得に失敗'); if (response.status === 401) { console.log(chalk_1.default.yellow(' 認証エラー。再ログインしてください')); console.log(chalk_1.default.blue(' ログイン: ') + chalk_1.default.cyan('kawazu login')); } else { console.error(chalk_1.default.red(`エラー: ${data.error || response.statusText}`)); } return; } spinner.succeed('プラン情報を取得しました'); console.log(chalk_1.default.blue.bold('\n サブスクリプションプラン\n')); if (data.success && data.data) { const subscription = data.data; console.log(chalk_1.default.green(` プラン: ${subscription.subscription_plans.name}`)); console.log(chalk_1.default.gray(` 料金: ${subscription.subscription_plans.amount.toLocaleString()}/月`)); console.log(chalk_1.default.gray(` ステータス: ${getStatusText(subscription.status)}`)); console.log(chalk_1.default.gray(` 次回請求: ${new Date(subscription.current_period_end).toLocaleDateString('ja-JP')}`)); if (subscription.cancel_at_period_end) { console.log(chalk_1.default.yellow(` ${new Date(subscription.current_period_end).toLocaleDateString('ja-JP')} にキャンセル予定`)); } console.log(chalk_1.default.blue('\n 利用可能機能:')); const features = subscription.subscription_plans.features; if (features.max_rooms) { console.log(chalk_1.default.gray(` ルーム作成: ${formatFeatureValue(features.max_rooms)}個`)); } if (features.max_participants_per_room) { console.log(chalk_1.default.gray(` ルーム参加者: ${formatFeatureValue(features.max_participants_per_room)}人`)); } if (features.storage_gb) { console.log(chalk_1.default.gray(` ストレージ: ${features.storage_gb}GB`)); } if (features.advanced_features) { console.log(chalk_1.default.gray(` 高度な機能: 利用可能`)); } if (features.priority_support) { console.log(chalk_1.default.gray(` 優先サポート: 利用可能`)); } } else { console.log(chalk_1.default.yellow(' アクティブなサブスクリプションがありません')); console.log(chalk_1.default.blue(' プランを選択: ') + chalk_1.default.cyan('https://kawazu.onrender.com/pricing')); } } catch (error) { spinner.fail('通信エラー'); console.error(chalk_1.default.red(`サーバー接続エラー: ${error.message}`)); } } catch (error) { console.error(chalk_1.default.red('プラン確認エラー:'), error.message); } } async function getCredentials(options) { const questions = []; if (!options.email) { questions.push({ type: 'input', name: 'email', message: 'メールアドレス:', validate: (input) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(input)) { return '有効なメールアドレスを入力してください'; } return true; } }); } if (!options.password) { questions.push({ type: 'password', name: 'password', message: 'パスワード:', mask: '*', validate: (input) => { if (input.length < 6) { return 'パスワードは6文字以上で入力してください'; } return true; } }); } const answers = await inquirer_1.default.prompt(questions); return { email: options.email || answers.email, password: options.password || answers.password }; } function getStatusText(status) { switch (status) { case 'active': return ' アクティブ'; case 'canceled': return ' キャンセル済み'; case 'past_due': return ' 支払い遅延'; default: return status; } } function formatFeatureValue(value) { if (value === 'unlimited') return '無制限'; if (typeof value === 'number') return value.toLocaleString(); return value; }