Files
paralus/pkg/service/audit_log_db.go

111 lines
2.7 KiB
Go

package service
import (
"context"
"encoding/json"
"github.com/paralus/paralus/internal/dao"
"github.com/paralus/paralus/internal/models"
v1 "github.com/paralus/paralus/proto/rpc/audit"
auditv1 "github.com/paralus/paralus/proto/types/audit"
"github.com/uptrace/bun"
"google.golang.org/protobuf/types/known/structpb"
)
type auditLogDatabaseService struct {
db *bun.DB
tag string
}
func (a *auditLogDatabaseService) GetAuditLog(req *v1.GetAuditLogSearchRequest) (res *v1.GetAuditLogSearchResponse, err error) {
project, err := getProjectFromUrlScope(req.GetMetadata().UrlScope)
if err != nil {
return nil, err
}
req.Filter.Projects = []string{project}
return a.GetAuditLogByProjects(req)
}
func buildAggregators(aggr []models.AggregatorData) []*auditv1.GroupByType {
var groups = make([]*auditv1.GroupByType, 0)
for _, agg := range aggr {
groups = append(groups, &auditv1.GroupByType{
DocCount: int32(agg.Count),
Key: agg.Key,
})
}
return groups
}
func buildDataSource(logs []models.AuditLog) (ds []*auditv1.DataSource) {
for _, log := range logs {
data := &auditv1.Data{}
json.Unmarshal(log.Data, data)
data.Timestamp = log.Time.String()
data.Ts = log.Time.String()
ds = append(ds, &auditv1.DataSource{
XSource: &auditv1.DataSourceJSON{
Json: data,
},
},
)
}
return ds
}
func (a *auditLogDatabaseService) GetAuditLogByProjects(req *v1.GetAuditLogSearchRequest) (res *v1.GetAuditLogSearchResponse, err error) {
err = validateQueryString(req.GetFilter().QueryString)
if err != nil {
return nil, err
}
ctx := context.Background()
auditLogs, err := dao.GetAuditLogs(ctx, a.db, a.tag, req.Filter)
if err != nil {
return nil, err
}
// aggregations
_, err = dao.GetAuditLogAggregations(ctx, a.db, a.tag, "project", req.Filter)
if err != nil {
return nil, err
}
usernameAggr, err := dao.GetAuditLogAggregations(ctx, a.db, a.tag, "username", req.Filter)
if err != nil {
return nil, err
}
typeAggr, err := dao.GetAuditLogAggregations(ctx, a.db, a.tag, "type", req.Filter)
if err != nil {
return nil, err
}
response := &auditv1.AuditResponse{
Aggregations: &auditv1.Aggregations{
GroupByType: &auditv1.AggregatorGroup{
Buckets: buildAggregators(typeAggr),
},
GroupByUsername: &auditv1.AggregatorGroup{
Buckets: buildAggregators(usernameAggr),
},
},
Hits: &auditv1.Hits{Hits: buildDataSource(auditLogs)},
}
var resMap map[string]interface{}
data, err := json.Marshal(response)
if err != nil {
return nil, err
}
err = json.Unmarshal(data, &resMap)
if err != nil {
return nil, err
}
result, _ := structpb.NewStruct(resMap)
res = &v1.GetAuditLogSearchResponse{
Result: result,
}
return res, nil
}