This is an automated email from the ASF dual-hosted git repository.

warren pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new d2815d5ff feat: add sonarqube scope and fix some models (#4369)
d2815d5ff is described below

commit d2815d5ffe4168d0080237f3c0f5ebc2240032b6
Author: abeizn <[email protected]>
AuthorDate: Thu Feb 9 18:54:36 2023 +0800

    feat: add sonarqube scope and fix some models (#4369)
    
    * feat: add sonarqube scope and fix some models
    
    * feat: add sonarqube scope and fix some models
    
    * feat: add sonarqube scope and fix some models
---
 backend/plugins/sonarqube/api/scope.go             | 183 +++++++++++++++++++++
 backend/plugins/sonarqube/api/swagger.go           |   2 +-
 backend/plugins/sonarqube/impl/impl.go             |  11 +-
 .../migrationscripts/20230111_add_init_tables.go   |   2 +-
 .../archived/sonarqube_file_metrics.go             |  44 ++---
 .../migrationscripts/archived/sonarqube_hotspot.go |  30 ++--
 .../migrationscripts/archived/sonarqube_issue.go   |  46 +++---
 .../archived/sonarqube_issue_code_block.go         |  14 +-
 .../migrationscripts/archived/sonarqube_project.go |   5 +-
 .../sonarqube/models/sonarqube_file_metrics.go     |  44 ++---
 .../plugins/sonarqube/models/sonarqube_hotspot.go  |  30 ++--
 .../plugins/sonarqube/models/sonarqube_issue.go    |  46 +++---
 .../sonarqube/models/sonarqube_issue_code_block.go |  14 +-
 .../plugins/sonarqube/models/sonarqube_project.go  |   4 +-
 14 files changed, 334 insertions(+), 141 deletions(-)

diff --git a/backend/plugins/sonarqube/api/scope.go 
b/backend/plugins/sonarqube/api/scope.go
new file mode 100644
index 000000000..d8ed6336b
--- /dev/null
+++ b/backend/plugins/sonarqube/api/scope.go
@@ -0,0 +1,183 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package api
+
+import (
+       "net/http"
+       "strconv"
+
+       "github.com/apache/incubator-devlake/core/dal"
+       "github.com/apache/incubator-devlake/core/errors"
+       "github.com/apache/incubator-devlake/core/plugin"
+       "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+       "github.com/apache/incubator-devlake/plugins/sonarqube/models"
+
+       "github.com/mitchellh/mapstructure"
+)
+
+type req struct {
+       Data []*models.SonarqubeProject `json:"data"`
+}
+
+// PutScope create or update sonarqube project
+// @Summary create or update sonarqube project
+// @Description Create or update sonarqube project
+// @Tags plugins/sonarqube
+// @Accept application/json
+// @Param connectionId path int false "connection ID"
+// @Param scope body req true "json"
+// @Success 200  {object} []models.SonarqubeProject
+// @Failure 400  {object} shared.ApiBody "Bad Request"
+// @Failure 500  {object} shared.ApiBody "Internal Error"
+// @Router /plugins/sonarqube/connections/{connectionId}/scopes [PUT]
+func PutScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, 
errors.Error) {
+       connectionId, _ := extractParam(input.Params)
+       if connectionId == 0 {
+               return nil, errors.BadInput.New("invalid connectionId")
+       }
+       var projects req
+       err := errors.Convert(mapstructure.Decode(input.Body, &projects))
+       if err != nil {
+               return nil, errors.BadInput.Wrap(err, "decoding Sonarqube 
project error")
+       }
+       keeper := make(map[string]struct{})
+       for _, project := range projects.Data {
+               if _, ok := keeper[project.ProjectKey]; ok {
+                       return nil, errors.BadInput.New("duplicated item")
+               } else {
+                       keeper[project.ProjectKey] = struct{}{}
+               }
+               project.ConnectionId = connectionId
+               err = verifyProject(project)
+               if err != nil {
+                       return nil, err
+               }
+       }
+       err = basicRes.GetDal().CreateOrUpdate(projects.Data)
+       if err != nil {
+               return nil, errors.Default.Wrap(err, "error on saving 
SonarqubeProject")
+       }
+       return &plugin.ApiResourceOutput{Body: projects.Data, Status: 
http.StatusOK}, nil
+}
+
+// UpdateScope patch to sonarqube project
+// @Summary patch to sonarqube project
+// @Description patch to sonarqube project
+// @Tags plugins/sonarqube
+// @Accept application/json
+// @Param connectionId path int false "connection ID"
+// @Param projectKey path string false "project Key"
+// @Param scope body models.SonarqubeProject true "json"
+// @Success 200  {object} models.SonarqubeProject
+// @Failure 400  {object} shared.ApiBody "Bad Request"
+// @Failure 500  {object} shared.ApiBody "Internal Error"
+// @Router /plugins/sonarqube/connections/{connectionId}/scopes/{projectKey} 
[PATCH]
+func UpdateScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, 
errors.Error) {
+       connectionId, projectKey := extractParam(input.Params)
+       if connectionId*uint64(len(projectKey)) == 0 {
+               return nil, errors.BadInput.New("invalid connectionId or 
projectKey")
+       }
+       var project models.SonarqubeProject
+       err := basicRes.GetDal().First(&project, dal.Where("connection_id = ? 
AND project_key = ?", connectionId, projectKey))
+       if err != nil {
+               return nil, errors.Default.Wrap(err, "getting SonarqubeProject 
error")
+       }
+       err = api.DecodeMapStruct(input.Body, &project)
+       if err != nil {
+               return nil, errors.Default.Wrap(err, "patch sonarqube project 
error")
+       }
+       err = verifyProject(&project)
+       if err != nil {
+               return nil, err
+       }
+       err = basicRes.GetDal().Update(project)
+       if err != nil {
+               return nil, errors.Default.Wrap(err, "error on saving 
SonarqubeProject")
+       }
+       return &plugin.ApiResourceOutput{Body: project, Status: http.StatusOK}, 
nil
+}
+
+// GetScopeList get Sonarqube projects
+// @Summary get Sonarqube projects
+// @Description get Sonarqube projects
+// @Tags plugins/sonarqube
+// @Param connectionId path int false "connection ID"
+// @Success 200  {object} []apiProject
+// @Failure 400  {object} shared.ApiBody "Bad Request"
+// @Failure 500  {object} shared.ApiBody "Internal Error"
+// @Router /plugins/sonarqube/connections/{connectionId}/scopes/ [GET]
+func GetScopeList(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, 
errors.Error) {
+       var projects []models.SonarqubeProject
+       connectionId, _ := extractParam(input.Params)
+       if connectionId == 0 {
+               return nil, errors.BadInput.New("invalid path params")
+       }
+       limit, offset := api.GetLimitOffset(input.Query, "pageSize", "page")
+       err := basicRes.GetDal().All(&projects, dal.Where("connection_id = ?", 
connectionId), dal.Limit(limit), dal.Offset(offset))
+       if err != nil {
+               return nil, err
+       }
+
+       return &plugin.ApiResourceOutput{Body: projects, Status: 
http.StatusOK}, nil
+}
+
+// GetScope get one Sonarqube project
+// @Summary get one Sonarqube project
+// @Description get one Sonarqube project
+// @Tags plugins/sonarqube
+// @Param connectionId path int false "connection ID"
+// @Param projectKey path string false "project key"
+// @Param pageSize query int false "page size, default 50"
+// @Param page query int false "page size, default 1"
+// @Success 200  {object} apiProject
+// @Failure 400  {object} shared.ApiBody "Bad Request"
+// @Failure 500  {object} shared.ApiBody "Internal Error"
+// @Router /plugins/sonarqube/connections/{connectionId}/scopes/{projectKey} 
[GET]
+func GetScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, 
errors.Error) {
+       var project models.SonarqubeProject
+       connectionId, projectKey := extractParam(input.Params)
+       if connectionId*uint64(len(projectKey)) == 0 {
+               return nil, errors.BadInput.New("invalid path params")
+       }
+       db := basicRes.GetDal()
+       err := db.First(&project, dal.Where("connection_id = ? AND project_key 
= ?", connectionId, projectKey))
+       if db.IsErrorNotFound(err) {
+               return nil, errors.NotFound.New("record not found")
+       }
+       if err != nil {
+               return nil, err
+       }
+
+       return &plugin.ApiResourceOutput{Body: project, Status: http.StatusOK}, 
nil
+}
+
+func extractParam(params map[string]string) (uint64, string) {
+       connectionId, _ := strconv.ParseUint(params["connectionId"], 10, 64)
+       projectKey := params["projectKey"]
+       return connectionId, projectKey
+}
+
+func verifyProject(project *models.SonarqubeProject) errors.Error {
+       if project.ConnectionId == 0 {
+               return errors.BadInput.New("invalid connectionId")
+       }
+       if len(project.ProjectKey) == 0 {
+               return errors.BadInput.New("invalid project key")
+       }
+       return nil
+}
diff --git a/backend/plugins/sonarqube/api/swagger.go 
b/backend/plugins/sonarqube/api/swagger.go
index 4164e0fbd..74c89ee80 100644
--- a/backend/plugins/sonarqube/api/swagger.go
+++ b/backend/plugins/sonarqube/api/swagger.go
@@ -32,7 +32,7 @@ type SonarqubeBlueprintSetting []struct {
                ConnectionID int    `json:"connectionId"`
                Scope        []struct {
                        Options struct {
-                               Id int `json:"id"`
+                               ProjectKey string `json:"projectKey"`
                        } `json:"options"`
                        Entities []string `json:"entities"`
                } `json:"scopes"`
diff --git a/backend/plugins/sonarqube/impl/impl.go 
b/backend/plugins/sonarqube/impl/impl.go
index 38358d462..d96b843be 100644
--- a/backend/plugins/sonarqube/impl/impl.go
+++ b/backend/plugins/sonarqube/impl/impl.go
@@ -19,9 +19,10 @@ package impl
 
 import (
        "fmt"
-       "github.com/apache/incubator-devlake/core/dal"
        "time"
 
+       "github.com/apache/incubator-devlake/core/dal"
+
        "github.com/apache/incubator-devlake/core/context"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/plugin"
@@ -161,6 +162,14 @@ func (p Sonarqube) ApiResources() 
map[string]map[string]plugin.ApiResourceHandle
                        "PATCH":  api.PatchConnection,
                        "DELETE": api.DeleteConnection,
                },
+               "connections/:connectionId/scopes/:projectKey": {
+                       "GET":   api.GetScope,
+                       "PATCH": api.UpdateScope,
+               },
+               "connections/:connectionId/scopes": {
+                       "GET": api.GetScopeList,
+                       "PUT": api.PutScope,
+               },
        }
 }
 
diff --git 
a/backend/plugins/sonarqube/models/migrationscripts/20230111_add_init_tables.go 
b/backend/plugins/sonarqube/models/migrationscripts/20230111_add_init_tables.go
index 3ed9ccda5..d61ee253a 100644
--- 
a/backend/plugins/sonarqube/models/migrationscripts/20230111_add_init_tables.go
+++ 
b/backend/plugins/sonarqube/models/migrationscripts/20230111_add_init_tables.go
@@ -40,7 +40,7 @@ func (*addInitTables) Up(basicRes context.BasicRes) 
errors.Error {
 }
 
 func (*addInitTables) Version() uint64 {
-       return 20230207220025
+       return 20230208220025
 }
 
 func (*addInitTables) Name() string {
diff --git 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_file_metrics.go
 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_file_metrics.go
index 9d1ee07aa..ab779ef11 100644
--- 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_file_metrics.go
+++ 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_file_metrics.go
@@ -22,28 +22,28 @@ import (
 )
 
 type SonarqubeFileMetrics struct {
-       ConnectionId             uint64  `gorm:"primaryKey"`
-       FileMetricsKey           string  `json:"component_key" 
gorm:"primaryKey"`
-       ProjectKey               string  `json:"project" gorm:"index"`
-       BatchID                  string  `json:"batch_id"`
-       FileName                 string  `json:"file_name"`
-       FilePath                 string  `json:"file_path"`
-       FileLanguage             string  `json:"file_language"`
-       CodeSmells               int     `json:"code_smells"`
-       SqaleIndex               string  `json:"sqale_index"`
-       SqaleRating              string  `json:"sqale_rating"`
-       Bugs                     int     `json:"bugs"`
-       ReliabilityRating        string  `json:"reliability_rating"`
-       Vulnerabilities          int     `json:"vulnerabilities"`
-       SecurityRating           string  `json:"security_rating"`
-       SecurityHotspots         int     `json:"security_hotspots"`
-       SecurityHotspotsReviewed float64 `json:"security_hotspots_reviewed"`
-       SecurityReviewRating     string  `json:"security_review_rating"`
-       Ncloc                    int     `json:"ncloc"`
-       Coverage                 float64 `json:"coverage"`
-       LinesToCover             int     `json:"lines_to_cover"`
-       DuplicatedLinesDensity   float64 `json:"duplicated_lines_density"`
-       DuplicatedBlocks         int     `json:"duplicated_blocks"`
+       ConnectionId             uint64 `gorm:"primaryKey"`
+       FileMetricsKey           string `gorm:"primaryKey"`
+       ProjectKey               string `gorm:"index"`
+       BatchID                  string
+       FileName                 string
+       FilePath                 string
+       FileLanguage             string
+       CodeSmells               int
+       SqaleIndex               string
+       SqaleRating              string
+       Bugs                     int
+       ReliabilityRating        string
+       Vulnerabilities          int
+       SecurityRating           string
+       SecurityHotspots         int
+       SecurityHotspotsReviewed float64
+       SecurityReviewRating     string
+       Ncloc                    int
+       Coverage                 float64
+       LinesToCover             int
+       DuplicatedLinesDensity   float64
+       DuplicatedBlocks         int
        archived.NoPKModel
 }
 
diff --git 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_hotspot.go
 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_hotspot.go
index 89ea9efe3..8ac27b491 100644
--- 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_hotspot.go
+++ 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_hotspot.go
@@ -23,21 +23,21 @@ import (
 )
 
 type SonarqubeHotspot struct {
-       ConnectionId             uint64           `gorm:"primaryKey"`
-       HotspotKey               string           `json:"key" gorm:"primaryKey"`
-       RuleKey                  string           `json:"ruleKey"`
-       Component                string           `json:"component" 
gorm:"index"`
-       ProjectKey               string           `json:"project" gorm:"index"`
-       BatchId                  string           `json:"batchId" 
gorm:"type:varchar(100)"` // from collection time
-       Line                     int              `json:"line"`
-       Status                   string           `json:"status"`
-       Message                  string           `json:"message"`
-       Author                   string           `json:"author"`
-       Assignee                 string           `json:"assignee"`
-       SecurityCategory         string           `json:"securityCategory"`
-       VulnerabilityProbability string           
`json:"vulnerabilityProbability"`
-       CreationDate             *api.Iso8601Time `json:"creationDate"`
-       UpdateDate               *api.Iso8601Time `json:"updateDate"`
+       ConnectionId             uint64 `gorm:"primaryKey"`
+       HotspotKey               string `gorm:"primaryKey"`
+       RuleKey                  string
+       Component                string `gorm:"index"`
+       ProjectKey               string `gorm:"index"`
+       BatchId                  string `gorm:"type:varchar(100)"` // from 
collection time
+       Line                     int
+       Status                   string
+       Message                  string
+       Author                   string
+       Assignee                 string
+       SecurityCategory         string
+       VulnerabilityProbability string
+       CreationDate             *api.Iso8601Time
+       UpdateDate               *api.Iso8601Time
        archived.NoPKModel
 }
 
diff --git 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_issue.go 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_issue.go
index a12e1a434..f4fc781b0 100644
--- 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_issue.go
+++ 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_issue.go
@@ -23,29 +23,29 @@ import (
 )
 
 type SonarqubeIssue struct {
-       ConnectionId uint64           `gorm:"primaryKey"`
-       IssueKey     string           `json:"key" gorm:"primaryKey"`
-       Rule         string           `json:"rule" gorm:"type:varchar(255)"`
-       Severity     string           `json:"severity" gorm:"type:varchar(255)"`
-       Component    string           `json:"component" 
gorm:"type:varchar(255)"`
-       ProjectKey   string           `gorm:"index;type:varchar(255)"`          
//domain project key
-       BatchId      string           `json:"batchId" gorm:"type:varchar(100)"` 
// from collection time
-       Line         int              `json:"line"`
-       Status       string           `json:"status"`
-       Message      string           `json:"message"`
-       Debt         string           `json:"debt"`
-       Effort       string           `json:"effort"`
-       Author       string           `json:"author"`
-       Hash         string           `json:"hash"`
-       Tags         string           `json:"tags"`
-       Type         string           `json:"type"`
-       Scope        string           `json:"scope"`
-       StartLine    int              `json:"startLine"`
-       EndLine      int              `json:"endLine"`
-       StartOffset  int              `json:"startOffset"`
-       EndOffset    int              `json:"endOffset"`
-       CreationDate *api.Iso8601Time `json:"creationDate"`
-       UpdateDate   *api.Iso8601Time `json:"updateDate"`
+       ConnectionId uint64 `gorm:"primaryKey"`
+       IssueKey     string `gorm:"primaryKey"`
+       Rule         string `gorm:"type:varchar(255)"`
+       Severity     string `gorm:"type:varchar(255)"`
+       Component    string `gorm:"type:varchar(255)"`
+       ProjectKey   string `gorm:"index;type:varchar(255)"` //domain project 
key
+       BatchId      string `gorm:"type:varchar(100)"`       // from collection 
time
+       Line         int
+       Status       string
+       Message      string
+       Debt         string
+       Effort       string
+       Author       string
+       Hash         string
+       Tags         string
+       Type         string
+       Scope        string
+       StartLine    int
+       EndLine      int
+       StartOffset  int
+       EndOffset    int
+       CreationDate *api.Iso8601Time
+       UpdateDate   *api.Iso8601Time
        archived.NoPKModel
 }
 
diff --git 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_issue_code_block.go
 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_issue_code_block.go
index d94d911ea..0cbedc14b 100644
--- 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_issue_code_block.go
+++ 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_issue_code_block.go
@@ -22,13 +22,13 @@ import 
"github.com/apache/incubator-devlake/core/models/migrationscripts/archive
 type SonarqubeIssueCodeBlock struct {
        ConnectionId uint64 `gorm:"primaryKey"`
        Id           string `gorm:"primaryKey"`
-       IssueKey     string `json:"key" gorm:"index"`
-       Component    string `json:"component" gorm:"index"`
-       StartLine    int    `json:"startLine" `
-       EndLine      int    `json:"endLine" `
-       StartOffset  int    `json:"startOffset" `
-       EndOffset    int    `json:"endOffset" `
-       Msg          string `json:"msg" `
+       IssueKey     string `gorm:"index"`
+       Component    string `gorm:"index"`
+       StartLine    int
+       EndLine      int
+       StartOffset  int
+       EndOffset    int
+       Msg          string
        archived.NoPKModel
 }
 
diff --git 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_project.go
 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_project.go
index 210619981..030e78d80 100644
--- 
a/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_project.go
+++ 
b/backend/plugins/sonarqube/models/migrationscripts/archived/sonarqube_project.go
@@ -18,13 +18,14 @@ limitations under the License.
 package archived
 
 import (
-       
"github.com/apache/incubator-devlake/core/models/migrationscripts/archived"
        "time"
+
+       
"github.com/apache/incubator-devlake/core/models/migrationscripts/archived"
 )
 
 type SonarqubeProject struct {
        ConnectionId     uint64     `gorm:"primaryKey"`
-       ProjectKey       string     `json:"key" 
gorm:"type:varchar(64);primaryKey"`
+       ProjectKey       string     `json:"projectKey" 
gorm:"type:varchar(64);primaryKey"`
        Name             string     `json:"name" gorm:"type:varchar(255)"`
        Qualifier        string     `json:"qualifier" gorm:"type:varchar(255)"`
        Visibility       string     `json:"visibility" gorm:"type:varchar(64)"`
diff --git a/backend/plugins/sonarqube/models/sonarqube_file_metrics.go 
b/backend/plugins/sonarqube/models/sonarqube_file_metrics.go
index 10b0292c0..4050f4916 100644
--- a/backend/plugins/sonarqube/models/sonarqube_file_metrics.go
+++ b/backend/plugins/sonarqube/models/sonarqube_file_metrics.go
@@ -22,28 +22,28 @@ import (
 )
 
 type SonarqubeFileMetrics struct {
-       ConnectionId             uint64  `gorm:"primaryKey"`
-       FileMetricsKey           string  `json:"component_key" 
gorm:"primaryKey"`
-       ProjectKey               string  `json:"project" gorm:"index"`
-       BatchID                  string  `json:"batch_id"`
-       FileName                 string  `json:"file_name"`
-       FilePath                 string  `json:"file_path"`
-       FileLanguage             string  `json:"file_language"`
-       CodeSmells               int     `json:"code_smells"`
-       SqaleIndex               string  `json:"sqale_index"`
-       SqaleRating              string  `json:"sqale_rating"`
-       Bugs                     int     `json:"bugs"`
-       ReliabilityRating        string  `json:"reliability_rating"`
-       Vulnerabilities          int     `json:"vulnerabilities"`
-       SecurityRating           string  `json:"security_rating"`
-       SecurityHotspots         int     `json:"security_hotspots"`
-       SecurityHotspotsReviewed float64 `json:"security_hotspots_reviewed"`
-       SecurityReviewRating     string  `json:"security_review_rating"`
-       Ncloc                    int     `json:"ncloc"`
-       Coverage                 float64 `json:"coverage"`
-       LinesToCover             int     `json:"lines_to_cover"`
-       DuplicatedLinesDensity   float64 `json:"duplicated_lines_density"`
-       DuplicatedBlocks         int     `json:"duplicated_blocks"`
+       ConnectionId             uint64 `gorm:"primaryKey"`
+       FileMetricsKey           string `gorm:"primaryKey"`
+       ProjectKey               string `gorm:"index"`
+       BatchID                  string
+       FileName                 string
+       FilePath                 string
+       FileLanguage             string
+       CodeSmells               int
+       SqaleIndex               string
+       SqaleRating              string
+       Bugs                     int
+       ReliabilityRating        string
+       Vulnerabilities          int
+       SecurityRating           string
+       SecurityHotspots         int
+       SecurityHotspotsReviewed float64
+       SecurityReviewRating     string
+       Ncloc                    int
+       Coverage                 float64
+       LinesToCover             int
+       DuplicatedLinesDensity   float64
+       DuplicatedBlocks         int
        common.NoPKModel
 }
 
diff --git a/backend/plugins/sonarqube/models/sonarqube_hotspot.go 
b/backend/plugins/sonarqube/models/sonarqube_hotspot.go
index e72acf190..8b032051c 100644
--- a/backend/plugins/sonarqube/models/sonarqube_hotspot.go
+++ b/backend/plugins/sonarqube/models/sonarqube_hotspot.go
@@ -23,21 +23,21 @@ import (
 )
 
 type SonarqubeHotspot struct {
-       ConnectionId             uint64           `gorm:"primaryKey"`
-       HotspotKey               string           `json:"key" gorm:"primaryKey"`
-       RuleKey                  string           `json:"ruleKey"`
-       Component                string           `json:"component" 
gorm:"index"`
-       ProjectKey               string           `json:"project" gorm:"index"`
-       BatchId                  string           `json:"batchId" 
gorm:"type:varchar(100)"` // from collection time
-       Line                     int              `json:"line"`
-       Status                   string           `json:"status"`
-       Message                  string           `json:"message"`
-       Author                   string           `json:"author"`
-       Assignee                 string           `json:"assignee"`
-       SecurityCategory         string           `json:"securityCategory"`
-       VulnerabilityProbability string           
`json:"vulnerabilityProbability"`
-       CreationDate             *api.Iso8601Time `json:"creationDate"`
-       UpdateDate               *api.Iso8601Time `json:"updateDate"`
+       ConnectionId             uint64 `gorm:"primaryKey"`
+       HotspotKey               string `gorm:"primaryKey"`
+       RuleKey                  string
+       Component                string `gorm:"index"`
+       ProjectKey               string `gorm:"index"`
+       BatchId                  string `gorm:"type:varchar(100)"` // from 
collection time
+       Line                     int
+       Status                   string
+       Message                  string
+       Author                   string
+       Assignee                 string
+       SecurityCategory         string
+       VulnerabilityProbability string
+       CreationDate             *api.Iso8601Time
+       UpdateDate               *api.Iso8601Time
        common.NoPKModel
 }
 
diff --git a/backend/plugins/sonarqube/models/sonarqube_issue.go 
b/backend/plugins/sonarqube/models/sonarqube_issue.go
index 91233aa03..8d39561a4 100644
--- a/backend/plugins/sonarqube/models/sonarqube_issue.go
+++ b/backend/plugins/sonarqube/models/sonarqube_issue.go
@@ -23,29 +23,29 @@ import (
 )
 
 type SonarqubeIssue struct {
-       ConnectionId uint64           `gorm:"primaryKey"`
-       IssueKey     string           `json:"key" gorm:"primaryKey"`
-       Rule         string           `json:"rule" gorm:"type:varchar(255)"`
-       Severity     string           `json:"severity" gorm:"type:varchar(255)"`
-       Component    string           `json:"component" 
gorm:"type:varchar(255)"`
-       ProjectKey   string           `gorm:"index;type:varchar(255)"`          
//domain project key
-       BatchId      string           `json:"batchId" gorm:"type:varchar(100)"` 
// from collection time
-       Line         int              `json:"line"`
-       Status       string           `json:"status"`
-       Message      string           `json:"message"`
-       Debt         string           `json:"debt"`
-       Effort       string           `json:"effort"`
-       Author       string           `json:"author"`
-       Hash         string           `json:"hash"`
-       Tags         string           `json:"tags"`
-       Type         string           `json:"type"`
-       Scope        string           `json:"scope"`
-       StartLine    int              `json:"startLine"`
-       EndLine      int              `json:"endLine"`
-       StartOffset  int              `json:"startOffset"`
-       EndOffset    int              `json:"endOffset"`
-       CreationDate *api.Iso8601Time `json:"creationDate"`
-       UpdateDate   *api.Iso8601Time `json:"updateDate"`
+       ConnectionId uint64 `gorm:"primaryKey"`
+       IssueKey     string `gorm:"primaryKey"`
+       Rule         string `gorm:"type:varchar(255)"`
+       Severity     string `gorm:"type:varchar(255)"`
+       Component    string `gorm:"type:varchar(255)"`
+       ProjectKey   string `gorm:"index;type:varchar(255)"` //domain project 
key
+       BatchId      string `gorm:"type:varchar(100)"`       // from collection 
time
+       Line         int
+       Status       string
+       Message      string
+       Debt         string
+       Effort       string
+       Author       string
+       Hash         string
+       Tags         string
+       Type         string
+       Scope        string
+       StartLine    int
+       EndLine      int
+       StartOffset  int
+       EndOffset    int
+       CreationDate *api.Iso8601Time
+       UpdateDate   *api.Iso8601Time
        common.NoPKModel
 }
 
diff --git a/backend/plugins/sonarqube/models/sonarqube_issue_code_block.go 
b/backend/plugins/sonarqube/models/sonarqube_issue_code_block.go
index 8e4e7ea86..31236a16b 100644
--- a/backend/plugins/sonarqube/models/sonarqube_issue_code_block.go
+++ b/backend/plugins/sonarqube/models/sonarqube_issue_code_block.go
@@ -22,13 +22,13 @@ import 
"github.com/apache/incubator-devlake/core/models/common"
 type SonarqubeIssueCodeBlock struct {
        ConnectionId uint64 `gorm:"primaryKey"`
        Id           string `gorm:"primaryKey"`
-       IssueKey     string `json:"key" gorm:"index"`
-       Component    string `json:"component" gorm:"index"`
-       StartLine    int    `json:"startLine" `
-       EndLine      int    `json:"endLine" `
-       StartOffset  int    `json:"startOffset" `
-       EndOffset    int    `json:"endOffset" `
-       Msg          string `json:"msg" `
+       IssueKey     string `gorm:"index"`
+       Component    string `gorm:"index"`
+       StartLine    int
+       EndLine      int
+       StartOffset  int
+       EndOffset    int
+       Msg          string
        common.NoPKModel
 }
 
diff --git a/backend/plugins/sonarqube/models/sonarqube_project.go 
b/backend/plugins/sonarqube/models/sonarqube_project.go
index 2a817c5a8..0c44075dd 100644
--- a/backend/plugins/sonarqube/models/sonarqube_project.go
+++ b/backend/plugins/sonarqube/models/sonarqube_project.go
@@ -23,9 +23,9 @@ import (
 )
 
 type SonarqubeProject struct {
-       common.NoPKModel
+       common.NoPKModel `json:"-" mapstructure:"-"`
        ConnectionId     uint64           `gorm:"primaryKey"`
-       ProjectKey       string           `json:"key" 
gorm:"type:varchar(64);primaryKey"`
+       ProjectKey       string           `json:"projectKey" 
gorm:"type:varchar(64);primaryKey"`
        Name             string           `json:"name" gorm:"type:varchar(255)"`
        Qualifier        string           `json:"qualifier" 
gorm:"type:varchar(255)"`
        Visibility       string           `json:"visibility" 
gorm:"type:varchar(64)"`

Reply via email to