diff --git a/.env b/.env deleted file mode 100644 index c715eb7..0000000 --- a/.env +++ /dev/null @@ -1,27 +0,0 @@ -# Database Configuration -DATABASE_URL=mysql://root:114514@localhost:3306/astarcupDev - -# OAuth Configuration -OSU_CLIENT_ID = 43674 -OSU_CLIENT_SECRET = 1HAJGGeerfrXficVtVWN5wD0KbyKnbeiyhCCXLwp -OSU_REDIRECT_URI = http://localhost:3000/api/auth/callback/osu - -# OAuth Configuration for g0v0.top server -GU_CLIENT_ID = 13 -GU_CLIENT_SECRET = fdcab562f6cfd5c62c0345e40791e7273ab8d4ed5459a4bac690d91f5c3f3b3f -GU_REDIRECT_URI = http://localhost:3000/api/auth/callback/gu - -# JWT Configuration -JWT_SECRET=457ceac798afbc2e305c4833844a2736 -JWT_EXPIRY_HOURS=24 - -# Server Configuration -PORT=3001 -HOST=localhost -LOG_LEVEL=info - -# CORS Configuration -CORS_ORIGIN=http://localhost:3000 - -# Redis Configuration (Optional) -REDIS_URL=redis://localhost:6379 diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index 5bf53ce..0000000 --- a/Cargo.toml +++ /dev/null @@ -1,71 +0,0 @@ -[package] -name = "astracup-backend" -version = "0.0.1" -edition = "2024" -authors = ["AstraCup Team"] -description = "AstraCup tournament management backend" -license = "MIT" -repository = "https://github.com/AECBanana/astracup-web" - -[dependencies] -# Web framework -axum = { version = "0.8.8", features = ["macros"] } -tokio = { version = "1.49", features = ["full"] } -tower = "0.5.3" -tower-http = { version = "0.6.8", features = ["cors", "trace"] } - -# Database -sea-orm = { version = "1.1.19", features = ["sqlx-mysql", "runtime-tokio-native-tls", "macros"] } -sqlx = { version = "0.8.6", features = ["mysql", "runtime-tokio-native-tls"] } -dotenv = "0.15" - -# Serialization -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" - -# Authentication and security -jsonwebtoken = "10.3" -bcrypt = "0.18" -argon2 = "0.5" -rand = "0.10" -async-trait = "0.1" - -# HTTP client for OAuth -reqwest = { version = "0.13", features = ["json"] } - -# Configuration -config = "0.15" -anyhow = "1.0" -thiserror = "2.0" - -# Logging and tracing -tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } - -# Validation -validator = { version = "0.20", features = ["derive"] } - -# Utilities -chrono = { version = "0.4", features = ["serde"] } -uuid = { version = "1.20", features = ["v4", "serde"] } -futures = "0.3" -axum-extra = { version = "0.12.5", features = ["typed-header"] } -utoipa = { version = "5.4.0", features = ["axum_extras"] } -utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] } -decimal = "2.1.0" -urlencoding = "2.1.3" - -[dev-dependencies] -# Testing -tokio = { version = "1.0", features = ["full"] } -reqwest = { version = "0.13", features = ["json"] } -mockall = "0.14" - -[profile.dev] -opt-level = 0 -debug = true - -[profile.release] -opt-level = 3 -lto = true -codegen-units = 1 \ No newline at end of file diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md deleted file mode 100644 index 53c450c..0000000 --- a/IMPLEMENTATION_PLAN.md +++ /dev/null @@ -1,212 +0,0 @@ -# AstraCup Backend - CRUD 实施计划 - -## 项目概述 -为AstraCup比赛管理后端生成完整的CRUD API,包括认证、授权和系统初始化功能。 - -## 技术栈 -- **框架**: Axum 0.8.8 -- **数据库**: SeaORM 1.1.19 + MySQL -- **认证**: JWT + osu! OAuth 2.0 -- **文档**: utoipa (OpenAPI/Swagger) -- **验证**: validator 0.20 -- **配置**: dotenv + config - -## 实施阶段 - -### 第一阶段:基础架构搭建 ✅ -- [x] 创建项目目录结构 -- [x] 实现数据库连接池 -- [x] 配置管理系统 -- [x] 错误处理系统 -- [x] 基础DTO和Service模板 - -### 第二阶段:认证系统 🔄 -- [ ] JWT认证中间件 -- [ ] osu! OAuth集成(含refresh token存储) -- [ ] 用户注册/登录流程 -- [ ] 权限中间件(基于UserGroup) - -### 第三阶段:核心CRUD -- [ ] User API完整实现 -- [ ] 管理员设置功能 -- [ ] 系统初始化逻辑 -- [ ] TournamentSettings API - -### 第四阶段:其他Entity CRUD -- [ ] MatchRooms API -- [ ] MatchSchedules API -- [ ] PlayerMatchups API -- [ ] MapSelections API -- [ ] MapComments API -- [ ] Messages API - -### 第五阶段:文档和优化 -- [ ] OpenAPI文档生成 -- [ ] 测试编写 -- [ ] 性能优化 -- [ ] 部署配置 - -## 详细任务分解 - -### 第一阶段任务 -1. **目录结构创建** - - [x] 创建 `src/api/` 目录和模块 - - [x] 创建 `src/service/` 目录和模块 - - [x] 创建 `src/dto/` 目录和模块 - - [x] 创建 `src/error/` 目录和模块 - - [x] 创建 `src/config/` 目录和模块 - - [x] 创建 `src/middleware/` 目录和模块 - - [x] 创建 `src/utils/` 目录和模块 - -2. **数据库连接** - - [x] 实现Database配置 - - [x] 创建连接池管理 - - [x] 添加数据库迁移支持 - -3. **错误处理** - - [x] 定义AppError枚举 - - [x] 实现From trait用于错误转换 - - [x] 创建统一的错误响应格式 - -4. **配置管理** - - [x] 从.env读取配置 - - [x] 创建Config结构体 - - [x] 实现配置验证 - -### 第二阶段任务 -1. **JWT认证** - - [ ] 创建JWT工具函数 - - [ ] 实现Token生成和验证 - - [ ] 创建认证中间件 - -2. **osu! OAuth集成** - - [ ] 添加OAuth相关字段到User entity - - [ ] 实现OAuth授权流程 - - [ ] 处理OAuth回调 - - [ ] 存储access/refresh token - -3. **权限管理** - - [ ] 创建权限检查中间件 - - [ ] 实现基于UserGroup的权限控制 - - [ ] 管理员权限特殊处理 - -### 第三阶段任务 -1. **User API** - - [ ] 创建User DTOs - - [ ] 实现UserService - - [ ] 创建User API路由 - - [ ] 添加数据验证 - -2. **系统初始化** - - [ ] 检查tournament_settings表 - - [ ] 创建默认比赛设置 - - [ ] 管理员用户初始化逻辑 - -3. **TournamentSettings API** - - [ ] 创建TournamentSettings DTOs - - [ ] 实现TournamentSettingsService - - [ ] 创建API路由 - -### 第四阶段任务 -1. **MatchRooms API** - - [ ] 创建MatchRooms DTOs - - [ ] 实现MatchRoomsService - - [ ] 创建API路由 - -2. **其他Entity API**(类似模式) - - [ ] MatchSchedules - - [ ] PlayerMatchups - - [ ] MapSelections - - [ ] MapComments - - [ ] Messages - -### 第五阶段任务 -1. **文档生成** - - [ ] 集成utoipa - - [ ] 为所有API添加OpenAPI注解 - - [ ] 设置Swagger UI路由 - -2. **测试** - - [ ] 单元测试 - - [ ] 集成测试 - - [ ] API测试 - -3. **优化** - - [ ] 性能优化 - - [ ] 错误处理优化 - - [ ] 日志优化 - -## 数据库变更 - -### User表新增字段 -```sql -ALTER TABLE user -ADD COLUMN osu_access_token VARCHAR(512) NULL, -ADD COLUMN osu_refresh_token VARCHAR(512) NULL, -ADD COLUMN osu_token_expires_at TIMESTAMP NULL; -``` - -## API端点设计 - -### 认证相关 -- `GET /api/auth/osu` - 重定向到osu! OAuth -- `GET /api/auth/callback/osu` - OAuth回调 -- `POST /api/auth/refresh` - 刷新JWT token -- `POST /api/auth/logout` - 登出 - -### 用户管理 -- `GET /api/users` - 获取用户列表(管理员) -- `GET /api/users/{id}` - 获取用户详情 -- `PUT /api/users/{id}` - 更新用户信息 -- `PUT /api/users/{id}/user-group` - 修改用户组(管理员) -- `DELETE /api/users/{id}` - 删除用户(管理员) - -### 比赛管理 -- `GET /api/match-rooms` - 获取比赛房间列表 -- `POST /api/match-rooms` - 创建比赛房间 -- `GET /api/match-rooms/{id}` - 获取比赛房间详情 -- `PUT /api/match-rooms/{id}` - 更新比赛房间 -- `DELETE /api/match-rooms/{id}` - 删除比赛房间 - -## 权限规则 - -### 用户角色 -1. **玩家 (Player)** - - 查看公开信息 - - 管理自己的数据 - - 参与比赛 - -2. **管理员 (Admin)** - - 所有玩家权限 - - 管理所有用户 - - 修改系统设置 - - 管理比赛 - -### 权限矩阵 -| 操作 | 玩家 | 管理员 | -|------|------|--------| -| 查看用户列表 | ❌ | ✅ | -| 修改用户组 | ❌ | ✅ | -| 创建比赛房间 | ✅ | ✅ | -| 删除比赛房间 | 仅自己 | ✅ | -| 修改系统设置 | ❌ | ✅ | - -## 开发注意事项 - -1. **安全性** - - 所有密码/Token加密存储 - - JWT secret从环境变量读取 - - 输入验证和清理 - - SQL注入防护 - -2. **性能** - - 数据库连接池 - - 查询优化 - - 缓存策略 - -3. **可维护性** - - 清晰的错误信息 - - 完整的日志记录 - - 统一的代码风格 - - 详细的API文档 - diff --git a/.env.example b/astarcup/.env.example similarity index 84% rename from .env.example rename to astarcup/.env.example index 59ae220..e549caa 100644 --- a/.env.example +++ b/astarcup/.env.example @@ -17,6 +17,3 @@ LOG_LEVEL=info # CORS Configuration CORS_ORIGIN=http://localhost:3000 - -# Redis Configuration (Optional) -REDIS_URL=redis://localhost:6379 \ No newline at end of file diff --git a/Cargo.lock b/astarcup/Cargo.lock similarity index 56% rename from Cargo.lock rename to astarcup/Cargo.lock index 07b782b..8905b84 100644 --- a/Cargo.lock +++ b/astarcup/Cargo.lock @@ -2,32 +2,17 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "ahash" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.17", + "getrandom", "once_cell", "version_check", ] -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - [[package]] name = "aliasable" version = "0.1.3" @@ -49,45 +34,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anstyle" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" - -[[package]] -name = "anyhow" -version = "1.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" - -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" -dependencies = [ - "derive_arbitrary", -] - -[[package]] -name = "argon2" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" -dependencies = [ - "base64ct", - "blake2", - "cpufeatures 0.2.17", - "password-hash", -] - -[[package]] -name = "arraydeque" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" - [[package]] name = "arrayvec" version = "0.7.6" @@ -95,39 +41,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] -name = "astracup-backend" -version = "0.0.1" +name = "astarcup" +version = "0.1.0" dependencies = [ - "anyhow", - "argon2", - "async-trait", "axum", - "axum-extra", - "bcrypt", - "chrono", - "config", - "decimal", "dotenv", - "futures", - "jsonwebtoken", - "mockall", - "rand 0.10.0", - "reqwest", "sea-orm", "serde", "serde_json", - "sqlx", - "thiserror 2.0.18", + "thiserror 1.0.69", "tokio", - "tower", "tower-http", "tracing", - "tracing-subscriber", - "urlencoding", - "utoipa", - "utoipa-swagger-ui", - "uuid", - "validator", ] [[package]] @@ -149,7 +74,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -160,7 +85,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -172,63 +97,34 @@ dependencies = [ "num-traits", ] -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "aws-lc-rs" -version = "1.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" -dependencies = [ - "aws-lc-sys", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c34dda4df7017c8db52132f0f8a2e0f8161649d15723ed63fc00c82d0f2081a" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", -] - [[package]] name = "axum" -version = "0.8.8" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ + "async-trait", "axum-core", - "axum-macros", + "bitflags 1.3.2", "bytes", - "form_urlencoded", "futures-util", "http", "http-body", - "http-body-util", "hyper", - "hyper-util", "itoa", "matchit", "memchr", "mime", "percent-encoding", "pin-project-lite", - "serde_core", + "rustversion", + "serde", "serde_json", "serde_path_to_error", "serde_urlencoded", @@ -237,59 +133,23 @@ dependencies = [ "tower", "tower-layer", "tower-service", - "tracing", ] [[package]] name = "axum-core" -version = "0.5.6" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" dependencies = [ + "async-trait", "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-extra" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef252edff26ddba56bbcdf2ee3307b8129acb86f5749b68990c168a6fcc9c76" -dependencies = [ - "axum", - "axum-core", - "bytes", - "futures-core", "futures-util", - "headers", "http", "http-body", - "http-body-util", "mime", - "pin-project-lite", + "rustversion", "tower-layer", "tower-service", - "tracing", -] - -[[package]] -name = "axum-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", ] [[package]] @@ -304,19 +164,6 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" -[[package]] -name = "bcrypt" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a0f5948f30df5f43ac29d310b7476793be97c50787e6ef4a63d960a0d0be827" -dependencies = [ - "base64", - "blowfish", - "getrandom 0.3.4", - "subtle", - "zeroize", -] - [[package]] name = "bigdecimal" version = "0.4.10" @@ -339,9 +186,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" dependencies = [ "serde_core", ] @@ -358,15 +205,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -376,16 +214,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "blowfish" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7" -dependencies = [ - "byteorder", - "cipher", -] - [[package]] name = "borsh" version = "1.6.0" @@ -406,14 +234,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytecheck" @@ -451,22 +279,14 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.55" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ "find-msvc-tools", - "jobserver", - "libc", "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfg-if" version = "1.0.4" @@ -479,17 +299,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chacha20" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "rand_core 0.10.0", -] - [[package]] name = "chrono" version = "0.4.43" @@ -497,42 +306,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", - "js-sys", "num-traits", "serde", - "wasm-bindgen", "windows-link", ] -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "cmake" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" -dependencies = [ - "cc", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -542,81 +320,12 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "config" -version = "0.15.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30fa8254caad766fc03cb0ccae691e14bf3bd72bfff27f72802ce729551b3d6" -dependencies = [ - "async-trait", - "convert_case", - "json5", - "pathdiff", - "ron", - "rust-ini", - "serde-untagged", - "serde_core", - "serde_json", - "toml", - "winnow", - "yaml-rust2", -] - [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -632,15 +341,6 @@ dependencies = [ "libc", ] -[[package]] -name = "cpufeatures" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" -dependencies = [ - "libc", -] - [[package]] name = "crc" version = "3.4.0" @@ -656,15 +356,6 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - [[package]] name = "crossbeam-queue" version = "0.3.12" @@ -680,12 +371,6 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - [[package]] name = "crypto-common" version = "0.1.7" @@ -696,55 +381,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.114", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "decimal" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a8ab77e91baeb15034c3be91e87bff4665c9036216148e4996d9a9f5792114d" -dependencies = [ - "bitflags 1.3.2", - "cc", - "libc", - "ord_subset", - "rustc-serialize", - "serde", -] - [[package]] name = "der" version = "0.7.10" @@ -758,25 +394,14 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" dependencies = [ "powerfmt", "serde_core", ] -[[package]] -name = "derive_arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - [[package]] name = "derive_more" version = "2.1.1" @@ -795,7 +420,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.114", + "syn 2.0.117", "unicode-xid", ] @@ -819,16 +444,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[package]] -name = "dlv-list" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" -dependencies = [ - "const-random", + "syn 2.0.117", ] [[package]] @@ -843,18 +459,6 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" -[[package]] -name = "downcast" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - [[package]] name = "either" version = "1.15.0" @@ -864,32 +468,12 @@ dependencies = [ "serde", ] -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "erased-serde" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - [[package]] name = "errno" version = "0.3.14" @@ -922,28 +506,12 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - [[package]] name = "find-msvc-tools" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "miniz_oxide", - "zlib-rs", -] - [[package]] name = "flume" version = "0.11.1" @@ -967,21 +535,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.2" @@ -991,44 +544,17 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fragile" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "funty" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -1036,15 +562,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -1064,48 +590,34 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ - "futures-channel", "futures-core", "futures-io", - "futures-macro", "futures-sink", "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -1126,57 +638,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "rand_core 0.10.0", - "wasip2", - "wasip3", -] - -[[package]] -name = "h2" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", ] [[package]] @@ -1188,12 +651,6 @@ dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hashbrown" version = "0.15.5" @@ -1220,30 +677,6 @@ dependencies = [ "hashbrown 0.15.5", ] -[[package]] -name = "headers" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" -dependencies = [ - "base64", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" -dependencies = [ - "http", -] - [[package]] name = "heck" version = "0.4.1" @@ -1291,36 +724,31 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", + "fnv", "itoa", ] [[package]] name = "http-body" -version = "1.0.1" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", + "pin-project-lite", ] [[package]] -name = "http-body-util" -version = "0.1.3" +name = "http-range-header" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] +checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" @@ -1336,66 +764,25 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.8.1" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ - "atomic-waker", "bytes", "futures-channel", "futures-core", - "h2", + "futures-util", "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", + "socket2 0.5.10", "tokio", "tower-service", "tracing", - "windows-registry", + "want", ] [[package]] @@ -1503,18 +890,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "1.1.0" @@ -1544,8 +919,6 @@ checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", - "serde", - "serde_core", ] [[package]] @@ -1556,32 +929,7 @@ checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" -dependencies = [ - "memchr", - "serde", + "syn 2.0.117", ] [[package]] @@ -1590,38 +938,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - [[package]] name = "js-sys" version = "0.3.85" @@ -1632,33 +948,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - -[[package]] -name = "jsonwebtoken" -version = "10.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" -dependencies = [ - "base64", - "getrandom 0.2.17", - "js-sys", - "pem", - "serde", - "serde_json", - "signature", - "simple_asn1", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -1668,17 +957,11 @@ dependencies = [ "spin", ] -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" -version = "0.2.181" +version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] name = "libm" @@ -1692,9 +975,9 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "libc", - "redox_syscall 0.7.0", + "redox_syscall 0.7.1", ] [[package]] @@ -1707,12 +990,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - [[package]] name = "litemap" version = "0.8.1" @@ -1734,26 +1011,11 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - [[package]] name = "matchit" -version = "0.8.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "md-5" @@ -1777,26 +1039,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - [[package]] name = "mio" version = "1.1.1" @@ -1808,58 +1050,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "mockall" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58d964098a5f9c6b63d0798e5372fd04708193510a7af313c22e9f29b7b620b" -dependencies = [ - "cfg-if", - "downcast", - "fragile", - "mockall_derive", - "predicates", - "predicates-tree", -] - -[[package]] -name = "mockall_derive" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca41ce716dda6a9be188b385aa78ee5260fc25cd3802cb2a8afdc6afbe6b6dbf" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe 0.1.6", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -1881,7 +1071,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand", "smallvec", "zeroize", ] @@ -1928,62 +1118,6 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "openssl" -version = "0.10.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "openssl-sys" -version = "0.9.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "ord_subset" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdcf5505c0f054ce51fa0fa74142738930a45d5ac1faacae4dd4e2f54afe00fa" - [[package]] name = "ordered-float" version = "4.6.0" @@ -1993,16 +1127,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-multimap" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" -dependencies = [ - "dlv-list", - "hashbrown 0.14.5", -] - [[package]] name = "ouroboros" version = "0.18.5" @@ -2024,7 +1148,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2056,33 +1180,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "password-hash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "pem" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64", - "serde_core", -] - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -2098,49 +1195,6 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "pest" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" -dependencies = [ - "memchr", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "pest_meta" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" -dependencies = [ - "pest", - "sha2", -] - [[package]] name = "pgvector" version = "0.4.1" @@ -2150,18 +1204,32 @@ dependencies = [ "serde", ] +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkcs1" version = "0.7.5" @@ -2213,42 +1281,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "predicates" -version = "3.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" -dependencies = [ - "anstyle", - "predicates-core", -] - -[[package]] -name = "predicates-core" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" - -[[package]] -name = "predicates-tree" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" -dependencies = [ - "predicates-core", - "termtree", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.114", -] - [[package]] name = "proc-macro-crate" version = "3.4.0" @@ -2277,7 +1309,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2297,7 +1329,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "version_check", "yansi", ] @@ -2322,62 +1354,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "quinn" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" -dependencies = [ - "aws-lc-rs", - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", -] - [[package]] name = "quote" version = "1.0.44" @@ -2387,12 +1363,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "radium" version = "0.7.0" @@ -2406,29 +1376,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" -dependencies = [ - "chacha20", - "getrandom 0.4.1", - "rand_core 0.10.0", + "rand_chacha", + "rand_core", ] [[package]] @@ -2438,17 +1387,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", + "rand_core", ] [[package]] @@ -2457,71 +1396,27 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.17", + "getrandom", ] -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_core" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" - [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] name = "redox_syscall" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" +checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" - [[package]] name = "rend" version = "0.4.2" @@ -2531,60 +1426,6 @@ dependencies = [ "bytecheck", ] -[[package]] -name = "reqwest" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "mime", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier", - "serde", - "serde_json", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - [[package]] name = "rkyv" version = "0.7.46" @@ -2614,20 +1455,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ron" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd490c5b18261893f14449cbd28cb9c0b637aebf161cd77900bfdedaff21ec32" -dependencies = [ - "bitflags 2.10.0", - "once_cell", - "serde", - "serde_derive", - "typeid", - "unicode-ident", -] - [[package]] name = "rsa" version = "0.9.10" @@ -2641,57 +1468,13 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core 0.6.4", + "rand_core", "signature", "spki", "subtle", "zeroize", ] -[[package]] -name = "rust-embed" -version = "8.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn 2.0.114", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" -dependencies = [ - "sha2", - "walkdir", -] - -[[package]] -name = "rust-ini" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" -dependencies = [ - "cfg-if", - "ordered-multimap", -] - [[package]] name = "rust_decimal" version = "1.40.0" @@ -2702,24 +1485,12 @@ dependencies = [ "borsh", "bytes", "num-traits", - "rand 0.8.5", + "rand", "rkyv", "serde", "serde_json", ] -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[package]] -name = "rustc-serialize" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe834bc780604f4674073badbad26d7219cadfb4a2275802db12cbae17498401" - [[package]] name = "rustc_version" version = "0.4.1" @@ -2729,94 +1500,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" -dependencies = [ - "aws-lc-rs", - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" -dependencies = [ - "openssl-probe 0.2.1", - "rustls-pki-types", - "schannel", - "security-framework 3.5.1", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-platform-verifier" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" -dependencies = [ - "core-foundation 0.10.1", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework 3.5.1", - "security-framework-sys", - "webpki-root-certs", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - -[[package]] -name = "rustls-webpki" -version = "0.103.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - [[package]] name = "rustversion" version = "1.0.22" @@ -2829,24 +1512,6 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -2863,7 +1528,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2906,7 +1571,7 @@ dependencies = [ "proc-macro2", "quote", "sea-bae", - "syn 2.0.114", + "syn 2.0.117", "unicode-ident", ] @@ -2948,42 +1613,6 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "1.0.27" @@ -3000,18 +1629,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-untagged" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" -dependencies = [ - "erased-serde", - "serde", - "serde_core", - "typeid", -] - [[package]] name = "serde_core" version = "1.0.228" @@ -3029,7 +1646,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3056,15 +1673,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "serde_spanned" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" -dependencies = [ - "serde_core", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3084,7 +1692,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures", "digest", ] @@ -3095,19 +1703,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures", "digest", ] -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - [[package]] name = "shlex" version = "1.3.0" @@ -3131,33 +1730,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core 0.6.4", + "rand_core", ] -[[package]] -name = "simd-adler32" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" - [[package]] name = "simdutf8" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" -[[package]] -name = "simple_asn1" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror 2.0.18", - "time", -] - [[package]] name = "slab" version = "0.4.12" @@ -3173,6 +1754,16 @@ dependencies = [ "serde", ] +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "socket2" version = "0.6.2" @@ -3238,7 +1829,6 @@ dependencies = [ "indexmap", "log", "memchr", - "native-tls", "once_cell", "percent-encoding", "rust_decimal", @@ -3248,8 +1838,6 @@ dependencies = [ "smallvec", "thiserror 2.0.18", "time", - "tokio", - "tokio-stream", "tracing", "url", "uuid", @@ -3265,7 +1853,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3288,8 +1876,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.114", - "tokio", + "syn 2.0.117", "url", ] @@ -3302,7 +1889,7 @@ dependencies = [ "atoi", "base64", "bigdecimal", - "bitflags 2.10.0", + "bitflags 2.11.0", "byteorder", "bytes", "chrono", @@ -3324,7 +1911,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rand 0.8.5", + "rand", "rsa", "rust_decimal", "serde", @@ -3349,7 +1936,7 @@ dependencies = [ "atoi", "base64", "bigdecimal", - "bitflags 2.10.0", + "bitflags 2.11.0", "byteorder", "chrono", "crc", @@ -3368,7 +1955,7 @@ dependencies = [ "memchr", "num-bigint", "once_cell", - "rand 0.8.5", + "rand", "rust_decimal", "serde", "serde_json", @@ -3433,12 +2020,6 @@ dependencies = [ "unicode-properties", ] -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - [[package]] name = "strum" version = "0.26.3" @@ -3464,9 +2045,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -3475,12 +2056,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "1.0.2" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "synstructure" @@ -3490,28 +2068,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[package]] -name = "system-configuration" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", + "syn 2.0.117", ] [[package]] @@ -3520,25 +2077,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "tempfile" -version = "3.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" -dependencies = [ - "fastrand", - "getrandom 0.4.1", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "termtree" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" - [[package]] name = "thiserror" version = "1.0.69" @@ -3565,7 +2103,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3576,16 +2114,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", + "syn 2.0.117", ] [[package]] @@ -3619,15 +2148,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinystr" version = "0.8.2" @@ -3665,7 +2185,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.2", "tokio-macros", "windows-sys 0.61.2", ] @@ -3678,54 +2198,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.9.12+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" -dependencies = [ - "serde_core", - "serde_spanned", - "toml_datetime", - "toml_parser", - "winnow", + "syn 2.0.117", ] [[package]] @@ -3751,23 +2224,23 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.7+spec-1.1.0" +version = "1.0.9+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "247eaa3197818b831697600aadf81514e577e0cba5eab10f7e064e78ae154df1" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" dependencies = [ "winnow", ] [[package]] name = "tower" -version = "0.5.3" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", + "pin-project", "pin-project-lite", - "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -3776,18 +2249,18 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" dependencies = [ - "bitflags 2.10.0", + "bitflags 1.3.2", "bytes", + "futures-core", "futures-util", "http", "http-body", - "iri-string", + "http-range-header", "pin-project-lite", - "tower", "tower-layer", "tower-service", "tracing", @@ -3825,7 +2298,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3835,36 +2308,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", ] [[package]] @@ -3873,30 +2316,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - [[package]] name = "typenum" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[package]] -name = "unicase" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" - [[package]] name = "unicode-bidi" version = "0.3.18" @@ -3905,9 +2330,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" @@ -3924,24 +2349,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - [[package]] name = "url" version = "2.5.8" @@ -3954,108 +2367,23 @@ dependencies = [ "serde", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "utf8_iter" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" -[[package]] -name = "utoipa" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" -dependencies = [ - "indexmap", - "serde", - "serde_json", - "utoipa-gen", -] - -[[package]] -name = "utoipa-gen" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 2.0.114", -] - -[[package]] -name = "utoipa-swagger-ui" -version = "9.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55" -dependencies = [ - "axum", - "base64", - "mime_guess", - "regex", - "rust-embed", - "serde", - "serde_json", - "url", - "utoipa", - "zip", -] - [[package]] name = "uuid" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" dependencies = [ - "getrandom 0.3.4", "js-sys", "serde_core", "wasm-bindgen", ] -[[package]] -name = "validator" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43fb22e1a008ece370ce08a3e9e4447a910e92621bb49b85d6e48a45397e7cfa" -dependencies = [ - "idna", - "once_cell", - "regex", - "serde", - "serde_derive", - "serde_json", - "url", - "validator_derive", -] - -[[package]] -name = "validator_derive" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7df16e474ef958526d1205f6dda359fdfab79d9aa6d54bafcb92dcd07673dca" -dependencies = [ - "darling", - "once_cell", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - [[package]] name = "vcpkg" version = "0.2.15" @@ -4068,16 +2396,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "want" version = "0.3.1" @@ -4093,24 +2411,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen", -] - [[package]] name = "wasite" version = "0.1.0" @@ -4130,20 +2430,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" -dependencies = [ - "cfg-if", - "futures-util", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.108" @@ -4163,7 +2449,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "wasm-bindgen-shared", ] @@ -4176,69 +2462,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.10.0", - "hashbrown 0.15.5", - "indexmap", - "semver", -] - -[[package]] -name = "web-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "whoami" version = "1.6.1" @@ -4249,15 +2472,6 @@ dependencies = [ "wasite", ] -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "windows-core" version = "0.62.2" @@ -4279,7 +2493,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4290,7 +2504,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4299,17 +2513,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - [[package]] name = "windows-result" version = "0.4.1" @@ -4328,15 +2531,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -4373,21 +2567,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.48.5" @@ -4436,12 +2615,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -4460,12 +2633,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -4484,12 +2651,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -4520,12 +2681,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -4544,12 +2699,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -4568,12 +2717,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -4592,12 +2735,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -4625,94 +2762,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck 0.5.0", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck 0.5.0", - "indexmap", - "prettyplease", - "syn 2.0.114", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.114", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.10.0", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - [[package]] name = "writeable" version = "0.6.2" @@ -4728,17 +2777,6 @@ dependencies = [ "tap", ] -[[package]] -name = "yaml-rust2" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" -dependencies = [ - "arraydeque", - "encoding_rs", - "hashlink", -] - [[package]] name = "yansi" version = "1.0.1" @@ -4764,7 +2802,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] @@ -4785,7 +2823,7 @@ checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4805,7 +2843,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] @@ -4845,43 +2883,11 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] -[[package]] -name = "zip" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" -dependencies = [ - "arbitrary", - "crc32fast", - "flate2", - "indexmap", - "memchr", - "zopfli", -] - -[[package]] -name = "zlib-rs" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" - [[package]] name = "zmij" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de98dfa5d5b7fef4ee834d0073d560c9ca7b6c46a71d058c48db7960f8cfaf7" - -[[package]] -name = "zopfli" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" -dependencies = [ - "bumpalo", - "crc32fast", - "log", - "simd-adler32", -] +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/astarcup/Cargo.toml b/astarcup/Cargo.toml new file mode 100644 index 0000000..4161e22 --- /dev/null +++ b/astarcup/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "astarcup" +version = "0.1.0" +authors = ["anonymous "] +edition = "2021" + +[dependencies] +dotenv = "0.15.0" +serde_json = "1.0.48" +thiserror = "1.0.38" +tracing = "0.1.37" + +[dependencies.axum] +features = [] +version = "0.6.18" + +[dependencies.serde] +features = ["derive"] +version = "1.0.105" + +[dependencies.tokio] +features = ["full"] +version = "1.28.2" + +[dependencies.tower-http] +features = ["cors", "trace"] +version = "0.3.5" + +[dependencies.sea-orm] +features = ["sqlx-postgres","macros","chrono"] +version = "1.1.19" diff --git a/migration/Cargo.lock b/astarcup/migration/Cargo.lock similarity index 100% rename from migration/Cargo.lock rename to astarcup/migration/Cargo.lock diff --git a/migration/Cargo.toml b/astarcup/migration/Cargo.toml similarity index 89% rename from migration/Cargo.toml rename to astarcup/migration/Cargo.toml index 518a8bb..5fe01fb 100644 --- a/migration/Cargo.toml +++ b/astarcup/migration/Cargo.toml @@ -18,8 +18,8 @@ features = [ # View the list of supported features at https://www.sea-ql.org/SeaORM/docs/install-and-config/database-and-async-runtime. # e.g. # "runtime-tokio-rustls", # `ASYNC_RUNTIME` feature - # "sqlx-postgres", # `DATABASE_DRIVER` feature - "sqlx-mysql", + "sqlx-postgres", + # "sqlx-mysql", "runtime-tokio-native-tls", ] version = "2.0.0-rc.31" diff --git a/migration/README.md b/astarcup/migration/README.md similarity index 100% rename from migration/README.md rename to astarcup/migration/README.md diff --git a/migration/src/lib.rs b/astarcup/migration/src/lib.rs similarity index 100% rename from migration/src/lib.rs rename to astarcup/migration/src/lib.rs diff --git a/migration/src/m20260211_140546_user.rs b/astarcup/migration/src/m20260211_140546_user.rs similarity index 76% rename from migration/src/m20260211_140546_user.rs rename to astarcup/migration/src/m20260211_140546_user.rs index abbdc9f..a3e9d37 100644 --- a/migration/src/m20260211_140546_user.rs +++ b/astarcup/migration/src/m20260211_140546_user.rs @@ -25,27 +25,34 @@ impl MigrationTrait for Migration { .not_null() .unique_key(), ) - .col( - ColumnDef::new(User::RegisteredAt) - .timestamp() - .not_null() - .default(Expr::current_timestamp()), - ) .col(ColumnDef::new(User::AvatarUrl).string().null()) + .col(ColumnDef::new(User::CoverUrl).string().null()) .col(ColumnDef::new(User::Pp).float().null()) .col(ColumnDef::new(User::GlobalRank).integer().null()) - .col(ColumnDef::new(User::Country).string().null()) + .col(ColumnDef::new(User::CountryCode).string().null()) .col(ColumnDef::new(User::CountryRank).integer().null()) - .col(ColumnDef::new(User::Approved).integer().null()) + .col( + ColumnDef::new(User::UserState) + .enumeration( + "userstate", + vec!["active", "approved", "banned", "ignored"], + ) + .not_null() + .default("active"), + ) .col( ColumnDef::new(User::UserGroup) - .enumeration("usergroup", vec!["player", "admin"]) + .enumeration( + "usergroup", + vec!["player", "admin", "mappooler", "tester"], + ) .not_null() .default("player"), ) .col(ColumnDef::new(User::Season).integer().null()) .col(ColumnDef::new(User::GuServerUserId).integer().null()) .col(ColumnDef::new(User::GuServerUsername).string().null()) + .col(ColumnDef::new(User::GuServerBindAt).timestamp().null()) .col( ColumnDef::new(User::CreatedAt) .timestamp() @@ -58,6 +65,7 @@ impl MigrationTrait for Migration { .not_null() .default(Expr::current_timestamp()), ) + .col(ColumnDef::new(User::CreatedAt).timestamp().null()) .to_owned(), ) .await?; @@ -78,13 +86,11 @@ enum User { Id, OsuId, Username, - RegisteredAt, + CoverUrl, AvatarUrl, Pp, GlobalRank, - Country, - CountryRank, - Approved, + UserState, UserGroup, Season, GuServerUserId, diff --git a/migration/src/m20260211_140547_map_selections.rs b/astarcup/migration/src/m20260211_140547_map_selections.rs similarity index 76% rename from migration/src/m20260211_140547_map_selections.rs rename to astarcup/migration/src/m20260211_140547_map_selections.rs index acdc86a..e500017 100644 --- a/migration/src/m20260211_140547_map_selections.rs +++ b/astarcup/migration/src/m20260211_140547_map_selections.rs @@ -24,47 +24,36 @@ impl MigrationTrait for Migration { .not_null(), ) .col( - ColumnDef::new(MapSelections::BeatmapsetId) + ColumnDef::new(MapSelections::BeatmapSetId) .integer() .not_null(), ) - .col(ColumnDef::new(MapSelections::Title).string().not_null()) + .col(ColumnDef::new(MapSelections::Title).string().null()) .col(ColumnDef::new(MapSelections::TitleUnicode).string().null()) - .col(ColumnDef::new(MapSelections::Artist).string().not_null()) + .col(ColumnDef::new(MapSelections::Artist).string().null()) .col(ColumnDef::new(MapSelections::ArtistUnicode).string().null()) - .col(ColumnDef::new(MapSelections::Version).string().not_null()) - .col(ColumnDef::new(MapSelections::Creator).string().not_null()) + .col(ColumnDef::new(MapSelections::Version).string().null()) + .col(ColumnDef::new(MapSelections::Creator).string().null()) + .col(ColumnDef::new(MapSelections::StarRating).decimal().null()) + .col(ColumnDef::new(MapSelections::Bpm).decimal().null()) + .col(ColumnDef::new(MapSelections::TotalLength).integer().null()) + .col(ColumnDef::new(MapSelections::MaxCombo).integer().null()) + .col(ColumnDef::new(MapSelections::Ar).decimal().null()) + .col(ColumnDef::new(MapSelections::Cs).decimal().null()) + .col(ColumnDef::new(MapSelections::Od).decimal().null()) + .col(ColumnDef::new(MapSelections::Hp).decimal().null()) + .col(ColumnDef::new(MapSelections::SelectedMods).json().null()) .col( - ColumnDef::new(MapSelections::StarRating) - .decimal() - .not_null(), - ) - .col(ColumnDef::new(MapSelections::Bpm).decimal().not_null()) - .col( - ColumnDef::new(MapSelections::TotalLength) + ColumnDef::new(MapSelections::SelectedModPosition) .integer() - .not_null(), - ) - .col(ColumnDef::new(MapSelections::MaxCombo).integer().not_null()) - .col(ColumnDef::new(MapSelections::Ar).decimal().not_null()) - .col(ColumnDef::new(MapSelections::Cs).decimal().not_null()) - .col(ColumnDef::new(MapSelections::Od).decimal().not_null()) - .col(ColumnDef::new(MapSelections::Hp).decimal().not_null()) - .col( - ColumnDef::new(MapSelections::SelectedMods) - .string() - .not_null(), - ) - .col( - ColumnDef::new(MapSelections::ModPosition) - .integer() - .not_null(), + .null(), ) .col(ColumnDef::new(MapSelections::Comment).text().null()) - .col( - ColumnDef::new(MapSelections::SelectedBy) - .string() - .not_null(), + .col(ColumnDef::new(MapSelections::SelectedBy).integer().null()) + .foreign_key( + ForeignKey::create() + .from(MapSelections::Table, MapSelections::SelectedBy) + .to(Users::Table, Users::Id), ) .col( ColumnDef::new(MapSelections::SelectedAt) @@ -73,10 +62,19 @@ impl MigrationTrait for Migration { ) .col(ColumnDef::new(MapSelections::Season).string().not_null()) .col(ColumnDef::new(MapSelections::Category).string().not_null()) - .col(ColumnDef::new(MapSelections::Url).text().not_null()) .col(ColumnDef::new(MapSelections::CoverUrl).text().null()) - .col(ColumnDef::new(MapSelections::Approved).integer().null()) - .col(ColumnDef::new(MapSelections::Padding).integer().null()) + .col( + ColumnDef::new(MapSelections::IsApproved) + .boolean() + .null() + .default(Expr::bool(false)), + ) + .col( + ColumnDef::new(MapSelections::IsNeedTest) + .boolean() + .null() + .default(Expr::bool(false)), + ) .col( ColumnDef::new(MapSelections::CreatedAt) .timestamp() diff --git a/migration/src/m20260211_140548_match_rooms.rs b/astarcup/migration/src/m20260211_140548_match_rooms.rs similarity index 59% rename from migration/src/m20260211_140548_match_rooms.rs rename to astarcup/migration/src/m20260211_140548_match_rooms.rs index 0ec5713..a1f491e 100644 --- a/migration/src/m20260211_140548_match_rooms.rs +++ b/astarcup/migration/src/m20260211_140548_match_rooms.rs @@ -18,38 +18,17 @@ impl MigrationTrait for Migration { .auto_increment() .primary_key(), ) - .col( - ColumnDef::new(MatchRooms::RoomName) - .string() - .not_null(), - ) - .col( - ColumnDef::new(MatchRooms::RoundNumber) - .integer() - .not_null(), - ) - .col( - ColumnDef::new(MatchRooms::MatchDate) - .date() - .not_null(), - ) - .col( - ColumnDef::new(MatchRooms::MatchTime) - .time() - .not_null(), - ) - .col( - ColumnDef::new(MatchRooms::MatchNumber) - .integer() - .not_null(), - ) + .col(ColumnDef::new(MatchRooms::RoundNumber).integer().not_null()) + .col(ColumnDef::new(MatchRooms::MatchDate).date().not_null()) + .col(ColumnDef::new(MatchRooms::MatchTime).time().not_null()) + .col(ColumnDef::new(MatchRooms::MatchNumber).integer().not_null()) .col(ColumnDef::new(MatchRooms::MaxParticipants).integer().null()) - .col(ColumnDef::new(MatchRooms::Status).enumeration("status", vec!["available", "scheduled", "completed"]).null()) .col( - ColumnDef::new(MatchRooms::CreatedBy) - .string() - .not_null(), + ColumnDef::new(MatchRooms::Status) + .enumeration("status", vec!["available", "scheduled", "completed"]) + .null(), ) + .col(ColumnDef::new(MatchRooms::CreatedBy).string().not_null()) .col( ColumnDef::new(MatchRooms::CreatedAt) .timestamp() diff --git a/migration/src/m20260211_140549_match_schedules.rs b/astarcup/migration/src/m20260211_140549_match_schedules.rs similarity index 100% rename from migration/src/m20260211_140549_match_schedules.rs rename to astarcup/migration/src/m20260211_140549_match_schedules.rs diff --git a/migration/src/m20260211_140550_player_matchups.rs b/astarcup/migration/src/m20260211_140550_player_matchups.rs similarity index 100% rename from migration/src/m20260211_140550_player_matchups.rs rename to astarcup/migration/src/m20260211_140550_player_matchups.rs diff --git a/migration/src/m20260211_140551_messages.rs b/astarcup/migration/src/m20260211_140551_messages.rs similarity index 91% rename from migration/src/m20260211_140551_messages.rs rename to astarcup/migration/src/m20260211_140551_messages.rs index 9e7d706..24f6552 100644 --- a/migration/src/m20260211_140551_messages.rs +++ b/astarcup/migration/src/m20260211_140551_messages.rs @@ -19,13 +19,7 @@ impl MigrationTrait for Migration { .primary_key(), ) .col(ColumnDef::new(Messages::SenderOsuId).string().not_null()) - .col(ColumnDef::new(Messages::SenderUsername).string().not_null()) .col(ColumnDef::new(Messages::ReceiverOsuId).string().not_null()) - .col( - ColumnDef::new(Messages::ReceiverUsername) - .string() - .not_null(), - ) .col( ColumnDef::new(Messages::Type) .enumeration( diff --git a/migration/src/m20260211_140552_map_comments.rs b/astarcup/migration/src/m20260211_140552_map_comments.rs similarity index 100% rename from migration/src/m20260211_140552_map_comments.rs rename to astarcup/migration/src/m20260211_140552_map_comments.rs diff --git a/migration/src/m20260211_140553_tournament_settings.rs b/astarcup/migration/src/m20260211_140553_tournament_settings.rs similarity index 100% rename from migration/src/m20260211_140553_tournament_settings.rs rename to astarcup/migration/src/m20260211_140553_tournament_settings.rs diff --git a/migration/src/m20260213_094956_add_refresh_tokens.rs b/astarcup/migration/src/m20260213_094956_add_refresh_tokens.rs similarity index 100% rename from migration/src/m20260213_094956_add_refresh_tokens.rs rename to astarcup/migration/src/m20260213_094956_add_refresh_tokens.rs diff --git a/migration/src/main.rs b/astarcup/migration/src/main.rs similarity index 100% rename from migration/src/main.rs rename to astarcup/migration/src/main.rs diff --git a/src/api/map_comments.rs b/astarcup/src/extensions/mod.rs similarity index 100% rename from src/api/map_comments.rs rename to astarcup/src/extensions/mod.rs diff --git a/astarcup/src/main.rs b/astarcup/src/main.rs new file mode 100644 index 0000000..cb380ce --- /dev/null +++ b/astarcup/src/main.rs @@ -0,0 +1,58 @@ +mod extensions; +mod middlewares; +mod routes; +mod utils; + +use sea_orm::{sqlx::database, Database, DatabaseConnection, DbErr}; +use std::net::SocketAddr; + +#[tokio::main] +async fn main() { + dotenv::dotenv().ok(); + + let port = std::env::var("PORT") + .ok() + .map(|e| e.parse().ok()) + .flatten() + .unwrap_or(8080); + + let host: std::net::IpAddr = std::env::var("HOST") + .ok() + .map(|e| e.parse().ok()) + .flatten() + .unwrap_or("127.0.0.1".parse().unwrap()); + + let app = routes::root::router::get_router().await; + + // Run app on local server + let address = SocketAddr::from((host, port)); + print_banner(); + + println!( + "Server running on http://{}:{}", + &address.ip(), + &address.port() + ); + // start server + connect_database().await.unwrap(); + axum::Server::bind(&address) + .serve(app.into_make_service()) + .await + .unwrap(); +} +fn print_banner() { + println!(r" _ _ ____ "); + println!(r" / \ ___| |_ __ _ _ __ / ____ _ _ __ "); + println!(r" / _ \ / __| __/ _` | '__| | | | | | '_ \ "); + println!(r" / ___ \\__ \ || (_| | | | |__| |_| | |_) |"); + println!(r" /_/ \_\___/\__\__,_|_| \____\__,_| .__/ "); + println!(r" |_| "); + println!(r"=============================================="); +} +async fn connect_database() -> Result { + let database_url = std::env::var("DATABASE_URL") + .unwrap_or_else(|_| "postgres://root:pass@localhost:5432/db".to_string()); + + let database = Database::connect(&database_url).await?; + Ok(database) +} diff --git a/src/api/map_selections.rs b/astarcup/src/middlewares/mod.rs similarity index 100% rename from src/api/map_selections.rs rename to astarcup/src/middlewares/mod.rs diff --git a/astarcup/src/routes/mod.rs b/astarcup/src/routes/mod.rs new file mode 100644 index 0000000..2d41ccf --- /dev/null +++ b/astarcup/src/routes/mod.rs @@ -0,0 +1,2 @@ +pub(crate) mod root; +pub(crate) mod user; diff --git a/astarcup/src/routes/root/dtos/health_response.rs b/astarcup/src/routes/root/dtos/health_response.rs new file mode 100644 index 0000000..b23d924 --- /dev/null +++ b/astarcup/src/routes/root/dtos/health_response.rs @@ -0,0 +1,6 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct HealthReponse { + pub server_ok: bool, +} diff --git a/astarcup/src/routes/root/dtos/mod.rs b/astarcup/src/routes/root/dtos/mod.rs new file mode 100644 index 0000000..81d1721 --- /dev/null +++ b/astarcup/src/routes/root/dtos/mod.rs @@ -0,0 +1 @@ +pub(crate) mod health_response; diff --git a/astarcup/src/routes/root/mod.rs b/astarcup/src/routes/root/mod.rs new file mode 100644 index 0000000..3eb8e0f --- /dev/null +++ b/astarcup/src/routes/root/mod.rs @@ -0,0 +1,4 @@ +pub(crate) mod dtos; +pub(crate) mod router; +pub(crate) mod service; +pub(crate) mod tests; diff --git a/astarcup/src/routes/root/router.rs b/astarcup/src/routes/root/router.rs new file mode 100644 index 0000000..f62c509 --- /dev/null +++ b/astarcup/src/routes/root/router.rs @@ -0,0 +1,50 @@ +use std::time::Duration; + +use axum::body::{Body, BoxBody}; +use axum::Json; +use axum::{ + http::{Request, Response}, + response::IntoResponse, + routing::get, + Router, +}; +use tower_http::trace::TraceLayer; +use tracing::Span; + +pub(crate) async fn get_router() -> Router { + let trace = TraceLayer::new_for_http() + .on_request(|request: &Request, _span: &Span| { + println!("{} {} started", request.method(), request.uri().path()); + println!("request: {request:?}",); + }) + .on_response( + |response: &Response, latency: Duration, _span: &Span| { + println!("response generated in {latency:?}",); + println!("response: {response:?}",); + }, + ); + + // Root Routing + let router = Router::new() + // .route("/", get(index)) + .route("/health", get(health)) + .nest("/user", crate::routes::user::router::get_router().await) + // Append the new route here. (don't delete this comment) + .layer(trace); + + router +} + +// async fn index() -> Html<&'static str> { +// Html("

Hello, World!

") +// } + +use super::service::RootService; + +async fn health() -> impl IntoResponse { + let service = RootService::new(); + + let response = service.get_health(); + + Json(response).into_response() +} diff --git a/astarcup/src/routes/root/service.rs b/astarcup/src/routes/root/service.rs new file mode 100644 index 0000000..4d13e0b --- /dev/null +++ b/astarcup/src/routes/root/service.rs @@ -0,0 +1,15 @@ +use super::dtos::health_response::HealthReponse; + +pub struct RootService {} + +impl RootService { + pub fn new() -> Self { + Self {} + } + + pub fn get_health(&self) -> HealthReponse { + let server_ok = true; + + HealthReponse { server_ok } + } +} diff --git a/astarcup/src/routes/root/tests/mod.rs b/astarcup/src/routes/root/tests/mod.rs new file mode 100644 index 0000000..60f9784 --- /dev/null +++ b/astarcup/src/routes/root/tests/mod.rs @@ -0,0 +1 @@ +pub(crate) mod service; diff --git a/astarcup/src/routes/root/tests/service.rs b/astarcup/src/routes/root/tests/service.rs new file mode 100644 index 0000000..e14b7df --- /dev/null +++ b/astarcup/src/routes/root/tests/service.rs @@ -0,0 +1,12 @@ +#![cfg(test)] + +use crate::routes::root::service::RootService; + +#[test] +pub fn get_health_check() { + let service = RootService::new(); + + let response = service.get_health(); + + assert_eq!(response.server_ok, true); +} diff --git a/astarcup/src/routes/user/dtos/mod.rs b/astarcup/src/routes/user/dtos/mod.rs new file mode 100644 index 0000000..68a79f5 --- /dev/null +++ b/astarcup/src/routes/user/dtos/mod.rs @@ -0,0 +1 @@ +pub(crate) mod user; diff --git a/astarcup/src/routes/user/dtos/user.rs b/astarcup/src/routes/user/dtos/user.rs new file mode 100644 index 0000000..b4f70ee --- /dev/null +++ b/astarcup/src/routes/user/dtos/user.rs @@ -0,0 +1,7 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +pub struct User { + pub user_id: i32, + pub user_name: String, +} diff --git a/astarcup/src/routes/user/mod.rs b/astarcup/src/routes/user/mod.rs new file mode 100644 index 0000000..3eb8e0f --- /dev/null +++ b/astarcup/src/routes/user/mod.rs @@ -0,0 +1,4 @@ +pub(crate) mod dtos; +pub(crate) mod router; +pub(crate) mod service; +pub(crate) mod tests; diff --git a/astarcup/src/routes/user/router.rs b/astarcup/src/routes/user/router.rs new file mode 100644 index 0000000..366d8c9 --- /dev/null +++ b/astarcup/src/routes/user/router.rs @@ -0,0 +1,25 @@ +use axum::{extract::Path, response::IntoResponse, routing::get, Json, Router}; + +use super::service::UserService; + +pub(crate) async fn get_router() -> Router { + Router::new() + .route("/", get(get_user_list)) + .route("/:user_id", get(find_user_by_id)) +} + +async fn get_user_list() -> impl IntoResponse { + let service = UserService::new(); + + let response = service.find_user_list(); + + Json(response).into_response() +} + +async fn find_user_by_id(Path(user_id): Path) -> impl IntoResponse { + let service = UserService::new(); + + let response = service.find_user_by_id(user_id); + + Json(response).into_response() +} diff --git a/astarcup/src/routes/user/service.rs b/astarcup/src/routes/user/service.rs new file mode 100644 index 0000000..783b4e3 --- /dev/null +++ b/astarcup/src/routes/user/service.rs @@ -0,0 +1,33 @@ +use super::dtos::user::User; + +pub struct UserService {} + +impl UserService { + pub fn new() -> Self { + Self {} + } + + pub fn find_user_list(&self) -> Vec { + let user_list = vec![ + User { + user_id: 1, + user_name: "test".to_string(), + }, + User { + user_id: 2, + user_name: "test2".to_string(), + }, + ]; + + user_list + } + + pub fn find_user_by_id(&self, id: i32) -> User { + let user = User { + user_id: id, + user_name: "test".to_string(), + }; + + user + } +} diff --git a/astarcup/src/routes/user/tests/mod.rs b/astarcup/src/routes/user/tests/mod.rs new file mode 100644 index 0000000..60f9784 --- /dev/null +++ b/astarcup/src/routes/user/tests/mod.rs @@ -0,0 +1 @@ +pub(crate) mod service; diff --git a/astarcup/src/routes/user/tests/service.rs b/astarcup/src/routes/user/tests/service.rs new file mode 100644 index 0000000..325d9fb --- /dev/null +++ b/astarcup/src/routes/user/tests/service.rs @@ -0,0 +1,24 @@ +#![cfg(test)] + +use crate::routes::user::service::UserService; + +#[test] +pub fn get_user_by_id() { + let service = UserService::new(); + + let user = service.find_user_by_id(10); + + assert_eq!(user.user_id, 10); +} + +#[test] +pub fn get_user_list() { + let service = UserService::new(); + + let list = service.find_user_list(); + + let mut other = list.clone(); + other.sort_by(|lhs, rhs| lhs.user_id.cmp(&rhs.user_id)); + + assert_eq!(list, other); +} diff --git a/astarcup/src/utils/mod.rs b/astarcup/src/utils/mod.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/astarcup/src/utils/mod.rs @@ -0,0 +1 @@ + diff --git a/src/api/auth.rs b/src/api/auth.rs deleted file mode 100644 index 4181db0..0000000 --- a/src/api/auth.rs +++ /dev/null @@ -1,568 +0,0 @@ -use crate::middleware::auth::AuthUser; -use axum::{ - Json, Router, - extract::{Query, State}, - response::Redirect, - routing::get, -}; -use reqwest::Client; -use serde::{Deserialize, Serialize}; -use std::env; -use uuid::Uuid; - -use crate::{ - dto::{ - ApiResponse, - user::{CreateUserRequest, OsuUserData}, - }, - error::Result, - service::{ServiceState, user::UserService}, -}; - -pub fn routes() -> Router { - Router::new() - .route("/osu", get(osu_auth)) - .route("/callback/osu", get(osu_callback)) - .route("/gu", get(gu_auth)) - .route("/callback/gu", get(gu_callback)) - .route("/refresh", get(refresh_token)) - .route("/logout", get(logout)) -} - -#[derive(Debug, Deserialize)] -struct OsuCallbackQuery { - code: String, - state: String, -} - -#[derive(Debug, Deserialize)] -struct RefreshTokenQuery { - server: Option, -} - -#[derive(Debug, Deserialize)] -struct OsuTokenResponse { - access_token: String, - token_type: String, - expires_in: u32, - refresh_token: String, - scope: String, -} - -#[derive(Debug, Serialize, utoipa::ToSchema)] -pub struct AuthResponse { - access_token: String, - refresh_token: String, - user: crate::dto::user::UserResponse, -} - -#[utoipa::path( - get, - path = "/api/auth/osu", - responses( - (status = 302, description = "重定向到OSU授权页面"), - ), - tag = "auth" -)] -async fn osu_auth() -> Redirect { - let client_id = env::var("OSU_CLIENT_ID").expect("OSU_CLIENT_ID not set"); - let redirect_uri = env::var("OSU_REDIRECT_URI").expect("OSU_REDIRECT_URI not set"); - let state = Uuid::new_v4().to_string(); - - let auth_url = format!( - "https://osu.ppy.sh/oauth/authorize?client_id={}&redirect_uri={}&response_type=code&scope=identify%20public&state={}", - client_id, - urlencoding::encode(&redirect_uri), - state - ); - - Redirect::to(&auth_url) -} - -#[utoipa::path( - get, - path = "/api/auth/gu", - responses( - (status = 302, description = "重定向到GU授权页面"), - ), - tag = "auth" -)] -async fn gu_auth() -> Redirect { - let client_id = env::var("GU_CLIENT_ID").expect("GU_CLIENT_ID not set"); - let redirect_uri = env::var("GU_REDIRECT_URI").expect("GU_REDIRECT_URI not set"); - let state = Uuid::new_v4().to_string(); - - let auth_url = format!( - "https://lazer-api.g0v0.top/oauth/authorize?client_id={}&redirect_uri={}&response_type=code&scope=identify%20public&state={}", - client_id, - urlencoding::encode(&redirect_uri), - state - ); - - Redirect::to(&auth_url) -} - -#[utoipa::path( - get, - path = "/api/auth/callback/osu", - params( - ("code" = String, Query, description = "OSU OAuth回调代码"), - ("state" = String, Query, description = "状态参数"), - ), - responses( - (status = 200, description = "OAuth回调成功"), - (status = 400, description = "请求参数错误"), - (status = 500, description = "内部服务器错误"), - ), - tag = "auth" -)] -async fn osu_callback( - Query(params): Query, - State(state): State, -) -> Result>> { - let client_id = env::var("OSU_CLIENT_ID").expect("OSU_CLIENT_ID not set"); - let client_secret = env::var("OSU_CLIENT_SECRET").expect("OSU_CLIENT_SECRET not set"); - let redirect_uri = env::var("OSU_REDIRECT_URI").expect("OSU_REDIRECT_URI not set"); - - // 获取访问令牌 - let client = Client::new(); - let token_response = client - .post("https://osu.ppy.sh/oauth/token") - .json(&serde_json::json!({ - "client_id": client_id, - "client_secret": client_secret, - "code": params.code, - "grant_type": "authorization_code", - "redirect_uri": redirect_uri - })) - .send() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!("Failed to get token: {}", e)) - })? - .json::() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!( - "Failed to parse token response: {}", - e - )) - })?; - - // 获取用户信息 - let user_data = client - .get("https://osu.ppy.sh/api/v2/me") - .header( - "Authorization", - format!("Bearer {}", token_response.access_token), - ) - .send() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!("Failed to get user info: {}", e)) - })? - .json::() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!("Failed to parse user info: {}", e)) - })?; - - // 处理用户数据 - let user_service = UserService::new(state.db); - let existing_user = user_service.find_by_osu_id(&user_data.id).await?; - - let user = match existing_user { - Some(existing) => { - // 更新现有用户 - let update_request = crate::dto::user::UpdateUserRequest { - username: Some(user_data.username), - avatar_url: user_data.avatar_url, - pp: user_data.statistics.as_ref().and_then(|s| s.pp), - global_rank: user_data.statistics.as_ref().and_then(|s| s.global_rank), - country: user_data.country.as_ref().map(|c| c.code.clone()), - country_rank: user_data.statistics.as_ref().and_then(|s| s.country_rank), - approved: None, - season: None, - }; - let updated_user = user_service.update(existing.id, update_request).await?; - - // 保存 OSU refresh_token - user_service - .update_osu_refresh_token(updated_user.id, token_response.refresh_token.clone()) - .await?; - updated_user - } - None => { - // 创建新用户 - let create_request = CreateUserRequest { - username: user_data.username, - avatar_url: user_data.avatar_url, - pp: user_data.statistics.as_ref().and_then(|s| s.pp), - global_rank: user_data.statistics.as_ref().and_then(|s| s.global_rank), - country: user_data.country.as_ref().map(|c| c.code.clone()), - country_rank: user_data.statistics.as_ref().and_then(|s| s.country_rank), - }; - let new_user = user_service.create(user_data.id, create_request).await?; - - // 保存 OSU refresh_token - user_service - .update_osu_refresh_token(new_user.id, token_response.refresh_token.clone()) - .await?; - new_user - } - }; - - // 生成JWT令牌 - let osu_id = user.osu_id.clone(); - let user_group_str = match user.user_group { - crate::entity::sea_orm_active_enums::UserGroup::Player => "player", - crate::entity::sea_orm_active_enums::UserGroup::Admin => "admin", - }; - let jwt_token = - crate::utils::jwt::generate_token(osu_id, user_group_str.to_string()).map_err(|e| { - crate::error::AppError::InternalError(format!("Failed to generate token: {}", e)) - })?; - - let auth_response = AuthResponse { - access_token: jwt_token, - refresh_token: token_response.refresh_token, - user: crate::dto::user::UserResponse::from(user), - }; - - Ok(Json(ApiResponse::success(auth_response))) -} - -#[utoipa::path( - get, - path = "/api/auth/refresh", - params( - ("server" = Option, Query, description = "服务器类型,可选值:osu, gu,默认为osu"), - ), - responses( - (status = 200, description = "令牌刷新成功"), - (status = 400, description = "请求参数错误"), - (status = 401, description = "未授权或refresh_token过期"), - (status = 500, description = "内部服务器错误"), - ), - tag = "auth" -)] -async fn refresh_token( - auth_user: AuthUser, - Query(params): Query, - State(state): State, -) -> Result>> { - let server = params.server.unwrap_or_else(|| "osu".to_string()); - - if server != "osu" && server != "gu" { - return Err(crate::error::AppError::ValidationError( - "server参数必须是'osu'或'gu'".into(), - )); - } - - let user_service = UserService::new(state.db); - - // 根据服务器类型获取对应的refresh_token - let refresh_token = match server.as_str() { - "osu" => user_service.get_osu_refresh_token(auth_user.id).await?, - "gu" => user_service.get_gu_refresh_token(auth_user.id).await?, - _ => unreachable!(), - }; - - let refresh_token = refresh_token.ok_or_else(|| { - crate::error::AppError::Unauthorized(format!("{} refresh_token不存在", server)) - })?; - - // 根据服务器类型调用相应的API刷新令牌 - let (client_id, client_secret, token_url, api_url) = match server.as_str() { - "osu" => ( - env::var("OSU_CLIENT_ID").expect("OSU_CLIENT_ID not set"), - env::var("OSU_CLIENT_SECRET").expect("OSU_CLIENT_SECRET not set"), - "https://osu.ppy.sh/oauth/token", - "https://osu.ppy.sh/api/v2/me", - ), - "gu" => ( - env::var("GU_CLIENT_ID").expect("GU_CLIENT_ID not set"), - env::var("GU_CLIENT_SECRET").expect("GU_CLIENT_SECRET not set"), - "https://lazer-api.g0v0.top/oauth/token", - "https://lazer-api.g0v0.top/api/v2/me", - ), - _ => unreachable!(), - }; - - let client = Client::new(); - - // 使用refresh_token获取新的访问令牌 - let token_response = client - .post(token_url) - .json(&serde_json::json!({ - "client_id": client_id, - "client_secret": client_secret, - "refresh_token": refresh_token, - "grant_type": "refresh_token" - })) - .send() - .await - .map_err(|e| { - // 如果refresh_token过期,返回401提示重新登录 - if e.status() == Some(reqwest::StatusCode::UNAUTHORIZED) { - crate::error::AppError::Unauthorized(format!( - "{} refresh_token已过期,请重新登录", - server - )) - } else { - crate::error::AppError::ExternalApiError(format!("Failed to refresh token: {}", e)) - } - })? - .json::() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!( - "Failed to parse token response: {}", - e - )) - })?; - - // 获取用户信息 - let user_data = client - .get(api_url) - .header( - "Authorization", - format!("Bearer {}", token_response.access_token), - ) - .send() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!("Failed to get user info: {}", e)) - })? - .json::() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!("Failed to parse user info: {}", e)) - })?; - - // 更新用户信息 - let update_request = crate::dto::user::UpdateUserRequest { - username: Some(user_data.username.clone()), - avatar_url: user_data.avatar_url, - pp: user_data.statistics.as_ref().and_then(|s| s.pp), - global_rank: user_data.statistics.as_ref().and_then(|s| s.global_rank), - country: user_data.country.as_ref().map(|c| c.code.clone()), - country_rank: user_data.statistics.as_ref().and_then(|s| s.country_rank), - approved: None, - season: None, - }; - - let user = user_service.update(auth_user.id, update_request).await?; - - // 更新数据库中的refresh_token - match server.as_str() { - "osu" => { - user_service - .update_osu_refresh_token(auth_user.id, token_response.refresh_token.clone()) - .await?; - } - "gu" => { - user_service - .update_gu_refresh_token(auth_user.id, token_response.refresh_token.clone()) - .await?; - } - _ => unreachable!(), - } - - // 生成新的JWT令牌 - let osu_id = user.osu_id.clone(); - let user_group_str = match user.user_group { - crate::entity::sea_orm_active_enums::UserGroup::Player => "player", - crate::entity::sea_orm_active_enums::UserGroup::Admin => "admin", - }; - let jwt_token = - crate::utils::jwt::generate_token(osu_id, user_group_str.to_string()).map_err(|e| { - crate::error::AppError::InternalError(format!("Failed to generate token: {}", e)) - })?; - - let auth_response = AuthResponse { - access_token: jwt_token, - refresh_token: token_response.refresh_token, - user: crate::dto::user::UserResponse::from(user), - }; - - Ok(Json(ApiResponse::success(auth_response))) -} - -#[utoipa::path( - get, - path = "/api/auth/logout", - responses( - (status = 200, description = "登出成功"), - (status = 401, description = "未授权"), - ), - tag = "auth" -)] -async fn logout( - auth_user: AuthUser, - State(state): State, -) -> Result>> { - // 清除用户的refresh_token - let user_service = UserService::new(state.db); - - // 清除所有refresh_token(OSU和GU) - user_service.clear_all_refresh_tokens(auth_user.id).await?; - - // 返回成功消息 - Ok(Json(ApiResponse::success_with_message( - (), - "登出成功,已清除OSU和GU refresh_token", - ))) -} - -#[utoipa::path( - get, - path = "/api/auth/callback/gu", - params( - ("code" = String, Query, description = "GU OAuth回调代码"), - ("state" = String, Query, description = "状态参数"), - ), - responses( - (status = 200, description = "OAuth回调成功"), - (status = 400, description = "请求参数错误"), - (status = 500, description = "内部服务器错误"), - ), - tag = "auth" -)] -async fn gu_callback( - Query(params): Query, - State(state): State, -) -> Result>> { - let client_id = env::var("GU_CLIENT_ID").expect("GU_CLIENT_ID not set"); - let client_secret = env::var("GU_CLIENT_SECRET").expect("GU_CLIENT_SECRET not set"); - let redirect_uri = env::var("GU_REDIRECT_URI").expect("GU_REDIRECT_URI not set"); - - // 获取访问令牌 - let client = Client::new(); - let token_response = client - .post("https://lazer-api.g0v0.top/oauth/token") - .json(&serde_json::json!({ - "client_id": client_id, - "client_secret": client_secret, - "code": params.code, - "grant_type": "authorization_code", - "redirect_uri": redirect_uri - })) - .send() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!("Failed to get token: {}", e)) - })? - .json::() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!( - "Failed to parse token response: {}", - e - )) - })?; - - // 获取用户信息 - let user_data = client - .get("https://lazer-api.g0v0.top/api/v2/me") - .header( - "Authorization", - format!("Bearer {}", token_response.access_token), - ) - .send() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!("Failed to get user info: {}", e)) - })? - .json::() - .await - .map_err(|e| { - crate::error::AppError::ExternalApiError(format!("Failed to parse user info: {}", e)) - })?; - - // 处理用户数据 - let user_service = UserService::new(state.db); - let existing_user = user_service.find_by_osu_id(&user_data.id).await?; - - // 提前复制需要的值,避免移动后借用 - let user_id = user_data.id.clone(); - let username = user_data.username.clone(); - - let user = match existing_user { - Some(existing) => { - // 更新现有用户,包括GU服务器信息 - let update_request = crate::dto::user::UpdateUserRequest { - username: Some(username.clone()), - avatar_url: user_data.avatar_url, - pp: user_data.statistics.as_ref().and_then(|s| s.pp), - global_rank: user_data.statistics.as_ref().and_then(|s| s.global_rank), - country: user_data.country.as_ref().map(|c| c.code.clone()), - country_rank: user_data.statistics.as_ref().and_then(|s| s.country_rank), - approved: None, - season: None, - }; - let updated_user = user_service.update(existing.id, update_request).await?; - - // 更新用户的gu_server_user_id和gu_server_username - let gu_user_id = user_id.parse::().unwrap_or(0); - let updated_user_with_gu_info = user_service - .update_gu_server_info(updated_user.id, gu_user_id, username.clone()) - .await?; - - // 保存 GU refresh_token - user_service - .update_gu_refresh_token( - updated_user_with_gu_info.id, - token_response.refresh_token.clone(), - ) - .await?; - updated_user_with_gu_info - } - None => { - // 创建新用户 - let create_request = CreateUserRequest { - username: username.clone(), - avatar_url: user_data.avatar_url, - pp: user_data.statistics.as_ref().and_then(|s| s.pp), - global_rank: user_data.statistics.as_ref().and_then(|s| s.global_rank), - country: user_data.country.as_ref().map(|c| c.code.clone()), - country_rank: user_data.statistics.as_ref().and_then(|s| s.country_rank), - }; - let new_user = user_service.create(user_id.clone(), create_request).await?; - - // 设置用户的gu_server_user_id和gu_server_username - let gu_user_id = user_id.parse::().unwrap_or(0); - let new_user_with_gu_info = user_service - .update_gu_server_info(new_user.id, gu_user_id, username.clone()) - .await?; - - // 保存 GU refresh_token - user_service - .update_gu_refresh_token( - new_user_with_gu_info.id, - token_response.refresh_token.clone(), - ) - .await?; - new_user_with_gu_info - } - }; - - // 生成JWT令牌 - let osu_id = user.osu_id.clone(); - let user_group_str = match user.user_group { - crate::entity::sea_orm_active_enums::UserGroup::Player => "player", - crate::entity::sea_orm_active_enums::UserGroup::Admin => "admin", - }; - let jwt_token = - crate::utils::jwt::generate_token(osu_id, user_group_str.to_string()).map_err(|e| { - crate::error::AppError::InternalError(format!("Failed to generate token: {}", e)) - })?; - - let auth_response = AuthResponse { - access_token: jwt_token, - refresh_token: token_response.refresh_token, - user: crate::dto::user::UserResponse::from(user), - }; - - Ok(Json(ApiResponse::success(auth_response))) -} diff --git a/src/api/match_rooms.rs b/src/api/match_rooms.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/api/match_schedules.rs b/src/api/match_schedules.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/api/messages.rs b/src/api/messages.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/api/mod.rs b/src/api/mod.rs deleted file mode 100644 index 9aa19ca..0000000 --- a/src/api/mod.rs +++ /dev/null @@ -1,65 +0,0 @@ -pub mod auth; -pub mod tournament_settings; -pub mod user; - -use axum::{Router, routing::get}; -use utoipa::OpenApi; -use utoipa_swagger_ui::SwaggerUi; - -use crate::service::ServiceState; - -pub fn configure_routes() -> Router { - Router::new() - // Swagger UI文档 - .merge(SwaggerUi::new("/api/docs").url("/api-docs/openapi.json", ApiDoc::openapi())) - .route("/health", get(|| async { "OK" })) - .nest("/api/auth", auth::routes()) - .nest("/api/users", user::routes()) - .nest("/api/tournament-settings", tournament_settings::routes()) -} - -#[derive(OpenApi)] -#[openapi( - paths( - auth::osu_auth, - auth::osu_callback, - auth::refresh_token, - auth::logout, - user::get_users, - user::get_user, - user::get_current_user, - user::update_user, - user::update_user_group, - user::delete_user, - user::update_registration_status, - user::update_season, - user::update_approved, - tournament_settings::get_tournament_settings, - tournament_settings::update_tournament_settings, - ), - components( - schemas( - crate::dto::user::UserResponse, - crate::dto::user::UpdateUserRequest, - crate::dto::user::UpdateUserGroupRequest, - crate::dto::user::UpdateRegistrationStatusRequest, - crate::dto::user::UpdateSeasonRequest, - crate::dto::user::UpdateApprovedRequest, - crate::dto::user::UserQueryParams, - crate::dto::ApiResponseSchema, - crate::dto::ApiResponseSchema, - crate::dto::PaginatedResponseSchema, - user::PaginatedUserResponse, - crate::dto::tournament_settings::TournamentSettingResponse, - crate::dto::tournament_settings::UpdateTournamentSettingRequest, - crate::dto::tournament_settings::TournamentSettingQueryParams, - crate::api::tournament_settings::PaginatedTournamentSettingsResponse, - ) - ), - tags( - (name = "auth", description = "认证相关API"), - (name = "users", description = "用户管理API"), - (name = "tournament-settings", description = "比赛设置API"), - ) -)] -pub struct ApiDoc; diff --git a/src/api/player_matchups.rs b/src/api/player_matchups.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/api/tournament_settings.rs b/src/api/tournament_settings.rs deleted file mode 100644 index 63f8bad..0000000 --- a/src/api/tournament_settings.rs +++ /dev/null @@ -1,136 +0,0 @@ -use axum::{ - Json, Router, - extract::{Query, State}, - routing::{get, put}, -}; - -use crate::{ - dto::{ - ApiResponse, - tournament_settings::{ - TournamentSettingQueryParams, TournamentSettingResponse, UpdateTournamentSettingRequest, - }, - }, - error::Result, - middleware::auth::{AuthUser, require_admin}, - service::{ServiceState, tournament_settings::TournamentSettingService}, -}; - -pub fn routes() -> Router { - Router::new() - .route("/", get(get_tournament_settings)) - .route("/", put(update_tournament_settings)) -} - -#[derive(Debug, serde::Serialize, utoipa::ToSchema)] -pub struct PaginatedTournamentSettingsResponse { - pub items: Vec, - pub total: u64, - pub page: u64, - pub page_size: u64, - pub total_pages: u64, -} - -#[utoipa::path( - get, - path = "/api/tournament-settings", - params(TournamentSettingQueryParams), - responses( - (status = 200, description = "获取比赛设置列表成功", body = PaginatedTournamentSettingsResponse), - (status = 401, description = "未授权"), - (status = 500, description = "内部服务器错误"), - ), - tag = "tournament-settings" -)] -async fn get_tournament_settings( - State(state): State, - Query(params): Query, -) -> Result>> { - let service = TournamentSettingService::new(state); - let page = params.page.unwrap_or(1); - let page_size = params.page_size.unwrap_or(20); - let (settings, total) = service.find_all(params).await?; - - let response = PaginatedTournamentSettingsResponse { - items: settings - .into_iter() - .map(|s| TournamentSettingResponse { - id: s.id, - tournament_name: s.tournament_name, - max_pp_for_registration: s.max_pp_for_registration, - min_pp_for_registration: s.min_pp_for_registration, - current_season: s.current_season, - current_season_stage: s.current_season_stage, - mappool_visible: s.mappool_visible, - created_at: s.created_at.to_rfc3339(), - updated_at: s.updated_at.to_rfc3339(), - }) - .collect(), - total, - page, - page_size, - total_pages: (total as f64 / page_size as f64).ceil() as u64, - }; - - Ok(Json(ApiResponse::success(response))) -} - -#[utoipa::path( - put, - path = "/api/tournament-settings", - request_body = UpdateTournamentSettingRequest, - responses( - (status = 200, description = "更新比赛设置成功", body = TournamentSettingResponse), - (status = 400, description = "请求参数错误"), - (status = 401, description = "未授权"), - (status = 403, description = "权限不足,需要管理员权限"), - (status = 500, description = "内部服务器错误"), - ), - tag = "tournament-settings" -)] -async fn update_tournament_settings( - State(state): State, - auth_user: AuthUser, - Json(data): Json, -) -> Result>> { - // 验证用户是否为admin - require_admin(&auth_user)?; - - let service = TournamentSettingService::new(state); - - // 检查是否存在设置,如果不存在则初始化 - let settings = match service.get_current_settings_cached().await? { - Some(existing) => { - // 更新现有设置 - service.update(existing.id, data).await? - } - None => { - // 初始化新设置 - let create_data = crate::dto::tournament_settings::CreateTournamentSettingRequest { - tournament_name: data - .tournament_name - .unwrap_or_else(|| "Default Tournament".to_string()), - max_pp_for_registration: data.max_pp_for_registration, - min_pp_for_registration: data.min_pp_for_registration, - current_season: data.current_season, - current_season_stage: data.current_season_stage, - mappool_visible: data.mappool_visible, - }; - service.create(create_data).await? - } - }; - - let response = TournamentSettingResponse { - id: settings.id, - tournament_name: settings.tournament_name, - max_pp_for_registration: settings.max_pp_for_registration, - min_pp_for_registration: settings.min_pp_for_registration, - current_season: settings.current_season, - current_season_stage: settings.current_season_stage, - mappool_visible: settings.mappool_visible, - created_at: settings.created_at.to_rfc3339(), - updated_at: settings.updated_at.to_rfc3339(), - }; - - Ok(Json(ApiResponse::success(response))) -} diff --git a/src/api/user.rs b/src/api/user.rs deleted file mode 100644 index 01478f2..0000000 --- a/src/api/user.rs +++ /dev/null @@ -1,360 +0,0 @@ -use axum::{ - Json, Router, - extract::{Path, Query, State}, - routing::{delete, get, post, put}, -}; -use utoipa::ToSchema; - -use crate::{ - dto::{ - ApiResponse, PaginatedResponse, - user::{ - CreateUserRequest, UpdateApprovedRequest, UpdateRegistrationStatusRequest, - UpdateSeasonRequest, UpdateUserGroupRequest, UpdateUserRequest, UserQueryParams, - UserResponse, - }, - }, - error::Result, - middleware::auth::{AuthUser, require_admin}, - service::{ServiceState, user::UserService}, -}; - -pub fn routes() -> Router { - Router::new() - .route("/", get(get_users)) - .route("/", post(create_user)) - .route("/me", get(get_current_user)) - .route("/{osu_id}", get(get_user)) - .route("/{osu_id}", put(update_user)) - .route("/{osu_id}", delete(delete_user)) - .route("/{osu_id}/user-group", put(update_user_group)) - .route( - "/{osu_id}/registration-status", - put(update_registration_status), - ) - .route("/{osu_id}/season", put(update_season)) - .route("/{osu_id}/approve", put(update_approved)) -} - -#[utoipa::path( - get, - path = "/api/users", - params(UserQueryParams), - responses( - (status = 200, description = "获取osu玩家列表成功", body = PaginatedUserResponse), - (status = 401, description = "未授权"), - (status = 403, description = "权限不足"), - ), - tag = "users" -)] -async fn get_users( - State(state): State, - Query(params): Query, -) -> Result>>> { - let service = UserService::new(state.db); - let (users, total) = service.find_all(params).await?; - - let response = PaginatedResponse::new( - users.into_iter().map(UserResponse::from).collect(), - total, - 1, - 20, - ); - - Ok(Json(ApiResponse::success(response))) -} - -#[utoipa::path( - get, - path = "/api/users/{osu_id}", - params( - ("osu_id" = String, Path, description = "osuID") - ), - responses( - (status = 200, description = "获取osu玩家成功", body = UserResponse), - (status = 404, description = "osu玩家不存在"), - ), - tag = "users" -)] -async fn get_user( - State(state): State, - Path(osu_id): Path, -) -> Result>> { - let service = UserService::new(state.db); - let user = service - .find_by_osu_id(&osu_id) - .await? - .ok_or_else(|| crate::error::AppError::NotFound(format!("osu玩家 {} 不存在", osu_id)))?; - - Ok(Json(ApiResponse::success(UserResponse::from(user)))) -} - -#[utoipa::path( - get, - path = "/api/users/me", - responses( - (status = 200, description = "获取当前玩家信息成功", body = UserResponse), - (status = 401, description = "未授权"), - (status = 404, description = "玩家不存在"), - ), - tag = "users" -)] -async fn get_current_user( - State(state): State, - auth_user: AuthUser, -) -> Result>> { - let service = UserService::new(state.db); - let user = service - .find_by_osu_id(&auth_user.osu_id) - .await? - .ok_or_else(|| { - crate::error::AppError::NotFound(format!("玩家 {} 不存在", auth_user.osu_id)) - })?; - - Ok(Json(ApiResponse::success(UserResponse::from(user)))) -} - -#[utoipa::path( - post, - path = "/api/users", - request_body = CreateUserRequest, - responses( - (status = 201, description = "创建osu玩家成功", body = UserResponse), - (status = 400, description = "请求参数错误"), - (status = 401, description = "未授权"), - ), - tag = "users" -)] -async fn create_user() -> Result>> { - // osu玩家创建将通过OAuth回调处理 - Err(crate::error::AppError::BusinessError( - "请通过OAuth注册osu玩家".into(), - )) -} - -#[utoipa::path( - put, - path = "/api/users/{osu_id}", - params( - ("osu_id" = String, Path, description = "osu玩家ID") - ), - request_body = UpdateUserRequest, - responses( - (status = 200, description = "更新osu玩家成功", body = UserResponse), - (status = 400, description = "请求参数错误"), - (status = 401, description = "未授权"), - (status = 403, description = "权限不足"), - (status = 404, description = "osu玩家不存在"), - ), - tag = "users" -)] -#[axum::debug_handler] -async fn update_user( - State(state): State, - Path(osu_id): Path, - auth_user: AuthUser, - Json(data): Json, -) -> Result>> { - let service = UserService::new(state.db); - - // 获取要更新的osu玩家信息 - let target_user = service - .find_by_osu_id(&osu_id) - .await? - .ok_or_else(|| crate::error::AppError::NotFound(format!("osu玩家 {} 不存在", osu_id)))?; - - // 检查权限:管理员或osu玩家本人可以更新 - let is_admin = auth_user.user_group == "admin"; - let is_self = auth_user.osu_id == target_user.osu_id; - - if !is_admin && !is_self { - return Err(crate::error::AppError::Forbidden("权限错误".into())); - } - - let user = service.update(target_user.id, data).await?; - - Ok(Json(ApiResponse::success(UserResponse::from(user)))) -} - -#[utoipa::path( - put, - path = "/api/users/{osu_id}/user-group", - params( - ("osu_id" = String, Path, description = "osuID") - ), - request_body = UpdateUserGroupRequest, - responses( - (status = 200, description = "更新osu玩家组成功", body = UserResponse), - (status = 400, description = "请求参数错误"), - (status = 401, description = "未授权"), - (status = 403, description = "权限不足"), - (status = 404, description = "osu玩家不存在"), - ), - tag = "users" -)] -#[axum::debug_handler] -async fn update_user_group( - State(state): State, - Path(osu_id): Path, - user: AuthUser, - Json(data): Json, -) -> Result>> { - // 检查是否为管理员 - require_admin(&user)?; - - let service = UserService::new(state.db); - let target_user = service - .find_by_osu_id(&osu_id) - .await? - .ok_or_else(|| crate::error::AppError::NotFound(format!("osu玩家 {} 不存在", osu_id)))?; - - let user = service.update_user_group(target_user.id, data).await?; - - Ok(Json(ApiResponse::success(UserResponse::from(user)))) -} - -#[utoipa::path( - delete, - path = "/api/users/{osu_id}", - params( - ("osu_id" = String, Path, description = "osuID") - ), - responses( - (status = 200, description = "删除osu玩家成功"), - (status = 401, description = "未授权"), - (status = 403, description = "权限不足"), - (status = 404, description = "osu玩家不存在"), - ), - tag = "users" -)] -async fn delete_user( - State(state): State, - Path(osu_id): Path, - user: AuthUser, -) -> Result>> { - // 检查是否为管理员 - require_admin(&user)?; - - let service = UserService::new(state.db); - let target_user = service - .find_by_osu_id(&osu_id) - .await? - .ok_or_else(|| crate::error::AppError::NotFound(format!("osu玩家 {} 不存在", osu_id)))?; - - service.delete(target_user.id).await?; - - Ok(Json(ApiResponse::success_with_message( - (), - "osu玩家删除成功", - ))) -} - -#[utoipa::path( - put, - path = "/api/users/{osu_id}/registration-status", - params( - ("osu_id" = String, Path, description = "osuID") - ), - request_body = UpdateRegistrationStatusRequest, - responses( - (status = 200, description = "更新注册状态成功", body = UserResponse), - (status = 400, description = "请求参数错误"), - (status = 401, description = "未授权"), - (status = 404, description = "osu玩家不存在"), - ), - tag = "users" -)] -async fn update_registration_status( - State(state): State, - Path(osu_id): Path, - Json(data): Json, -) -> Result>> { - let service = UserService::new(state.db); - let target_user = service - .find_by_osu_id(&osu_id) - .await? - .ok_or_else(|| crate::error::AppError::NotFound(format!("osu玩家 {} 不存在", osu_id)))?; - - let user = service - .update_registration_status(target_user.id, data) - .await?; - - Ok(Json(ApiResponse::success(UserResponse::from(user)))) -} - -#[utoipa::path( - put, - path = "/api/users/{osu_id}/season", - params( - ("osu_id" = String, Path, description = "osuID") - ), - request_body = UpdateSeasonRequest, - responses( - (status = 200, description = "更新赛季成功", body = UserResponse), - (status = 400, description = "请求参数错误"), - (status = 401, description = "未授权"), - (status = 404, description = "osu玩家不存在"), - ), - tag = "users" -)] -async fn update_season( - State(state): State, - Path(osu_id): Path, - Json(data): Json, -) -> Result>> { - let service = UserService::new(state.db); - let target_user = service - .find_by_osu_id(&osu_id) - .await? - .ok_or_else(|| crate::error::AppError::NotFound(format!("osu玩家 {} 不存在", osu_id)))?; - - let user = service.update_season(target_user.id, data).await?; - - Ok(Json(ApiResponse::success(UserResponse::from(user)))) -} - -#[utoipa::path( - put, - path = "/api/users/{osu_id}/approve", - params( - ("osu_id" = String, Path, description = "osuID") - ), - request_body = UpdateApprovedRequest, - responses( - (status = 200, description = "更新审批状态成功", body = UserResponse), - (status = 400, description = "请求参数错误"), - (status = 401, description = "未授权"), - (status = 403, description = "权限不足"), - (status = 404, description = "osu玩家不存在"), - ), - tag = "users" -)] -#[axum::debug_handler] -async fn update_approved( - State(state): State, - Path(osu_id): Path, - user: AuthUser, - Json(data): Json, -) -> Result>> { - // 检查是否为管理员 - require_admin(&user)?; - - let service = UserService::new(state.db); - let target_user = service - .find_by_osu_id(&osu_id) - .await? - .ok_or_else(|| crate::error::AppError::NotFound(format!("osu玩家 {} 不存在", osu_id)))?; - - let user = service.update_approved(target_user.id, data, true).await?; - - Ok(Json(ApiResponse::success(UserResponse::from(user)))) -} - -#[derive(ToSchema)] -pub struct PaginatedUserResponse { - items: Vec, - total: u64, - page: u64, - page_size: u64, - total_pages: u64, -} diff --git a/src/config/mod.rs b/src/config/mod.rs deleted file mode 100644 index 2444816..0000000 --- a/src/config/mod.rs +++ /dev/null @@ -1,96 +0,0 @@ -use std::env; - -use serde::Deserialize; -use validator::Validate; - -#[derive(Debug, Clone, Deserialize, Validate)] -pub struct Config { - #[validate(length(min = 1))] - pub database_url: String, - - #[validate(range(min = 1, max = 65535))] - pub port: u16, - - pub host: String, - - #[validate(length(min = 1))] - pub jwt_secret: String, - - pub jwt_expiry_hours: u64, - - pub osu_client_id: String, - - pub osu_client_secret: String, - - pub osu_redirect_uri: String, - - pub gu_client_id: String, - - pub gu_client_secret: String, - - pub gu_redirect_uri: String, - - pub cors_origin: String, - - pub log_level: String, -} - -impl Config { - pub fn from_env() -> Result { - dotenv::dotenv().ok(); - - let config = Config { - database_url: env::var("DATABASE_URL") - .map_err(|_| crate::error::AppError::ConfigError("DATABASE_URL未设置".into()))?, - - port: env::var("PORT") - .unwrap_or_else(|_| "3000".to_string()) - .parse() - .map_err(|_| crate::error::AppError::ConfigError("PORT格式错误".into()))?, - - host: env::var("HOST").unwrap_or_else(|_| "0.0.0.0".to_string()), - - jwt_secret: env::var("JWT_SECRET") - .map_err(|_| crate::error::AppError::ConfigError("JWT_SECRET未设置".into()))?, - - jwt_expiry_hours: env::var("JWT_EXPIRY_HOURS") - .unwrap_or_else(|_| "24".to_string()) - .parse() - .map_err(|_| { - crate::error::AppError::ConfigError("JWT_EXPIRY_HOURS格式错误".into()) - })?, - - osu_client_id: env::var("OSU_CLIENT_ID") - .map_err(|_| crate::error::AppError::ConfigError("OSU_CLIENT_ID未设置".into()))?, - - osu_client_secret: env::var("OSU_CLIENT_SECRET").map_err(|_| { - crate::error::AppError::ConfigError("OSU_CLIENT_SECRET未设置".into()) - })?, - - osu_redirect_uri: env::var("OSU_REDIRECT_URI").map_err(|_| { - crate::error::AppError::ConfigError("OSU_REDIRECT_URI未设置".into()) - })?, - - gu_client_id: env::var("GU_CLIENT_ID") - .map_err(|_| crate::error::AppError::ConfigError("GU_CLIENT_ID未设置".into()))?, - - gu_client_secret: env::var("GU_CLIENT_SECRET").map_err(|_| { - crate::error::AppError::ConfigError("GU_CLIENT_SECRET未设置".into()) - })?, - - gu_redirect_uri: env::var("GU_REDIRECT_URI") - .map_err(|_| crate::error::AppError::ConfigError("GU_REDIRECT_URI未设置".into()))?, - - cors_origin: env::var("CORS_ORIGIN") - .unwrap_or_else(|_| "http://localhost:3000".to_string()), - - log_level: env::var("LOG_LEVEL").unwrap_or_else(|_| "info".to_string()), - }; - - config - .validate() - .map_err(|e| crate::error::AppError::ConfigError(format!("配置验证失败: {}", e)))?; - - Ok(config) - } -} diff --git a/src/dto/auth.rs b/src/dto/auth.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/dto/map_comments.rs b/src/dto/map_comments.rs deleted file mode 100644 index 7cff801..0000000 --- a/src/dto/map_comments.rs +++ /dev/null @@ -1,23 +0,0 @@ -use serde::Deserialize; -use utoipa::ToSchema; - -#[derive(Debug, Deserialize, ToSchema)] -pub struct CreateMapCommentRequest { - pub map_selection_id: i32, - pub osu_id: String, - pub username: String, - pub comment: Option, -} - -#[derive(Debug, Deserialize, ToSchema)] -pub struct UpdateMapCommentRequest { - pub comment: Option, -} - -#[derive(Debug, Deserialize, ToSchema)] -pub struct MapCommentQueryParams { - pub page: Option, - pub page_size: Option, - pub map_selection_id: Option, - pub osu_id: Option, -} diff --git a/src/dto/map_selections.rs b/src/dto/map_selections.rs deleted file mode 100644 index d90ced8..0000000 --- a/src/dto/map_selections.rs +++ /dev/null @@ -1,68 +0,0 @@ -use serde::Deserialize; -use utoipa::ToSchema; - -#[derive(Debug, Deserialize, ToSchema)] -pub struct CreateMapSelectionRequest { - pub beatmap_id: i32, - pub beatmapset_id: i32, - pub title: String, - pub title_unicode: Option, - pub artist: String, - pub artist_unicode: Option, - pub version: String, - pub creator: String, - pub star_rating: String, - pub bpm: String, - pub total_length: i32, - pub max_combo: i32, - pub ar: String, - pub cs: String, - pub od: String, - pub hp: String, - pub selected_mods: String, - pub mod_position: i32, - pub comment: Option, - pub selected_by: String, - pub season: String, - pub category: String, - pub url: String, - pub cover_url: Option, - pub approved: Option, - pub padding: Option, -} - -#[derive(Debug, Deserialize, ToSchema)] -pub struct UpdateMapSelectionRequest { - pub title: Option, - pub title_unicode: Option, - pub artist: Option, - pub artist_unicode: Option, - pub version: Option, - pub creator: Option, - pub star_rating: Option, - pub bpm: Option, - pub total_length: Option, - pub max_combo: Option, - pub ar: Option, - pub cs: Option, - pub od: Option, - pub hp: Option, - pub selected_mods: Option, - pub mod_position: Option, - pub comment: Option, - pub season: Option, - pub category: Option, - pub url: Option, - pub cover_url: Option, - pub approved: Option, - pub padding: Option, -} - -#[derive(Debug, Deserialize, ToSchema)] -pub struct MapSelectionQueryParams { - pub page: Option, - pub page_size: Option, - pub season: Option, - pub category: Option, - pub selected_by: Option, -} diff --git a/src/dto/match_rooms.rs b/src/dto/match_rooms.rs deleted file mode 100644 index c5d0f0f..0000000 --- a/src/dto/match_rooms.rs +++ /dev/null @@ -1,37 +0,0 @@ -use sea_orm::prelude::{Date, Time}; -use serde::Deserialize; -use utoipa::ToSchema; - -#[derive(Debug, Deserialize, ToSchema)] -pub struct CreateMatchRoomRequest { - pub room_name: String, - pub round_number: i32, - #[schema(value_type = String)] - pub match_date: Date, - #[schema(value_type = String)] - pub match_time: Time, - pub match_number: i32, - pub max_participants: Option, - pub created_by: String, -} - -#[derive(Debug, Deserialize, ToSchema)] -pub struct UpdateMatchRoomRequest { - pub room_name: Option, - pub round_number: Option, - #[schema(value_type = Option)] - pub match_date: Option, - #[schema(value_type = Option)] - pub match_time: Option