Bez popisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Config_template_builder.go 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package models
  2. import (
  3. "encoding/json"
  4. "time"
  5. )
  6. // ConfigTemplateBuilder 配置模板建造者
  7. type ConfigTemplateBuilder struct {
  8. templates []*ConfigTemplate
  9. current *ConfigTemplate
  10. }
  11. // NewConfigTemplateBuilder 创建配置模板建造者
  12. func NewConfigTemplateBuilder() *ConfigTemplateBuilder {
  13. return &ConfigTemplateBuilder{
  14. templates: make([]*ConfigTemplate, 0),
  15. }
  16. }
  17. // StartTemplate 开始创建新模板
  18. func (b *ConfigTemplateBuilder) StartTemplate(id, name, description string) *ConfigTemplateBuilder {
  19. b.current = &ConfigTemplate{
  20. ConfigTemplateID: id,
  21. TemplateName: name,
  22. Description: description,
  23. IsDefault: true,
  24. SortOrder: len(b.templates) + 1,
  25. Creator: "system",
  26. CreatedAt: time.Now(),
  27. UpdatedAt: time.Now(),
  28. Details: make([]ConfigTemplateDetail, 0),
  29. }
  30. return b
  31. }
  32. // AddInt 添加整型配置项
  33. func (b *ConfigTemplateBuilder) AddInt(key, description string) *DetailBuilder {
  34. return b.addDetail(key, description, "number", "int")
  35. }
  36. // AddString 添加字符串配置项
  37. func (b *ConfigTemplateBuilder) AddString(key, description string) *DetailBuilder {
  38. return b.addDetail(key, description, "string", "string")
  39. }
  40. // AddBoolean 添加布尔型配置项
  41. func (b *ConfigTemplateBuilder) AddBoolean(key, description string) *DetailBuilder {
  42. return b.addDetail(key, description, "boolean", "boolean")
  43. }
  44. // AddEnum 添加枚举型配置项
  45. func (b *ConfigTemplateBuilder) AddEnum(key, description string, enumValues []string) *DetailBuilder {
  46. db := b.addDetail(key, description, "string", "string")
  47. db.detail.ValidationRules = func() string {
  48. rules := ValidationRules{
  49. EnumValues: enumValues,
  50. }
  51. b, _ := json.Marshal(rules)
  52. return string(b)
  53. }()
  54. return db
  55. }
  56. // FinishTemplate 完成当前模板创建
  57. func (b *ConfigTemplateBuilder) FinishTemplate() *ConfigTemplateBuilder {
  58. if b.current != nil {
  59. b.templates = append(b.templates, b.current)
  60. b.current = nil
  61. }
  62. return b
  63. }
  64. // GetTemplates 获取所有模板
  65. func (b *ConfigTemplateBuilder) GetTemplates() []*ConfigTemplate {
  66. return b.templates
  67. }
  68. // 私有方法
  69. func (b *ConfigTemplateBuilder) addDetail(key, description, valueType, dataType string) *DetailBuilder {
  70. if b.current == nil {
  71. b.StartTemplate("untitled", "未命名模板", "未描述模板")
  72. }
  73. detailID := b.current.ConfigTemplateID + "." + key
  74. detail := ConfigTemplateDetail{
  75. ConfigTemplateDetailID: detailID,
  76. ConfigTemplateID: b.current.ConfigTemplateID,
  77. ConfigKey: key,
  78. Description: description,
  79. ValueType: valueType,
  80. DataType: dataType,
  81. IsRequired: false,
  82. IsSensitive: false,
  83. IsReadonly: false,
  84. SortOrder: len(b.current.Details) + 1,
  85. Creator: "system",
  86. CreatedAt: time.Now(),
  87. UpdatedAt: time.Now(),
  88. }
  89. return &DetailBuilder{
  90. builder: b,
  91. detail: detail,
  92. }
  93. }
  94. // DetailBuilder 配置详情建造者
  95. type DetailBuilder struct {
  96. builder *ConfigTemplateBuilder
  97. detail ConfigTemplateDetail
  98. }
  99. // Default 设置默认值
  100. func (db *DetailBuilder) Default(value string) *DetailBuilder {
  101. db.detail.DefaultValue = value
  102. db.detail.ConfigValue = value
  103. return db
  104. }
  105. // Required 设置为必填项
  106. func (db *DetailBuilder) Required() *DetailBuilder {
  107. db.detail.IsRequired = true
  108. return db
  109. }
  110. // Sensitive 设置为敏感信息
  111. func (db *DetailBuilder) Sensitive() *DetailBuilder {
  112. db.detail.IsSensitive = true
  113. return db
  114. }
  115. // Readonly 设置为只读
  116. func (db *DetailBuilder) Readonly() *DetailBuilder {
  117. db.detail.IsReadonly = true
  118. return db
  119. }
  120. // Min 设置最小值
  121. func (db *DetailBuilder) Min(min float64) *DetailBuilder {
  122. db.addValidation(func(r *ValidationRules) {
  123. r.Min = &min
  124. })
  125. return db
  126. }
  127. // Max 设置最大值
  128. func (db *DetailBuilder) Max(max float64) *DetailBuilder {
  129. db.addValidation(func(r *ValidationRules) {
  130. r.Max = &max
  131. })
  132. return db
  133. }
  134. // MinLength 设置最小长度
  135. func (db *DetailBuilder) MinLength(length int) *DetailBuilder {
  136. db.addValidation(func(r *ValidationRules) {
  137. r.MinLength = &length
  138. })
  139. return db
  140. }
  141. // MaxLength 设置最大长度
  142. func (db *DetailBuilder) MaxLength(length int) *DetailBuilder {
  143. db.addValidation(func(r *ValidationRules) {
  144. r.MaxLength = &length
  145. })
  146. return db
  147. }
  148. // Pattern 设置正则表达式
  149. func (db *DetailBuilder) Pattern(pattern string) *DetailBuilder {
  150. db.addValidation(func(r *ValidationRules) {
  151. r.Pattern = pattern
  152. })
  153. return db
  154. }
  155. // Message 设置验证错误消息
  156. func (db *DetailBuilder) Message(msg string) *DetailBuilder {
  157. db.addValidation(func(r *ValidationRules) {
  158. r.Message = msg
  159. })
  160. return db
  161. }
  162. // FinishDetail 完成当前详情项
  163. func (db *DetailBuilder) FinishDetail() *ConfigTemplateBuilder {
  164. db.builder.current.Details = append(db.builder.current.Details, db.detail)
  165. return db.builder
  166. }
  167. // 私有方法
  168. func (db *DetailBuilder) addValidation(fn func(*ValidationRules)) {
  169. var rules ValidationRules
  170. if db.detail.ValidationRules != "" {
  171. json.Unmarshal([]byte(db.detail.ValidationRules), &rules)
  172. }
  173. fn(&rules)
  174. b, _ := json.Marshal(rules)
  175. db.detail.ValidationRules = string(b)
  176. }
  177. // 使用示例
  178. func CreateSampleConfigTemplates() []*ConfigTemplate {
  179. builder := NewConfigTemplateBuilder()
  180. //builder.BuildSampleTemplates()
  181. return builder.GetTemplates()
  182. }
  183. // // 更简洁的使用示例
  184. // func CreateConfigTemplates() []*ConfigTemplate {
  185. // builder := NewConfigTemplateBuilder()
  186. // // Service模板 - 更简洁的写法
  187. // builder.StartTemplate("Service配置", "service", "服务基础配置")
  188. // builder.AddInt("port", "服务监听端口").Default("8080").Min(1024).Max(65535).Required().FinishDetail()
  189. // builder.AddString("service_name", "服务名称").Default("svc-configure").Required().FinishDetail()
  190. // builder.FinishTemplate()
  191. // // Log模板
  192. // builder.StartTemplate("日志配置", "log", "日志相关配置")
  193. // builder.AddEnum("level", "日志级别", []string{"debug", "info", "warn", "error", "fatal"}).Default("debug").Required().FinishDetail()
  194. // builder.AddString("output", "日志输出").Default("console,file").FinishDetail()
  195. // builder.FinishTemplate()
  196. // // Doris模板
  197. // builder.StartTemplate("Doris配置", "doris", "Doris连接配置")
  198. // builder.AddString("fe_host", "FE主机").Default("localhost").Required().FinishDetail()
  199. // builder.AddString("fe_password", "密码").Sensitive().Required().FinishDetail()
  200. // builder.FinishTemplate()
  201. // return builder.GetTemplates()
  202. // }