-
Notifications
You must be signed in to change notification settings - Fork 3
/
storage.go
101 lines (86 loc) · 3.32 KB
/
storage.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
Copyright 2020 Adevinta
*/
package storage
import (
"errors"
"github.com/adevinta/vulnerability-db-api/pkg/model"
)
var (
// ErrInvalidData is returned when a method in Storage finds inconsistent
// data in the db, for instance, a Finding without a target.
ErrInvalidData = errors.New("inconsistent data found")
)
// Filter holds query filtering information.
type Filter struct {
Status string
Team string
Teams string
Identifier string
Identifiers string
IdentifierMatch bool
MinScore float32
MaxScore float32
MinDate string
MaxDate string
AtDate string
Page int
Size int
SortBy SortBy
IssueID string
TargetID string
SourceID string
Labels string
}
// SortBy holds information for the
// query sorting criteria.
type SortBy struct {
Field string
Order string
}
// Pagination holds database pagination information.
type Pagination struct {
Limit int `json:"limit"`
Offset int `json:"offset"`
Total int `json:"total"`
}
// Storage defines the API for querying data from storage.
type Storage interface {
ListSources(filter Filter) ([]model.Source, Pagination, error)
GetSource(id string) (model.Source, error)
GetSourceMTTR(id string) (float32, error)
ListTargets(filter Filter) ([]model.Target, Pagination, error)
TargetsSummary(filter Filter) ([]model.TargetSummary, Pagination, error)
GetTarget(id string) (model.Target, error)
GetTargetMTTR(id string) (float32, error)
CreateTarget(target model.Target) (model.Target, error)
DeleteTeam(teamID string) error
DeleteTargetTeam(targetID, teamID string) error
ListIssues(filter Filter) ([]model.Issue, Pagination, error)
IssuesSummary(filter Filter) ([]model.IssueSummary, Pagination, error)
GetIssue(id string) (model.Issue, error)
GetIssueMTTR(id string) (float32, error)
ListLabels(filter Filter) ([]string, error)
ListFindings(filter Filter) ([]model.FindingExpanded, Pagination, error)
GetFinding(id string) (model.FindingExpanded, error)
GetFindingFromTargetIssueAndResource(targetID, affectedResource, issueID string) (model.FindingExpanded, error)
ListFindingsByTarget(id string, filter Filter) ([]model.FindingExpanded, Pagination, error)
ListFindingsByIssue(id string, filter Filter) ([]model.FindingExpanded, Pagination, error)
ListFindingsBySource(id string, filter Filter) ([]model.FindingExpanded, Pagination, error)
ListFindingEventsByFinding(id string, filter Filter) ([]model.FindingEvent, Pagination, error)
GetFindingMTTR(id string) (float32, error)
PatchFinding(id string, payload model.PatchFindingPayload) error
ListFindingEvents(filter Filter) ([]model.FindingEvent, Pagination, error)
StatsSize() (model.StatsSize, error)
StatsOpenIssues(filter Filter) (model.StatsIssueSeverity, error)
StatsFixedIssues(filter Filter) (model.StatsIssueSeverity, error)
StatsIssues(filter Filter) ([]model.Issue, Pagination, error)
StatsMTTR(filter Filter) (model.StatsMTTRSeverity, error)
StatsExposure(filter Filter) (model.StatsExposure, error)
StatsCurrentExposure(filter Filter) (model.StatsExposure, error)
StatsAssetsPerSeverity(filter Filter) (model.StatsAssetsSeverity, error)
}
// Offset calculates the offset required for a given page and limit.
func Offset(page int, limit int) int {
return (page - 1) * limit
}