Commit Graph
32 Commits
Author SHA1 Message Date
xrain 11360b3359 docs: 更新 README——注解(@SimApiSign/@AesBody)、stdx.http、simapi_serialization 依赖、字段无下划线
- annotations 子包(原 attributes)
- @SimApiSign / @AesBody 声明式注解(替代手动调用)
- SimApiSignProviderBase / AesBodyProviderBase 移至 interfaces
- SimApiHttpClient/SimApiStorage/verifySign 基于 stdx.net.http(不依赖 soulsoft_net_http)
- SimApiUtil.json/escapeJson 直接实现、fromJson 免约束
- 依赖表:去掉 soulsoft_serialization/soulsoft_net_http,加 simapi_serialization
2026-08-18 02:08:00 +08:00
xrain aa2af7aee1 refactor: 移除 soulsoft_serialization / soulsoft_net_http 依赖——全部 HTTP 改 stdx.net.http
- SimApiStorage 4 处 S3 请求(PUT 上传/HEAD 检桶/PUT 建桶/POST 删除)改 stdx ClientBuilder/HttpRequestBuilder
- SimApiAuthCenter.verifySign 改 stdx(post + body + 读响应)
- cjpm.toml 删除 soulsoft_serialization、soulsoft_net_http(soulsoft web 栈传递依赖提供序列化)
- S3 全链路实测通过(上传/预签名/删除)
2026-08-18 01:56:32 +08:00
xrain 5c30f201ad refactor: SimApiHttpClient 改用 stdx.net.http——不再依赖 soulsoft_net_http
- query<T> 用 stdx.net.http ClientBuilder/HttpRequestBuilder/Client.send
  (等价 .NET HttpClient,替代 soulsoft_net_http.HttpClient)
- TLS 配置用 stdx TlsClientConfig(TrustAll + SNI 域名)
- 响应读取:status(UInt16) 2xx 判断 + InputStream 读 body
- 去掉 import soulsoft_net_http
- 端到端验证:stdx client 请求本机服务读响应正常
2026-08-18 01:29:02 +08:00
xrain 9c2e0ae0e3 refactor: AES 请求体改用 SimApiOneFieldRequest 序列化,去掉手拼字符串
- aesQuery/aesSignQuery:{"data":"..."} 手拼 → SimApiOneFieldRequest<String>
  经 SimApiUtil.json 序列化(对齐 C# new SimApiOneFieldRequest<string>{...})
- SimApiOneFieldRequest<T> 恢复带参构造(构造请求用)
2026-08-18 01:24:11 +08:00
xrain 79a997c014 refactor: 删除 SimApiBaseRequest 空类 + Request DTO 去掉显式构造器
- SimApiBaseRequest 空类无意义:.NET 无此类、仓颉版无继承无使用,删除
- SimApiIdOnlyRequest/SimApiStringIdOnlyRequest/SimApiOneFieldRequest/
  SimApiBasePageRequest 去掉所有显式构造器(含带参)——它们只作反序列化
  目标,无参构造由编译器自动提供,带参构造无人调用
2026-08-18 01:18:12 +08:00
xrain c7099040fa refactor: DTO 字段去下划线 + SimApiBaseResponse 不再可继承 + 删除 SimApiJson/toJsonString
- 纯 POCO DTO 字段去下划线:AuthDto(id/name/applicationId/profileId/scene 等)、
  SimApiLoginItem(id/types/meta/extra)、AesBodyRequest(data)、
  SimApiBaseResponse 系列(code/message/data/list/page/count/total)
- SimApiBaseResponse 去 open(不再允许继承)+ 删 @SerializerParent(无子类继承)
- SimApiResponse<T> / SimApiDataResponse 改为组合(自带 code/message/data)
- 删除 toJsonString(无使用点,统一走 simapi_serialization)
- 删除 SimApiJson.cj:json() → SimApiUtil.json() 直接序列化;
  escapeJson() 迁入 SimApiUtil
- 同步更新所有字段引用(AuthCenter/AuthIam/HttpClient/ExceptionMiddleware 等)
- 保留 sqlsharp 实体 User/Bot 的 _ 前缀(soulsoft 宏依赖)
2026-08-18 01:15:15 +08:00
xrain ea31bd9b6a refactor: 删除仅有空构造器的 public init() {}——编译器自动提供无参构造
删除(类无其他构造器):
- SimApiBaseModel / SimApiLoggerProvider / SimApiSignProviderBase / AesBodyProviderBase
- SimApiResponseFilter / SimApiAuthCenterOptions / SimApiExceptionOptions
- SimApiHttpClientOptions / SimApiOptions / SimApiSynapseOptions / SimApiRouteOptions
- SimApiStorageOptions / SimApiRequestLogOptions / SimApiJobServer / SimApiAuthOption
- AuthDto 5 个纯 POCO(AppAndProfileItem/ConfirmResponse/LoginInfoResponse/
  GroupRelatedItem/GroupDetailTreeNode)/ AesBodyRequest

保留(有带参构造器,空 init 是反序列化/绑定必需):
- GetCodeResponse / PermissionItem / SimApiBaseRequest 系列 / PageResponse
- SimApiLoginItem / SimApiDocGroup / SimApiStorage 相关 / 各 DTO
2026-08-18 00:59:48 +08:00
xrain 6e6b21ff83 refactor: SimApiSignProviderBase / AesBodyProviderBase 移至 interfaces 子包
- 新增 src/interfaces/SimApiSignProviderBase.cj / AesBodyProviderBase.cj(package simapi.interfaces)
- SimApiSignChecker / SimApiAesBodyChecker 移除基类定义,import simapi.interfaces.*
- SimApiRequestDelegateFactory 已 import interfaces,无需改
- 说明:基类含配置字段故用 open class(Cangjie 接口不能声明字段)
2026-08-18 00:51:45 +08:00
xrain ef9765de5d feat: 新增 @SimApiSign 与 @AesBody 注解(对齐 C# SimApiSignAttribute / AesBodyAttribute)
- src/annotations/SimApiSign.cj:方法/类级声明式验签注解,keyProvider 用类型名(DI 解析)
- src/annotations/AesBody.cj:参数级声明式 AES body 解密注解
- SimApiRequestDelegateFactory 自动执行:
  - checkSimApiSign:解析 @SimApiSign → DI 取 SimApiSignProviderBase → SimApiSignChecker.verify
  - bindAesBody:@AesBody 参数 → DI 取 AesBodyProviderBase → decryptBody → 按类型反序列化
- 注解未指定类型名时用默认空实现(未配置即报错,对齐 C# 行为)
2026-08-18 00:35:59 +08:00
xrain d76b08a542 refactor: 子包 attributes 改名 annotations——simapi.attributes → simapi.annotations
- src/attributes/ → src/annotations/(OriginResponse.cj / SimApiAuth.cj)
- SimApiRequestDelegateFactory import 同步更新
2026-08-18 00:31:36 +08:00
xrain e9978ea5e0 feat: 自定义 FromBody 绑定——simapi_serialization 按运行时类型反序列化,DTO 免 @Serialization 宏
- SimApiRequestDelegateFactory:无注解参数(FromBody)用 JsonSerializer.Deserialize(typeInfo, body)
  反序列化(免宏、免约束),显式注解参数(Query/Form/Route/Header/Services)委托 soulsoft binder
- 请求体只读一次并缓存到 context.items["SimApi:BodyCache"](body 流不可重读,
  请求日志中间件与 FromBody 共用缓存)
- 验证:/auth/login/admin 的 LoginAdminRequest(无宏)反序列化成功,走到业务密码校验
2026-08-18 00:27:32 +08:00
xrain 73f60f6f15 refactor: 全框架 JSON 操作迁移到 simapi_serialization
- 依赖:新增 simapi_serialization path 依赖(保留 soulsoft_serialization 供 soulsoft web 栈传递使用)
- SimApiJson.json / SimApiUtil.json → JsonSerializer.Serialize
- SimApiUtil.fromJson / base64DecodeTo → JsonSerializer.Deserialize(去 ISerialization 约束)
- SimApiHttpClient signQuery/aesQuery/aesSignQuery/query → 去约束,反序列化换新库
- SimApiBaseResponse/SimApiDataResponse/SimApiLoginItem/AesBodyRequest/AuthSDK DTO → 去 @Serialization 宏/去 soulsoft 接口,改纯 POCO(simapi_serialization 反射)
- SimApiBaseResponse 标 @SerializerParent:子类响应序列化包含 _code/_message
- SimApiResultWriter / SimApiExceptionMiddleware → 响应输出走 simapi_serialization(统一 _code/_message 格式)
- SimApiRequestLogMiddleware 截断 → Deserialize<HashMap<String,Any>> + 重序列化
- SimApiAuthDto JsonValue 字段 → HashMap<String,Any>;SimApiCache.get<T> 去约束
- webdemo:AuthController readFromJson 换 Deserialize;cjpm.toml 补依赖
- 验证:webdemo 启动正常,GET/POST 接口响应格式统一,S3 存储全链路 OK
2026-08-18 00:07:00 +08:00
xrain 8b0a8f783c refactor: SimApiExtensions 移入根包 simapi 并改为静态类,删除 extensions 子包
- src/extensions/SimApiExtensions.cj 删除,内容合并进 src/SimApiExtensions.cj(package simapi)
- 接口+extend 改为静态类 SimApiExtensions:
  SimApiExtensions.addSimApi(builder, configure) / useSimApi(host)(对齐 .NET 根命名空间静态类)
- 私有辅助 addSimApiCore / addControllers 收敛为私有静态方法
- 用法从 builder.addSimApi{} / host.useSimApi() 改为 SimApiExtensions.addSimApi(builder){} / useSimApi(host)
2026-08-17 09:16:42 +08:00
xrain bcac7b1102 refactor: SimApiRequestDelegateFactory/SimApiResultWriter 从 extensions 移到 helpers
- 包 simapi.extensions → simapi.helpers
- 新增 interfaces/IBindRequestContext 接口切断 helpers↔controllers 循环依赖
  (工厂只依赖接口,不再依赖 SimApiBaseController)
- SimApiAuth 注解类与 helpers.SimApiAuth 同名冲突,用 import 别名 SimApiAuthAttribute 解决
2026-08-17 09:12:47 +08:00
xrain ff41d287ed refactor: 根包锚点 simapi.cj 改名为 SimApiExtensions.cj(对齐 .NET 根目录 SimApiExtensions.cs) 2026-08-17 09:10:02 +08:00
xrain 2b8d2c47be feat: SimApiError 增加顶层函数,支持无前缀 error(400);精简 simapi.cj 为包锚点
- error/errorWhen/errorWhenTrue/errorWhenFalse/errorWhenNull 提升为 simapi.helpers 顶层函数,
  import simapi.helpers.* 后可直接调用(对齐 C# using static SimApi.Helpers.SimApiError)
- SimApiError 类保留为兼容门面(旧写法仍可用)
- simapi.cj 精简为仅 package 声明:实测 cjpm 要求 src 根目录必须有 .cj 锚点,
  否则不扫描子目录导致整包编译为空;SimApi 类/version 常量无任何引用,已移除
2026-08-17 09:06:17 +08:00
xrain 67f7c16a3f feat: SimApiStorage 增加 deleteFiles 批量删除(S3 DeleteObjects)
- POST /{bucket}?delete + XML 一次删除多个对象(Minio RemoveObjects 同款接口)
- MinIO 强制要求 Content-Md5 头(缺失返回 MissingContentMD5),MD5 经 stdx 计算 + Base64
- 已用 oss.anymemory.cn 实测:批量删除后访问对象返回 404
2026-08-17 00:22:08 +08:00
xrain b4e808e775 fix: SimApiStorage 直接请求补 x-amz-date 签名头,Content-Type 移到 HttpContent
- 直接请求(上传/桶检测/建桶)需带 x-amz-date 请求头并纳入签名(缺省会 400)
- Content-Type 按 soulsoft_net_http 规则设在 ByteArrayContent.headers(不是 request.headers)
- 已用 oss.anymemory.cn 实测:上传/预签名上传/预签名下载回读全部一致
2026-08-17 00:08:50 +08:00
xrain eb488bcd5a feat: 实现 SimApiStorage(S3/MinIO 存储)
- 自实现 AWS Signature V4(HMAC-SHA256 基于 stdx SHA256),无需 Minio SDK
- getUploadUrl / getDownloadUrl(预签名 PUT/GET)
- uploadFile(直接 PUT 上传)、fullUrl / getUrl / getPath
- 构造时检测并自动创建桶(静态守卫只执行一次)
- 注册为 Scoped 以注入 IHttpContextAccessor(soulsoft DI 禁止 singleton 消费 scoped)
- 签名核心已用 AWS 官方测试向量验证(最终签名 5d672d79... 一致)
- README 同步(未实现表移除、新增 5.3 存储章节)
2026-08-17 00:00:15 +08:00
xrain 92eea3108a refactor: 对齐 simapi-net 的 20 项差异
- SimApiLoginItem._types 默认 [user]
- 新增 SimApiIdOnlyRequest
- errorWhenNone 改名 errorWhenNull
- SimApiAuth.update 保留 TTL(Redis ttl/expire)
- SimApiCache: set 接受 Any + 新增 get<T>/getString
- SimApiHttpClient 签名字段移出 Options
- SimApiUtil: md5/sha1 支持 mode + 新增 paginate
- @SimApiAuth 支持逗号分隔多类型
- Logger: 4 位毫秒 + IsEnabled 恒 true
- 删除 /versions 端点;exceptionHandler 改为抛错
- UseSimApi 中间件顺序对齐 .NET
- README 同步更新
2026-08-16 23:44:52 +08:00
xrain 40e0726087 docs: README 更新(新功能文档 + 修正过时状态)
- 新增:@SimApiAuth/@OriginResponse/验签/AES body/AES/BaseModel/AuthSDK 使用文档
- 修正:AuthGate/AES 已实现、自动控制器扫描、DI 构造示例、移除 ApiResult 引用
- cjpm.lock:新增 soulsoft_net_http 等依赖
2026-08-16 22:47:05 +08:00
xrain e278753a8c feat: SimApiOptions 增加 authCheckers 注册表
存储 ISimApiAuthChecker 类型列表(由 addSimApi 自动扫描填充),
供 @SimApiAuth 鉴权时逐个从 DI 解析执行
2026-08-16 22:47:05 +08:00
xrain c591387288 feat: SimApiControllerScanner 增加 ISimApiAuthChecker 自动扫描
scanAuthCheckers():扫描调用者包及其子包中 ISimApiAuthChecker 的非抽象实现类
(复用控制器扫描的 PackageInfo 枚举机制,对齐 C# Assembly.GetTypes 扫描)
2026-08-16 22:47:04 +08:00
xrain 6cb79cf970 feat: SimApiHttpClient 增强
- aesEncrypt 接入纯仓颉 AES(替换 Base64 占位)
- TLS 支持:https 自动配置 TrustAll + SNI(stdx TLS 动态加载 openssl)
- generateNonce 用 UUID v4(对齐 C# Guid.NewGuid)
- open class 供 SimApiAuthClient 继承
2026-08-16 22:47:04 +08:00
xrain 8a6c783459 feat: Auth/Cache/Util 增强
- SimApiAuth/Cache:Redis 连接串支持密码/DB 索引(host:port,password=xxx,db=2)
- InMemory 模式加过期机制(TokenEntry/CacheEntry 带 expireAt,过期自动移除)
- Redis 客户端 autoHello=false 兼容 Redis 8.x(HELLO 3 RESP3 响应解析失败)
- SimApiAuth.generateToken 用 UUID v4
- SimApiUtil 补齐:newGuid / fromJson<T> / base64Encode(Any) / base64DecodeTo<T>
2026-08-16 22:46:57 +08:00
xrain a73a986f8b feat: RequestLog 中间件补齐(对齐 C#)
- 请求体 JSON 字段级截断(仅超长字符串字段,保留结构)
- 下游异常捕获记录后重抛(对齐 C# ExceptionDispatchInfo)
- 响应体受 soulsoft body 只读限制,记录 Content-Length 替代
2026-08-16 22:46:57 +08:00
xrain a04ab2f400 feat: addSimApi/useSimApi 接入内置路由/AuthSDK/checker 扫描
- 内置路由:RouteOptions 自定义路径用 mapGet/mapPost 真实注册(默认值由特性路由覆盖)
- AuthGate:enableSimApiAuthGate 时注册 AuthClient/Center/Iam 单例并挂载网关中间件
- ISimApiAuthChecker 自动扫描:enableSimApiAuth 时扫描调用者包实现类填充 authCheckers + AddScoped
2026-08-16 22:46:57 +08:00
xrain c7b8148ff5 refactor: 提取统一响应封装 SimApiResultWriter
- dispatchResult 复用 SimApiResultWriter(IActionResult/SimApiBaseResponse/String/Unit/其他 五分支)
- @SimApiAuth 鉴权执行(checkSimApiAuth:401/类型403/checker 遍历)
- @OriginResponse 跳过封装原样输出
2026-08-16 22:46:48 +08:00
xrain f056de582b feat: AuthSDK 认证中心完整实现(对齐 C# AuthSDK)
- SimApiAuthClient:SimApiHttpClient 子类,凭证取 AuthCenterOptions
- SimApiAuthCenter:群组/Profile/内部应用/系统登录/安全验证 12 接口 + VerifySign
- SimApiAuthIam:注册权限/获取权限/校验权限(无权限 403)
- SimApiAuthCenterMiddleware:网关透传(三头 MD5 校验 + Base64 解码 LoginInfo)
- SimApiAuthDto:7 个 DTO(data 字段用 JsonValue 规避宏约束)
2026-08-16 22:46:48 +08:00
xrain 9af7871114 feat: SimApiBaseModel 实体基类(对齐 C# Models/SimApiBaseModel)
- _id 默认 UUID v4、_createdAt/_updatedAt 自动当前时间
- mapData 反射式字段映射(忽略字段/白名单两种重载)
- updateTime 刷新更新时间
2026-08-16 22:46:48 +08:00
xrain d68a31077a feat: 声明式鉴权/原样响应注解 + 服务端验签 + AES body 解密
- @SimApiAuth:方法/类级鉴权注解(401/类型403/checker执行),对齐 C# [SimApiAuth]
- @OriginResponse:跳过统一响应封装原样输出,对齐 C# [OriginResponse]
- SimApiSignChecker + SimApiSignProviderBase:服务端验签(含 QueryExpires 过期与 nonce 去重)
- SimApiAesBodyChecker + AesBodyProviderBase:服务端解密加密 body
2026-08-16 22:46:40 +08:00
xrain 932fce1b9e first version 2026-08-16 12:46:15 +08:00