<% '======================================================================================================================= ' Orders Repository '======================================================================================================================= Class OrdersRepository_Class ' Creates a new order row for the given email/jurisdiction, generates a single-use ' token that expires after OrderTokenExpirationHours, and returns that token. Public Function CreateOrder(email, jurisdictionNumber) Dim token, expiresAt token = NewGuid() expiresAt = DateAdd("h", TokenExpirationHours(), Now()) DAL.Execute _ "INSERT INTO Orders (Email, JurisdictionNumber, Token, TokenExpiresAt, CreatedAt) VALUES (?, ?, ?, ?, ?)", _ Array(email, jurisdictionNumber, token, expiresAt, Now()) CreateOrder = token End Function ' Returns a Scripting.Dictionary of Scripting.Dictionary rows for every order, newest first. Public Function GetAll() Dim rs, results, order Set results = Server.CreateObject("Scripting.Dictionary") Set rs = DAL.Query( _ "SELECT OrderID, Email, JurisdictionNumber, Token, TokenExpiresAt, TokenUsedAt, CreatedAt FROM Orders ORDER BY OrderID DESC", _ Empty) Do While Not rs.EOF Set order = Server.CreateObject("Scripting.Dictionary") order.Add "OrderID", rs("OrderID").Value order.Add "Email", rs("Email").Value order.Add "JurisdictionNumber", rs("JurisdictionNumber").Value order.Add "Token", rs("Token").Value order.Add "TokenExpiresAt", rs("TokenExpiresAt").Value order.Add "TokenUsedAt", rs("TokenUsedAt").Value order.Add "CreatedAt", rs("CreatedAt").Value results.Add rs("OrderID").Value, order rs.MoveNext Loop Destroy rs Set GetAll = results End Function ' Returns a Scripting.Dictionary of Scripting.Dictionary rows (newest first) matching searchTerm ' against Email or JurisdictionNumber (all rows if searchTerm is blank), one page at a time. ' page_count/record_count are returned by reference for building pagination controls. Public Function SearchPaged(searchTerm, per_page, page_num, ByRef page_count, ByRef record_count) Dim sql, params sql = "SELECT OrderID, Email, JurisdictionNumber, Token, TokenExpiresAt, TokenUsedAt, CreatedAt FROM Orders" page_count = 0 record_count = 0 If Len(Trim(searchTerm)) > 0 Then sql = sql & " WHERE Email LIKE ? OR JurisdictionNumber LIKE ?" params = Array("%" & searchTerm & "%", "%" & searchTerm & "%") Else params = Empty End If sql = sql & " ORDER BY OrderID DESC" Dim rs : Set rs = DAL.PagedQuery(sql, params, per_page, page_num) If Not rs.EOF Then rs.PageSize = per_page rs.AbsolutePage = page_num page_count = rs.PageCount record_count = rs.RecordCount End If Dim results, order, x Set results = Server.CreateObject("Scripting.Dictionary") x = 0 Do While (per_page <= 0 Or x < per_page) And Not rs.EOF Set order = Server.CreateObject("Scripting.Dictionary") order.Add "OrderID", rs("OrderID").Value order.Add "Email", rs("Email").Value order.Add "JurisdictionNumber", rs("JurisdictionNumber").Value order.Add "Token", rs("Token").Value order.Add "TokenExpiresAt", rs("TokenExpiresAt").Value order.Add "TokenUsedAt", rs("TokenUsedAt").Value order.Add "CreatedAt", rs("CreatedAt").Value results.Add rs("OrderID").Value, order x = x + 1 rs.MoveNext Loop Destroy rs Set SearchPaged = results End Function ' Returns a Scripting.Dictionary describing the order matching the given token, or Nothing if not found. Public Function FindByToken(token) Dim rs Set rs = DAL.Query( _ "SELECT OrderID, Email, JurisdictionNumber, Token, TokenExpiresAt, TokenUsedAt, CreatedAt FROM Orders WHERE Token = ?", _ Array(token)) If rs.EOF Then Set FindByToken = Nothing Else Dim order : Set order = Server.CreateObject("Scripting.Dictionary") order.Add "OrderID", rs("OrderID").Value order.Add "Email", rs("Email").Value order.Add "JurisdictionNumber", rs("JurisdictionNumber").Value order.Add "Token", rs("Token").Value order.Add "TokenExpiresAt", rs("TokenExpiresAt").Value order.Add "TokenUsedAt", rs("TokenUsedAt").Value order.Add "CreatedAt", rs("CreatedAt").Value Set FindByToken = order End If Destroy rs End Function Public Sub MarkTokenUsed(orderId) DAL.Execute "UPDATE Orders SET TokenUsedAt = ? WHERE OrderID = ?", Array(Now(), orderId) End Sub Private Function TokenExpirationHours() Dim setting : setting = GetAppSetting("OrderTokenExpirationHours") If setting = "nothing" Or Not IsNumeric(setting) Then TokenExpirationHours = 24 Else TokenExpirationHours = CInt(setting) End If End Function End Class Dim OrdersRepository__Singleton Function OrdersRepository() If IsEmpty(OrdersRepository__Singleton) Then Set OrdersRepository__Singleton = New OrdersRepository_Class End If Set OrdersRepository = OrdersRepository__Singleton End Function %>