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

repo.go 4.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package tech
  2. import (
  3. "code.gitea.io/gitea/models"
  4. "code.gitea.io/gitea/modules/auth"
  5. "code.gitea.io/gitea/modules/context"
  6. api "code.gitea.io/gitea/modules/structs"
  7. "code.gitea.io/gitea/routers/response"
  8. "code.gitea.io/gitea/services/repository"
  9. techService "code.gitea.io/gitea/services/tech"
  10. "errors"
  11. "fmt"
  12. "net/http"
  13. )
  14. //CommitOpenIRepo 新建启智项目申请页面提交
  15. func CommitOpenIRepo(ctx *context.APIContext, form api.OpenITechRepo) {
  16. //解析项目路径,查找项目
  17. repo, err := repository.FindRepoByUrl(form.Url)
  18. if err != nil {
  19. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr(err.Error())))
  20. return
  21. }
  22. //查找项目编号
  23. tech, err := models.GetTechByTechNo(form.TechNo)
  24. if err != nil {
  25. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr(err.Error())))
  26. return
  27. }
  28. //判断承接单位是否在科技项目的参与单位中
  29. if !tech.IsValidInstitution(form.Institution) {
  30. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr("tech.institution_not_valid")))
  31. return
  32. }
  33. //判断是否已经存在了该项目
  34. exist, err := techService.IsValidRepoConvergeExists(repo.ID, tech.ID)
  35. if err != nil {
  36. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr(err.Error())))
  37. return
  38. }
  39. if exist {
  40. ctx.JSON(http.StatusOK, response.OuterServerError(fmt.Sprintf(ctx.Tr("tech.repo_converge_exists"), tech.ProjectName, repo.Alias)))
  41. return
  42. }
  43. //写入数据库
  44. rci := &models.RepoConvergeInfo{
  45. RepoID: repo.ID,
  46. Url: form.Url,
  47. BaseInfoID: tech.ID,
  48. Institution: form.Institution,
  49. UID: ctx.User.ID,
  50. Status: models.DefaultTechApprovedStatus,
  51. }
  52. err = rci.InsertOrUpdate()
  53. if err != nil {
  54. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr(err.Error())))
  55. return
  56. }
  57. ctx.JSON(http.StatusOK, response.OuterSuccess())
  58. }
  59. //CommitNotOpenIRepo 新建非启智项目申请页面提交
  60. func CommitNotOpenIRepo(ctx *context.APIContext, form api.NotOpenITechRepo) {
  61. //触发更新迁移状态
  62. go techService.UpdateTechMigrateStatus()
  63. //查找项目编号
  64. tech, err := models.GetTechByTechNo(form.TechNo)
  65. if err != nil {
  66. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr(err.Error())))
  67. return
  68. }
  69. //判断承接单位是否在科技项目的参与单位中
  70. if !tech.IsValidInstitution(form.Institution) {
  71. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr("tech.institution_not_valid")))
  72. return
  73. }
  74. //调用迁移接口
  75. bizErr := repository.MigrateSubmit(ctx.User, auth.MigrateRepoForm{
  76. CloneAddr: form.Url,
  77. UID: form.UID,
  78. RepoName: form.RepoName,
  79. Alias: form.Alias,
  80. Description: form.Description,
  81. Labels: false,
  82. Mirror: true,
  83. })
  84. if bizErr != nil {
  85. if bizErr.Code == 3 {
  86. ctx.JSON(http.StatusOK, response.OuterError(bizErr.Code, ctx.Tr("tech.to_migrate_repo_exists")))
  87. return
  88. }
  89. ctx.JSON(http.StatusOK, response.OuterError(bizErr.Code, ctx.Tr(bizErr.Err)))
  90. return
  91. }
  92. repo, err := models.GetRepositoryByName(form.UID, form.RepoName)
  93. if err != nil {
  94. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr(err.Error())))
  95. return
  96. }
  97. //判断是否已经存在了该项目
  98. exist, err := techService.IsValidRepoConvergeExists(repo.ID, tech.ID)
  99. if err != nil {
  100. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr(err.Error())))
  101. return
  102. }
  103. if exist {
  104. ctx.JSON(http.StatusOK, response.OuterServerError(fmt.Sprintf(ctx.Tr("tech.repo_converge_exists"), tech.ProjectName, repo.Alias)))
  105. return
  106. }
  107. //给仓库加标签
  108. updateTopics(repo.ID, form.Topics)
  109. //写入数据库
  110. rci := &models.RepoConvergeInfo{
  111. RepoID: repo.ID,
  112. Url: form.Url,
  113. BaseInfoID: tech.ID,
  114. Institution: form.Institution,
  115. UID: ctx.User.ID,
  116. Status: models.DefaultTechApprovedStatus,
  117. }
  118. err = rci.InsertOrUpdate()
  119. if err != nil {
  120. ctx.JSON(http.StatusOK, response.OuterServerError(ctx.Tr(err.Error())))
  121. return
  122. }
  123. ctx.JSON(http.StatusOK, response.OuterSuccess())
  124. }
  125. func updateTopics(repoId int64, topicNames []string) error {
  126. validTopics, invalidTopics := models.SanitizeAndValidateTopics(topicNames)
  127. if len(validTopics) > 25 {
  128. return errors.New("Exceeding maximum number of topics per repo")
  129. }
  130. if len(invalidTopics) > 0 {
  131. return errors.New("Topic names are invalid")
  132. }
  133. err := models.SaveTopics(repoId, validTopics...)
  134. if err != nil {
  135. return err
  136. }
  137. return nil
  138. }