11namespace Rules . Framework . WebUI . Handlers
22{
33 using System ;
4+ using System . Collections . Generic ;
45 using System . Linq ;
56 using System . Net ;
7+ using System . Text . Json ;
68 using System . Threading . Tasks ;
9+ using System . Web ;
710 using Microsoft . AspNetCore . Http ;
811 using Rules . Framework . Generics ;
912 using Rules . Framework . WebUI . Dto ;
1013 using Rules . Framework . WebUI . Extensions ;
1114
1215 internal sealed class GetRulesHandler : WebUIRequestHandlerBase
1316 {
14- private const string dateFormat = "dd/MM/yyyy HH:mm:ss" ;
1517 private static readonly string [ ] resourcePath = new [ ] { "/{0}/api/v1/rules" } ;
16- private readonly IGenericRulesEngine rulesEngine ;
18+ private readonly IGenericRulesEngine genericRulesEngine ;
1719 private readonly IRuleStatusDtoAnalyzer ruleStatusDtoAnalyzer ;
1820
19- public GetRulesHandler ( IGenericRulesEngine rulesEngine , IRuleStatusDtoAnalyzer ruleStatusDtoAnalyzer , WebUIOptions webUIOptions ) : base ( resourcePath , webUIOptions )
21+ public GetRulesHandler ( IGenericRulesEngine genericRulesEngine , IRuleStatusDtoAnalyzer ruleStatusDtoAnalyzer , WebUIOptions webUIOptions ) : base ( resourcePath , webUIOptions )
2022 {
21- this . rulesEngine = rulesEngine ;
23+ this . genericRulesEngine = genericRulesEngine ;
2224 this . ruleStatusDtoAnalyzer = ruleStatusDtoAnalyzer ;
2325 }
2426
2527 protected override HttpMethod HttpMethod => HttpMethod . GET ;
2628
27- protected override async Task HandleRequestAsync ( HttpRequest httpRequest , HttpResponse httpResponse , RequestDelegate next )
29+ protected override async Task HandleRequestAsync ( HttpRequest httpRequest ,
30+ HttpResponse httpResponse ,
31+ RequestDelegate next )
2832 {
29- if ( ! httpRequest . Query . TryGetValue ( "contentType" , out var contentTypeName ) )
33+ var rulesFilter = this . GetRulesFilterFromRequest ( httpRequest ) ;
34+
35+ if ( ! IsValidFilterDates ( rulesFilter ) )
3036 {
31- await this . WriteResponseAsync ( httpResponse , new { Message = "contentType is required " } , ( int ) HttpStatusCode . BadRequest )
32- . ConfigureAwait ( false ) ;
37+ await this . WriteResponseAsync ( httpResponse , new { Message = "Date begin cannot be greater than after " } , ( int ) HttpStatusCode . BadRequest )
38+ . ConfigureAwait ( false ) ;
3339
3440 return ;
3541 }
3642
3743 try
3844 {
39- var genericRules = await this . rulesEngine . SearchAsync (
40- new SearchArgs < GenericContentType , GenericConditionType > (
41- new GenericContentType { Identifier = contentTypeName } ,
42- DateTime . MinValue , DateTime . MaxValue ) )
43- . ConfigureAwait ( false ) ;
44-
45- var rules = Enumerable . Empty < RuleDto > ( ) ;
46-
47- var priorityCriteria = this . rulesEngine . GetPriorityCriteria ( ) ;
45+ var rules = new List < RuleDto > ( ) ;
4846
49- if ( genericRules != null && genericRules . Any ( ) )
47+ if ( rulesFilter . ContentType . Equals ( "all" ) )
5048 {
51- if ( priorityCriteria == PriorityCriterias . BottommostRuleWins )
52- {
53- genericRules = genericRules . OrderByDescending ( r => r . Priority ) ;
54- }
55- else
49+ var contents = this . genericRulesEngine . GetContentTypes ( ) ;
50+
51+ foreach ( var identifier in contents . Select ( c => c . Identifier ) )
5652 {
57- genericRules = genericRules . OrderBy ( r => r . Priority ) ;
53+ var rulesForContentType = await this . GetRulesForContentyType ( identifier , rulesFilter ) . ConfigureAwait ( false ) ;
54+ rules . AddRange ( rulesForContentType ) ;
5855 }
59-
60- rules = genericRules . Select ( g => g . ToRuleDto ( this . ruleStatusDtoAnalyzer ) ) ;
56+ }
57+ else
58+ {
59+ var rulesForContentType = await this . GetRulesForContentyType ( rulesFilter . ContentType , rulesFilter ) . ConfigureAwait ( false ) ;
60+ rules . AddRange ( rulesForContentType ) ;
6161 }
6262
6363 await this . WriteResponseAsync ( httpResponse , rules , ( int ) HttpStatusCode . OK ) . ConfigureAwait ( false ) ;
@@ -67,5 +67,85 @@ protected override async Task HandleRequestAsync(HttpRequest httpRequest, HttpRe
6767 await this . WriteExceptionResponseAsync ( httpResponse , ex ) . ConfigureAwait ( false ) ;
6868 }
6969 }
70+
71+ private static bool IsValidFilterDates ( RulesFilterDto rulesFilter )
72+ {
73+ return ( rulesFilter . DateBegin is null
74+ || rulesFilter . DateEnd is null ) ||
75+ ( rulesFilter . DateBegin <= rulesFilter . DateEnd ) ;
76+ }
77+
78+ private IEnumerable < RuleDto > ApplyFilters ( RulesFilterDto rulesFilter , IEnumerable < RuleDto > genericRulesDto )
79+ {
80+ if ( ! string . IsNullOrWhiteSpace ( rulesFilter . Content ) )
81+ {
82+ genericRulesDto = genericRulesDto . Where ( g =>
83+ {
84+ return JsonSerializer . Serialize ( g . Value ) . Contains ( rulesFilter . Content , StringComparison . OrdinalIgnoreCase ) ;
85+ } ) ;
86+ }
87+
88+ if ( ! string . IsNullOrWhiteSpace ( rulesFilter . Name ) )
89+ {
90+ genericRulesDto = genericRulesDto . Where ( g =>
91+ {
92+ return g . Name . Contains ( rulesFilter . Name , StringComparison . OrdinalIgnoreCase ) ;
93+ } ) ;
94+ }
95+ if ( rulesFilter . Status != null )
96+ {
97+ genericRulesDto = genericRulesDto . Where ( g =>
98+ {
99+ return g . Status . Equals ( rulesFilter . Status . ToString ( ) ) ;
100+ } ) ;
101+ }
102+
103+ return genericRulesDto ;
104+ }
105+
106+ private RulesFilterDto GetRulesFilterFromRequest ( HttpRequest httpRequest )
107+ {
108+ var parseQueryString = HttpUtility . ParseQueryString ( httpRequest . QueryString . Value ) ;
109+
110+ var rulesFilterAsString = JsonSerializer . Serialize ( parseQueryString . Cast < string > ( ) . ToDictionary ( k => k , v => string . IsNullOrWhiteSpace ( parseQueryString [ v ] ) ? null : parseQueryString [ v ] ) ) ;
111+ var rulesFilter = JsonSerializer . Deserialize < RulesFilterDto > ( rulesFilterAsString , this . SerializerOptions ) ;
112+
113+ rulesFilter . ContentType = string . IsNullOrWhiteSpace ( rulesFilter . ContentType ) ? "all" : rulesFilter . ContentType ;
114+
115+ rulesFilter . DateEnd ??= DateTime . MaxValue ;
116+
117+ rulesFilter . DateBegin ??= DateTime . MinValue ;
118+
119+ return rulesFilter ;
120+ }
121+
122+ private async Task < IEnumerable < RuleDto > > GetRulesForContentyType ( string identifier , RulesFilterDto rulesFilter )
123+ {
124+ var genericRules = await this . genericRulesEngine . SearchAsync (
125+ new SearchArgs < GenericContentType , GenericConditionType > (
126+ new GenericContentType { Identifier = identifier } ,
127+ rulesFilter . DateBegin . Value , rulesFilter . DateEnd . Value ) )
128+ . ConfigureAwait ( false ) ;
129+
130+ var priorityCriteria = this . genericRulesEngine . GetPriorityCriteria ( ) ;
131+
132+ if ( genericRules != null && genericRules . Any ( ) )
133+ {
134+ if ( priorityCriteria == PriorityCriterias . BottommostRuleWins )
135+ {
136+ genericRules = genericRules . OrderByDescending ( r => r . Priority ) ;
137+ }
138+ else
139+ {
140+ genericRules = genericRules . OrderBy ( r => r . Priority ) ;
141+ }
142+
143+ var genericRulesDto = this . ApplyFilters ( rulesFilter , genericRules . Select ( g => g . ToRuleDto ( identifier , this . ruleStatusDtoAnalyzer ) ) ) ;
144+
145+ return genericRulesDto ;
146+ }
147+
148+ return Enumerable . Empty < RuleDto > ( ) ;
149+ }
70150 }
71151}
0 commit comments