Skip to content

Commit bbaf494

Browse files
committed
Move validation into model attributes
1 parent 04c1b3a commit bbaf494

File tree

11 files changed

+96
-38
lines changed

11 files changed

+96
-38
lines changed

IntegrationEngine.Tests/Api/Controllers/CronTriggerControllerTest.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ public void ShouldScheduleJobWhenCronTriggerIsCreatedWithValidCronExpression()
2020
};
2121
var engineScheduler = new Mock<IEngineScheduler>();
2222
engineScheduler.Setup(x => x.ScheduleJobWithCronTrigger(expected));
23-
engineScheduler.Setup(x => x.IsJobTypeRegistered(expected.JobType)).Returns(true);
2423
subject.EngineScheduler = engineScheduler.Object;
2524
var esRepository = new Mock<ESRepository<CronTrigger>>();
2625
esRepository.Setup(x => x.Insert(expected)).Returns(expected);

IntegrationEngine/Api/Controllers/CronTriggerController.cs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using System.Collections.Generic;
22
using System.Net;
3+
using System.Net.Http;
34
using System.Web.Http;
5+
using System.Web.Http.Cors;
46
using System.Web.Http.Description;
57
using IntegrationEngine.Core.Storage;
68
using IntegrationEngine.Scheduler;
7-
using System.Web.Http.Cors;
89

910
namespace IntegrationEngine.Api.Controllers
1011
{
@@ -44,12 +45,8 @@ public IHttpActionResult PutCronTrigger(string id, CronTrigger trigger)
4445
{
4546
if (id != trigger.Id)
4647
return BadRequest();
47-
if (!EngineScheduler.IsJobTypeRegistered(trigger.JobType))
48-
return BadRequest("Job type is invalid: " + trigger.JobType);
49-
if (!trigger.CronExpressionString.IsValidCronExpression())
50-
return BadRequest("Cron expression is not valid: " + trigger.CronExpressionString);
51-
if (!trigger.TimeZoneId.IsValidTimeZone())
52-
return BadRequest("Time zone id is invalid: " + trigger.TimeZoneId);
48+
if (ModelState.IsValid)
49+
BadRequest(ModelState);
5350
Repository.Update(trigger);
5451
EngineScheduler.ScheduleJobWithCronTrigger(trigger);
5552
return StatusCode(HttpStatusCode.NoContent);
@@ -59,12 +56,8 @@ public IHttpActionResult PutCronTrigger(string id, CronTrigger trigger)
5956
[ResponseType(typeof(CronTrigger))]
6057
public IHttpActionResult PostCronTrigger(CronTrigger trigger)
6158
{
62-
if (!EngineScheduler.IsJobTypeRegistered(trigger.JobType))
63-
return BadRequest("Job type is invalid: " + trigger.JobType);
64-
if (!trigger.CronExpressionString.IsValidCronExpression())
65-
return BadRequest("Cron expression is not valid: " + trigger.CronExpressionString);
66-
if (!trigger.TimeZoneId.IsValidTimeZone())
67-
return BadRequest("Time zone id is invalid: " + trigger.TimeZoneId);
59+
if (ModelState.IsValid)
60+
BadRequest(ModelState);
6861
var triggerWithId = Repository.Insert(trigger);
6962
EngineScheduler.ScheduleJobWithCronTrigger(triggerWithId);
7063
return CreatedAtRoute("DefaultApi", new { id = triggerWithId.Id }, triggerWithId);

IntegrationEngine/Api/Controllers/SimpleTriggerController.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ public IHttpActionResult PutSimpleTrigger(string id, SimpleTrigger trigger)
4949
{
5050
if (id != trigger.Id)
5151
return BadRequest();
52-
if (!EngineScheduler.IsJobTypeRegistered(trigger.JobType))
53-
return BadRequest("Job type is invalid: " + trigger.JobType);
52+
if (ModelState.IsValid)
53+
BadRequest(ModelState);
5454
Repository.Update(trigger);
5555
EngineScheduler.ScheduleJobWithSimpleTrigger(trigger);
5656
return StatusCode(HttpStatusCode.NoContent);
@@ -60,8 +60,8 @@ public IHttpActionResult PutSimpleTrigger(string id, SimpleTrigger trigger)
6060
[ResponseType(typeof(SimpleTrigger))]
6161
public IHttpActionResult PostSimpleTrigger(SimpleTrigger trigger)
6262
{
63-
if (!EngineScheduler.IsJobTypeRegistered(trigger.JobType))
64-
return BadRequest("Job type is invalid: " + trigger.JobType);
63+
if (ModelState.IsValid)
64+
BadRequest(ModelState);
6565
var triggerWithId = Repository.Insert(trigger);
6666
EngineScheduler.ScheduleJobWithSimpleTrigger(triggerWithId);
6767
return CreatedAtRoute("DefaultApi", new { id = triggerWithId.Id }, triggerWithId);

IntegrationEngine/Api/IntegrationEngineApi.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Web.Http;
22
using Microsoft.Owin.Host.HttpListener;
33
using Microsoft.Owin.Hosting;
4+
using Microsoft.Practices.Unity;
45

56
namespace IntegrationEngine.Api
67
{
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using System.ComponentModel.DataAnnotations;
3+
4+
namespace IntegrationEngine
5+
{
6+
public class CronExpressionStringAttribute : ValidationAttribute
7+
{
8+
public CronExpressionStringAttribute()
9+
{}
10+
11+
public override bool IsValid(object value)
12+
{
13+
string strValue = value as string;
14+
if (string.IsNullOrEmpty(strValue))
15+
return true;
16+
return Quartz.CronExpression.IsValidExpression(strValue);
17+
}
18+
}
19+
}
20+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using System.ComponentModel.DataAnnotations;
3+
using IntegrationEngine.Scheduler;
4+
using Microsoft.Practices.Unity;
5+
6+
namespace IntegrationEngine
7+
{
8+
public class JobTypeAttribute : ValidationAttribute
9+
{
10+
public JobTypeAttribute()
11+
{}
12+
13+
public override bool IsValid(object value)
14+
{
15+
string strValue = value as string;
16+
if (string.IsNullOrEmpty(strValue))
17+
return true;
18+
return ContainerSingleton.GetContainer()
19+
.Resolve<IEngineScheduler>()
20+
.IsJobTypeRegistered(strValue);
21+
}
22+
}
23+
}
24+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Linq;
3+
using System.ComponentModel.DataAnnotations;
4+
5+
namespace IntegrationEngine
6+
{
7+
public class TimeZoneIdAttribute : ValidationAttribute
8+
{
9+
public TimeZoneIdAttribute()
10+
{}
11+
12+
public override bool IsValid(object value)
13+
{
14+
string strValue = value as string;
15+
if (string.IsNullOrEmpty(strValue))
16+
return true;
17+
return TimeZoneInfo.GetSystemTimeZones().Where(x => x.Id == strValue).Any();
18+
}
19+
}
20+
}
21+

IntegrationEngine/IntegrationEngine.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@
172172
<Compile Include="Scheduler\TimeZone.cs" />
173173
<Compile Include="Scheduler\TriggerPropertyExtension.cs" />
174174
<Compile Include="Api\Controllers\JobTypeController.cs" />
175+
<Compile Include="DataAnnotations\JobTypeAttribute.cs" />
176+
<Compile Include="DataAnnotations\CronExpressionStringAttribute.cs" />
177+
<Compile Include="DataAnnotations\TimeZoneIdAttribute.cs" />
175178
</ItemGroup>
176179
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
177180
<ItemGroup>
@@ -201,4 +204,7 @@
201204
</ItemGroup>
202205
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
203206
<ItemGroup />
207+
<ItemGroup>
208+
<Folder Include="DataAnnotations\" />
209+
</ItemGroup>
204210
</Project>

IntegrationEngine/Scheduler/CronTrigger.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,23 @@
33
using Nest;
44
using System;
55
using QuartzTriggerState = Quartz.TriggerState;
6+
using System.ComponentModel.DataAnnotations;
67

78
namespace IntegrationEngine.Scheduler
89
{
910
public class CronTrigger : ICronTrigger, ICronTriggerReadOnly, IHasStateDescription
1011
{
1112
public string Id { get; set; }
13+
[Required]
14+
[JobType]
1215
public string JobType { get; set; }
16+
[Required]
17+
[CronExpressionString]
1318
public string CronExpressionString { get; set; }
19+
[Required]
20+
[TimeZoneId]
1421
public string TimeZoneId { get; set; }
22+
[Range(0, 1)]
1523
public int StateId { get; set; }
1624
[ElasticProperty(OptOut = true)]
1725
public string CronExpressionDescription { get { return ExpressionDescriptor.GetDescription(CronExpressionString); } }

IntegrationEngine/Scheduler/SimpleTrigger.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
using IntegrationEngine.Model;
1+
using System;
2+
using System.ComponentModel.DataAnnotations;
3+
using IntegrationEngine.Model;
24
using Nest;
3-
using System;
45
using QuartzTriggerState = Quartz.TriggerState;
56

67
namespace IntegrationEngine.Scheduler
78
{
89
public class SimpleTrigger : ISimpleTrigger, IHasStateDescription
910
{
1011
public string Id { get; set; }
12+
[Required]
13+
[JobType]
1114
public string JobType { get; set; }
1215
public int RepeatCount { get; set; }
1316
public TimeSpan RepeatInterval { get; set; }
1417
public DateTimeOffset StartTimeUtc { get; set; }
18+
[Range(0, 1)]
1519
public int StateId { get; set; }
1620
[ElasticProperty(OptOut = true)]
1721
public string StateDescription { get { return StateId.GetStateDescription(); } }

0 commit comments

Comments
 (0)