Skip to content

Commit 1b91223

Browse files
committed
RHINENG-21786: use standard JSONSlice datatype
and remove lot of custom json column parsing function
1 parent 3105869 commit 1b91223

11 files changed

Lines changed: 69 additions & 115 deletions

File tree

base/models/models.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"time"
55

66
"github.com/lib/pq"
7+
"gorm.io/datatypes"
78
)
89

910
type RhAccount struct {
@@ -261,10 +262,10 @@ type AdvisoryMetadata struct {
261262
ModifiedDate *time.Time
262263
URL *string
263264
SeverityID *int
264-
PackageData []byte
265-
CveList []byte
265+
PackageData datatypes.JSONSlice[string] `gorm:"type:jsonb"`
266+
CveList datatypes.JSONSlice[string] `gorm:"type:jsonb"`
266267
RebootRequired bool
267-
ReleaseVersions []byte
268+
ReleaseVersions datatypes.JSONSlice[string] `gorm:"type:jsonb"`
268269
Synced bool
269270
}
270271

base/vmaas/vmaas.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -210,23 +210,23 @@ type ErrataResponse struct {
210210
}
211211

212212
type ErrataResponseErrataList struct {
213-
Updated string `json:"updated,omitempty"`
214-
Severity string `json:"severity,omitempty"`
215-
ReferenceList *[]string `json:"reference_list,omitempty"`
216-
Issued string `json:"issued,omitempty"`
217-
Description string `json:"description,omitempty"`
218-
Solution *string `json:"solution,omitempty"`
219-
Summary string `json:"summary,omitempty"`
220-
URL *string `json:"url,omitempty"`
221-
Synopsis string `json:"synopsis,omitempty"`
222-
CveList *[]string `json:"cve_list,omitempty"`
223-
BugzillaList *[]string `json:"bugzilla_list,omitempty"`
224-
PackageList []string `json:"package_list,omitempty"`
225-
SourcePackageList *[]string `json:"source_package_list,omitempty"`
226-
Type string `json:"type,omitempty"`
227-
ThirdParty *bool `json:"third_party,omitempty"`
228-
RequiresReboot bool `json:"requires_reboot,omitempty"`
229-
ReleaseVersions *[]string `json:"release_versions,omitempty"`
213+
Updated string `json:"updated,omitempty"`
214+
Severity string `json:"severity,omitempty"`
215+
ReferenceList []string `json:"reference_list,omitempty"`
216+
Issued string `json:"issued,omitempty"`
217+
Description string `json:"description,omitempty"`
218+
Solution *string `json:"solution,omitempty"`
219+
Summary string `json:"summary,omitempty"`
220+
URL *string `json:"url,omitempty"`
221+
Synopsis string `json:"synopsis,omitempty"`
222+
CveList []string `json:"cve_list,omitempty"`
223+
BugzillaList []string `json:"bugzilla_list,omitempty"`
224+
PackageList []string `json:"package_list,omitempty"`
225+
SourcePackageList []string `json:"source_package_list,omitempty"`
226+
Type string `json:"type,omitempty"`
227+
ThirdParty *bool `json:"third_party,omitempty"`
228+
RequiresReboot bool `json:"requires_reboot,omitempty"`
229+
ReleaseVersions []string `json:"release_versions,omitempty"`
230230
}
231231

232232
type PkgListRequest struct {

go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ require (
4040

4141
require (
4242
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 // indirect
43+
filippo.io/edwards25519 v1.1.0 // indirect
4344
github.com/KyleBanks/depth v1.2.1 // indirect
4445
github.com/benbjohnson/clock v1.3.5 // indirect
4546
github.com/beorn7/perks v1.0.1 // indirect
@@ -69,6 +70,7 @@ require (
6970
github.com/go-playground/locales v0.14.1 // indirect
7071
github.com/go-playground/universal-translator v0.18.1 // indirect
7172
github.com/go-playground/validator/v10 v10.30.1 // indirect
73+
github.com/go-sql-driver/mysql v1.8.1 // indirect
7274
github.com/goccy/go-json v0.10.5 // indirect
7375
github.com/goccy/go-yaml v1.19.2 // indirect
7476
github.com/gorilla/securecookie v1.1.2 // indirect
@@ -134,6 +136,8 @@ require (
134136
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect
135137
google.golang.org/protobuf v1.36.11 // indirect
136138
gopkg.in/yaml.v3 v3.0.1 // indirect
139+
gorm.io/datatypes v1.2.7 // indirect
140+
gorm.io/driver/mysql v1.5.6 // indirect
137141
)
138142

139143
replace github.com/segmentio/kafka-go v0.4.49 => github.com/MichaelMraka/kafka-go v0.0.0-20251014134425-230b5408c208

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 h1:PMmTMyvHScV9Mn8wc6ASge9uRcHy0jtqPd+fM35LmsQ=
22
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1/go.mod h1:tvtbpgaVXZX4g6Pn+AnzFycuRK3MOz5HJfEGeEllXYM=
3+
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
4+
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
35
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
46
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
57
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
@@ -111,6 +113,9 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
111113
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
112114
github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=
113115
github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=
116+
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
117+
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
118+
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
114119
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
115120
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
116121
github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
@@ -467,8 +472,13 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
467472
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
468473
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
469474
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
475+
gorm.io/datatypes v1.2.7 h1:ww9GAhF1aGXZY3EB3cJPJ7//JiuQo7DlQA7NNlVaTdk=
476+
gorm.io/datatypes v1.2.7/go.mod h1:M2iO+6S3hhi4nAyYe444Pcb0dcIiOMJ7QHaUXxyiNZY=
477+
gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=
478+
gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
470479
gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4=
471480
gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo=
481+
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
472482
gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg=
473483
gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs=
474484
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=

manager/controllers/advisories.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,7 @@ type AdvisoryItemAttributesCommon struct {
5757
SeverityName *string `json:"severity_name,omitempty" csv:"severity_name" query:"sev.name" gorm:"column:severity_name"`
5858
CveCount int `json:"cve_count" csv:"cve_count" query:"CASE WHEN jsonb_typeof(am.cve_list) = 'array' THEN jsonb_array_length(am.cve_list) ELSE 0 END" gorm:"column:cve_count"`
5959
RebootRequired bool `json:"reboot_required" csv:"reboot_required" query:"am.reboot_required" gorm:"column:reboot_required"`
60-
ReleaseVersions RelList `json:"release_versions" csv:"release_versions" query:"null" gorm:"-"`
61-
62-
// helper field to get release_version json from db and parse it to ReleaseVersions field
63-
ReleaseVersionsJSONB []byte `json:"-" csv:"-" query:"am.release_versions" gorm:"column:release_versions_json"`
60+
ReleaseVersions RelList `json:"release_versions" csv:"release_versions" query:"am.release_versions" gorm:"column:release_versions" swaggertype:"array,string"`
6461
}
6562

6663
// nolint: lll
@@ -261,7 +258,6 @@ func buildAdvisoriesData(advisories []AdvisoriesDBLookup) ([]AdvisoryItem, int,
261258
data := make([]AdvisoryItem, len(advisories))
262259
for i := 0; i < len(advisories); i++ {
263260
advisory := (advisories)[i]
264-
advisory.AdvisoryItemAttributesCommon = fillAdvisoryItemAttributeReleaseVersion(advisory.AdvisoryItemAttributesCommon)
265261
data[i] = AdvisoryItem{
266262
Attributes: AdvisoryItemAttributes{
267263
AdvisoryItemAttributesCommon: advisory.AdvisoryItemAttributesCommon,

manager/controllers/advisories_export.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,5 @@ func AdvisoriesExportHandler(c *gin.Context) {
6060
return
6161
}
6262

63-
// update release_version field
64-
for i := range advisories {
65-
advisories[i].AdvisoryItemAttributesCommon =
66-
fillAdvisoryItemAttributeReleaseVersion(advisories[i].AdvisoryItemAttributesCommon)
67-
}
68-
6963
OutputExportData(c, advisories)
7064
}

manager/controllers/advisory_detail.go

Lines changed: 18 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/gin-gonic/gin"
1313
lru "github.com/hashicorp/golang-lru/v2"
1414
"github.com/pkg/errors"
15+
"gorm.io/datatypes"
1516
"gorm.io/gorm"
1617
)
1718

@@ -30,24 +31,22 @@ type AdvisoryDetailItem struct {
3031
}
3132

3233
type AdvisoryDetailAttributes struct {
33-
Description string `json:"description"`
34-
ModifiedDate *time.Time `json:"modified_date"`
35-
PublicDate *time.Time `json:"public_date"`
36-
Topic string `json:"topic"`
37-
Synopsis string `json:"synopsis"`
38-
Solution *string `json:"solution"`
39-
AdvisoryTypeName string `json:"advisory_type_name"`
40-
Severity *int `json:"severity"`
41-
Fixes *string `json:"fixes"`
42-
Cves []string `json:"cves"`
43-
References []string `json:"references"`
44-
RebootRequired bool `json:"reboot_required"`
45-
ReleaseVersions []string `json:"release_versions"`
46-
Packages packages `json:"packages"`
34+
Description string `json:"description"`
35+
ModifiedDate *time.Time `json:"modified_date"`
36+
PublicDate *time.Time `json:"public_date"`
37+
Topic string `json:"topic"`
38+
Synopsis string `json:"synopsis"`
39+
Solution *string `json:"solution"`
40+
AdvisoryTypeName string `json:"advisory_type_name"`
41+
Severity *int `json:"severity"`
42+
Fixes *string `json:"fixes"`
43+
Cves datatypes.JSONSlice[string] `json:"cves" swaggertype:"array,string"`
44+
References []string `json:"references"`
45+
RebootRequired bool `json:"reboot_required"`
46+
ReleaseVersions datatypes.JSONSlice[string] `json:"release_versions" swaggertype:"array,string"`
47+
Packages datatypes.JSONSlice[string] `json:"packages" swaggertype:"array,string"`
4748
}
4849

49-
type packages []string
50-
5150
// @Summary Show me details an advisory by given advisory name
5251
// @Description Show me details an advisory by given advisory name
5352
// @ID detailAdvisory
@@ -95,16 +94,6 @@ func getAdvisoryFromDB(db *gorm.DB, advisoryName string) (*AdvisoryDetailRespons
9594
return nil, err
9695
}
9796

98-
cves, err := parseJSONList(advisory.CveList)
99-
if err != nil {
100-
return nil, errors.Wrap(err, "CVEs parsing error")
101-
}
102-
103-
releaseVersions, err := parseJSONList(advisory.ReleaseVersions)
104-
if err != nil {
105-
return nil, errors.Wrap(err, "release_versions parsing error")
106-
}
107-
10897
ada := AdvisoryDetailAttributes{
10998
Description: advisory.Description,
11099
ModifiedDate: advisory.ModifiedDate,
@@ -115,40 +104,22 @@ func getAdvisoryFromDB(db *gorm.DB, advisoryName string) (*AdvisoryDetailRespons
115104
Severity: advisory.SeverityID,
116105
AdvisoryTypeName: database.AdvisoryTypes[advisory.AdvisoryTypeID],
117106
Fixes: nil,
118-
Cves: cves,
107+
Cves: advisory.CveList,
108+
Packages: advisory.PackageData,
119109
References: []string{},
120110
RebootRequired: advisory.RebootRequired,
121-
ReleaseVersions: releaseVersions,
122-
}
123-
124-
pkgs, err := parsePackages(advisory.PackageData)
125-
if err != nil {
126-
return nil, errors.Wrap(err, "packages parsing error")
111+
ReleaseVersions: advisory.ReleaseVersions,
127112
}
128113

129114
var resp = AdvisoryDetailResponse{Data: AdvisoryDetailItem{
130115
ID: advisory.Name,
131116
Type: "advisory",
132117
Attributes: ada,
133118
}}
134-
resp.Data.Attributes.Packages = pkgs
135119

136120
return &resp, nil
137121
}
138122

139-
func parsePackages(jsonb []byte) (packages, error) {
140-
if jsonb == nil {
141-
return packages{}, nil
142-
}
143-
144-
var err error
145-
pkgs, err := parseJSONList(jsonb)
146-
if err != nil {
147-
return nil, err
148-
}
149-
return pkgs, nil
150-
}
151-
152123
func InitAdvisoryDetailCache() {
153124
middlewares.AdvisoryDetailGauge.Set(0)
154125
if !config.EnableAdvisoryDetailCache {

manager/controllers/system_advisories.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import (
55
"app/base/models"
66
"app/base/utils"
77
"app/manager/middlewares"
8+
"database/sql/driver"
89
"net/http"
910
"strings"
1011

12+
"gorm.io/datatypes"
1113
"gorm.io/gorm"
1214

1315
"github.com/gin-gonic/gin"
@@ -24,7 +26,7 @@ var SystemAdvisoriesOpts = ListOpts{
2426
SearchFields: []string{"am.name", "am.synopsis"},
2527
}
2628

27-
type RelList []string
29+
type RelList datatypes.JSONSlice[string]
2830

2931
type SystemAdvisoriesDBLookup struct {
3032
ID string `json:"id" csv:"id" query:"am.name" gorm:"column:id"`
@@ -60,6 +62,14 @@ func (v RelList) String() string {
6062
return strings.Join(v, ",")
6163
}
6264

65+
func (v RelList) Value() (driver.Value, error) {
66+
return (datatypes.JSONSlice[string])(v).Value()
67+
}
68+
69+
func (v *RelList) Scan(value interface{}) error {
70+
return (*datatypes.JSONSlice[string])(v).Scan(value)
71+
}
72+
6373
func systemAdvisoriesCommon(c *gin.Context) (*gorm.DB, *ListMeta, []string, error) {
6474
account := c.GetInt(utils.KeyAccount)
6575
groups := c.GetStringMapString(utils.KeyInventoryGroups)
@@ -206,7 +216,6 @@ func buildSystemAdvisoriesData(models []SystemAdvisoriesDBLookup) ([]SystemAdvis
206216
}
207217
data := make([]SystemAdvisoryItem, len(models))
208218
for i, advisory := range models {
209-
advisory.AdvisoryItemAttributesCommon = fillAdvisoryItemAttributeReleaseVersion(advisory.AdvisoryItemAttributesCommon)
210219
item := SystemAdvisoryItem{
211220
ID: advisory.ID,
212221
Type: "advisory",

manager/controllers/system_advisories_export.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,6 @@ func SystemAdvisoriesExportHandler(c *gin.Context) {
7070

7171
var advisories []SystemAdvisoriesDBLookup
7272
err = query.Find(&advisories).Error
73-
for i := 0; i < len(advisories); i++ {
74-
advisories[i].AdvisoryItemAttributesCommon =
75-
fillAdvisoryItemAttributeReleaseVersion(advisories[i].AdvisoryItemAttributesCommon)
76-
}
7773
if err != nil {
7874
utils.LogAndRespError(c, err, "db error")
7975
return

manager/controllers/utils.go

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -558,29 +558,6 @@ func systemsSatelliteIDs(c *gin.Context, systems []SystemsSatelliteManagedID, me
558558
return resp, nil
559559
}
560560

561-
func fillAdvisoryItemAttributeReleaseVersion(advisory AdvisoryItemAttributesCommon) AdvisoryItemAttributesCommon {
562-
// parse release version from json to []strings
563-
var err error
564-
advisory.ReleaseVersions, err = parseJSONList(advisory.ReleaseVersionsJSONB)
565-
if err != nil {
566-
utils.LogWarn("err", err.Error(), "json", advisory.ReleaseVersionsJSONB, "Unable to parse json list")
567-
}
568-
return advisory
569-
}
570-
571-
func parseJSONList(jsonb []byte) ([]string, error) {
572-
if jsonb == nil {
573-
return []string{}, nil
574-
}
575-
576-
var items []string
577-
err := sonic.Unmarshal(jsonb, &items)
578-
if err != nil {
579-
return nil, err
580-
}
581-
return items, nil
582-
}
583-
584561
func isFilterInURLValid(c *gin.Context) bool {
585562
if strings.Contains(c.Request.URL.String(), "filter") {
586563
utils.LogAndRespBadRequest(c, errors.New(FilterNotSupportedMsg), FilterNotSupportedMsg)

0 commit comments

Comments
 (0)