service.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. package entity
  2. import (
  3. "git.sxidc.com/go-framework/baize/api"
  4. "git.sxidc.com/go-framework/baize/binding"
  5. "git.sxidc.com/go-framework/baize/binding/request"
  6. "git.sxidc.com/go-framework/baize/binding/response"
  7. "git.sxidc.com/go-framework/baize/domain"
  8. "git.sxidc.com/go-framework/baize/infrastructure"
  9. "git.sxidc.com/go-framework/baize/infrastructure/database"
  10. "git.sxidc.com/go-framework/baize/infrastructure/database/sql"
  11. "git.sxidc.com/go-framework/baize/tag/sql/sql_mapping"
  12. "git.sxidc.com/service-supports/fserr"
  13. "reflect"
  14. )
  15. func Create(tableName string, dbExecutor database.Executor, callbacks *Callbacks[string]) binding.ServiceFunc[string] {
  16. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (string, error) {
  17. e, ok := objects[0].(domain.Entity)
  18. if !ok {
  19. return "", fserr.New("需要传递领域对象应该为实体")
  20. }
  21. err := e.GenerateID()
  22. if err != nil {
  23. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, "")
  24. }
  25. err = e.CheckID()
  26. if err != nil {
  27. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, "")
  28. }
  29. err = callbackBeforeDBOperate(callbacks, e, dbExecutor)
  30. if err != nil {
  31. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, "")
  32. }
  33. err = database.InsertEntity(dbExecutor, tableName, e)
  34. if err != nil {
  35. if database.IsErrorDBRecordHasExist(err) {
  36. err = fserr.New(e.DomainCNName() + "已存在")
  37. }
  38. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, "")
  39. }
  40. err = callbackAfterDBOperate(callbacks, e, dbExecutor)
  41. if err != nil {
  42. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, "")
  43. }
  44. return callbackOnSuccessReturn(callbacks, e, dbExecutor, e.GetID())
  45. }
  46. }
  47. func Delete(tableName string, dbExecutor database.Executor, callbacks *Callbacks[any]) binding.ServiceFunc[any] {
  48. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
  49. e, ok := objects[0].(domain.Entity)
  50. if !ok {
  51. return nil, fserr.New("需要传递领域对象应该为实体")
  52. }
  53. err := e.CheckID()
  54. if err != nil {
  55. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  56. }
  57. err = callbackBeforeDBOperate(callbacks, e, dbExecutor)
  58. if err != nil {
  59. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  60. }
  61. err = database.DeleteEntity(dbExecutor, tableName, e)
  62. if err != nil {
  63. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  64. }
  65. err = callbackAfterDBOperate(callbacks, e, dbExecutor)
  66. if err != nil {
  67. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  68. }
  69. return callbackOnSuccessReturn(callbacks, e, dbExecutor, nil)
  70. }
  71. }
  72. func Update(tableName string, dbExecutor database.Executor, callbacks *Callbacks[any]) binding.ServiceFunc[any] {
  73. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
  74. e, ok := objects[0].(domain.Entity)
  75. if !ok {
  76. return nil, fserr.New("需要传递领域对象应该为实体")
  77. }
  78. err := e.CheckID()
  79. if err != nil {
  80. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  81. }
  82. exist, err := database.CheckExist(dbExecutor, &sql.CheckExistExecuteParams{
  83. TableName: tableName,
  84. Conditions: sql.NewConditions().Equal(e.IDColumnName(), e.GetID()),
  85. })
  86. if err != nil {
  87. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  88. }
  89. if !exist {
  90. err := fserr.New(e.DomainCNName() + "不存在")
  91. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  92. }
  93. err = callbackBeforeDBOperate(callbacks, e, dbExecutor)
  94. if err != nil {
  95. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  96. }
  97. err = database.UpdateEntity(dbExecutor, tableName, e)
  98. if err != nil {
  99. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  100. }
  101. err = callbackAfterDBOperate(callbacks, e, dbExecutor)
  102. if err != nil {
  103. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  104. }
  105. return callbackOnSuccessReturn(callbacks, e, dbExecutor, nil)
  106. }
  107. }
  108. type ConditionFieldCallback func(conditions *sql.Conditions, fieldName string, columnName string, value any) (hasDeal bool)
  109. func Query[O any](tableName string, dbExecutor database.Executor, callbacks *Callbacks[response.InfosData[O]], conditionFieldCallback ConditionFieldCallback) binding.ServiceFunc[response.InfosData[O]] {
  110. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (response.InfosData[O], error) {
  111. queryParams, ok := params.(request.Query)
  112. if !ok {
  113. return response.InfosData[O]{}, fserr.New("请求参数不是Query接口")
  114. }
  115. e, ok := objects[0].(domain.Entity)
  116. if !ok {
  117. return response.InfosData[O]{}, fserr.New("需要传递领域对象应该为实体")
  118. }
  119. conditions := sql.NewConditions()
  120. fields, err := sql_mapping.DefaultUsage(e)
  121. if err != nil {
  122. return response.InfosData[O]{}, err
  123. }
  124. for _, field := range fields {
  125. hasDeal := false
  126. if conditionFieldCallback != nil {
  127. hasDeal = conditionFieldCallback(conditions, field.FieldName, field.ColumnName, field.Value)
  128. }
  129. if !hasDeal {
  130. fieldValue := reflect.ValueOf(field.Value)
  131. if !fieldValue.IsZero() {
  132. conditions.Equal(field.ColumnName, field.Value)
  133. }
  134. }
  135. }
  136. err = callbackBeforeDBOperate(callbacks, e, dbExecutor)
  137. if err != nil {
  138. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, response.InfosData[O]{})
  139. }
  140. results, totalCount, err := database.Query(dbExecutor, &sql.QueryExecuteParams{
  141. TableName: tableName,
  142. Conditions: conditions,
  143. PageNo: queryParams.GetPageNo(),
  144. PageSize: queryParams.GetPageSize(),
  145. })
  146. if err != nil {
  147. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, response.InfosData[O]{})
  148. }
  149. err = callbackAfterDBOperate(callbacks, e, dbExecutor)
  150. if err != nil {
  151. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, response.InfosData[O]{})
  152. }
  153. infos := make([]O, 0)
  154. err = sql.ParseSqlResult(results, &infos)
  155. if err != nil {
  156. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, response.InfosData[O]{})
  157. }
  158. output := response.InfosData[O]{
  159. Infos: infos,
  160. TotalCount: totalCount,
  161. PageNo: queryParams.GetPageNo(),
  162. }
  163. return callbackOnSuccessReturn(callbacks, e, dbExecutor, output)
  164. }
  165. }
  166. func GetByID[O any](tableName string, dbExecutor database.Executor, callbacks *Callbacks[O]) binding.ServiceFunc[O] {
  167. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (O, error) {
  168. var outputZero O
  169. outputZeroValue := reflect.Zero(reflect.TypeOf(outputZero))
  170. if outputZeroValue.Kind() == reflect.Pointer {
  171. outputZeroValue.Set(reflect.New(outputZeroValue.Type().Elem()))
  172. }
  173. e, ok := objects[0].(domain.Entity)
  174. if !ok {
  175. return outputZero, fserr.New("需要传递领域对象应该为实体")
  176. }
  177. err := e.CheckID()
  178. if err != nil {
  179. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, outputZero)
  180. }
  181. err = callbackBeforeDBOperate(callbacks, e, dbExecutor)
  182. if err != nil {
  183. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, outputZero)
  184. }
  185. result, err := database.QueryOne(dbExecutor, &sql.QueryOneExecuteParams{
  186. TableName: tableName,
  187. Conditions: sql.NewConditions().Equal(e.IDColumnName(), e.GetID()),
  188. })
  189. if err != nil {
  190. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, outputZero)
  191. }
  192. err = callbackAfterDBOperate(callbacks, e, dbExecutor)
  193. if err != nil {
  194. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, outputZero)
  195. }
  196. var info O
  197. var infoPointer any
  198. infoPointer = &info
  199. if outputZeroValue.Kind() == reflect.Pointer {
  200. infoPointer = info
  201. }
  202. err = sql.ParseSqlResult(result, infoPointer)
  203. if err != nil {
  204. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, outputZero)
  205. }
  206. return callbackOnSuccessReturn(callbacks, e, dbExecutor, info)
  207. }
  208. }
  209. func CreateTx(tableName string, dbExecutor database.Executor, callbacks *Callbacks[string]) binding.ServiceFunc[string] {
  210. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (string, error) {
  211. e, ok := objects[0].(domain.Entity)
  212. if !ok {
  213. return "", fserr.New("需要传递领域对象应该为实体")
  214. }
  215. err := e.GenerateID()
  216. if err != nil {
  217. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, "")
  218. }
  219. err = e.CheckID()
  220. if err != nil {
  221. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, "")
  222. }
  223. err = database.Transaction(dbExecutor, func(tx database.Executor) error {
  224. err = callbackBeforeDBOperate(callbacks, e, tx)
  225. if err != nil {
  226. return err
  227. }
  228. err = database.InsertEntity(tx, tableName, e)
  229. if err != nil {
  230. if database.IsErrorDBRecordHasExist(err) {
  231. err = fserr.New(e.DomainCNName() + "已存在")
  232. }
  233. return err
  234. }
  235. err = callbackAfterDBOperate(callbacks, e, tx)
  236. if err != nil {
  237. return err
  238. }
  239. return nil
  240. })
  241. if err != nil {
  242. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, "")
  243. }
  244. return callbackOnSuccessReturn(callbacks, e, dbExecutor, e.GetID())
  245. }
  246. }
  247. func DeleteTx(tableName string, dbExecutor database.Executor, callbacks *Callbacks[any]) binding.ServiceFunc[any] {
  248. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
  249. e, ok := objects[0].(domain.Entity)
  250. if !ok {
  251. return nil, fserr.New("需要传递领域对象应该为实体")
  252. }
  253. err := e.CheckID()
  254. if err != nil {
  255. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  256. }
  257. err = database.Transaction(dbExecutor, func(tx database.Executor) error {
  258. err = callbackBeforeDBOperate(callbacks, e, tx)
  259. if err != nil {
  260. return err
  261. }
  262. err = database.DeleteEntity(tx, tableName, e)
  263. if err != nil {
  264. return err
  265. }
  266. err = callbackAfterDBOperate(callbacks, e, tx)
  267. if err != nil {
  268. return err
  269. }
  270. return nil
  271. })
  272. if err != nil {
  273. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  274. }
  275. return callbackOnSuccessReturn(callbacks, e, dbExecutor, nil)
  276. }
  277. }
  278. func UpdateTx(tableName string, dbExecutor database.Executor, callbacks *Callbacks[any]) binding.ServiceFunc[any] {
  279. return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
  280. e, ok := objects[0].(domain.Entity)
  281. if !ok {
  282. return nil, fserr.New("需要传递领域对象应该为实体")
  283. }
  284. err := e.CheckID()
  285. if err != nil {
  286. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  287. }
  288. exist, err := database.CheckExist(dbExecutor, &sql.CheckExistExecuteParams{
  289. TableName: tableName,
  290. Conditions: sql.NewConditions().Equal(e.IDColumnName(), e.GetID()),
  291. })
  292. if err != nil {
  293. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  294. }
  295. if !exist {
  296. err := fserr.New(e.DomainCNName() + "不存在")
  297. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  298. }
  299. err = database.Transaction(dbExecutor, func(tx database.Executor) error {
  300. err = callbackBeforeDBOperate(callbacks, e, tx)
  301. if err != nil {
  302. return err
  303. }
  304. err = database.UpdateEntity(tx, tableName, e)
  305. if err != nil {
  306. return err
  307. }
  308. err = callbackAfterDBOperate(callbacks, e, tx)
  309. if err != nil {
  310. return err
  311. }
  312. return nil
  313. })
  314. if err != nil {
  315. return callbackOnErrorReturn(callbacks, e, err, dbExecutor, nil)
  316. }
  317. return callbackOnSuccessReturn(callbacks, e, dbExecutor, nil)
  318. }
  319. }