validate.proto 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. // Copyright 2025 Kuban Technologies
  2. //
  3. // 自定义字段验证框架 - 基于 buf/validate 优化设计
  4. // 提供简化的 API、中文支持和业务规则集成
  5. syntax = "proto3";
  6. package kuban.api.validate;
  7. import "google/protobuf/descriptor.proto";
  8. // import "google/protobuf/duration.proto"; // 未使用
  9. // import "google/protobuf/timestamp.proto"; // 未使用
  10. option go_package = "git.ikuban.com/server/kubanapis/kuban/api/validate;validate";
  11. // ============================================================================
  12. // 扩展定义 - 为 Protobuf 描述符添加验证能力
  13. // ============================================================================
  14. // MessageOptions 扩展 - 消息级别验证
  15. extend google.protobuf.MessageOptions {
  16. // 消息级别的验证规则
  17. MessageRules message = 10100;
  18. }
  19. // FieldOptions 扩展 - 字段级别验证
  20. extend google.protobuf.FieldOptions {
  21. // 字段级别的验证规则
  22. FieldRules field = 10100;
  23. // 预定义规则引用(用于扩展)
  24. PredefinedRules predefined = 10101;
  25. }
  26. // OneofOptions 扩展 - oneof 级别验证
  27. extend google.protobuf.OneofOptions {
  28. // oneof 级别的验证规则
  29. OneofRules oneof = 10100;
  30. }
  31. // ============================================================================
  32. // 核心规则定义
  33. // ============================================================================
  34. // CEL 验证规则
  35. // 使用 Common Expression Language 编写自定义验证逻辑
  36. message Rule {
  37. // 规则唯一标识符
  38. string id = 1;
  39. // 错误消息(中文)
  40. string message = 2;
  41. // 错误消息(英文) - 可选,用于国际化
  42. string message_en = 3;
  43. // CEL 表达式 - 返回 true 表示验证通过
  44. string expression = 4;
  45. }
  46. // 消息级别验证规则
  47. message MessageRules {
  48. // CEL 自定义规则列表
  49. repeated Rule cel = 1;
  50. // 是否禁用所有字段验证
  51. bool disabled = 2;
  52. // 验证组 - 用于分组验证
  53. repeated string groups = 3;
  54. }
  55. // Oneof 验证规则
  56. message OneofRules {
  57. // 是否必须选择一个字段
  58. bool required = 1;
  59. }
  60. // 字段级别验证规则
  61. message FieldRules {
  62. // CEL 自定义规则列表
  63. repeated Rule cel = 1;
  64. // 字段是否必填 (Proto3 不需要 optional 关键字)
  65. bool required = 2;
  66. // 忽略策略
  67. IgnoreRule ignore = 3;
  68. // 验证组 - 只在指定组中验证
  69. repeated string groups = 4;
  70. // ========== 自定义错误消息 ==========
  71. // 使用场景:
  72. // 1. error_message: 覆盖所有类型验证规则的默认错误消息
  73. // 2. required_message: 专门为 required 验证自定义错误消息
  74. //
  75. // 优先级: required_message > error_message > 默认消息
  76. //
  77. // 示例:
  78. // string password = 1 [(kuban.api.validate.field) = {
  79. // required: true,
  80. // required_message: "密码不能为空", // required 验证失败时使用
  81. // error_message: "密码格式不符合要求", // 其他验证失败时使用
  82. // string: { min_len: 8, max_len: 32 }
  83. // }];
  84. // 通用错误消息(中文) - 覆盖所有验证规则的默认消息
  85. string error_message = 5;
  86. // 通用错误消息(英文)
  87. string error_message_en = 6;
  88. // required 验证专用错误消息(中文)
  89. string required_message = 7;
  90. // required 验证专用错误消息(英文)
  91. string required_message_en = 8;
  92. // 类型特定的验证规则
  93. oneof type {
  94. // 数值类型
  95. FloatRules float = 10;
  96. DoubleRules double = 11;
  97. Int32Rules int32 = 12;
  98. Int64Rules int64 = 13;
  99. UInt32Rules uint32 = 14;
  100. UInt64Rules uint64 = 15;
  101. SInt32Rules sint32 = 16;
  102. SInt64Rules sint64 = 17;
  103. Fixed32Rules fixed32 = 18;
  104. Fixed64Rules fixed64 = 19;
  105. SFixed32Rules sfixed32 = 20;
  106. SFixed64Rules sfixed64 = 21;
  107. // 布尔和字符串
  108. BoolRules bool = 30;
  109. StringRules string = 31;
  110. BytesRules bytes = 32;
  111. // 复杂类型
  112. EnumRules enum = 40;
  113. RepeatedRules repeated = 41;
  114. MapRules map = 42;
  115. // Well-Known Types
  116. DurationRules duration = 50;
  117. TimestampRules timestamp = 51;
  118. }
  119. }
  120. // 预定义规则(用于规则扩展)
  121. message PredefinedRules {
  122. repeated Rule cel = 1;
  123. }
  124. // 忽略策略
  125. enum IgnoreRule {
  126. // 未指定 - 默认行为(字段未设置时不验证)
  127. IGNORE_UNSPECIFIED = 0;
  128. // 字段为零值时忽略验证
  129. IGNORE_IF_ZERO = 1;
  130. // 始终忽略验证
  131. IGNORE_ALWAYS = 2;
  132. // 从不忽略验证(即使未设置也验证)
  133. IGNORE_NEVER = 3;
  134. }
  135. // ============================================================================
  136. // 数值类型验证规则
  137. // ============================================================================
  138. // 浮点数验证规则
  139. message FloatRules {
  140. // 常量值 - 字段必须等于此值
  141. optional float const = 1;
  142. // 小于
  143. optional float lt = 2;
  144. // 小于等于
  145. optional float lte = 3;
  146. // 大于
  147. optional float gt = 4;
  148. // 大于等于
  149. optional float gte = 5;
  150. // 在值列表中
  151. repeated float in = 6;
  152. // 不在值列表中
  153. repeated float not_in = 7;
  154. // 是否为有限数(非 NaN/Inf)
  155. optional bool finite = 8;
  156. }
  157. // 双精度浮点数验证规则
  158. message DoubleRules {
  159. optional double const = 1;
  160. optional double lt = 2;
  161. optional double lte = 3;
  162. optional double gt = 4;
  163. optional double gte = 5;
  164. repeated double in = 6;
  165. repeated double not_in = 7;
  166. optional bool finite = 8;
  167. }
  168. // Int32 验证规则
  169. message Int32Rules {
  170. optional int32 const = 1;
  171. optional int32 lt = 2;
  172. optional int32 lte = 3;
  173. optional int32 gt = 4;
  174. optional int32 gte = 5;
  175. repeated int32 in = 6;
  176. repeated int32 not_in = 7;
  177. }
  178. // Int64 验证规则
  179. message Int64Rules {
  180. optional int64 const = 1;
  181. optional int64 lt = 2;
  182. optional int64 lte = 3;
  183. optional int64 gt = 4;
  184. optional int64 gte = 5;
  185. repeated int64 in = 6;
  186. repeated int64 not_in = 7;
  187. }
  188. // UInt32 验证规则
  189. message UInt32Rules {
  190. optional uint32 const = 1;
  191. optional uint32 lt = 2;
  192. optional uint32 lte = 3;
  193. optional uint32 gt = 4;
  194. optional uint32 gte = 5;
  195. repeated uint32 in = 6;
  196. repeated uint32 not_in = 7;
  197. }
  198. // UInt64 验证规则
  199. message UInt64Rules {
  200. optional uint64 const = 1;
  201. optional uint64 lt = 2;
  202. optional uint64 lte = 3;
  203. optional uint64 gt = 4;
  204. optional uint64 gte = 5;
  205. repeated uint64 in = 6;
  206. repeated uint64 not_in = 7;
  207. }
  208. // SInt32 验证规则
  209. message SInt32Rules {
  210. optional sint32 const = 1;
  211. optional sint32 lt = 2;
  212. optional sint32 lte = 3;
  213. optional sint32 gt = 4;
  214. optional sint32 gte = 5;
  215. repeated sint32 in = 6;
  216. repeated sint32 not_in = 7;
  217. }
  218. // SInt64 验证规则
  219. message SInt64Rules {
  220. optional sint64 const = 1;
  221. optional sint64 lt = 2;
  222. optional sint64 lte = 3;
  223. optional sint64 gt = 4;
  224. optional sint64 gte = 5;
  225. repeated sint64 in = 6;
  226. repeated sint64 not_in = 7;
  227. }
  228. // Fixed32 验证规则
  229. message Fixed32Rules {
  230. optional fixed32 const = 1;
  231. optional fixed32 lt = 2;
  232. optional fixed32 lte = 3;
  233. optional fixed32 gt = 4;
  234. optional fixed32 gte = 5;
  235. repeated fixed32 in = 6;
  236. repeated fixed32 not_in = 7;
  237. }
  238. // Fixed64 验证规则
  239. message Fixed64Rules {
  240. optional fixed64 const = 1;
  241. optional fixed64 lt = 2;
  242. optional fixed64 lte = 3;
  243. optional fixed64 gt = 4;
  244. optional fixed64 gte = 5;
  245. repeated fixed64 in = 6;
  246. repeated fixed64 not_in = 7;
  247. }
  248. // SFixed32 验证规则
  249. message SFixed32Rules {
  250. optional sfixed32 const = 1;
  251. optional sfixed32 lt = 2;
  252. optional sfixed32 lte = 3;
  253. optional sfixed32 gt = 4;
  254. optional sfixed32 gte = 5;
  255. repeated sfixed32 in = 6;
  256. repeated sfixed32 not_in = 7;
  257. }
  258. // SFixed64 验证规则
  259. message SFixed64Rules {
  260. optional sfixed64 const = 1;
  261. optional sfixed64 lt = 2;
  262. optional sfixed64 lte = 3;
  263. optional sfixed64 gt = 4;
  264. optional sfixed64 gte = 5;
  265. repeated sfixed64 in = 6;
  266. repeated sfixed64 not_in = 7;
  267. }
  268. // ============================================================================
  269. // 字符串验证规则
  270. // ============================================================================
  271. // 布尔值验证规则
  272. message BoolRules {
  273. optional bool const = 1;
  274. }
  275. // 字符串验证规则 - 增强的中文支持
  276. message StringRules {
  277. // 常量值
  278. optional string const = 1;
  279. // 长度限制(字符数,非字节数)
  280. optional uint64 len = 2;
  281. optional uint64 min_len = 3;
  282. optional uint64 max_len = 4;
  283. // 字节长度限制
  284. optional uint64 len_bytes = 5;
  285. optional uint64 min_bytes = 6;
  286. optional uint64 max_bytes = 7;
  287. // 模式匹配
  288. optional string pattern = 8; // 正则表达式
  289. // 前缀/后缀
  290. optional string prefix = 9;
  291. optional string suffix = 10;
  292. // 包含/不包含
  293. optional string contains = 11;
  294. optional string not_contains = 12;
  295. // 在值列表中
  296. repeated string in = 13;
  297. repeated string not_in = 14;
  298. // 预定义格式(优化设计 - 更简洁)
  299. oneof well_known {
  300. bool email = 20; // 邮箱格式
  301. bool hostname = 21; // 主机名
  302. bool ip = 22; // IP 地址(v4/v6)
  303. bool ipv4 = 23; // IPv4
  304. bool ipv6 = 24; // IPv6
  305. bool uri = 25; // URI
  306. bool uri_ref = 26; // URI 引用
  307. bool uuid = 27; // UUID
  308. // 中文业务格式 - 这是优化点!
  309. bool chinese_mobile = 30; // 中国手机号
  310. bool chinese_id_card = 31; // 中国身份证号
  311. bool chinese_name = 32; // 中文姓名
  312. bool chinese_postcode = 33; // 中国邮政编码
  313. }
  314. // 字符类型限制
  315. optional bool ascii = 40; // 仅 ASCII 字符
  316. optional bool printable = 41; // 可打印字符
  317. optional bool alpha = 42; // 仅字母
  318. optional bool alphanumeric = 43; // 字母和数字
  319. optional bool numeric = 44; // 仅数字
  320. // 大小写要求
  321. optional bool lowercase = 50; // 仅小写
  322. optional bool uppercase = 51; // 仅大写
  323. }
  324. // 字节数组验证规则
  325. message BytesRules {
  326. optional bytes const = 1;
  327. optional uint64 len = 2;
  328. optional uint64 min_len = 3;
  329. optional uint64 max_len = 4;
  330. optional bytes pattern = 5;
  331. optional bytes prefix = 6;
  332. optional bytes suffix = 7;
  333. optional bytes contains = 8;
  334. repeated bytes in = 9;
  335. repeated bytes not_in = 10;
  336. // Well-known 格式
  337. oneof well_known {
  338. bool ip = 20;
  339. bool ipv4 = 21;
  340. bool ipv6 = 22;
  341. }
  342. }
  343. // ============================================================================
  344. // 复杂类型验证规则
  345. // ============================================================================
  346. // 枚举验证规则
  347. message EnumRules {
  348. optional int32 const = 1;
  349. optional bool defined_only = 2; // 仅允许已定义的枚举值
  350. repeated int32 in = 3;
  351. repeated int32 not_in = 4;
  352. }
  353. // 重复字段验证规则
  354. message RepeatedRules {
  355. optional uint64 min_items = 1; // 最小元素数
  356. optional uint64 max_items = 2; // 最大元素数
  357. optional bool unique = 3; // 元素必须唯一
  358. FieldRules items = 4; // 元素验证规则
  359. }
  360. // Map 验证规则
  361. message MapRules {
  362. optional uint64 min_pairs = 1; // 最小键值对数
  363. optional uint64 max_pairs = 2; // 最大键值对数
  364. FieldRules keys = 3; // 键验证规则
  365. FieldRules values = 4; // 值验证规则
  366. }
  367. // ============================================================================
  368. // Well-Known Types 验证规则
  369. // ============================================================================
  370. // Duration 验证规则
  371. message DurationRules {
  372. optional bool required = 1;
  373. // Duration 常量
  374. optional int64 const_seconds = 2;
  375. optional int32 const_nanos = 3;
  376. // 范围限制
  377. optional int64 lt_seconds = 4;
  378. optional int64 lte_seconds = 5;
  379. optional int64 gt_seconds = 6;
  380. optional int64 gte_seconds = 7;
  381. // 在值列表中
  382. repeated int64 in_seconds = 8;
  383. repeated int64 not_in_seconds = 9;
  384. }
  385. // Timestamp 验证规则
  386. message TimestampRules {
  387. optional bool required = 1;
  388. // Timestamp 常量(Unix 秒)
  389. optional int64 const = 2;
  390. // 范围限制
  391. optional int64 lt = 3;
  392. optional int64 lte = 4;
  393. optional int64 gt = 5;
  394. optional int64 gte = 6;
  395. // 相对时间限制
  396. optional bool lt_now = 7; // 必须在当前时间之前
  397. optional bool gt_now = 8; // 必须在当前时间之后
  398. // 时间范围(从现在开始的偏移量,秒)
  399. optional int64 within_seconds = 9; // 必须在现在的 N 秒内
  400. }