public JObject addLoan(JObject request) { //Get arguments request.TryGetValue("productId", out JToken requestProductId); request.TryGetValue("start", out JToken requestStart); request.TryGetValue("end", out JToken requestEnd); // Verify the arguments List <string> failedVerifications = new List <string>(); if (requestProductId == null || requestProductId.Type != JTokenType.String) { failedVerifications.Add("productID"); } if (requestStart == null || !(requestStart.Type == JTokenType.String || requestStart.Type == JTokenType.Date)) { failedVerifications.Add("start"); } if (requestEnd == null || !(requestEnd.Type == JTokenType.String || requestEnd.Type == JTokenType.Date)) { failedVerifications.Add("end"); } if (failedVerifications.Any()) { return(Templates.InvalidArguments(failedVerifications.ToArray())); } // Parse arguments DateTime start; DateTime end; string productId = requestProductId.ToString(); try { start = DateTime.Parse(requestStart.ToString()); } catch (Exception) { return(Templates.InvalidArgument("Unable to parse 'start'")); } try { end = DateTime.Parse(requestEnd.ToString()); } catch (Exception) { return(Templates.InvalidArgument("Unable to parse 'end'")); } if (end < start) { return(Templates.InvalidArguments("'end' must come after 'start'")); } var newLoanSpan = new DateTimeSpan(start, end); if (newLoanSpan.Start < DateTime.Now.Date) { return(Templates.InvalidArgument("'start' may not be set earlier than today.")); } if (newLoanSpan.Duration > MaxLoanDuration) { return(Templates.InvalidArgument($"Duration of the loan may not exceed {MaxLoanDuration.Days} days.")); } // Get an unreserved product item ProductItem item; try { item = Core_GetUnreservedItems(productId, newLoanSpan).FirstOrDefault(); } catch (Exception) { return(Templates.NoItemsForProduct(productId)); } if (item == null) { return(Templates.NoItemsForProduct($"Product '{productId}' has no items available during this time.")); } var loan = new LoanItem(null, CurrentUser.Username, item.Id.Value, start, end); Connection.Upload(loan); //Create response JObject response = new JObject() { { "reason", null }, { "responseData", new JObject() { { "loanId", loan.Id }, { "productItem", item.Id } } } }; return(response); }