raisfast 0.2.19

The last backend you'll ever need. Rust-powered headless CMS with built-in blog, ecommerce, wallet, payment and 4 plugin engines.
# Contributing to raisfast

Thank you for your interest in contributing to raisfast!

## Status

raisfast is in **early alpha**. The codebase evolves rapidly and APIs may change without notice. We appreciate your patience and willingness to contribute at this stage.

## How to Contribute

### Bug Reports

- Open a [GitHub Issue]https://github.com/snkzhong/raisfast/issues/new
- Include: Rust version, OS, feature flags used, steps to reproduce, expected vs actual behavior
- Check existing issues before filing a new one

### Feature Requests

- Open a GitHub Issue with the `feature-request` label
- Describe the use case, not just the solution
- Indicate if you're willing to implement it

### Pull Requests

1. Fork the repository
2. Create a feature branch: `git checkout -b feature/my-feature`
3. Make your changes
4. Ensure all checks pass:
   ```bash
   cargo fmt --check
   cargo clippy --features "db-sqlite plugin-all search-tantivy" -- -D warnings
   cargo test --features "db-sqlite plugin-all search-tantivy" -- --test-threads=1
   ```
5. Submit a pull request

## Development Setup

### Prerequisites

- Rust 1.85+ (edition 2024)
- pnpm (for Admin UI development)
- SQLite 3.x

### Build

```bash
# Backend only
cargo build --features "db-sqlite plugin-all search-tantivy"

# Backend + Admin UI
just build-full
```

### Test

```bash
# Unit + integration tests
cargo test --features "db-sqlite plugin-all search-tantivy" -- --test-threads=1

# Lint
cargo clippy --features "db-sqlite plugin-all search-tantivy" -- -D warnings

# Format check
cargo fmt --check
```

### Admin UI Development

```bash
cd frontend/admin
pnpm install
pnpm dev    # Dev server at http://localhost:5173
pnpm build  # Production build (embedded into Rust binary)
```

## Code Style

### Rust

- `cargo fmt` and `cargo clippy` are authoritative
- Public items require `///` doc comments
- Handler → Service → Repository layering enforced; handlers must not contain business logic
- No `unsafe` code (`#![deny(unsafe_code)]` at crate root)
- No `unwrap()` / `expect()` in non-test code; use `?` or explicit error handling
- Error handling: `thiserror` for `AppError` enum at handler boundaries; `anyhow` for internal service errors
- SQL queries use `sqlx::query()` / `sqlx::query_as()` (not `!` macros) + `dialect::translate()`
- All database-specific code uses `crate::db::dialect::*` helpers for portability

### Commits

- Use clear, descriptive commit messages
- Keep PRs focused on a single concern
- Rebase on main before submitting

## Architecture

Before contributing, please read:

- `docs/guide.md` — Product and architecture specification
- `AGENTS.md` — Technical constraints and coding conventions
- `docs/serverless.md` — Serverless deployment design
- `docs/product-analysis.md` — Product positioning and roadmap

## License

By contributing, you agree that your contributions will be licensed under the same license as the module you're modifying:

- Core framework: MIT
- Commercial modules: BSL 1.1