allow user to disable decision deduplication (#1687)

* allow user to disable decision deduplication
This commit is contained in:
Thibault "bui" Koechlin 2022-08-26 14:17:46 +02:00 committed by GitHub
parent 1f5224b74b
commit bacea50485
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 8 deletions

View file

@ -140,6 +140,11 @@ func (c *Controller) StreamDecision(gctx *gin.Context) {
filters["scopes"] = []string{"ip,range"} filters["scopes"] = []string{"ip,range"}
} }
dedup := true
if v, ok := filters["dedup"]; ok && v[0] == "false" {
dedup = false
}
// if the blocker just start, return all decisions // if the blocker just start, return all decisions
if val, ok := gctx.Request.URL.Query()["startup"]; ok { if val, ok := gctx.Request.URL.Query()["startup"]; ok {
if val[0] == "true" { if val[0] == "true" {
@ -150,7 +155,7 @@ func (c *Controller) StreamDecision(gctx *gin.Context) {
return return
} }
//data = KeepLongestDecision(data) //data = KeepLongestDecision(data)
ret["new"], err = FormatDecisions(data, true) ret["new"], err = FormatDecisions(data, dedup)
if err != nil { if err != nil {
log.Errorf("unable to format expired decision for '%s' : %v", bouncerInfo.Name, err) log.Errorf("unable to format expired decision for '%s' : %v", bouncerInfo.Name, err)
gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
@ -164,7 +169,7 @@ func (c *Controller) StreamDecision(gctx *gin.Context) {
gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
return return
} }
ret["deleted"], err = FormatDecisions(data, true) ret["deleted"], err = FormatDecisions(data, dedup)
if err != nil { if err != nil {
log.Errorf("unable to format expired decision for '%s' : %v", bouncerInfo.Name, err) log.Errorf("unable to format expired decision for '%s' : %v", bouncerInfo.Name, err)
gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
@ -193,7 +198,7 @@ func (c *Controller) StreamDecision(gctx *gin.Context) {
return return
} }
//data = KeepLongestDecision(data) //data = KeepLongestDecision(data)
ret["new"], err = FormatDecisions(data, true) ret["new"], err = FormatDecisions(data, dedup)
if err != nil { if err != nil {
log.Errorf("unable to format new decision for '%s' : %v", bouncerInfo.Name, err) log.Errorf("unable to format new decision for '%s' : %v", bouncerInfo.Name, err)
gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
@ -207,7 +212,7 @@ func (c *Controller) StreamDecision(gctx *gin.Context) {
gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()})
return return
} }
ret["deleted"], err = FormatDecisions(data, true) ret["deleted"], err = FormatDecisions(data, dedup)
if err != nil { if err != nil {
log.Errorf("unable to format expired decision for '%s' : %v", bouncerInfo.Name, err) log.Errorf("unable to format expired decision for '%s' : %v", bouncerInfo.Name, err)
gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) gctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error()})

View file

@ -97,8 +97,12 @@ func BuildDecisionRequestWithFilter(query *ent.DecisionQuery, filter map[string]
func (c *Client) QueryAllDecisionsWithFilters(filters map[string][]string) ([]*ent.Decision, error) { func (c *Client) QueryAllDecisionsWithFilters(filters map[string][]string) ([]*ent.Decision, error) {
query := c.Ent.Decision.Query().Where( query := c.Ent.Decision.Query().Where(
decision.UntilGT(time.Now().UTC()), decision.UntilGT(time.Now().UTC()),
longestDecisionForScopeTypeValue,
) )
//Allow a bouncer to ask for non-deduplicated results
if v, ok := filters["dedup"]; !ok || v[0] != "false" {
query = query.Where(longestDecisionForScopeTypeValue)
}
query, err := BuildDecisionRequestWithFilter(query, filters) query, err := BuildDecisionRequestWithFilter(query, filters)
if err != nil { if err != nil {
@ -117,8 +121,12 @@ func (c *Client) QueryAllDecisionsWithFilters(filters map[string][]string) ([]*e
func (c *Client) QueryExpiredDecisionsWithFilters(filters map[string][]string) ([]*ent.Decision, error) { func (c *Client) QueryExpiredDecisionsWithFilters(filters map[string][]string) ([]*ent.Decision, error) {
query := c.Ent.Decision.Query().Where( query := c.Ent.Decision.Query().Where(
decision.UntilLT(time.Now().UTC()), decision.UntilLT(time.Now().UTC()),
longestDecisionForScopeTypeValue,
) )
//Allow a bouncer to ask for non-deduplicated results
if v, ok := filters["dedup"]; !ok || v[0] != "false" {
query = query.Where(longestDecisionForScopeTypeValue)
}
query, err := BuildDecisionRequestWithFilter(query, filters) query, err := BuildDecisionRequestWithFilter(query, filters)
if err != nil { if err != nil {
@ -219,8 +227,11 @@ func (c *Client) QueryExpiredDecisionsSinceWithFilters(since time.Time, filters
query := c.Ent.Decision.Query().Where( query := c.Ent.Decision.Query().Where(
decision.UntilLT(time.Now().UTC()), decision.UntilLT(time.Now().UTC()),
decision.UntilGT(since), decision.UntilGT(since),
longestDecisionForScopeTypeValue,
) )
//Allow a bouncer to ask for non-deduplicated results
if v, ok := filters["dedup"]; !ok || v[0] != "false" {
query = query.Where(longestDecisionForScopeTypeValue)
}
query, err := BuildDecisionRequestWithFilter(query, filters) query, err := BuildDecisionRequestWithFilter(query, filters)
if err != nil { if err != nil {
c.Log.Warningf("QueryExpiredDecisionsSinceWithFilters : %s", err) c.Log.Warningf("QueryExpiredDecisionsSinceWithFilters : %s", err)
@ -240,8 +251,11 @@ func (c *Client) QueryNewDecisionsSinceWithFilters(since time.Time, filters map[
query := c.Ent.Decision.Query().Where( query := c.Ent.Decision.Query().Where(
decision.CreatedAtGT(since), decision.CreatedAtGT(since),
decision.UntilGT(time.Now().UTC()), decision.UntilGT(time.Now().UTC()),
longestDecisionForScopeTypeValue,
) )
//Allow a bouncer to ask for non-deduplicated results
if v, ok := filters["dedup"]; !ok || v[0] != "false" {
query = query.Where(longestDecisionForScopeTypeValue)
}
query, err := BuildDecisionRequestWithFilter(query, filters) query, err := BuildDecisionRequestWithFilter(query, filters)
if err != nil { if err != nil {
c.Log.Warningf("QueryNewDecisionsSinceWithFilters : %s", err) c.Log.Warningf("QueryNewDecisionsSinceWithFilters : %s", err)