forked from ServiceStack/ServiceStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOrmLiteValidationSource.cs
More file actions
111 lines (95 loc) · 3.92 KB
/
Copy pathOrmLiteValidationSource.cs
File metadata and controls
111 lines (95 loc) · 3.92 KB
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
102
103
104
105
106
107
108
109
110
111
using System;
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using ServiceStack.Auth;
using ServiceStack.Caching;
using ServiceStack.Data;
using ServiceStack.OrmLite;
using ServiceStack.Text;
namespace ServiceStack
{
public class OrmLiteValidationSource : IValidationSource, IRequiresSchema, IValidationSourceAdmin, IClearable
{
public IDbConnectionFactory DbFactory { get; }
public ICacheClient Cache { get; }
public TimeSpan? CacheDuration { get; }
public string NamedConnection { get; set; }
public OrmLiteValidationSource(IDbConnectionFactory dbFactory=null, ICacheClient cache=null, TimeSpan? cacheDuration=null)
{
DbFactory = dbFactory
?? HostContext.TryResolve<IDbConnectionFactory>()
?? throw new ArgumentNullException(nameof(dbFactory));
Cache = cache;
}
public IEnumerable<KeyValuePair<string, IValidateRule>> GetValidationRules(Type type)
{
if (Cache == null)
return GetDbValidationRules(type);
if (CacheDuration == null)
return Cache.GetOrCreate(nameof(IValidationSource) + "." + type.Name, () => GetDbValidationRules(type));
return Cache.GetOrCreate(nameof(IValidationSource) + "." + type.Name, CacheDuration.Value, () => GetDbValidationRules(type));
}
private IEnumerable<KeyValuePair<string, IValidateRule>> GetDbValidationRules(Type type)
{
using var db = OpenDbConnection();
var rows = db.Select<ValidationRule>(x => x.Type == type.Name && x.SuspendedDate == null);
var to = rows.Map(x => new KeyValuePair<string, IValidateRule>(x.Field, x));
return to;
}
private IDbConnection OpenDbConnection()
{
var db = NamedConnection == null
? DbFactory.OpenDbConnection()
: DbFactory.OpenDbConnection(NamedConnection);
return db;
}
public void InitSchema()
{
using var db = OpenDbConnection();
db.CreateTableIfNotExists<ValidationRule>();
}
public async Task<List<ValidationRule>> GetAllValidateRulesAsync()
{
using var db = OpenDbConnection();
var rows = await db.SelectAsync<ValidationRule>().ConfigAwait();
return rows;
}
public async Task<List<ValidationRule>> GetAllValidateRulesAsync(string typeName)
{
using var db = OpenDbConnection();
var rows = await db.SelectAsync<ValidationRule>(x => x.Type == typeName).ConfigAwait();
return rows;
}
public async Task SaveValidationRulesAsync(List<ValidationRule> validateRules)
{
using var db = OpenDbConnection();
await db.SaveAllAsync(validateRules).ConfigAwait();
ClearValidationSourceCache();
}
public async Task<List<ValidationRule>> GetValidateRulesByIdsAsync(params int[] ids)
{
using var db = OpenDbConnection();
var rows = await db.SelectByIdsAsync<ValidationRule>(ids).ConfigAwait();
return rows;
}
private void ClearValidationSourceCache() => Cache?.RemoveByPattern(nameof(IValidationSource) + ".*");
public async Task DeleteValidationRulesAsync(params int[] ids)
{
using var db = OpenDbConnection();
await db.DeleteByIdsAsync<ValidationRule>(ids).ConfigAwait();
ClearValidationSourceCache();
}
public Task ClearCacheAsync()
{
ClearValidationSourceCache();
return TypeConstants.EmptyTask;
}
public void Clear()
{
using var db = OpenDbConnection();
db.DeleteAll<ValidationRule>();
Cache?.RemoveByPattern(nameof(IValidationSource) + ".*");
}
}
}