Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

👻 Use JSON serializer everywhere #680

Merged
merged 1 commit into from
Aug 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 32 additions & 49 deletions api/analysis.go
Original file line number Diff line number Diff line change
Expand Up @@ -1060,11 +1060,9 @@ func (h AnalysisHandler) RuleReports(ctx *gin.Context) {
Name: m.Name,
}
resources = append(resources, r)
if m.Labels != nil {
_ = json.Unmarshal(m.Labels, &r.Labels)
}
if m.Links != nil {
_ = json.Unmarshal(m.Links, &r.Links)
r.Labels = m.Labels
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

r.Links = []Link{} so it's not nil?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Links field is omitempty so seemed like it was okay to let it be nil. No problem changing it if you disagree.

for _, l := range m.Links {
r.Links = append(r.Links, Link(l))
}
r.Effort += m.Effort
}
Expand Down Expand Up @@ -1197,11 +1195,9 @@ func (h AnalysisHandler) AppIssueReports(ctx *gin.Context) {
ID: m.ID,
}
resources = append(resources, r)
if m.Labels != nil {
_ = json.Unmarshal(m.Labels, &r.Labels)
}
if m.Links != nil {
_ = json.Unmarshal(m.Links, &r.Links)
r.Labels = m.Labels
for _, l := range m.Links {
r.Links = append(r.Links, Link(l))
}
r.Effort += m.Effort
}
Expand Down Expand Up @@ -1722,13 +1718,9 @@ func (h AnalysisHandler) DepReports(ctx *gin.Context) {
Name: m.Name,
Applications: m.Applications,
}
if m.Labels != nil {
var aggregated []string
_ = json.Unmarshal(m.Labels, &aggregated)
for _, s := range aggregated {
if s != "" {
r.Labels = append(r.Labels, s)
}
for _, s := range m.Labels {
if s != "" {
r.Labels = append(r.Labels, s)
}
}
resources = append(resources, r)
Expand Down Expand Up @@ -2082,7 +2074,7 @@ func (h *AnalysisHandler) archive(ctx *gin.Context, q *gorm.DB) (err error) {
db = db.Where("n.IssueID = i.ID")
db = db.Where("i.AnalysisID", m.ID)
db = db.Group("i.ID")
summary := []ArchivedIssue{}
summary := []model.ArchivedIssue{}
Copy link
Contributor

@jortel jortel Jun 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

type ArchivedIssue = model.ArchivedIssue

Shouldn't this be a []ArchivedIssue?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seemed more appropriate to use the one from the model package because it's used directly in a query and stored on the model.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah. I misunderstood.

err = db.Scan(&summary).Error
if err != nil {
return
Expand All @@ -2091,8 +2083,8 @@ func (h *AnalysisHandler) archive(ctx *gin.Context, q *gorm.DB) (err error) {
db = db.Model(m)
db = db.Omit(clause.Associations)
m.Archived = true
m.Summary, _ = json.Marshal(summary)
err = db.Updates(h.fields(&m)).Error
m.Summary = summary
err = db.Save(&m).Error
if err != nil {
return
}
Expand Down Expand Up @@ -2155,7 +2147,7 @@ type Issue struct {
Effort int `json:"effort,omitempty" yaml:",omitempty"`
Incidents []Incident `json:"incidents,omitempty" yaml:",omitempty"`
Links []Link `json:"links,omitempty" yaml:",omitempty"`
Facts FactMap `json:"facts,omitempty" yaml:",omitempty"`
Facts Map `json:"facts,omitempty" yaml:",omitempty"`
Labels []string `json:"labels"`
}

Expand All @@ -2176,15 +2168,11 @@ func (r *Issue) With(m *model.Issue) {
r.Incidents,
n)
}
if m.Links != nil {
_ = json.Unmarshal(m.Links, &r.Links)
}
if m.Facts != nil {
_ = json.Unmarshal(m.Facts, &r.Facts)
}
if m.Labels != nil {
_ = json.Unmarshal(m.Labels, &r.Labels)
for _, l := range m.Links {
r.Links = append(r.Links, Link(l))
}
r.Facts = m.Facts
r.Labels = m.Labels
r.Effort = m.Effort
}

Expand All @@ -2203,9 +2191,11 @@ func (r *Issue) Model() (m *model.Issue) {
m.Incidents,
*n)
}
m.Links, _ = json.Marshal(r.Links)
m.Facts, _ = json.Marshal(r.Facts)
m.Labels, _ = json.Marshal(r.Labels)
for _, l := range r.Links {
m.Links = append(m.Links, model.Link(l))
}
m.Facts = r.Facts
m.Labels = r.Labels
m.Effort = r.Effort
return
}
Expand All @@ -2231,9 +2221,7 @@ func (r *TechDependency) With(m *model.TechDependency) {
r.Version = m.Version
r.Indirect = m.Indirect
r.SHA = m.SHA
if m.Labels != nil {
_ = json.Unmarshal(m.Labels, &r.Labels)
}
r.Labels = m.Labels
}

// Model builds a model.
Expand All @@ -2244,20 +2232,20 @@ func (r *TechDependency) Model() (m *model.TechDependency) {
m.Version = r.Version
m.Provider = r.Provider
m.Indirect = r.Indirect
m.Labels, _ = json.Marshal(r.Labels)
m.Labels = r.Labels
m.SHA = r.SHA
return
}

// Incident REST resource.
type Incident struct {
Resource `yaml:",inline"`
Issue uint `json:"issue"`
File string `json:"file"`
Line int `json:"line"`
Message string `json:"message"`
CodeSnip string `json:"codeSnip" yaml:"codeSnip"`
Facts FactMap `json:"facts"`
Issue uint `json:"issue"`
File string `json:"file"`
Line int `json:"line"`
Message string `json:"message"`
CodeSnip string `json:"codeSnip" yaml:"codeSnip"`
Facts Map `json:"facts"`
}

// With updates the resource with the model.
Expand All @@ -2268,9 +2256,7 @@ func (r *Incident) With(m *model.Incident) {
r.Line = m.Line
r.Message = m.Message
r.CodeSnip = m.CodeSnip
if m.Facts != nil {
_ = json.Unmarshal(m.Facts, &r.Facts)
}
r.Facts = m.Facts
}

// Model builds a model.
Expand All @@ -2280,7 +2266,7 @@ func (r *Incident) Model() (m *model.Incident) {
m.Line = r.Line
m.Message = r.Message
m.CodeSnip = r.CodeSnip
m.Facts, _ = json.Marshal(r.Facts)
m.Facts = r.Facts
return
}

Expand Down Expand Up @@ -2371,9 +2357,6 @@ type DepAppReport struct {
} `json:"dependency"`
}

// FactMap map.
type FactMap map[string]any

// IssueWriter used to create a file containing issues.
type IssueWriter struct {
encoder
Expand Down
28 changes: 13 additions & 15 deletions api/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ func (h ApplicationHandler) Update(ctx *gin.Context) {
m.UpdateUser = h.BaseHandler.CurrentUser(ctx)
db = h.DB(ctx).Model(m)
db = db.Omit(clause.Associations, "BucketID")
result = db.Updates(h.fields(m))
result = db.Save(m)
if result.Error != nil {
_ = ctx.Error(result.Error)
return
Expand Down Expand Up @@ -722,12 +722,10 @@ func (h ApplicationHandler) FactList(ctx *gin.Context, key FactKey) {
return
}

facts := FactMap{}
facts := Map{}
for i := range list {
fact := &list[i]
var v any
_ = json.Unmarshal(fact.Value, &v)
facts[fact.Key] = v
facts[fact.Key] = fact.Value
}
h.Respond(ctx, http.StatusOK, facts)
}
Expand Down Expand Up @@ -772,9 +770,7 @@ func (h ApplicationHandler) FactGet(ctx *gin.Context) {
return
}

var v any
_ = json.Unmarshal(list[0].Value, &v)
h.Respond(ctx, http.StatusOK, v)
h.Respond(ctx, http.StatusOK, list[0].Value)
}

// FactCreate godoc
Expand Down Expand Up @@ -846,12 +842,11 @@ func (h ApplicationHandler) FactPut(ctx *gin.Context) {
return
}

value, _ := json.Marshal(f.Value)
m := &model.Fact{
Key: key.Name(),
Source: key.Source(),
ApplicationID: id,
Value: value,
Value: f.Value,
}
db := h.DB(ctx)
result = db.Save(m)
Expand Down Expand Up @@ -906,7 +901,7 @@ func (h ApplicationHandler) FactDelete(ctx *gin.Context) {
// @param factmap body api.FactMap true "Fact map"
func (h ApplicationHandler) FactReplace(ctx *gin.Context, key FactKey) {
id := h.pk(ctx)
facts := FactMap{}
facts := Map{}
err := h.Bind(ctx, &facts)
if err != nil {
_ = ctx.Error(err)
Expand Down Expand Up @@ -1145,7 +1140,10 @@ func (r *Application) With(m *model.Application, tags []model.ApplicationTag) {
r.Bucket = r.refPtr(m.BucketID, m.Bucket)
r.Comments = m.Comments
r.Binary = m.Binary
_ = json.Unmarshal(m.Repository, &r.Repository)
if m.Repository != (model.Repository{}) {
repo := Repository(m.Repository)
r.Repository = &repo
}
if m.Review != nil {
ref := &Ref{}
ref.With(m.Review.ID, "")
Expand Down Expand Up @@ -1246,7 +1244,7 @@ func (r *Application) Model() (m *model.Application) {
}
m.ID = r.ID
if r.Repository != nil {
m.Repository, _ = json.Marshal(r.Repository)
m.Repository = model.Repository(*r.Repository)
}
if r.BusinessService != nil {
m.BusinessServiceID = &r.BusinessService.ID
Expand Down Expand Up @@ -1307,14 +1305,14 @@ type Fact struct {
func (r *Fact) With(m *model.Fact) {
r.Key = m.Key
r.Source = m.Source
_ = json.Unmarshal(m.Value, &r.Value)
r.Value = m.Value
}

func (r *Fact) Model() (m *model.Fact) {
m = &model.Fact{}
m.Key = r.Key
m.Source = r.Source
m.Value, _ = json.Marshal(r.Value)
m.Value = r.Value
return
}

Expand Down
2 changes: 1 addition & 1 deletion api/archetype.go
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ func (h ArchetypeHandler) Update(ctx *gin.Context) {
m.UpdateUser = h.CurrentUser(ctx)
db := h.DB(ctx).Model(m)
db = db.Omit(clause.Associations)
result := db.Updates(h.fields(m))
result := db.Save(m)
if result.Error != nil {
_ = ctx.Error(result.Error)
return
Expand Down
44 changes: 25 additions & 19 deletions api/assessment.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package api

import (
"encoding/json"
"net/http"

"github.com/gin-gonic/gin"
Expand Down Expand Up @@ -126,7 +125,7 @@ func (h AssessmentHandler) Update(ctx *gin.Context) {
m.UpdateUser = h.CurrentUser(ctx)
db := h.DB(ctx).Model(m)
db = db.Omit(clause.Associations, "Thresholds", "RiskMessages")
result := db.Updates(h.fields(m))
result := db.Save(m)
if result.Error != nil {
_ = ctx.Error(result.Error)
return
Expand All @@ -148,21 +147,25 @@ func (h AssessmentHandler) Update(ctx *gin.Context) {
// Assessment REST resource.
type Assessment struct {
Resource `yaml:",inline"`
Application *Ref `json:"application,omitempty" yaml:",omitempty" binding:"excluded_with=Archetype"`
Archetype *Ref `json:"archetype,omitempty" yaml:",omitempty" binding:"excluded_with=Application"`
Questionnaire Ref `json:"questionnaire" binding:"required"`
Sections []assessment.Section `json:"sections" binding:"dive"`
Stakeholders []Ref `json:"stakeholders"`
StakeholderGroups []Ref `json:"stakeholderGroups" yaml:"stakeholderGroups"`
Application *Ref `json:"application,omitempty" yaml:",omitempty" binding:"excluded_with=Archetype"`
Archetype *Ref `json:"archetype,omitempty" yaml:",omitempty" binding:"excluded_with=Application"`
Questionnaire Ref `json:"questionnaire" binding:"required"`
Sections []Section `json:"sections" binding:"dive"`
Stakeholders []Ref `json:"stakeholders"`
StakeholderGroups []Ref `json:"stakeholderGroups" yaml:"stakeholderGroups"`
// read only
Risk string `json:"risk"`
Confidence int `json:"confidence"`
Status string `json:"status"`
Thresholds assessment.Thresholds `json:"thresholds"`
RiskMessages assessment.RiskMessages `json:"riskMessages" yaml:"riskMessages"`
Required bool `json:"required"`
Risk string `json:"risk"`
Confidence int `json:"confidence"`
Status string `json:"status"`
Thresholds Thresholds `json:"thresholds"`
RiskMessages RiskMessages `json:"riskMessages" yaml:"riskMessages"`
Required bool `json:"required"`
}

type Section model.Section
type Thresholds model.Thresholds
type RiskMessages model.RiskMessages

// With updates the resource with the model.
func (r *Assessment) With(m *model.Assessment) {
r.Resource.With(&m.Model)
Expand All @@ -186,18 +189,21 @@ func (r *Assessment) With(m *model.Assessment) {
r.Required = a.Questionnaire.Required
r.Risk = a.Risk()
r.Confidence = a.Confidence()
r.RiskMessages = a.RiskMessages
r.Thresholds = a.Thresholds
r.Sections = a.Sections
r.RiskMessages = RiskMessages(a.RiskMessages)
r.Thresholds = Thresholds(a.Thresholds)
r.Sections = []Section{}
for _, s := range a.Sections {
r.Sections = append(r.Sections, Section(s))
}
r.Status = a.Status()
}

// Model builds a model.
func (r *Assessment) Model() (m *model.Assessment) {
m = &model.Assessment{}
m.ID = r.ID
if r.Sections != nil {
m.Sections, _ = json.Marshal(r.Sections)
for _, s := range r.Sections {
m.Sections = append(m.Sections, model.Section(s))
}
m.QuestionnaireID = r.Questionnaire.ID
if r.Archetype != nil {
Expand Down
6 changes: 0 additions & 6 deletions api/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,6 @@ func (h *BaseHandler) preLoad(db *gorm.DB, fields ...string) (tx *gorm.DB) {
return
}

// fields builds a map of fields.
func (h *BaseHandler) fields(m any) (mp map[string]any) {
mp = reflect.Fields(m)
return
}

// pk returns the PK (ID) parameter.
func (h *BaseHandler) pk(ctx *gin.Context) (id uint) {
s := ctx.Param(ID)
Expand Down
2 changes: 1 addition & 1 deletion api/businessservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func (h BusinessServiceHandler) Update(ctx *gin.Context) {
m.UpdateUser = h.BaseHandler.CurrentUser(ctx)
db := h.DB(ctx).Model(m)
db = db.Omit(clause.Associations)
result := db.Updates(h.fields(m))
result := db.Save(m)
if result.Error != nil {
_ = ctx.Error(result.Error)
return
Expand Down
2 changes: 1 addition & 1 deletion api/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ func (h StakeholderGroupHandler) Update(ctx *gin.Context) {
m.UpdateUser = h.BaseHandler.CurrentUser(ctx)
db := h.DB(ctx).Model(m)
db = db.Omit(clause.Associations)
result := db.Updates(h.fields(m))
result := db.Save(m)
if result.Error != nil {
_ = ctx.Error(result.Error)
return
Expand Down
Loading
Loading