コード例 #1
0
        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);
        }