-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathOrdersFeed.cs
More file actions
166 lines (157 loc) · 10.1 KB
/
OrdersFeed.cs
File metadata and controls
166 lines (157 loc) · 10.1 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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
using System;
using System.Collections.Generic;
using System.Linq;
using OpenActive.Server.NET.OpenBookingHelper;
using OpenActive.NET.Rpde.Version1;
using OpenActive.NET;
using OpenActive.FakeDatabase.NET;
using ServiceStack.OrmLite;
using System.Threading.Tasks;
namespace BookingSystem
{
public class AcmeOrdersFeedRpdeGenerator : OrdersRPDEFeedModifiedTimestampAndID
{
//public override string FeedPath { get; protected set; } = "example path override";
protected override async Task<List<RpdeItem>> GetRPDEItems(string clientId, long? afterTimestamp, string afterId)
{
// Note if using SQL Server it is best to use rowversion as the modified value for the Orders table,
// and update this class to inherit from OrdersRPDEFeedIncrementingUniqueChangeNumber
// (to use afterChangeNumber, instead of afterTimestamp and afterId)
using (var db = FakeBookingSystem.FakeDatabase.DatabaseWrapper.Database.Open())
{
long afterTimestampLong = afterTimestamp ?? 0;
var q = db.From<OrderTable>()
.LeftJoin<OrderTable, OrderItemsTable>((orders, items) => orders.OrderId == items.OrderId)
.OrderBy(x => x.OrderModified)
.ThenBy(x => x.OrderId)
.Where(x =>
x.VisibleInOrdersFeed != FeedVisibility.None && x.ClientId == clientId && (
x.OrderModified > afterTimestampLong ||
(x.OrderModified == afterTimestamp &&
// Note this comparison will fail OpenActive validation if using SQL Server GUIDs due to the SQL Server GUID ordering
// Use SQL Server rowversion and OrdersRPDEFeedIncrementingUniqueChangeNumber instead
string.Compare(afterId, x.OrderId, StringComparison.InvariantCulture) > 0)) &&
x.OrderModified < (DateTimeOffset.UtcNow - new TimeSpan(0, 0, 2)).UtcTicks)
.Take(RPDEPageSize);
var query = db
.SelectMulti<OrderTable, OrderItemsTable>(q)
.GroupBy(x => new { x.Item1.OrderId })
.Select(result => new
{
OrderTable = result.Select(item => new { item.Item1 }).FirstOrDefault()?.Item1,
OrderItemsTable = result.Select(item => new { item.Item2 }).ToList().Select(orderItem => orderItem.Item2).ToList()
})
.Select(result => new RpdeItem
{
Kind = RpdeKind.Order,
Id = result.OrderTable.OrderId,
Modified = result.OrderTable.OrderModified,
State = result.OrderTable.Deleted || result.OrderTable.VisibleInOrdersFeed == FeedVisibility.Archived ? RpdeState.Deleted : RpdeState.Updated,
Data = result.OrderTable.Deleted || result.OrderTable.VisibleInOrdersFeed == FeedVisibility.Archived ? null :
AcmeOrderStore.RenderOrderFromDatabaseResult(RenderOrderId(result.OrderTable.OrderMode == OrderMode.Proposal ? OrderType.OrderProposal : OrderType.Order, new Guid(result.OrderTable.OrderId)), result.OrderTable,
result.OrderItemsTable.Select(orderItem => new OrderItem
{
Id = RenderOrderItemId(OrderType.Order, new Guid(result.OrderTable.OrderId), orderItem.Id),
AcceptedOffer = new Offer
{
Id = orderItem.OfferJsonLdId,
Price = orderItem.Price,
PriceCurrency = "GBP"
},
OrderedItem = orderItem.OpportunityJsonLdId,
AccessChannel = orderItem.MeetingUrl != null ? new VirtualLocation()
{
Name = "Zoom Video Chat",
Url = orderItem.MeetingUrl,
AccessId = orderItem.MeetingId,
AccessCode = orderItem.MeetingPassword,
Description = "Please log into Zoom a few minutes before the event"
} : null,
AccessCode = orderItem.PinCode != null ? new List<PropertyValue>
{
new PropertyValue()
{
Name = "Pin Code",
Description = orderItem.PinCode,
Value = "defaultValue"
}
} : null,
AccessPass = orderItem.BarCodeText != null ? new List<ImageObject>
{
new Barcode()
{
Url = new Uri(orderItem.ImageUrl),
Text = orderItem.BarCodeText,
CodeType = "code128"
}
} : null,
OrderItemStatus =
orderItem.Status == BookingStatus.Confirmed ? OrderItemStatus.OrderItemConfirmed :
orderItem.Status == BookingStatus.CustomerCancelled ? OrderItemStatus.CustomerCancelled :
orderItem.Status == BookingStatus.SellerCancelled ? OrderItemStatus.SellerCancelled :
orderItem.Status == BookingStatus.Attended ? OrderItemStatus.AttendeeAttended :
orderItem.Status == BookingStatus.Absent ? OrderItemStatus.AttendeeAbsent : (OrderItemStatus?)null,
CancellationMessage = orderItem.CancellationMessage,
CustomerNotice = orderItem.CustomerNotice,
}).ToList()
)
});
return query.ToList();
}
}
}
public class AcmeOrderProposalsFeedRpdeGenerator : OrdersRPDEFeedModifiedTimestampAndID
{
//public override string FeedPath { get; protected set; } = "example path override";
protected override async Task<List<RpdeItem>> GetRPDEItems(string clientId, long? afterTimestamp, string afterId)
{
using (var db = FakeBookingSystem.FakeDatabase.DatabaseWrapper.Database.Open())
{
long afterTimestampLong = afterTimestamp ?? 0;
var q = db.From<OrderTable>()
.LeftJoin<OrderTable, OrderItemsTable>((orders, items) => orders.OrderId == items.OrderId)
.OrderBy(x => x.OrderProposalModified)
.ThenBy(x => x.OrderId)
.Where(x =>
x.VisibleInOrderProposalsFeed != FeedVisibility.None && x.ClientId == clientId && (
x.OrderProposalModified > afterTimestampLong ||
(x.OrderProposalModified == afterTimestamp &&
// Note this comparison will fail OpenActive validation if using SQL Server GUIDs due to the SQL Server GUID ordering
// Use SQL Server rowversion and OrdersRPDEFeedIncrementingUniqueChangeNumber instead
string.Compare(afterId, x.OrderId, StringComparison.InvariantCulture) > 0)) &&
x.OrderProposalModified < (DateTimeOffset.UtcNow - new TimeSpan(0, 0, 2)).UtcTicks)
.Take(RPDEPageSize);
var query = db
.SelectMulti<OrderTable, OrderItemsTable>(q)
.GroupBy(x => new { x.Item1.OrderId })
.Select(result => new
{
OrderTable = result.Select(item => new { item.Item1 }).FirstOrDefault()?.Item1,
OrderItemsTable = result.Select(item => new { item.Item2 }).ToList().Select(orderItem => orderItem.Item2).ToList()
})
.Select(result => new RpdeItem
{
Kind = RpdeKind.Order,
Id = result.OrderTable.OrderId,
Modified = result.OrderTable.OrderProposalModified,
State = result.OrderTable.Deleted || result.OrderTable.VisibleInOrderProposalsFeed == FeedVisibility.Archived ? RpdeState.Deleted : RpdeState.Updated,
Data = result.OrderTable.Deleted || result.OrderTable.VisibleInOrderProposalsFeed == FeedVisibility.Archived ? null :
AcmeOrderStore.RenderOrderFromDatabaseResult(RenderOrderId(result.OrderTable.OrderMode == OrderMode.Proposal ? OrderType.OrderProposal : OrderType.Order, new Guid(result.OrderTable.OrderId)), result.OrderTable,
result.OrderItemsTable.Select(orderItem => new OrderItem
{
Id = RenderOrderItemId(OrderType.Order, new Guid(result.OrderTable.OrderId), orderItem.Id),
AcceptedOffer = new Offer
{
Id = orderItem.OfferJsonLdId,
Price = orderItem.Price,
PriceCurrency = "GBP"
},
OrderedItem = orderItem.OpportunityJsonLdId
}).ToList()
)
});
return query.ToList();
}
}
}
}