gitea源码

v293.go 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_22
  4. import (
  5. "code.gitea.io/gitea/modules/setting"
  6. "code.gitea.io/gitea/modules/timeutil"
  7. "xorm.io/xorm"
  8. )
  9. // CheckProjectColumnsConsistency ensures there is exactly one default board per project present
  10. func CheckProjectColumnsConsistency(x *xorm.Engine) error {
  11. sess := x.NewSession()
  12. defer sess.Close()
  13. limit := setting.Database.IterateBufferSize
  14. if limit <= 0 {
  15. limit = 50
  16. }
  17. type Project struct {
  18. ID int64
  19. CreatorID int64
  20. BoardID int64
  21. }
  22. type ProjectBoard struct {
  23. ID int64 `xorm:"pk autoincr"`
  24. Title string
  25. Default bool `xorm:"NOT NULL DEFAULT false"` // issues not assigned to a specific board will be assigned to this board
  26. Sorting int8 `xorm:"NOT NULL DEFAULT 0"`
  27. Color string `xorm:"VARCHAR(7)"`
  28. ProjectID int64 `xorm:"INDEX NOT NULL"`
  29. CreatorID int64 `xorm:"NOT NULL"`
  30. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  31. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  32. }
  33. for {
  34. if err := sess.Begin(); err != nil {
  35. return err
  36. }
  37. // all these projects without defaults will be fixed in the same loop, so
  38. // we just need to always get projects without defaults until no such project
  39. var projects []*Project
  40. if err := sess.Select("project.id as id, project.creator_id, project_board.id as board_id").
  41. Join("LEFT", "project_board", "project_board.project_id = project.id AND project_board.`default`=?", true).
  42. Where("project_board.id is NULL OR project_board.id = 0").
  43. Limit(limit).
  44. Find(&projects); err != nil {
  45. return err
  46. }
  47. for _, p := range projects {
  48. if _, err := sess.Insert(ProjectBoard{
  49. ProjectID: p.ID,
  50. Default: true,
  51. Title: "Uncategorized",
  52. CreatorID: p.CreatorID,
  53. }); err != nil {
  54. return err
  55. }
  56. }
  57. if err := sess.Commit(); err != nil {
  58. return err
  59. }
  60. if len(projects) == 0 {
  61. break
  62. }
  63. }
  64. sess.Close()
  65. return removeDuplicatedBoardDefault(x)
  66. }
  67. func removeDuplicatedBoardDefault(x *xorm.Engine) error {
  68. type ProjectInfo struct {
  69. ProjectID int64
  70. DefaultNum int
  71. }
  72. var projects []ProjectInfo
  73. if err := x.Select("project_id, count(*) AS default_num").
  74. Table("project_board").
  75. Where("`default` = ?", true).
  76. GroupBy("project_id").
  77. Having("count(*) > 1").
  78. Find(&projects); err != nil {
  79. return err
  80. }
  81. for _, project := range projects {
  82. if _, err := x.Where("project_id=?", project.ProjectID).
  83. Table("project_board").
  84. Limit(project.DefaultNum - 1).
  85. Update(map[string]bool{
  86. "`default`": false,
  87. }); err != nil {
  88. return err
  89. }
  90. }
  91. return nil
  92. }