Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: merge Lorem Fitsum features into Reference Implementation feeds #215

Merged
merged 21 commits into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UserSecretsId>aspnet-BookingSystem.AspNetCore-443B4F82-A20C-41CE-9924-329A0BCF0D14</UserSecretsId>
<Configurations>Release;Debug</Configurations>
</PropertyGroup>

<ItemGroup>
Expand All @@ -22,4 +23,5 @@
<NoWarn>1701;1702;1591</NoWarn>
</PropertyGroup>

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " />
</Project>
339 changes: 203 additions & 136 deletions Examples/BookingSystem.AspNetCore/Feeds/FacilitiesFeeds.cs

Large diffs are not rendered by default.

429 changes: 321 additions & 108 deletions Examples/BookingSystem.AspNetCore/Feeds/SessionsFeeds.cs

Large diffs are not rendered by default.

306 changes: 306 additions & 0 deletions Examples/BookingSystem.AspNetCore/Helpers/FeedGenerationHelper.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
"profiles": {
"BookingSystem.AspNetCore": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "https://localhost:5001/openactive",
"applicationUrl": "https://localhost:5001",
"environmentVariables": {
Expand Down
37 changes: 37 additions & 0 deletions Examples/BookingSystem.AspNetCore/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,41 @@ This implementation is also used as a reference implementation for the [Test Sui

## Running Locally

1. In Visual Studio, run the BookingSystem.AspNetCore project

When it's finished building, it will open a page in your browser with a randomly assigned port e.g. http://localhost:55603/. Make note of this port.

Head to `http://localhost:{PORT}/openactive` to check that the project is running correctly. You should see an Open Data landing page.
2. Head to BookingSystem.AspNetCore project options and add an env var using the port you made note of earlier:

`ApplicationHostBaseUrl: http://localhost:{PORT}`
3. Now, re-run the project. You're good to go 👍

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this still true? I think I removed this at some point in a PR because this no longer seems to be true. For example the port assignment. I at some point removed and re-installed the project, run it with dotnet run and it always uses 5001.

The section in CONTRIBUTING.md shows how I run it. I think recommending using dotnet CLI is useful because the IDE in use will always rely on that CLI, and some users will use VSCode, or some users may not use an IDE and just git clone the project and run it.

But I do agree with you that that section focuses on how to run it with Test Suite and thus requires running the IdentityServer. But to run it just as a standalone reference implementation (w/o reference to Test Suite), the IdentityServer part should be ignored

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep since launchSettings.json fixed the port, this has no longer been the case. Have fixed

See the [project contribution documentation](/CONTRIBUTING.md) for details on how to run BookingSystem.AspNetCore locally.

## Reference Implementation Data Generation

Reference Implementation has three main uses that make it very important in the OpenActive ecosystem:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need to do either:

  1. Make it clear that "BookingSystem.AspNetCore" is synonymous with "Reference Implementation", which is not exactly explicit in the top section of this README
  2. Or just always call the project BookingSystem.AspNetCore in the README

My personal opinion is # 2 because OpenActive may need to broaden the meaning of "Reference Implementation" at a later date (e.g. if there are future reference implementations in other languages)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep makes sense, I've added a comment about that.

- For data publishers / booking systems: It is used to demonstrate the properties and shape of data and APIs, according to the OpenActive specifications
- For data users / brokers: It is used as a trial integration where testing can be done with no ramifications
- For contributors: It is used to ensure the Test Suite tests are correct and passing, for different combinations of Open Booking API features.
Comment on lines +39 to +41
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unbelievably useful to finally spell this out — good shout!


The data for the sample feeds are generated in two places:
- BookingSystem.AspNetCore/Feeds/*Feeds.cs
- OpenActive.FakeDatabase.NET/Fakes/FakeBookingSystem.cs

The FakeBookingSystem within OpenActive.FakeDatabase.NET acts as the interface to an example database.
The example Feeds within BookingSystem.AspNetCore query this interface and translate the data to conform with the OpenActive Modelling Spec.

Due to this split of functionality, the sample data in the feeds are created/transformed in both files, depending on whether they are important to booking
or not. For example, `Price` is important to booking and there is generated in FakeBookingSystem at startup and stored in the in-memory database. However `Terms Of Service` is not
needed for booking, and therefore is generated at request time.
Comment on lines +50 to +52
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also appreciated!


### Lorem Fitsum mode
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe this section should refer to how to set Lorem Fitsum mode?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeh done

When Reference Implementation is run in Lorem Fitsum mode, the data generated contains all the possible fields specified by the OpenActive Modelling Specification.
civsiv marked this conversation as resolved.
Show resolved Hide resolved
They are unrealistic representations of data, and the presence of all the fields should not be relied on when developing front-end representations of the data.
However it is very useful for data consumers and deciding on how to present the data to the users.

### Golden Records
Golden records are randomly generated records that have maximally enriched properties in the generated data. For example where a record might have one image normally, a golden record will have four.

1 change: 1 addition & 0 deletions Examples/BookingSystem.AspNetCore/Settings/AppSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class FeatureSettings
public bool OnlyFreeOpportunities { get; set; } = false;
public bool PrepaymentAlwaysRequired { get; set; } = false;
public bool FacilityUseHasSlots { get; set; } = false;
public bool IsLoremFitsumMode { get; set; } = false;
}

public class PaymentSettings
Expand Down
12 changes: 10 additions & 2 deletions Examples/BookingSystem.AspNetCore/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,22 @@ public Startup(IConfiguration configuration)
configuration.Bind(AppSettings);

// Provide a simple way to disable token auth for some testing scenarios
if (System.Environment.GetEnvironmentVariable("DISABLE_TOKEN_AUTH") == "true") {
if (System.Environment.GetEnvironmentVariable("DISABLE_TOKEN_AUTH") == "true")
{
AppSettings.FeatureFlags.EnableTokenAuth = false;
}

// Provide a simple way to enable FacilityUseHasSlots for some testing scenarios
if (System.Environment.GetEnvironmentVariable("FACILITY_USE_HAS_SLOTS") == "true") {
if (System.Environment.GetEnvironmentVariable("FACILITY_USE_HAS_SLOTS") == "true")
{
AppSettings.FeatureFlags.FacilityUseHasSlots = true;
}

// Provide a simple way to enable CI mode
if (System.Environment.GetEnvironmentVariable("IS_LOREM_FITSUM_MODE") == "true")
{
AppSettings.FeatureFlags.IsLoremFitsumMode = true;
}
}

public AppSettings AppSettings { get; }
Expand Down
7 changes: 4 additions & 3 deletions Examples/BookingSystem.AspNetCore/Stores/FacilityStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using BookingSystem.AspNetCore.Helpers;
using OpenActive.DatasetSite.NET;
using OpenActive.FakeDatabase.NET;
using OpenActive.NET;
Expand Down Expand Up @@ -320,7 +321,7 @@ protected override async Task GetOrderItems(List<OrderItemContext<FacilityOpport
}),
Name = facility.Name,
Url = new Uri("https://example.com/events/" + slot.FacilityUseId),
Location = _fakeBookingSystem.Database.GetPlaceById(facility.PlaceId),
Location = FeedGenerationHelper.GetPlaceById(facility.PlaceId),
FacilityType = new List<Concept> {
new Concept
{
Expand Down Expand Up @@ -374,11 +375,11 @@ protected override async Task GetOrderItems(List<OrderItemContext<FacilityOpport
// Note this should always be driven from the database, with new FacilityOpportunity's instantiated
Id = RenderOpportunityId(new FacilityOpportunity
{
OpportunityType = _appSettings.FeatureFlags.FacilityUseHasSlots ? OpportunityType.FacilityUseSlot : OpportunityType.IndividualFacilityUseSlot,
OpportunityType = _appSettings.FeatureFlags.FacilityUseHasSlots ? OpportunityType.FacilityUseSlot : OpportunityType.IndividualFacilityUseSlot,
FacilityUseId = slot.FacilityUseId,
SlotId = slot.Id,
IndividualFacilityUseId = !_appSettings.FeatureFlags.FacilityUseHasSlots ? slot.IndividualFacilityUseId : null,
}),
}),
FacilityUse = slotParent,
StartDate = (DateTimeOffset)slot.Start,
EndDate = (DateTimeOffset)slot.End,
Expand Down
4 changes: 2 additions & 2 deletions Examples/BookingSystem.AspNetCore/Stores/SessionStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
using OpenActive.FakeDatabase.NET;
using RequiredStatusType = OpenActive.FakeDatabase.NET.RequiredStatusType;
using System.Threading.Tasks;

using BookingSystem.AspNetCore.Helpers;

namespace BookingSystem
{
Expand Down Expand Up @@ -361,7 +361,7 @@ protected override async Task GetOrderItems(List<OrderItemContext<SessionOpportu
}),
Name = @class.Title,
Url = new Uri("https://example.com/events/" + occurrence.ClassId),
Location = _fakeBookingSystem.Database.GetPlaceById(@class.PlaceId),
Location = FeedGenerationHelper.GetPlaceById(@class.PlaceId),
Activity = new List<Concept>
{
new Concept
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public static void AddPropertiesToBookedOrderItem(IOrderItemContext ctx, BookedO
new PropertyValue()
{
Name = "Pin Code",
Description = bookedOrderItemInfo.PinCode,
Description = bookedOrderItemInfo.PinCode
}
};
ctx.ResponseOrderItem.AccessPass = new List<ImageObject>
Expand Down
Loading
Loading