kawazu
Version:
kawazu CLI tool for real-time chat in your editor
250 lines (249 loc) • 11.4 kB
JavaScript
;
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;
}