pagination.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. // Code generated by ent, DO NOT EDIT.
  2. package ent
  3. import (
  4. "context"
  5. "fmt"
  6. "wechat-api/ent/contact"
  7. "wechat-api/ent/label"
  8. "wechat-api/ent/labelrelationship"
  9. "wechat-api/ent/message"
  10. "wechat-api/ent/messagerecords"
  11. "wechat-api/ent/server"
  12. "wechat-api/ent/sopnode"
  13. "wechat-api/ent/sopstage"
  14. "wechat-api/ent/soptask"
  15. "wechat-api/ent/wx"
  16. )
  17. const errInvalidPage = "INVALID_PAGE"
  18. const (
  19. listField = "list"
  20. pageNumField = "pageNum"
  21. pageSizeField = "pageSize"
  22. )
  23. type PageDetails struct {
  24. Page uint64 `json:"page"`
  25. Size uint64 `json:"size"`
  26. Total uint64 `json:"total"`
  27. }
  28. // OrderDirection defines the directions in which to order a list of items.
  29. type OrderDirection string
  30. const (
  31. // OrderDirectionAsc specifies an ascending order.
  32. OrderDirectionAsc OrderDirection = "ASC"
  33. // OrderDirectionDesc specifies a descending order.
  34. OrderDirectionDesc OrderDirection = "DESC"
  35. )
  36. // Validate the order direction value.
  37. func (o OrderDirection) Validate() error {
  38. if o != OrderDirectionAsc && o != OrderDirectionDesc {
  39. return fmt.Errorf("%s is not a valid OrderDirection", o)
  40. }
  41. return nil
  42. }
  43. // String implements fmt.Stringer interface.
  44. func (o OrderDirection) String() string {
  45. return string(o)
  46. }
  47. func (o OrderDirection) reverse() OrderDirection {
  48. if o == OrderDirectionDesc {
  49. return OrderDirectionAsc
  50. }
  51. return OrderDirectionDesc
  52. }
  53. const errInvalidPagination = "INVALID_PAGINATION"
  54. type ContactPager struct {
  55. Order contact.OrderOption
  56. Filter func(*ContactQuery) (*ContactQuery, error)
  57. }
  58. // ContactPaginateOption enables pagination customization.
  59. type ContactPaginateOption func(*ContactPager)
  60. // DefaultContactOrder is the default ordering of Contact.
  61. var DefaultContactOrder = Desc(contact.FieldID)
  62. func newContactPager(opts []ContactPaginateOption) (*ContactPager, error) {
  63. pager := &ContactPager{}
  64. for _, opt := range opts {
  65. opt(pager)
  66. }
  67. if pager.Order == nil {
  68. pager.Order = DefaultContactOrder
  69. }
  70. return pager, nil
  71. }
  72. func (p *ContactPager) ApplyFilter(query *ContactQuery) (*ContactQuery, error) {
  73. if p.Filter != nil {
  74. return p.Filter(query)
  75. }
  76. return query, nil
  77. }
  78. // ContactPageList is Contact PageList result.
  79. type ContactPageList struct {
  80. List []*Contact `json:"list"`
  81. PageDetails *PageDetails `json:"pageDetails"`
  82. }
  83. func (c *ContactQuery) Page(
  84. ctx context.Context, pageNum uint64, pageSize uint64, opts ...ContactPaginateOption,
  85. ) (*ContactPageList, error) {
  86. pager, err := newContactPager(opts)
  87. if err != nil {
  88. return nil, err
  89. }
  90. if c, err = pager.ApplyFilter(c); err != nil {
  91. return nil, err
  92. }
  93. ret := &ContactPageList{}
  94. ret.PageDetails = &PageDetails{
  95. Page: pageNum,
  96. Size: pageSize,
  97. }
  98. query := c.Clone()
  99. query.ctx.Fields = nil
  100. count, err := query.Count(ctx)
  101. if err != nil {
  102. return nil, err
  103. }
  104. ret.PageDetails.Total = uint64(count)
  105. if pager.Order != nil {
  106. c = c.Order(pager.Order)
  107. } else {
  108. c = c.Order(DefaultContactOrder)
  109. }
  110. c = c.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  111. list, err := c.All(ctx)
  112. if err != nil {
  113. return nil, err
  114. }
  115. ret.List = list
  116. return ret, nil
  117. }
  118. type LabelPager struct {
  119. Order label.OrderOption
  120. Filter func(*LabelQuery) (*LabelQuery, error)
  121. }
  122. // LabelPaginateOption enables pagination customization.
  123. type LabelPaginateOption func(*LabelPager)
  124. // DefaultLabelOrder is the default ordering of Label.
  125. var DefaultLabelOrder = Desc(label.FieldID)
  126. func newLabelPager(opts []LabelPaginateOption) (*LabelPager, error) {
  127. pager := &LabelPager{}
  128. for _, opt := range opts {
  129. opt(pager)
  130. }
  131. if pager.Order == nil {
  132. pager.Order = DefaultLabelOrder
  133. }
  134. return pager, nil
  135. }
  136. func (p *LabelPager) ApplyFilter(query *LabelQuery) (*LabelQuery, error) {
  137. if p.Filter != nil {
  138. return p.Filter(query)
  139. }
  140. return query, nil
  141. }
  142. // LabelPageList is Label PageList result.
  143. type LabelPageList struct {
  144. List []*Label `json:"list"`
  145. PageDetails *PageDetails `json:"pageDetails"`
  146. }
  147. func (l *LabelQuery) Page(
  148. ctx context.Context, pageNum uint64, pageSize uint64, opts ...LabelPaginateOption,
  149. ) (*LabelPageList, error) {
  150. pager, err := newLabelPager(opts)
  151. if err != nil {
  152. return nil, err
  153. }
  154. if l, err = pager.ApplyFilter(l); err != nil {
  155. return nil, err
  156. }
  157. ret := &LabelPageList{}
  158. ret.PageDetails = &PageDetails{
  159. Page: pageNum,
  160. Size: pageSize,
  161. }
  162. query := l.Clone()
  163. query.ctx.Fields = nil
  164. count, err := query.Count(ctx)
  165. if err != nil {
  166. return nil, err
  167. }
  168. ret.PageDetails.Total = uint64(count)
  169. if pager.Order != nil {
  170. l = l.Order(pager.Order)
  171. } else {
  172. l = l.Order(DefaultLabelOrder)
  173. }
  174. l = l.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  175. list, err := l.All(ctx)
  176. if err != nil {
  177. return nil, err
  178. }
  179. ret.List = list
  180. return ret, nil
  181. }
  182. type LabelRelationshipPager struct {
  183. Order labelrelationship.OrderOption
  184. Filter func(*LabelRelationshipQuery) (*LabelRelationshipQuery, error)
  185. }
  186. // LabelRelationshipPaginateOption enables pagination customization.
  187. type LabelRelationshipPaginateOption func(*LabelRelationshipPager)
  188. // DefaultLabelRelationshipOrder is the default ordering of LabelRelationship.
  189. var DefaultLabelRelationshipOrder = Desc(labelrelationship.FieldID)
  190. func newLabelRelationshipPager(opts []LabelRelationshipPaginateOption) (*LabelRelationshipPager, error) {
  191. pager := &LabelRelationshipPager{}
  192. for _, opt := range opts {
  193. opt(pager)
  194. }
  195. if pager.Order == nil {
  196. pager.Order = DefaultLabelRelationshipOrder
  197. }
  198. return pager, nil
  199. }
  200. func (p *LabelRelationshipPager) ApplyFilter(query *LabelRelationshipQuery) (*LabelRelationshipQuery, error) {
  201. if p.Filter != nil {
  202. return p.Filter(query)
  203. }
  204. return query, nil
  205. }
  206. // LabelRelationshipPageList is LabelRelationship PageList result.
  207. type LabelRelationshipPageList struct {
  208. List []*LabelRelationship `json:"list"`
  209. PageDetails *PageDetails `json:"pageDetails"`
  210. }
  211. func (lr *LabelRelationshipQuery) Page(
  212. ctx context.Context, pageNum uint64, pageSize uint64, opts ...LabelRelationshipPaginateOption,
  213. ) (*LabelRelationshipPageList, error) {
  214. pager, err := newLabelRelationshipPager(opts)
  215. if err != nil {
  216. return nil, err
  217. }
  218. if lr, err = pager.ApplyFilter(lr); err != nil {
  219. return nil, err
  220. }
  221. ret := &LabelRelationshipPageList{}
  222. ret.PageDetails = &PageDetails{
  223. Page: pageNum,
  224. Size: pageSize,
  225. }
  226. query := lr.Clone()
  227. query.ctx.Fields = nil
  228. count, err := query.Count(ctx)
  229. if err != nil {
  230. return nil, err
  231. }
  232. ret.PageDetails.Total = uint64(count)
  233. if pager.Order != nil {
  234. lr = lr.Order(pager.Order)
  235. } else {
  236. lr = lr.Order(DefaultLabelRelationshipOrder)
  237. }
  238. lr = lr.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  239. list, err := lr.All(ctx)
  240. if err != nil {
  241. return nil, err
  242. }
  243. ret.List = list
  244. return ret, nil
  245. }
  246. type MessagePager struct {
  247. Order message.OrderOption
  248. Filter func(*MessageQuery) (*MessageQuery, error)
  249. }
  250. // MessagePaginateOption enables pagination customization.
  251. type MessagePaginateOption func(*MessagePager)
  252. // DefaultMessageOrder is the default ordering of Message.
  253. var DefaultMessageOrder = Desc(message.FieldID)
  254. func newMessagePager(opts []MessagePaginateOption) (*MessagePager, error) {
  255. pager := &MessagePager{}
  256. for _, opt := range opts {
  257. opt(pager)
  258. }
  259. if pager.Order == nil {
  260. pager.Order = DefaultMessageOrder
  261. }
  262. return pager, nil
  263. }
  264. func (p *MessagePager) ApplyFilter(query *MessageQuery) (*MessageQuery, error) {
  265. if p.Filter != nil {
  266. return p.Filter(query)
  267. }
  268. return query, nil
  269. }
  270. // MessagePageList is Message PageList result.
  271. type MessagePageList struct {
  272. List []*Message `json:"list"`
  273. PageDetails *PageDetails `json:"pageDetails"`
  274. }
  275. func (m *MessageQuery) Page(
  276. ctx context.Context, pageNum uint64, pageSize uint64, opts ...MessagePaginateOption,
  277. ) (*MessagePageList, error) {
  278. pager, err := newMessagePager(opts)
  279. if err != nil {
  280. return nil, err
  281. }
  282. if m, err = pager.ApplyFilter(m); err != nil {
  283. return nil, err
  284. }
  285. ret := &MessagePageList{}
  286. ret.PageDetails = &PageDetails{
  287. Page: pageNum,
  288. Size: pageSize,
  289. }
  290. query := m.Clone()
  291. query.ctx.Fields = nil
  292. count, err := query.Count(ctx)
  293. if err != nil {
  294. return nil, err
  295. }
  296. ret.PageDetails.Total = uint64(count)
  297. if pager.Order != nil {
  298. m = m.Order(pager.Order)
  299. } else {
  300. m = m.Order(DefaultMessageOrder)
  301. }
  302. m = m.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  303. list, err := m.All(ctx)
  304. if err != nil {
  305. return nil, err
  306. }
  307. ret.List = list
  308. return ret, nil
  309. }
  310. type MessageRecordsPager struct {
  311. Order messagerecords.OrderOption
  312. Filter func(*MessageRecordsQuery) (*MessageRecordsQuery, error)
  313. }
  314. // MessageRecordsPaginateOption enables pagination customization.
  315. type MessageRecordsPaginateOption func(*MessageRecordsPager)
  316. // DefaultMessageRecordsOrder is the default ordering of MessageRecords.
  317. var DefaultMessageRecordsOrder = Desc(messagerecords.FieldID)
  318. func newMessageRecordsPager(opts []MessageRecordsPaginateOption) (*MessageRecordsPager, error) {
  319. pager := &MessageRecordsPager{}
  320. for _, opt := range opts {
  321. opt(pager)
  322. }
  323. if pager.Order == nil {
  324. pager.Order = DefaultMessageRecordsOrder
  325. }
  326. return pager, nil
  327. }
  328. func (p *MessageRecordsPager) ApplyFilter(query *MessageRecordsQuery) (*MessageRecordsQuery, error) {
  329. if p.Filter != nil {
  330. return p.Filter(query)
  331. }
  332. return query, nil
  333. }
  334. // MessageRecordsPageList is MessageRecords PageList result.
  335. type MessageRecordsPageList struct {
  336. List []*MessageRecords `json:"list"`
  337. PageDetails *PageDetails `json:"pageDetails"`
  338. }
  339. func (mr *MessageRecordsQuery) Page(
  340. ctx context.Context, pageNum uint64, pageSize uint64, opts ...MessageRecordsPaginateOption,
  341. ) (*MessageRecordsPageList, error) {
  342. pager, err := newMessageRecordsPager(opts)
  343. if err != nil {
  344. return nil, err
  345. }
  346. if mr, err = pager.ApplyFilter(mr); err != nil {
  347. return nil, err
  348. }
  349. ret := &MessageRecordsPageList{}
  350. ret.PageDetails = &PageDetails{
  351. Page: pageNum,
  352. Size: pageSize,
  353. }
  354. query := mr.Clone()
  355. query.ctx.Fields = nil
  356. count, err := query.Count(ctx)
  357. if err != nil {
  358. return nil, err
  359. }
  360. ret.PageDetails.Total = uint64(count)
  361. if pager.Order != nil {
  362. mr = mr.Order(pager.Order)
  363. } else {
  364. mr = mr.Order(DefaultMessageRecordsOrder)
  365. }
  366. mr = mr.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  367. list, err := mr.All(ctx)
  368. if err != nil {
  369. return nil, err
  370. }
  371. ret.List = list
  372. return ret, nil
  373. }
  374. type ServerPager struct {
  375. Order server.OrderOption
  376. Filter func(*ServerQuery) (*ServerQuery, error)
  377. }
  378. // ServerPaginateOption enables pagination customization.
  379. type ServerPaginateOption func(*ServerPager)
  380. // DefaultServerOrder is the default ordering of Server.
  381. var DefaultServerOrder = Desc(server.FieldID)
  382. func newServerPager(opts []ServerPaginateOption) (*ServerPager, error) {
  383. pager := &ServerPager{}
  384. for _, opt := range opts {
  385. opt(pager)
  386. }
  387. if pager.Order == nil {
  388. pager.Order = DefaultServerOrder
  389. }
  390. return pager, nil
  391. }
  392. func (p *ServerPager) ApplyFilter(query *ServerQuery) (*ServerQuery, error) {
  393. if p.Filter != nil {
  394. return p.Filter(query)
  395. }
  396. return query, nil
  397. }
  398. // ServerPageList is Server PageList result.
  399. type ServerPageList struct {
  400. List []*Server `json:"list"`
  401. PageDetails *PageDetails `json:"pageDetails"`
  402. }
  403. func (s *ServerQuery) Page(
  404. ctx context.Context, pageNum uint64, pageSize uint64, opts ...ServerPaginateOption,
  405. ) (*ServerPageList, error) {
  406. pager, err := newServerPager(opts)
  407. if err != nil {
  408. return nil, err
  409. }
  410. if s, err = pager.ApplyFilter(s); err != nil {
  411. return nil, err
  412. }
  413. ret := &ServerPageList{}
  414. ret.PageDetails = &PageDetails{
  415. Page: pageNum,
  416. Size: pageSize,
  417. }
  418. query := s.Clone()
  419. query.ctx.Fields = nil
  420. count, err := query.Count(ctx)
  421. if err != nil {
  422. return nil, err
  423. }
  424. ret.PageDetails.Total = uint64(count)
  425. if pager.Order != nil {
  426. s = s.Order(pager.Order)
  427. } else {
  428. s = s.Order(DefaultServerOrder)
  429. }
  430. s = s.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  431. list, err := s.All(ctx)
  432. if err != nil {
  433. return nil, err
  434. }
  435. ret.List = list
  436. return ret, nil
  437. }
  438. type SopNodePager struct {
  439. Order sopnode.OrderOption
  440. Filter func(*SopNodeQuery) (*SopNodeQuery, error)
  441. }
  442. // SopNodePaginateOption enables pagination customization.
  443. type SopNodePaginateOption func(*SopNodePager)
  444. // DefaultSopNodeOrder is the default ordering of SopNode.
  445. var DefaultSopNodeOrder = Desc(sopnode.FieldID)
  446. func newSopNodePager(opts []SopNodePaginateOption) (*SopNodePager, error) {
  447. pager := &SopNodePager{}
  448. for _, opt := range opts {
  449. opt(pager)
  450. }
  451. if pager.Order == nil {
  452. pager.Order = DefaultSopNodeOrder
  453. }
  454. return pager, nil
  455. }
  456. func (p *SopNodePager) ApplyFilter(query *SopNodeQuery) (*SopNodeQuery, error) {
  457. if p.Filter != nil {
  458. return p.Filter(query)
  459. }
  460. return query, nil
  461. }
  462. // SopNodePageList is SopNode PageList result.
  463. type SopNodePageList struct {
  464. List []*SopNode `json:"list"`
  465. PageDetails *PageDetails `json:"pageDetails"`
  466. }
  467. func (sn *SopNodeQuery) Page(
  468. ctx context.Context, pageNum uint64, pageSize uint64, opts ...SopNodePaginateOption,
  469. ) (*SopNodePageList, error) {
  470. pager, err := newSopNodePager(opts)
  471. if err != nil {
  472. return nil, err
  473. }
  474. if sn, err = pager.ApplyFilter(sn); err != nil {
  475. return nil, err
  476. }
  477. ret := &SopNodePageList{}
  478. ret.PageDetails = &PageDetails{
  479. Page: pageNum,
  480. Size: pageSize,
  481. }
  482. query := sn.Clone()
  483. query.ctx.Fields = nil
  484. count, err := query.Count(ctx)
  485. if err != nil {
  486. return nil, err
  487. }
  488. ret.PageDetails.Total = uint64(count)
  489. if pager.Order != nil {
  490. sn = sn.Order(pager.Order)
  491. } else {
  492. sn = sn.Order(DefaultSopNodeOrder)
  493. }
  494. sn = sn.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  495. list, err := sn.All(ctx)
  496. if err != nil {
  497. return nil, err
  498. }
  499. ret.List = list
  500. return ret, nil
  501. }
  502. type SopStagePager struct {
  503. Order sopstage.OrderOption
  504. Filter func(*SopStageQuery) (*SopStageQuery, error)
  505. }
  506. // SopStagePaginateOption enables pagination customization.
  507. type SopStagePaginateOption func(*SopStagePager)
  508. // DefaultSopStageOrder is the default ordering of SopStage.
  509. var DefaultSopStageOrder = Desc(sopstage.FieldID)
  510. func newSopStagePager(opts []SopStagePaginateOption) (*SopStagePager, error) {
  511. pager := &SopStagePager{}
  512. for _, opt := range opts {
  513. opt(pager)
  514. }
  515. if pager.Order == nil {
  516. pager.Order = DefaultSopStageOrder
  517. }
  518. return pager, nil
  519. }
  520. func (p *SopStagePager) ApplyFilter(query *SopStageQuery) (*SopStageQuery, error) {
  521. if p.Filter != nil {
  522. return p.Filter(query)
  523. }
  524. return query, nil
  525. }
  526. // SopStagePageList is SopStage PageList result.
  527. type SopStagePageList struct {
  528. List []*SopStage `json:"list"`
  529. PageDetails *PageDetails `json:"pageDetails"`
  530. }
  531. func (ss *SopStageQuery) Page(
  532. ctx context.Context, pageNum uint64, pageSize uint64, opts ...SopStagePaginateOption,
  533. ) (*SopStagePageList, error) {
  534. pager, err := newSopStagePager(opts)
  535. if err != nil {
  536. return nil, err
  537. }
  538. if ss, err = pager.ApplyFilter(ss); err != nil {
  539. return nil, err
  540. }
  541. ret := &SopStagePageList{}
  542. ret.PageDetails = &PageDetails{
  543. Page: pageNum,
  544. Size: pageSize,
  545. }
  546. query := ss.Clone()
  547. query.ctx.Fields = nil
  548. count, err := query.Count(ctx)
  549. if err != nil {
  550. return nil, err
  551. }
  552. ret.PageDetails.Total = uint64(count)
  553. if pager.Order != nil {
  554. ss = ss.Order(pager.Order)
  555. } else {
  556. ss = ss.Order(DefaultSopStageOrder)
  557. }
  558. ss = ss.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  559. list, err := ss.All(ctx)
  560. if err != nil {
  561. return nil, err
  562. }
  563. ret.List = list
  564. return ret, nil
  565. }
  566. type SopTaskPager struct {
  567. Order soptask.OrderOption
  568. Filter func(*SopTaskQuery) (*SopTaskQuery, error)
  569. }
  570. // SopTaskPaginateOption enables pagination customization.
  571. type SopTaskPaginateOption func(*SopTaskPager)
  572. // DefaultSopTaskOrder is the default ordering of SopTask.
  573. var DefaultSopTaskOrder = Desc(soptask.FieldID)
  574. func newSopTaskPager(opts []SopTaskPaginateOption) (*SopTaskPager, error) {
  575. pager := &SopTaskPager{}
  576. for _, opt := range opts {
  577. opt(pager)
  578. }
  579. if pager.Order == nil {
  580. pager.Order = DefaultSopTaskOrder
  581. }
  582. return pager, nil
  583. }
  584. func (p *SopTaskPager) ApplyFilter(query *SopTaskQuery) (*SopTaskQuery, error) {
  585. if p.Filter != nil {
  586. return p.Filter(query)
  587. }
  588. return query, nil
  589. }
  590. // SopTaskPageList is SopTask PageList result.
  591. type SopTaskPageList struct {
  592. List []*SopTask `json:"list"`
  593. PageDetails *PageDetails `json:"pageDetails"`
  594. }
  595. func (st *SopTaskQuery) Page(
  596. ctx context.Context, pageNum uint64, pageSize uint64, opts ...SopTaskPaginateOption,
  597. ) (*SopTaskPageList, error) {
  598. pager, err := newSopTaskPager(opts)
  599. if err != nil {
  600. return nil, err
  601. }
  602. if st, err = pager.ApplyFilter(st); err != nil {
  603. return nil, err
  604. }
  605. ret := &SopTaskPageList{}
  606. ret.PageDetails = &PageDetails{
  607. Page: pageNum,
  608. Size: pageSize,
  609. }
  610. query := st.Clone()
  611. query.ctx.Fields = nil
  612. count, err := query.Count(ctx)
  613. if err != nil {
  614. return nil, err
  615. }
  616. ret.PageDetails.Total = uint64(count)
  617. if pager.Order != nil {
  618. st = st.Order(pager.Order)
  619. } else {
  620. st = st.Order(DefaultSopTaskOrder)
  621. }
  622. st = st.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  623. list, err := st.All(ctx)
  624. if err != nil {
  625. return nil, err
  626. }
  627. ret.List = list
  628. return ret, nil
  629. }
  630. type WxPager struct {
  631. Order wx.OrderOption
  632. Filter func(*WxQuery) (*WxQuery, error)
  633. }
  634. // WxPaginateOption enables pagination customization.
  635. type WxPaginateOption func(*WxPager)
  636. // DefaultWxOrder is the default ordering of Wx.
  637. var DefaultWxOrder = Desc(wx.FieldID)
  638. func newWxPager(opts []WxPaginateOption) (*WxPager, error) {
  639. pager := &WxPager{}
  640. for _, opt := range opts {
  641. opt(pager)
  642. }
  643. if pager.Order == nil {
  644. pager.Order = DefaultWxOrder
  645. }
  646. return pager, nil
  647. }
  648. func (p *WxPager) ApplyFilter(query *WxQuery) (*WxQuery, error) {
  649. if p.Filter != nil {
  650. return p.Filter(query)
  651. }
  652. return query, nil
  653. }
  654. // WxPageList is Wx PageList result.
  655. type WxPageList struct {
  656. List []*Wx `json:"list"`
  657. PageDetails *PageDetails `json:"pageDetails"`
  658. }
  659. func (w *WxQuery) Page(
  660. ctx context.Context, pageNum uint64, pageSize uint64, opts ...WxPaginateOption,
  661. ) (*WxPageList, error) {
  662. pager, err := newWxPager(opts)
  663. if err != nil {
  664. return nil, err
  665. }
  666. if w, err = pager.ApplyFilter(w); err != nil {
  667. return nil, err
  668. }
  669. ret := &WxPageList{}
  670. ret.PageDetails = &PageDetails{
  671. Page: pageNum,
  672. Size: pageSize,
  673. }
  674. query := w.Clone()
  675. query.ctx.Fields = nil
  676. count, err := query.Count(ctx)
  677. if err != nil {
  678. return nil, err
  679. }
  680. ret.PageDetails.Total = uint64(count)
  681. if pager.Order != nil {
  682. w = w.Order(pager.Order)
  683. } else {
  684. w = w.Order(DefaultWxOrder)
  685. }
  686. w = w.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  687. list, err := w.All(ctx)
  688. if err != nil {
  689. return nil, err
  690. }
  691. ret.List = list
  692. return ret, nil
  693. }