Initial Rust/Axum API skeleton
This commit is contained in:
commit
3693a19411
7 changed files with 84 additions and 0 deletions
5
.env.example
Normal file
5
.env.example
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
DATABASE_URL=postgres://nexus:@localhost:5432/nexus_dev
|
||||||
|
JWT_SECRET=
|
||||||
|
JWT_EXPIRY_SECS=3600
|
||||||
|
PORT=8080
|
||||||
|
RUST_LOG=info
|
||||||
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
/target
|
||||||
|
.env
|
||||||
|
*.log
|
||||||
|
Cargo.lock
|
||||||
23
Cargo.toml
Normal file
23
Cargo.toml
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
[package]
|
||||||
|
name = "nexus-api"
|
||||||
|
version = "1.3.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
axum = "0.7"
|
||||||
|
tokio = { version = "1", features = ["full"] }
|
||||||
|
sqlx = { version = "0.7", features = ["postgres", "runtime-tokio", "uuid", "time"] }
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
serde_json = "1"
|
||||||
|
uuid = { version = "1", features = ["v4"] }
|
||||||
|
jsonwebtoken = "9"
|
||||||
|
tracing = "0.1"
|
||||||
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||||
|
tower = "0.4"
|
||||||
|
tower-http = { version = "0.5", features = ["trace", "cors"] }
|
||||||
|
anyhow = "1"
|
||||||
|
thiserror = "1"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
tokio-test = "0.4"
|
||||||
|
reqwest = { version = "0.12", features = ["json"] }
|
||||||
27
README.md
Normal file
27
README.md
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
# nexus/backend-api
|
||||||
|
|
||||||
|
Core REST API for the Nexus platform. Built with Rust (Axum).
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
cargo build
|
||||||
|
cargo test
|
||||||
|
cargo run -- --port 8080
|
||||||
|
|
||||||
|
## Environment
|
||||||
|
|
||||||
|
Copy `.env.example` to `.env` before running locally.
|
||||||
|
|
||||||
|
## API Reference
|
||||||
|
|
||||||
|
| Endpoint | Method | Description |
|
||||||
|
|----------|--------|-------------|
|
||||||
|
| `/health` | GET | Liveness check |
|
||||||
|
| `/api/v1/users` | GET | List users |
|
||||||
|
| `/api/v1/users/:id` | GET | Get user by ID |
|
||||||
|
| `/api/v1/auth/login` | POST | Authenticate |
|
||||||
|
| `/api/v1/auth/refresh` | POST | Refresh JWT |
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
Request → Axum router → middleware (auth, logging) → handler → SQLx → PostgreSQL
|
||||||
6
src/api/health.rs
Normal file
6
src/api/health.rs
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
use axum::{http::StatusCode, Json};
|
||||||
|
use serde_json::{json, Value};
|
||||||
|
|
||||||
|
pub async fn health_check() -> (StatusCode, Json<Value>) {
|
||||||
|
(StatusCode::OK, Json(json!({ "status": "ok", "version": env!("CARGO_PKG_VERSION") })))
|
||||||
|
}
|
||||||
3
src/api/mod.rs
Normal file
3
src/api/mod.rs
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
pub mod health;
|
||||||
|
pub mod users;
|
||||||
|
pub mod auth;
|
||||||
16
src/models/user.rs
Normal file
16
src/models/user.rs
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, sqlx::FromRow)]
|
||||||
|
pub struct User {
|
||||||
|
pub id: Uuid,
|
||||||
|
pub username: String,
|
||||||
|
pub email: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct CreateUserRequest {
|
||||||
|
pub username: String,
|
||||||
|
pub email: String,
|
||||||
|
pub password: String,
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue