student.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package service
  2. import (
  3. "baize-demo/project/server/application/domain/student"
  4. "fmt"
  5. "git.sxidc.com/go-framework/baize/convenient/domain/query_rule"
  6. "git.sxidc.com/go-framework/baize/convenient/domain/query_rule/rule"
  7. "git.sxidc.com/go-framework/baize/convenient/entity_crud"
  8. "git.sxidc.com/go-framework/baize/framework/binding"
  9. "git.sxidc.com/go-framework/baize/framework/core/api"
  10. "git.sxidc.com/go-framework/baize/framework/core/api/request"
  11. "git.sxidc.com/go-framework/baize/framework/core/api/response"
  12. "git.sxidc.com/go-framework/baize/framework/core/application"
  13. "git.sxidc.com/go-framework/baize/framework/core/domain"
  14. "git.sxidc.com/go-framework/baize/framework/core/infrastructure"
  15. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/database"
  16. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/database/clause"
  17. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/database/sql"
  18. )
  19. var studentService = &StudentService{}
  20. type StudentService struct{}
  21. func (svc *StudentService) Init(appInstance *application.App) error {
  22. err := student.RegisterQueryRule()
  23. if err != nil {
  24. return err
  25. }
  26. svc.v1(appInstance)
  27. return nil
  28. }
  29. func (svc *StudentService) Destroy() error {
  30. return nil
  31. }
  32. func (svc *StudentService) v1(appInstance *application.App) {
  33. v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), appInstance.Infrastructure())
  34. entity_crud.BindSimple[student.Info](v1Binder, &entity_crud.Simple[student.Info]{
  35. Entity: &student.Entity{},
  36. Schema: dbSchema,
  37. CreateJsonBody: &student.CreateStudentJsonBody{},
  38. DeleteQueryParams: &student.DeleteStudentQueryParams{},
  39. UpdateJsonBody: &student.UpdateStudentJsonBody{},
  40. GetByIDQueryParams: &student.GetStudentByIDQueryParams{},
  41. }, entity_crud.WithDisableQuery[student.Info]())
  42. binding.GetBind(v1Binder, &binding.SimpleBindItem[response.InfosData[student.Info]]{
  43. Path: "/student/query",
  44. SendResponseFunc: response.SendInfosResponse[student.Info],
  45. RequestParams: &student.GetStudentsQueryParams{},
  46. Objects: []domain.Object{&student.Entity{}},
  47. ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (response.InfosData[student.Info], error) {
  48. errResponse := response.InfosData[student.Info]{
  49. Infos: make([]student.Info, 0),
  50. }
  51. queryParams, err := request.ToConcrete[*student.GetStudentsQueryParams](params)
  52. if err != nil {
  53. return errResponse, err
  54. }
  55. e, err := domain.ToConcrete[*student.Entity](objects[0])
  56. if err != nil {
  57. return errResponse, err
  58. }
  59. hasRule, err := rule.HasRule(dbSchema, "global", e.DomainCamelName(), i)
  60. if err != nil {
  61. return errResponse, err
  62. }
  63. if !hasRule {
  64. queryFunc := entity_crud.Query[student.Info](domain.TableName(dbSchema, e), "", nil, nil, nil)
  65. return queryFunc(c, params, objects, i)
  66. }
  67. conditionClause, err := rule.FormConditionClause(dbSchema, "global", e.DomainCamelName(), i, e.FormQueryRuleParams())
  68. if err != nil {
  69. return errResponse, err
  70. }
  71. selectClause := clause.NewSelect(
  72. nil,
  73. clause.NewFrom([]clause.Clause{clause.TableName(domain.TableName(dbSchema, e))}),
  74. clause.NewWhere(conditionClause),
  75. clause.NewLimit(queryParams.PageNo, queryParams.PageSize))
  76. selectClauseStr, err := selectClause.Clause()
  77. if err != nil {
  78. return errResponse, err
  79. }
  80. results, err := database.ExecuteRawSql(i.DBExecutor(), selectClauseStr, selectClause.Args()...)
  81. if err != nil {
  82. return errResponse, err
  83. }
  84. countClause := clause.NewSelect(
  85. []string{"COUNT(*) AS total"},
  86. clause.NewFrom([]clause.Clause{clause.TableName(domain.TableName(dbSchema, e))}),
  87. clause.NewWhere(conditionClause))
  88. countClauseStr, err := countClause.Clause()
  89. if err != nil {
  90. return errResponse, err
  91. }
  92. countResults, err := database.ExecuteRawSql(i.DBExecutor(), countClauseStr, countClause.Args()...)
  93. if err != nil {
  94. return errResponse, err
  95. }
  96. infos := make([]student.Info, 0)
  97. err = sql.ParseSqlResult(results, &infos)
  98. if err != nil {
  99. return errResponse, err
  100. }
  101. return response.InfosData[student.Info]{
  102. Infos: infos,
  103. TotalCount: countResults[0].ColumnValueInt64("total"),
  104. PageNo: queryParams.PageNo,
  105. }, nil
  106. },
  107. })
  108. query_rule.AddUseQueryRuleQueryRoute[student.Info](v1Binder, &query_rule.AddUseQueryRuleQueryRouteParams{
  109. DBSchema: dbSchema,
  110. Object: &student.Entity{},
  111. QueryMiddlewares: []binding.Middleware{
  112. func(c *api.Context, i *infrastructure.Infrastructure) {
  113. fmt.Println("In Advanced Query")
  114. },
  115. },
  116. })
  117. }