Back to list
varubogu

clean-architecture

by varubogu

1🍴 0📅 Jan 24, 2026

SKILL.md


name: clean-architecture description: Clean architecture 4-layer structure (events/facades/services/repository), transaction management, dependency rules. Use when creating events, facades, services, repositories, managing transactions, asking about layer responsibilities, architectural questions, or refactoring code.

Clean Architecture Guide

Layer Flow

events (Presentation) → facades (Application) → services (Business Logic) → repository (Data Access)

Layer Responsibilities

events/

Discord event handlers (slash commands, buttons, reactions)

  • Call facades (1:1 relationship)
  • Prohibited: Direct access to Service/Repository layers

facades/

Coordinate multiple services, manage transaction boundaries

  • Only layer responsible for transaction management (begin/commit/rollback)
  • Compose services to implement use cases

services/

Single business operations, domain rules

  • Call repositories
  • Receive transactions as arguments, pass to repositories only
  • Prohibited: Direct dependency on other services

repository/

Data persistence and retrieval abstraction

  • DB operations with transactions (create_with_txn, etc.)
  • Prohibited: Business logic implementation

Transaction Management (Critical)

Only Facade layer can manage transactions

Facade Layer

let txn = app_state.db().begin().await?;
let result = async {
    service_layer_call(&txn).await?;
    Ok(())
}.await;
match result {
    Ok(_) => txn.commit().await?,
    Err(e) => txn.rollback().await?,
}

Service Layer

pub async fn service_function(txn: &DatabaseTransaction) -> Result<()> {
    repository.create_with_txn(txn, ...).await?;
    Ok(())  // No commit/rollback
}

Repository Layer

pub async fn create_with_txn(&self, txn: &DatabaseTransaction, ...) -> Result<()> {
    entity.insert(txn).await?;
    Ok(())  // No commit/rollback
}

Dependency Injection

AppState pattern (Rust-idiomatic approach, not DI container)

  • Initialize single DB connection and AppState in main.rs
  • Share across all layers via PoiseData
  • Constructor injection for dependencies
  • Prohibited: Creating individual DB connections per layer

Architecture Constraints

Prohibited

  • Cross-layer direct access (e.g., Facade → Repository direct call)
  • DB operations outside transactions
  • Transaction creation/commit/rollback in Service/Repository layers
  • Long-held transactions
  • Global variables

Code Quality Constraints

  • No functions over 100 lines
  • No nesting deeper than 5 levels
  • Avoid unnecessary clone(), use borrowing
  • Minimize Arc<T> usage

Performance

  • Use futures::future::try_join_all for concurrent operations

Score

Total Score

60/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon