feat: comprehensive project improvements
Some checks failed
CI / Rust Format (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Test Server (push) Has been cancelled
CI / Frontend Check (push) Has been cancelled
CI / Tauri Client Check (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Build Tauri (Linux) (push) Has been cancelled

- Fix 14 Clippy warnings across server and bot-sdk
- Add 67 unit tests (32 bot-sdk, 34 server, 1 doctest)
- Add Prometheus metrics endpoint (/api/metrics)
- Add structured JSON logging (EIFELDC_LOG_FORMAT=json)
- Add release workflow (Docker push + GitHub Release + Tauri builds)
- Add rate limiting middleware (EIFELDC_RATE_LIMIT)
- Add CORS restriction (EIFELDC_CORS_ORIGINS)
- Add session token expiry (EIFELDC_SESSION_TTL)
- Add input validation (username/password/homeserver length limits)
- Add upload size limit (EIFELDC_MAX_UPLOAD_MB)
- Upgrade Tauri client from v1 to v2
- Add session store with SQLite persistence
- Add proper error types and cleanup across all crates
- Format all code with cargo fmt
- Update CI pipeline with fmt, clippy, test, frontend, and Tauri checks
- Add README with full API reference and setup guide
This commit is contained in:
root
2026-04-29 13:08:01 +02:00
parent 0978d0c2e9
commit cacd2b04a7
80 changed files with 18307 additions and 1724 deletions

View File

@@ -11,19 +11,30 @@ env:
RUST_BACKTRACE: 1
jobs:
check-rust:
name: Rust Check
fmt:
name: Rust Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-action/setup@v1
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev libssl-dev libgtksourceview-3.0-dev
- name: Check formatting
run: cargo fmt --all -- --check
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- name: Cache Cargo
uses: actions/cache@v4
@@ -32,35 +43,23 @@ jobs:
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-
key: ${{ runner.os }}-cargo-clippy-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-clippy-
- name: Cargo check (client)
run: cargo check -p eifeldc-client
- name: Clippy (server)
run: cargo clippy -p eifeldc-server -- -D warnings
- name: Cargo check (bot-sdk)
run: cargo check -p eifeldc-bot-sdk
- name: Clippy (bot-sdk)
run: cargo clippy -p eifeldc-bot-sdk -- -D warnings
- name: Cargo check (server)
run: cargo check -p eifeldc-server
- name: Cargo clippy
run: cargo clippy --workspace -- -D warnings
test-rust:
name: Rust Tests
test-server:
name: Test Server
runs-on: ubuntu-latest
needs: check-rust
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-action/setup@v1
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev libssl-dev
uses: dtolnay/rust-toolchain@stable
- name: Cache Cargo
uses: actions/cache@v4
@@ -69,11 +68,14 @@ jobs:
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-
key: ${{ runner.os }}-cargo-server-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-server-
- name: Run tests
run: cargo test --workspace
- name: Test (server)
run: cargo test -p eifeldc-server
- name: Test (bot-sdk)
run: cargo test -p eifeldc-bot-sdk
check-frontend:
name: Frontend Check
@@ -89,118 +91,84 @@ jobs:
with:
node-version: 20
cache: npm
cache-dependency-path: client/src-ui/package.json
cache-dependency-path: client/src-ui/package-lock.json
- name: Install dependencies
run: npm ci
- name: Svelte check
run: npm run check
- name: Build
run: npm run build
build-tauri-macos:
name: Build Tauri (macOS)
runs-on: macos-latest
needs: [check-rust, check-frontend]
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-action/setup@v1
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: client/src-ui/package.json
- name: Install frontend deps
run: npm ci
working-directory: client/src-ui
- name: Build Tauri (macOS)
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
projectPath: client
tagName: v__VERSION__
releaseName: "EifelDC v__VERSION__"
releaseBody: "EifelDC Release"
releaseDraft: true
args: --target aarch64-apple-darwin
- name: Upload macOS .dmg
uses: actions/upload-artifact@v4
with:
name: EifelDC-macos-aarch64
path: client/src-tauri/target/release/bundle/dmg/*.dmg
build-tauri-macos-intel:
name: Build Tauri (macOS Intel)
runs-on: macos-latest
needs: [check-rust, check-frontend]
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-action/setup@v1
with:
targets: x86_64-apple-darwin
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: client/src-ui/package.json
- name: Install frontend deps
run: npm ci
working-directory: client/src-ui
- name: Build Tauri (macOS Intel)
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
projectPath: client
tagName: v__VERSION__
releaseName: "EifelDC v__VERSION__"
releaseBody: "EifelDC Release"
releaseDraft: true
args: --target x86_64-apple-darwin
- name: Upload macOS Intel .dmg
uses: actions/upload-artifact@v4
with:
name: EifelDC-macos-x86_64
path: client/src-tauri/target/x86_64-apple-darwin/release/bundle/dmg/*.dmg
build-tauri-linux:
name: Build Tauri (Linux)
check-client-tauri:
name: Tauri Client Check
runs-on: ubuntu-latest
needs: [check-rust, check-frontend]
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-action/setup@v1
uses: dtolnay/rust-toolchain@stable
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev libssl-dev libgtksourceview-3.0-dev
sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev libssl-dev
- name: Cache Cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-client-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-client-
- name: Cargo check (client)
run: cargo check -p eifeldc-client
build-docker:
name: Docker Build
runs-on: ubuntu-latest
needs: [test-server, check-frontend]
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: false
tags: eifeldc:latest
cache-from: type=gha
cache-to: type=gha,mode=max
build-tauri-linux:
name: Build Tauri (Linux)
runs-on: ubuntu-latest
needs: [check-client-tauri, check-frontend]
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev libssl-dev
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: client/src-ui/package.json
cache-dependency-path: client/src-ui/package-lock.json
- name: Install frontend deps
run: npm ci

235
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,235 @@
name: Release
on:
push:
tags:
- 'v*'
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
build-server:
name: Build Server Binary
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Cache Cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-release-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-release-
- name: Build release binary
run: cargo build --release -p eifeldc-server
- name: Upload server binary
uses: actions/upload-artifact@v4
with:
name: eifeldc-server-linux-amd64
path: target/release/eifeldc-server
build-frontend:
name: Build Frontend
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: client/src-ui/package-lock.json
- name: Install dependencies
run: cd client/src-ui && npm ci
- name: Build
run: cd client/src-ui && npm run build
- name: Upload frontend dist
uses: actions/upload-artifact@v4
with:
name: eifeldc-frontend
path: client/src-ui/dist
docker-push:
name: Docker Push
runs-on: ubuntu-latest
needs: []
steps:
- uses: actions/checkout@v4
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
ghcr.io/${{ github.repository }}/server
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=sha
- name: Login to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
build-tauri-linux:
name: Build Tauri (Linux)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev libssl-dev
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: client/src-ui/package-lock.json
- name: Install frontend deps
run: cd client/src-ui && npm ci
- name: Build Tauri (Linux)
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
projectPath: client
tagName: ${{ github.ref_name }}
releaseName: "EifelDC ${{ github.ref_name }}"
releaseBody: "See [CHANGELOG.md](CHANGELOG.md) for details."
releaseDraft: true
build-tauri-macos:
name: Build Tauri (macOS)
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: client/src-ui/package-lock.json
- name: Install frontend deps
run: cd client/src-ui && npm ci
- name: Build Tauri (macOS)
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
projectPath: client
tagName: ${{ github.ref_name }}
releaseName: "EifelDC ${{ github.ref_name }}"
releaseBody: "See [CHANGELOG.md](CHANGELOG.md) for details."
releaseDraft: true
build-tauri-windows:
name: Build Tauri (Windows)
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: client/src-ui/package-lock.json
- name: Install frontend deps
run: cd client/src-ui && npm ci
- name: Build Tauri (Windows)
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
projectPath: client
tagName: ${{ github.ref_name }}
releaseName: "EifelDC ${{ github.ref_name }}"
releaseBody: "See [CHANGELOG.md](CHANGELOG.md) for details."
releaseDraft: true
create-release:
name: Create GitHub Release
runs-on: ubuntu-latest
needs: [build-server, build-frontend, docker-push]
steps:
- uses: actions/checkout@v4
- name: Download server binary
uses: actions/download-artifact@v4
with:
name: eifeldc-server-linux-amd64
path: release-assets
- name: Download frontend dist
uses: actions/download-artifact@v4
with:
name: eifeldc-frontend
path: release-assets/frontend
- name: Create release archive
run: |
cd release-assets
tar czf eifeldc-server-linux-amd64.tar.gz eifeldc-server
cd frontend
tar czf ../eifeldc-frontend.tar.gz .
cd ..
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
draft: true
generate_release_notes: true
files: |
release-assets/eifeldc-server-linux-amd64.tar.gz
release-assets/eifeldc-frontend.tar.gz