mcpField
R
rust-fullstack

rust-fullstack

github.com/daiki48開発037 回インストール3 週間前に更新
リポジトリ

rust-fullstack について

Rust Full-Stack Web Development Patterns は、Rust で Web アプリケーションを構築する開発者向けのスキルです。Leptos のフロントエンド、Axum と SQLx のバックエンド、PostgreSQL に加え、認証、状態管理、API リクエスト、テナントルーティングのパターンを扱います。

主な機能

  1. 01Tailwind CSS と DaisyUI を使う Leptos フロントエンド
  2. 02Axum と SQLx のバックエンドパターン
  3. 03JWT アクセストークンとリフレッシュトークンの流れ
  4. 04フロントエンド状態と TTL ベースのキャッシュ
  5. 05API の再試行処理とテナントルーティング
  6. 06PostgreSQL のクエリと列挙型

活用シーン

  1. 01Rust のフルスタック Web アプリを構成
  2. 02Cookie ベースの JWT 認証を実装
  3. 03API のレート制限と 401 再試行に対応
  4. 04テナントのサブドメインでリクエストを振り分け

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/daiki48/dotfiles --skill rust-fullstack

インストール後、Claude Code で/rust-fullstackを入力して読み込まれたか確認します。

詳細

Rust フルスタック Web 開発パターン

技術スタック

レイヤー技術
フロントエンドLeptos(Rust→WASM CSR)、Tailwind CSS + DaisyUI
バックエンドAxum、SQLx(コンパイル時にクエリをチェック)
データベースPostgreSQL
ビルドTrunk(WASM)、Docker、Makefile

JWT デュアルトークン認証

Access Token (short-lived)  → API request auth
Refresh Token (long-lived)  → Access token renewal
  • HTTP-only Cookie に保存(XSS 対策)
  • バックエンド:トークンの検証
  • フロントエンド:401 時に自動で再試行
// Backend: Cookie setup
let cookie = format!(
    "access_token={}; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age={}",
    token, 900  // 15 min
);

// Frontend: 401 retry
if response.status() == 401 {
    refresh_token().await?;
    // Retry original request
}

フロントエンドの状態管理

provide_context(AuthContext::new());
provide_context(AppCache::new());  // TTL-based cache
provide_context(ToastContext::new());

// localStorage for preferences
let stored = window().local_storage()?.get_item("preferences")?;

API クライアントパターン

// Rate limiting (429) handling
async fn fetch_with_retry<T>(request: impl Fn() -> Future<T>) -> Result<T> {
    loop {
        match request().await {
            Err(e) if e.status() == 429 => {
                let delay = e.retry_after().unwrap_or(1000);
                sleep(delay).await;
            }
            result => return result,
        }
    }
}

// Token refresh queue (prevent multiple refreshes)
static REFRESH_LOCK: OnceCell<RwLock<()>> = OnceCell::new();

マルチテナントのルーティング

{tenant}.example.com → Tenant identification
fn extract_subdomain(host: &str) -> Option<String> {
    let parts: Vec<&str> = host.split('.').collect();
    (parts.len() >= 3).then(|| parts[0].to_string())
}

async fn check_tenant_access(claims: &Claims, subdomain: &str) -> Result<(), AppError> {
    // Verify user has access to this tenant
}

データベース

// SQLx compile-time query checking
let user = sqlx::query_as!(
    User,
    r#"SELECT id, name, role as "role: UserRole" FROM users WHERE id = $1"#,
    id
).fetch_one(&pool).await?;

// PostgreSQL ENUMs
#[derive(sqlx::Type)]
#[sqlx(type_name = "user_role", rename_all = "PascalCase")]
pub enum UserRole { Admin, AreaManager, ServiceStation }

よく使うコマンド

make dev          # Start local environment
make fmt          # Format (cargo fmt + leptosfmt)
make lint         # Clippy checks
make test         # Run tests
make migrate-run  # Apply migrations

開発メモ

項目値
バックエンドのポート3000
ローカルサブドメインlvh.me(127.0.0.1 に解決されます)
環境ファイル.env.development、.env.staging、.env.production
必須の環境変数DATABASE_URL、JWT_SECRET、APP_ENV

関連スキル

  • leptos-guide - Leptos フロントエンド
  • axum-guide - Axum バックエンド
  • sqlx-postgres - SQLx + PostgreSQL

コメント