Skip to content

Commit 424e9d4

Browse files
committed
Readd current RefProvider and split into V1 and V2 namespaces
1 parent ea865bf commit 424e9d4

16 files changed

Lines changed: 274 additions & 38 deletions

File tree

src/api/Nhs.Appointments.Api/FunctionConfigurationExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@
2828
using Nhs.Appointments.Core.Messaging;
2929
using Nhs.Appointments.Core.Okta;
3030
using Nhs.Appointments.Core.ReferenceNumber;
31+
using Nhs.Appointments.Core.ReferenceNumber.V1;
32+
using Nhs.Appointments.Core.ReferenceNumber.V2;
3133
using Nhs.Appointments.Core.Reports;
3234
using Nhs.Appointments.Core.Reports.SiteSummary;
3335
using Nhs.Appointments.Persistance;
36+
using Nhs.Appointments.Persistance.Reference;
3437

3538
namespace Nhs.Appointments.Api;
3639

@@ -70,6 +73,7 @@ public static IFunctionsWorkerApplicationBuilder ConfigureFunctionDependencies(
7073

7174
builder.Services
7275
.Configure<CosmosDataStoreOptions>(opts => opts.DatabaseName = "appts")
76+
.Configure<ReferenceGroupOptions>(opts => opts.InitialGroupCount = 100)
7377
.Configure<SiteSummaryOptions>(opts =>
7478
{
7579
opts.DaysForward = configuration.GetValue<int>("SITE_SUMMARY_DAYS_FORWARD");
@@ -94,11 +98,13 @@ public static IFunctionsWorkerApplicationBuilder ConfigureFunctionDependencies(
9498
.AddTransient<IAvailabilityCreatedEventStore, AvailabilityCreatedEventDocumentStore>()
9599
.AddTransient<IBookingsDocumentStore, BookingCosmosDocumentStore>()
96100
.AddTransient<IBookingReferenceDocumentStore, BookingReferenceCosmosDocumentStore>()
101+
.AddTransient<IReferenceNumberDocumentStore, ReferenceGroupCosmosDocumentStore>()
97102
.AddTransient<IEulaStore, EulaStore>()
98103
.AddTransient<IUserStore, UserStore>()
99104
.AddTransient<IRolesStore, RolesStore>()
100105
.AddTransient<IRolesService, RolesService>()
101106
.AddTransient<ISiteStore, SiteStore>()
107+
.AddTransient<IReferenceNumberProvider, ReferenceNumberProvider>()
102108
.AddTransient<IEmailWhitelistStore, EmailWhitelistStore>()
103109
.AddTransient<INotificationConfigurationStore, NotificationConfigurationStore>()
104110
.AddTransient<IAccessibilityDefinitionsStore, AccessibilityDefinitionsStore>()

src/api/Nhs.Appointments.Core/BookingWriteService.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using Nhs.Appointments.Core.Messaging;
44
using Nhs.Appointments.Core.Messaging.Events;
55
using Nhs.Appointments.Core.ReferenceNumber;
6+
using Nhs.Appointments.Core.ReferenceNumber.V1;
7+
using Nhs.Appointments.Core.ReferenceNumber.V2;
68

79
namespace Nhs.Appointments.Core;
810

@@ -43,7 +45,8 @@ Task<BookingRecalculationsStatistics> RecalculateAppointmentStatuses(string site
4345
public class BookingWriteService(
4446
IBookingsDocumentStore bookingDocumentStore,
4547
IBookingQueryService bookingQueryService,
46-
IProvider provider,
48+
IReferenceNumberProvider referenceNumberProviderV1,
49+
IProvider referenceNumberProviderV2,
4750
ISiteLeaseManager siteLeaseManager,
4851
IBookingAvailabilityStateService bookingAvailabilityStateService,
4952
IBookingEventFactory eventFactory,
@@ -71,7 +74,10 @@ public class BookingWriteService(
7174
}
7275

7376
booking.Created = time.GetUtcNow();
74-
booking.Reference = await provider.GetReferenceNumber();
77+
78+
booking.Reference = await referenceNumberProviderV1.GetReferenceNumber(booking.Site);
79+
80+
booking.Reference = await referenceNumberProviderV2.GetReferenceNumber();
7581
booking.ReminderSent = false;
7682
booking.AvailabilityStatus = AvailabilityStatus.Supported;
7783
await bookingDocumentStore.InsertAsync(booking);

src/api/Nhs.Appointments.Core/Features/Flags.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public static class Flags
99
public const string CancelDay = "CancelDay";
1010
public const string ChangeSessionUpliftedJourney = "ChangeSessionUpliftedJourney";
1111
public const string QuerySites = "QuerySites";
12+
public const string BookingReferenceV2 = "BookingReferenceV2";
1213

1314
#region TestFlags
1415
//a simple on/off global flag

src/api/Nhs.Appointments.Core/ISiteStore.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
namespace Nhs.Appointments.Core;
22

33
public interface ISiteStore
4-
{
4+
{
55
Task<Site> GetSiteById(string siteId);
66
Task<OperationResult> UpdateAccessibilities(string siteId, IEnumerable<Accessibility> accessibilities);
77
Task<OperationResult> UpdateInformationForCitizens(string siteId, string informationForCitizens);
88

99
Task<OperationResult> UpdateSiteDetails(string siteId, string name, string address, string phoneNumber,
1010
decimal? longitude,
1111
decimal? latitude);
12-
12+
1313
Task<OperationResult> UpdateSiteReferenceDetails(string siteId, string odsCode, string icb, string region);
14-
14+
1515
Task<IEnumerable<Site>> GetAllSites(bool includeDeleted = false);
1616

17+
Task AssignPrefix(string site, int prefix);
18+
Task<int> GetReferenceNumberGroup(string site);
19+
1720
Task<OperationResult> SaveSiteAsync(string siteId, string odsCode, string name, string address, string phoneNumber,
18-
string icb, string region, Location location, IEnumerable<Accessibility> accessibilities, string type, SiteStatus? siteStatus = null, bool? isDeleted = null);
21+
string icb, string region, Location location, IEnumerable<Accessibility> accessibilities, string type,
22+
SiteStatus? siteStatus = null, bool? isDeleted = null);
1923

2024
Task<IEnumerable<Site>> GetSitesInRegionAsync(string region);
2125

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
namespace Nhs.Appointments.Core.ReferenceNumber.V1;
2+
3+
public interface IReferenceNumberProvider
4+
{
5+
Task<string> GetReferenceNumber(string siteId);
6+
}
7+
8+
public class ReferenceNumberProvider : IReferenceNumberProvider
9+
{
10+
private readonly ISiteStore _siteStore;
11+
private readonly IReferenceNumberDocumentStore _referenceNumberDocumentStore;
12+
private readonly TimeProvider _timeProvider;
13+
public ReferenceNumberProvider(
14+
ISiteStore siteStore,
15+
IReferenceNumberDocumentStore referenceNumberDocumentStore,
16+
TimeProvider timeProvider)
17+
{
18+
_siteStore = siteStore;
19+
_referenceNumberDocumentStore = referenceNumberDocumentStore;
20+
_timeProvider = timeProvider;
21+
}
22+
public async Task<string> GetReferenceNumber(string siteId)
23+
{
24+
var referenceGroup = await _siteStore.GetReferenceNumberGroup(siteId);
25+
if (referenceGroup == 0)
26+
{
27+
referenceGroup = await _referenceNumberDocumentStore.AssignReferenceGroup();
28+
await _siteStore.AssignPrefix(siteId, referenceGroup);
29+
}
30+
31+
var sequence = await _referenceNumberDocumentStore.GetNextSequenceNumber(referenceGroup);
32+
var now = _timeProvider.GetUtcNow();
33+
var rng = now.Day + now.Second;
34+
35+
return $"{referenceGroup:00}-{rng:00}-{sequence:000000}";
36+
}
37+
}
38+
39+
public interface IReferenceNumberDocumentStore
40+
{
41+
Task<int> AssignReferenceGroup();
42+
Task<int> GetNextSequenceNumber(int prefix);
43+
}

src/api/Nhs.Appointments.Core/ReferenceNumber/Options.cs renamed to src/api/Nhs.Appointments.Core/ReferenceNumber/V2/Options.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace Nhs.Appointments.Core.ReferenceNumber;
1+
namespace Nhs.Appointments.Core.ReferenceNumber.V2;
22

33
public class ReferenceNumberOptions
44
{

src/api/Nhs.Appointments.Core/ReferenceNumber/Provider.cs renamed to src/api/Nhs.Appointments.Core/ReferenceNumber/V2/Provider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using Microsoft.Extensions.Caching.Memory;
77
using Microsoft.Extensions.Options;
88

9-
namespace Nhs.Appointments.Core.ReferenceNumber;
9+
namespace Nhs.Appointments.Core.ReferenceNumber.V2;
1010

1111
public interface IProvider
1212
{

src/api/Nhs.Appointments.Persistance/Models/BookingReferenceDocument.cs renamed to src/api/Nhs.Appointments.Persistance/Models/Reference/BookingReferenceDocument.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace Nhs.Appointments.Persistance.Models;
1+
namespace Nhs.Appointments.Persistance.Models.Reference;
22

33
[CosmosDocumentType("system")]
44
public class BookingReferenceDocument : CoreDataCosmosDocument
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Nhs.Appointments.Persistance.Models.Reference;
2+
3+
[CosmosDocumentType("reference_group")]
4+
public class ReferenceGroupDocument : CoreDataCosmosDocument
5+
{
6+
public ReferenceGroup[] Groups { get; set; }
7+
}
8+
9+
public class ReferenceGroup
10+
{
11+
public int Prefix { get; set; }
12+
public int SiteCount { get; set; }
13+
public int Sequence { get; set; }
14+
}

src/api/Nhs.Appointments.Persistance/Models/SiteDocument.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ public class SiteDocument : CoreDataCosmosDocument
3333
/// </summary>
3434
public double? Latitude => Location?.Coordinates[1];
3535

36-
[JsonProperty("informationForCitizens")] public string InformationForCitizens { get; set; }
36+
[JsonProperty("informationForCitizens")]
37+
public string InformationForCitizens { get; set; }
38+
39+
[JsonProperty("referenceNumberGroup")] public int ReferenceNumberGroup { get; set; }
3740

3841
[JsonProperty("accessibilities")] public Accessibility[] Accessibilities { get; set; }
3942

0 commit comments

Comments
 (0)