/// <summary> /// Heart of the getProductItems function. /// </summary> /// <param name="productIds"></param> /// <returns></returns> private ILookup <string, ProductItem> Core_getProductItems(string[] productIds, int[] itemIds = null) { productIds = productIds ?? new string[0]; itemIds = itemIds ?? new int[0]; // Build condition MySqlConditionBuilder condition = new MySqlConditionBuilder("product", MySqlDbType.String, productIds); condition.And(); condition.NewGroup(); foreach (var id in itemIds) { condition.Or() .Column("id") .Equals(id, MySqlDbType.Int32); } condition.EndGroup(); var itemPrimary = ProductItem.indexes.First(x => x.Type == Index.IndexType.PRIMARY).Columns[0]; // Ignore default item condition.And() .Column(itemPrimary.Column) .NotEquals(0, itemPrimary.Type); return(Connection.Select <ProductItem>(condition).ToLookup(x => x.ProductId)); }
/// <summary> /// Tries to find and return all items of a product type during a timespan that aren't reserved. /// </summary> /// <param name="productId">The product type whose items to return.</param> /// <param name="span">The time period to test for unreserved items.</param> /// <returns>A subset of all items of the given product type, or null if the product type has no items.</returns> private List <ProductItem> Core_GetUnreservedItems(string productId, DateTimeSpan span) { List <ProductItem> items = Core_getProductItems(new string[] { productId })[productId].ToList(); if (!items.Any()) { return(null); } var condition = new MySqlConditionBuilder(); condition.NewGroup(); foreach (var item in items) { condition.Or() .Column("product_item") .Equals(item.Id, item.GetIndex("PRIMARY").Columns[0].Type); } condition.EndGroup(); condition.And() .Column("end") .GreaterThanOrEqual() .Operand(span.Start, MySqlDbType.DateTime); condition.And() .Column("start") .LessThanOrEqual() .Operand(span.End, MySqlDbType.DateTime); List <LoanItem> loans = Connection.Select <LoanItem>(condition).ToList(); foreach (var loan in loans) { if (!items.Any(x => x.Id == loan.ProductItem)) { continue; } var loanSpan = new DateTimeSpan(loan.Start, loan.End); if (span.Overlaps(loanSpan)) { items.Remove(items.First(x => x.Id == loan.ProductItem)); } } return(items); }
public static MySqlConditionBuilder CreateCondition(JObject criteria, MySqlConditionBuilder condition = null) { condition = condition ?? new MySqlConditionBuilder(); condition.NewGroup(); int i = 0; foreach (KeyValuePair <string, JToken> pair in criteria) { if (i > 0) { condition.And(); } condition.Column(pair.Key); string value = (string)pair.Value; string[] operands = value.Split("OR"); foreach (string operand in operands) { string[] split = operand.Split(" "); if (split[0] == "LIKE") { condition.Like(split[1]); } else { condition.Equals(operand, MySql.Data.MySqlClient.MySqlDbType.String); } if (operands.Last() != operand) { condition.Or(); } } i++; } return(condition.EndGroup()); }
public JObject getLoans(JObject request) { // Get arguments request.TryGetValue("columns", out JToken requestColumns); request.TryGetValue("productItemIds", out JToken requestProductItems); request.TryGetValue("userId", out JToken requestUserId); request.TryGetValue("loanItemID", out JToken requestLoanId); request.TryGetValue("start", out JToken requestStart); request.TryGetValue("end", out JToken requestEnd); // Verify arguments List <string> failedVerifications = new List <string>(); if (requestColumns != null && (requestColumns.Type != JTokenType.Array || requestColumns.Any(x => x.Type != JTokenType.String))) { failedVerifications.Add("columns"); } if (requestProductItems != null && (requestProductItems.Type != JTokenType.Array || requestProductItems.Any(x => x.Type != JTokenType.String))) { failedVerifications.Add("productItemIds"); } if (requestUserId != null && requestUserId.Type != JTokenType.String) { failedVerifications.Add("userId"); } if (failedVerifications.Any()) { return(Templates.InvalidArguments(failedVerifications.ToArray())); } // Parse arguments DateTime start; DateTime end; try { start = requestStart == null ? new DateTime() : DateTime.Parse(requestStart.ToString()); } catch (Exception) { return(Templates.InvalidArgument("Unable to parse 'start'")); } try { end = requestEnd == null ? new DateTime() : DateTime.Parse(requestEnd.ToString()); } catch (Exception) { return(Templates.InvalidArgument("Unable to parse 'end'")); } // Prepare values if (requestColumns == null || requestColumns.Count() == 0) { requestColumns = new JArray(LoanItem.metadata.Select(x => x.Column)); } // Build condition var condition = new MySqlConditionBuilder(); if (requestProductItems != null && requestProductItems.Any()) { condition.NewGroup(); foreach (var productItem in requestProductItems) { condition.Or() .Column("product_item") .Equals(productItem, MySqlDbType.String); } condition.EndGroup(); } // Filter by specific loan id if (requestLoanId != null) { condition.And().Column("id").Equals(requestLoanId, MySqlDbType.Int32); } // Filter by user if (requestUserId != null) { condition.And().Column("user").Equals(requestUserId, MySqlDbType.String); } // Automatically limit results to current user only if their permission is User if (CurrentUser.Permission <= UserPermission.User) { condition.And().Column("user").Equals(CurrentUser.Username, MySqlDbType.String); } // Select only relevant loans if (requestStart != null) { condition.And().Column("end").GreaterThanOrEqual().Operand(start, MySqlDbType.DateTime); } if (requestEnd != null) { condition.And().Column("start").LessThanOrEqual().Operand(end, MySqlDbType.DateTime); } // Get loans var loans = Connection.Select <LoanItem>(requestColumns.ToObject <string[]>(), condition); // Build base response var responseData = new JArray(); JObject response = new JObject() { { "reason", null }, { "responseData", responseData } }; // Populate responseData foreach (var loanData in loans) { var item = new JObject(); for (int i = 0; i < requestColumns.Count(); i++) { if (loanData[i] is DateTime) { item[(string)requestColumns[i]] = new JValue(((DateTime)loanData[i]).ToUniversalTime().Subtract(Epoch).TotalMilliseconds); } else { item[(string)requestColumns[i]] = new JValue(loanData[i]); } } responseData.Add(item); } return(response); }
public JObject getImages(JObject request) { //Get arguments request.TryGetValue("columns", out JToken requestColumns); request.TryGetValue("images", out JToken requestImageIds); if (requestImageIds == null) { return(Templates.MissingArguments("imageIds")); } // Verify arguments List <string> failedVerifications = new List <string>(); if (requestColumns != null && (requestColumns.Type != JTokenType.Array || ((JArray)requestColumns).Count == 0)) { failedVerifications.Add("columns"); } if (requestImageIds.Type != JTokenType.Array) { failedVerifications.Add("images"); } if (failedVerifications.Any()) { return(Templates.InvalidArguments(failedVerifications.ToArray())); } // Build condition var condition = new MySqlConditionBuilder(); bool first = true; foreach (string id in requestImageIds) { if (!first) { condition.Or(); } condition.Column(Image.indexes.First(x => x.Type == Index.IndexType.PRIMARY).Columns[0].Column); condition.Equals(id, MySqlDbType.String); first = false; } // If condition is blank, add a condition that is false if (first) { condition.Not().Null().Is().Null(); } // Prepare query values if (requestColumns == null || !requestColumns.Any()) { requestColumns = new JArray(Image.metadata.Select(x => x.Column)); } // Add primary key column name ((JArray)requestColumns).Insert(0, Image.indexes.First(x => x.Type == Index.IndexType.PRIMARY).Columns[0].Column); // Get images List <object[]> imageData = Connection.Select <Image>(requestColumns.ToObject <string[]>(), condition).ToList(); //Create base response var responseData = new JObject(); var response = new JObject() { { "reason", null }, { "responseData", responseData } }; foreach (var data in imageData) { var item = new JObject(); for (int i = 1; i < requestColumns.Count(); i++) { item.Add((string)requestColumns[i], new JValue(data[i])); } responseData.Add((string)data[0], item); } return(response); }
public JObject getProducts(JObject request) { // Get request arguments request.TryGetValue("columns", out JToken requestColumns); request.TryGetValue("criteria", out JToken requestCriteria); request.TryGetValue("language", out JToken requestLanguages); request.TryGetValue("start", out JToken requestRangeStart); request.TryGetValue("amount", out JToken requestRangeAmount); MySqlConditionBuilder condition = new MySqlConditionBuilder(); // Verify the types of the arguments List <string> failedVerifications = new List <string>(); if (requestColumns != null && (requestColumns.Type != JTokenType.Array || requestColumns.Any(x => x.Type != JTokenType.String))) { failedVerifications.Add("colums"); } if (requestCriteria != null) { try { condition = Misc.CreateCondition((JObject)requestCriteria, condition); } catch (Exception) { failedVerifications.Add("criteria"); } } if (requestLanguages != null && (requestLanguages.Type != JTokenType.Array || requestLanguages.Any(x => x.Type != JTokenType.String))) { failedVerifications.Add("language"); } if (requestRangeStart != null && (requestRangeStart.Type != JTokenType.Integer)) { failedVerifications.Add("start"); } if (requestRangeAmount != null && (requestRangeAmount.Type != JTokenType.Integer)) { failedVerifications.Add("amount"); } if (failedVerifications.Any()) { return(Templates.InvalidArguments(failedVerifications.ToArray())); } //Create base response var responseData = new JArray(); JObject response = new JObject() { { "reason", null }, { "responseData", responseData } }; // Prepare values for database call var productPrimary = Product.indexes.First(x => x.Type == Index.IndexType.PRIMARY).Columns[0]; condition.And() .Column(productPrimary.Column) .NotEquals(0, productPrimary.Type); (ulong, ulong)range = (requestRangeStart?.ToObject <ulong>() ?? 0, requestRangeAmount?.ToObject <ulong>() ?? ulong.MaxValue); if (requestColumns == null || requestColumns.Count() == 0) { requestColumns = new JArray(Product.metadata.Select(x => x.Column)); } else if (requestLanguages != null && !requestColumns.Contains("name")) { ((JArray)requestColumns).Add("name"); } // Remove unknown language columns requestLanguages = new JArray(requestLanguages.Where(x => LanguageItem.metadata.Select(y => y.Column).Contains(x.ToString()))); // Request category data from database List <object[]> categoryData = Connection.Select <Product>(requestColumns.ToObject <string[]>(), condition, range).ToList(); // Add all categories as dictionaries to responseData foreach (var data in categoryData) { var item = new JObject(); for (int i = 0; i < requestColumns.Count(); i++) { item[(string)requestColumns[i]] = new JValue(data[i]); } responseData.Add(item); } // Add translations if specified in the arguments if (requestLanguages != null) { List <string> nameIds = responseData.Select(x => x["name"].ToString()).ToList(); // Build a condition to get all language items in one query var nameCondition = new MySqlConditionBuilder(); foreach (var name in nameIds) { nameCondition.Or(); nameCondition.Column("id"); nameCondition.Equals(name, MySqlDbType.String); } // Get the specified translations var languageColumns = requestLanguages.ToObject <List <string> >(); if (languageColumns.Count == 0) { languageColumns.AddRange(LanguageItem.metadata.Select(x => x.Column)); } else { languageColumns.Insert(0, "id"); } List <object[]> names = Connection.Select <LanguageItem>(languageColumns.ToArray(), nameCondition).ToList(); for (int i = 0; i < responseData.Count; i++) { var nameData = names.First(x => x[0].Equals(nameIds[i])); var translations = new JObject(); for (int j = 1; j < languageColumns.Count; j++) { if (nameData[j] != null) { translations[languageColumns[j]] = new JValue(nameData[j]); } } responseData[i]["name"] = translations; } } if (requestLanguages != null) { List <string> descIds = responseData.Select(x => x["description"].ToString()).ToList(); // Build a condition to get all language items in one query var descCondition = new MySqlConditionBuilder(); foreach (var desc in descIds) { descCondition.Or(); descCondition.Column("id"); descCondition.Equals(desc, MySqlDbType.String); } // Get the specified translations var languageColumns = requestLanguages.ToObject <List <string> >(); if (languageColumns.Count == 0) { languageColumns.AddRange(LanguageItem.metadata.Select(x => x.Column)); } else { languageColumns.Insert(0, "id"); } List <object[]> names = Connection.Select <LanguageItem>(languageColumns.ToArray(), descCondition).ToList(); for (int i = 0; i < responseData.Count; i++) { var nameData = names.First(x => x[0].Equals(descIds[i])); var translations = new JObject(); for (int j = 1; j < languageColumns.Count; j++) { if (nameData[j] != null) { translations[languageColumns[j]] = new JValue(nameData[j]); } } responseData[i]["description"] = translations; } } return(response); }