最終更新: 2025-12-05 01:11 JST
本ドキュメントは、複数の画面で共通して使用されるAPIの仕様を定義します。
pub struct User {
pub user_id: i64,
pub name: String,
pub role: i64, // 0: Admin, 1: General User
}pub struct SessionInfo {
pub source_screen: Option<String>, // 遷移元画面名
pub category1_code: Option<String>, // 選択中の大分類コード
pub modal_state: Option<String>, // モーダルの状態
}現在ログイン中のユーザー情報を取得します。
パラメータ: なし
戻り値:
Option<User>: ログイン中の場合はユーザー情報、未ログインの場合はnull
使用例:
const user = await invoke('get_current_session_user');
if (user) {
console.log(`User: ${user.name}, Role: ${user.role}`);
}セッションが認証済みかどうかを確認します。
パラメータ: なし
戻り値:
bool: 認証済みの場合true、未認証の場合false
使用例:
const isAuth = await invoke('is_session_authenticated');
if (!isAuth) {
window.location.href = 'index.html';
}セッション情報をすべてクリアします(ログアウト処理)。
パラメータ: なし
戻り値: なし
使用例:
await invoke('clear_session');
window.location.href = 'index.html';注意:
- ユーザー情報と
SessionInfoのすべてのフィールドがクリアされます
遷移元画面名をセッションに保存します。
パラメータ:
source_screen(String): 画面名(例: "transaction-management")
戻り値: なし
使用例:
await invoke('set_session_source_screen', {
sourceScreen: 'transaction-management'
});セッションに保存された遷移元画面名を取得します。
パラメータ: なし
戻り値:
Option<String>: 画面名、未設定の場合はnull
使用例:
const sourceScreen = await invoke('get_session_source_screen');
if (sourceScreen) {
window.location.href = `${sourceScreen}.html`;
}セッションから遷移元画面名をクリアします。
パラメータ: なし
戻り値: なし
選択中の大分類コードをセッションに保存します。
パラメータ:
category1_code(String): 大分類コード(例: "EXPENSE")
戻り値: なし
使用例:
await invoke('set_session_category1_code', {
category1Code: 'EXPENSE'
});セッションに保存された大分類コードを取得します。
パラメータ: なし
戻り値:
Option<String>: 大分類コード、未設定の場合はnull
セッションから大分類コードをクリアします。
パラメータ: なし
戻り値: なし
モーダルの状態をセッションに保存します。
パラメータ:
modal_state(String): モーダル状態(例: "add", "edit")
戻り値: なし
セッションに保存されたモーダルの状態を取得します。
パラメータ: なし
戻り値:
Option<String>: モーダル状態、未設定の場合はnull
セッションからモーダルの状態をクリアします。
パラメータ: なし
戻り値: なし
指定された言語のすべての翻訳リソースを取得します。
パラメータ:
language(String): 言語コード("ja", "en"など)
戻り値:
HashMap<String, String>: キーと翻訳のマップ
使用例:
const translations = await invoke('get_translations', { language: 'ja' });
console.log(translations['common.save']); // "保存"指定されたキーの翻訳リソースを取得します。
パラメータ:
key(String): リソースキー(例: "common.save")lang_code(String): 言語コード
戻り値:
String: 翻訳文字列
フォールバック:
- 指定言語に翻訳がない場合、デフォルト言語(日本語)にフォールバック
- デフォルト言語にもない場合はエラー
使用例:
const label = await invoke('get_i18n_resource', {
key: 'common.save',
langCode: 'en'
});カテゴリ別に翻訳リソースを取得します。
パラメータ:
lang_code(String): 言語コードcategory(String): カテゴリ名(例: "common", "user")
戻り値:
HashMap<String, String>: カテゴリに属するリソースのマップ
使用例:
const commonResources = await invoke('get_i18n_resources_by_category', {
langCode: 'ja',
category: 'common'
});利用可能な言語コードの一覧を取得します。
パラメータ: なし
戻り値:
Vec<String>: 言語コードの配列(例:["ja", "en"])
使用例:
const languages = await invoke('get_available_languages');言語コードと表示名のペアを取得します。
パラメータ: なし
戻り値:
Vec<(String, String)>:(言語コード, 表示名)の配列
表示名の言語:
- 現在の設定言語に基づいて表示名を取得
使用例:
const langNames = await invoke('get_language_names');
// [["ja", "日本語"], ["en", "English"]]
langNames.forEach(([code, name]) => {
const option = document.createElement('option');
option.value = code;
option.textContent = name;
selectElement.appendChild(option);
});データベース内の暗号化対象フィールドの一覧を取得します。
パラメータ:
user_id(i64): ユーザーID
戻り値:
Vec<(String, String)>:(テーブル名, カラム名)の配列
使用例:
const fields = await invoke('list_encrypted_fields', { userId: 1 });
// [["TRANSACTION_MEMOS", "MEMO_TEXT"], ...]新しい暗号化対象フィールドを登録します。
パラメータ:
user_id(i64): ユーザーIDtable_name(String): テーブル名column_name(String): カラム名
戻り値:
String: 成功メッセージ
使用例:
await invoke('register_encrypted_field', {
userId: 1,
tableName: 'CUSTOM_TABLE',
columnName: 'SECRET_DATA'
});注意:
- 既に登録済みの場合はエラー
データベース接続をテストします。
パラメータ: なし
戻り値:
String: "OK" (接続成功時)
使用例:
try {
const result = await invoke('test_db_connection');
console.log('DB接続: ', result);
} catch (error) {
console.error('DB接続エラー:', error);
}ウィンドウサイズを調整します。
パラメータ:
width(f64): 幅(ピクセル)height(f64): 高さ(ピクセル)
戻り値: なし
使用例:
await invoke('adjust_window_size', {
width: 1200,
height: 800
});注意:
- デスクトップアプリケーションでのみ有効
アプリケーションを終了します。
パラメータ: なし
戻り値: なし
使用例:
await invoke('handle_quit');パスワードの妥当性を検証します。
パラメータ:
password(String): 検証するパスワード
戻り値:
- 成功時:
null - エラー時: エラーメッセージ
バリデーションルール:
- 最小16文字
使用例:
try {
await invoke('validate_password_frontend', {
password: 'MyPassword123456'
});
console.log('パスワードは有効です');
} catch (error) {
alert(error); // "Password must be at least 16 characters long"
}パスワードと確認用パスワードの妥当性を検証します。
パラメータ:
password(String): パスワードpassword_confirm(String): 確認用パスワード
戻り値:
- 成功時:
null - エラー時: エラーメッセージ
バリデーションルール:
- パスワードが最小16文字
- パスワードと確認用パスワードが一致
使用例:
try {
await invoke('validate_passwords_frontend', {
password: 'MyPassword123456',
passwordConfirm: 'MyPassword123456'
});
console.log('パスワードは有効です');
} catch (error) {
alert(error);
}| エラーメッセージ | 原因 | 対処方法 |
|---|---|---|
"User not authenticated" |
セッション未認証 | ログイン画面にリダイレクト |
"Resource not found: {key}" |
翻訳リソースが存在しない | リソースキーを確認 |
"Failed to get translations: ..." |
DB接続エラー | データベース確認 |
"Password must be at least 16 characters long" |
パスワードが短い | 16文字以上に変更 |
"Passwords do not match" |
パスワード不一致 | 入力を確認 |
// セッションチェック
async function checkSession() {
try {
const isAuth = await invoke('is_session_authenticated');
if (!isAuth) {
window.location.href = 'index.html';
return false;
}
return true;
} catch (error) {
console.error('Session check failed:', error);
return false;
}
}
// 翻訳取得(フォールバック付き)
async function translate(key, fallback = key) {
try {
const lang = localStorage.getItem('language') || 'ja';
return await invoke('get_i18n_resource', {
key,
langCode: lang
});
} catch (error) {
console.warn(`Translation not found for key: ${key}`);
return fallback;
}
}- タイムアウト: セッションに有効期限はありません(アプリケーションレベルで実装が必要)
- クリア: ログアウト時は必ず
clear_sessionを呼び出す - 認証チェック: 各画面で
is_session_authenticatedを必ず確認
- 最小長: 16文字(
MIN_PASSWORD_LENGTH定数) - 文字種制限: なし(Unicode対応)
- クライアント・サーバー両側でバリデーション実施
- AES-256-GCM: データ暗号化に使用
- ユーザー単位: 各ユーザーが独自の暗号化キーを保持
- パスワード変更時: 暗号化データの再暗号化が必要
セッション管理:
- ✅ 初期化テスト
- ✅ ユーザー設定・取得テスト
- ✅ クリア操作テスト
- ✅ 複数操作の連続実行テスト
I18n:
- ✅ リソース取得テスト
- ✅ フォールバックテスト
- ✅ パラメータ置換テスト
バリデーション:
- ✅ パスワード長チェック
- ✅ パスワード一致チェック
- ✅ Unicode文字対応テスト
// すべての画面で実行する初期化処理
async function initializePage() {
// 1. セッションチェック
const isAuth = await invoke('is_session_authenticated');
if (!isAuth) {
window.location.href = 'index.html';
return;
}
// 2. ユーザー情報取得
const user = await invoke('get_current_session_user');
console.log(`Logged in as: ${user.name}`);
// 3. 翻訳リソース読み込み
const lang = localStorage.getItem('language') || 'ja';
const translations = await invoke('get_translations', { language: lang });
// 4. UI要素に翻訳を適用
applyTranslations(translations);
// 5. セッション情報を画面に反映
const category1Code = await invoke('get_session_category1_code');
if (category1Code) {
// 前回選択していたカテゴリを復元
restoreCategorySelection(category1Code);
}
}
// ページロード時に実行
document.addEventListener('DOMContentLoaded', initializePage);- セッション管理:
src/services/session.rs - 国際化:
src/services/i18n.rs - 暗号化:
src/services/encryption.rs - バリデーション:
src/validation.rs - Tauri Commands:
src/lib.rs
変更履歴:
- 2025-12-05: 初版作成(実装コードに基づく)