-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathReferenceNumberProvider.cs
More file actions
60 lines (50 loc) · 2.09 KB
/
ReferenceNumberProvider.cs
File metadata and controls
60 lines (50 loc) · 2.09 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
using Nhs.Appointments.Core.Caching;
using Nhs.Appointments.Core.Sites;
namespace Nhs.Appointments.Core.Bookings;
public interface IReferenceNumberProvider
{
Task<string> GetReferenceNumber(string siteId);
}
public class ReferenceNumberProvider : IReferenceNumberProvider
{
private readonly ISiteService _siteService;
private readonly ICacheService _cacheService;
private readonly IReferenceNumberDocumentStore _referenceNumberDocumentStore;
private readonly TimeProvider _timeProvider;
public ReferenceNumberProvider(
ISiteService siteService,
ICacheService cacheService,
IReferenceNumberDocumentStore referenceNumberDocumentStore,
TimeProvider timeProvider)
{
_siteService = siteService;
_cacheService = cacheService;
_referenceNumberDocumentStore = referenceNumberDocumentStore;
_timeProvider = timeProvider;
}
public async Task<string> GetReferenceNumber(string siteId)
{
var referenceNumberGroup =
await _cacheService.GetCacheValue(
$"site:referenceNumberGroup:{siteId}",
new CacheOptions<int>(
async () => await GetSitesAssignedReferenceGroup(siteId),
TimeSpan.FromHours(24)));
var sequence = await _referenceNumberDocumentStore.GetNextSequenceNumber(referenceNumberGroup);
var now = _timeProvider.GetUtcNow();
var rng = now.Day + now.Second;
return $"{referenceNumberGroup:00}-{rng:00}-{sequence:000000}";
}
private async Task<int> GetSitesAssignedReferenceGroup(string siteId)
{
var site = await _siteService.GetSiteByIdAsync(siteId, true);
if (!SiteHasNotBeenAssignedReferenceGroup(site))
{
return site.ReferenceNumberGroup;
}
var referenceGroup = await _referenceNumberDocumentStore.AssignReferenceGroup();
await _siteService.AssignPrefix(siteId, referenceGroup);
return referenceGroup;
}
private static bool SiteHasNotBeenAssignedReferenceGroup(Site site) => site.ReferenceNumberGroup == 0;
}