From 73c4d22fdd033497ff8754a0d9b7a1693a118501 Mon Sep 17 00:00:00 2001 From: chenyifan01 Date: Sun, 29 Jan 2023 17:28:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E5=90=AF=E6=99=BA=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=94=B3=E8=AF=B7=E9=A1=B5=E9=9D=A2=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/tech_converge_info.go | 30 ++++++++++++++++++++++++++++++ modules/structs/tech.go | 11 +++++++++++ routers/api/v1/api.go | 2 +- routers/api/v1/tech/repo.go | 35 ++++++++++++++++++++++++++++++++++- services/repository/url.go | 40 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 modules/structs/tech.go create mode 100644 services/repository/url.go diff --git a/models/tech_converge_info.go b/models/tech_converge_info.go index a4e19f7c4..87dc85ecb 100644 --- a/models/tech_converge_info.go +++ b/models/tech_converge_info.go @@ -8,6 +8,14 @@ import ( "xorm.io/builder" ) +const ( + TechHide = 1 + TechShow = 2 + TechMigrateFailed = 3 +) + +const DefaultTechStatus = 2 + type TechConvergeBaseInfo struct { ID int64 `xorm:"pk autoincr"` ProjectNumber string `xorm:"UNIQUE NOT NULL"` //项目立项编号 @@ -66,6 +74,16 @@ type RepoConvergeInfo struct { BaseInfo *TechConvergeBaseInfo `xorm:"-"` } +func (r *RepoConvergeInfo) InsertOrUpdate() error { + if r.ID != 0 { + _, err := x.ID(r.ID).Update(r) + return err + } else { + _, err := x.InsertOne(r) + return err + } +} + func GetTechConvergeBaseInfoByProjectNumber(projectNumber string) (*TechConvergeBaseInfo, error) { tb := &TechConvergeBaseInfo{ProjectNumber: projectNumber} return getTechConvergeBaseInfo(tb) @@ -139,3 +157,15 @@ func FindTech(opt FindTechOpt) ([]*TechConvergeBaseInfo, error) { } return r, nil } + +func GetTechByTechNo(techNo string) (*TechConvergeBaseInfo, error) { + var tech *TechConvergeBaseInfo + has, err := x.Where("project_number = ?", techNo).Get(&tech) + if err != nil { + return nil, err + } else if !has { + return nil, ErrTechConvergeBaseInfoNotExist{} + } + return tech, nil + +} diff --git a/modules/structs/tech.go b/modules/structs/tech.go new file mode 100644 index 000000000..45738f959 --- /dev/null +++ b/modules/structs/tech.go @@ -0,0 +1,11 @@ +package structs + +type TechRepo struct { + Url string `json:"url"` + TechNo string `json:"no"` + Institution string `json:"institution"` + uid string `json:"uid"` //启智项目uid + repo_name string `json:"repo_name"` //启智项目名称 + topics string `json:"topics"` //关键词 + description string `json:"description"` //简介 +} diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 7d6df4cae..6228ee941 100755 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -540,7 +540,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/tech", func() { m.Get("", tech.FindTech) m.Post("/basic", tech.ImportBasicInfo) - m.Post("/openi", tech.CommitOpenIRepo) + m.Post("/openi", bind(api.TechRepo{}), tech.CommitOpenIRepo) }, reqToken()) diff --git a/routers/api/v1/tech/repo.go b/routers/api/v1/tech/repo.go index 9d0ec2947..36f7aab5d 100644 --- a/routers/api/v1/tech/repo.go +++ b/routers/api/v1/tech/repo.go @@ -1,9 +1,42 @@ package tech import ( + "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/context" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/response" + "code.gitea.io/gitea/services/repository" + "net/http" ) -func CommitOpenIRepo(ctx *context.APIContext) { +func CommitOpenIRepo(ctx *context.APIContext, form api.TechRepo) { + //解析项目路径,查找项目 + repo, err := repository.FindRepoByUrl(form.Url) + if err != nil { + ctx.JSON(http.StatusOK, response.OuterServerError(err.Error())) + return + } + //查找项目编号 + tech, err := models.GetTechByTechNo(form.TechNo) + if err != nil { + ctx.JSON(http.StatusOK, response.OuterServerError(err.Error())) + return + } + //写入数据库 + rci := &models.RepoConvergeInfo{ + RepoID: repo.ID, + Url: form.Url, + BaseInfoID: tech.ID, + Institution: form.Institution, + UID: ctx.User.ID, + Status: models.DefaultTechStatus, + } + err = rci.InsertOrUpdate() + if err != nil { + ctx.JSON(http.StatusOK, response.OuterServerError(err.Error())) + return + } + ctx.JSON(http.StatusOK, response.OuterSuccess()) + return } diff --git a/services/repository/url.go b/services/repository/url.go new file mode 100644 index 000000000..e688b693e --- /dev/null +++ b/services/repository/url.go @@ -0,0 +1,40 @@ +package repository + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/setting" + "net/url" + "strings" +) + +func FindRepoByUrl(url string) (*models.Repository, error) { + ownerName, repoName := parseOpenIUrl(url) + if ownerName == "" || repoName == "" { + return nil, nil + } + r, err := models.GetRepositoryByOwnerAndName(ownerName, repoName) + if err != nil { + return nil, err + } + return r, nil +} + +//parseOpenIUrl parse openI repo url,return ownerName and repoName +func parseOpenIUrl(u string) (string, string) { + url, err := url.Parse(u) + if err != nil { + return "", "" + } + if url.Host != setting.AppURL { + return "", "" + } + + array := strings.Split(url.Path, "/") + if len(array) < 3 { + return "", "" + } + + ownerName := array[1] + repoName := array[2] + return ownerName, repoName +}