public JObject deleteUser(JObject request) { //Get arguments string username; request.TryGetValue("username", out JToken usernameValue); if (usernameValue == null || usernameValue.Type != JTokenType.String) { return(Templates.MissingArguments("username")); } else { username = usernameValue.ToObject <string>(); } //Check if user exists User user = GetObject <User>(username, "Username"); if (user == null) { return(Templates.NoSuchUser(username)); } //Create + return response object return(new JObject() { { "reason", null }, { "responseData", new JObject() } }); }
public JObject deleteProductItem(JObject request) { //Get arguments request.TryGetValue("productItemID", out JToken idValue); if (idValue == null || idValue.Type != JTokenType.String) { return(Templates.MissingArguments("productItemID")); } string productID = idValue.ToString(); if (productID == "0") { return(Templates.InvalidArgument("productID")); } //Check if productItem exists ProductItem item = GetObject <ProductItem>(productID); if (item == null) { return(Templates.NoSuchProduct(productID)); } item.Delete(Connection); //Create base response return(new JObject() { { "reason", null }, }); }
public JObject deleteProductCategory(JObject request) { //Get arguments request.TryGetValue("categoryID", out JToken idValue); if (idValue == null || idValue.Type != JTokenType.String) { return(Templates.MissingArguments("productID")); } // Prepare values string categoryID = idValue.ToString(); //Check if product exists ProductCategory category = GetObject <ProductCategory>(categoryID); if (category == null) { return(Templates.NoSuchProductCategory(categoryID)); } // Delete category and relate category.Delete(Connection); category.GetName(Connection).Delete(Connection); //Create base response return(new JObject() { { "reason", null }, { "success", true } }); }
public JObject setLoanAcquired(JObject request) { // Get arguments request.TryGetValue("loanItemID", out JToken requestLoanItemId); request.TryGetValue("value", out JToken requestAcquiredValue); // Verify presence of arguments var failedVerifications = new List <string>(); if (requestLoanItemId == null) { failedVerifications.Add("loanItemID"); } if (requestAcquiredValue == null) { failedVerifications.Add("value"); } if (failedVerifications.Any()) { return(Templates.MissingArguments(failedVerifications.ToArray())); } // Verify arguments if (requestLoanItemId.Type != JTokenType.Integer) { failedVerifications.Add("loanItemID"); } if (requestAcquiredValue.Type != JTokenType.Boolean) { failedVerifications.Add("value"); } if (failedVerifications.Any()) { return(Templates.InvalidArguments(failedVerifications.ToArray())); } // Get loanItem var condition = new MySqlConditionBuilder("id", MySqlDbType.Int32, (object)requestLoanItemId.ToObject <int>()); var loanItem = Connection.Select <LoanItem>(condition).FirstOrDefault(); if (loanItem == null) { return(Templates.NoSuchLoan(requestLoanItemId.ToString())); } // Update the IsAcquired value if it isn't equal to the 'value' argument if ((bool)requestAcquiredValue != loanItem.IsAcquired) { loanItem.IsAcquired = (bool)requestAcquiredValue; Connection.Update(loanItem); } //Create base response return(new JObject() { { "reason", null } }); }
public JObject updateProductItem(JObject request) { //Validate arguments string productItemID; string productID = null; request.TryGetValue("productItemID", out JToken itemIdValue); request.TryGetValue("productID", out JToken idValue); if (itemIdValue == null || itemIdValue.Type != JTokenType.String) { return(Templates.MissingArguments("productItemID")); } else { productItemID = itemIdValue.ToObject <string>(); } if (idValue != null || idValue.Type != JTokenType.String) { productID = idValue.ToObject <string>(); if (productID == "0") { return(Templates.InvalidArgument("productID")); } } //Get product, if it exists Product product = GetObject <Product>(productID); if (product == null) { return(Templates.NoSuchProduct(productID)); } //get productItem, if it exists ProductItem item = GetObject <ProductItem>(productItemID); if (item == null) { return(Templates.NoSuchProductItem(productItemID)); } //Change product ID, if necessary if (productID != null) { item.ProductId = productID; } item.Update(Connection); //Create response return(new JObject() { { "reason", null }, }); }
public JObject addProductItem(JObject request) { //Get arguments string productID; int count; request.TryGetValue("productID", out JToken productIDValue); request.TryGetValue("count", out JToken countValue); if (productIDValue == null || productIDValue.Type != JTokenType.String) { return(Templates.MissingArguments("productID")); } else { productID = productIDValue.ToObject <string>(); } if (countValue == null || countValue.Type != JTokenType.Integer) { count = 1; } else { count = countValue.ToObject <int>(); if (count > 30) { return(Templates.InvalidArgument("count")); } } //Check if product exists Product product = GetObject <Product>(productID); if (product == null) { return(Templates.NoSuchProduct(productID)); } //Create productItems List <int> IDs = new List <int>(); for (int i = count; i != 0; i--) { ProductItem item = new ProductItem(null, productID); item.Upload(Connection); IDs.Add(item.Id.Value); } //Create response return(new JObject() { { "reason", null }, { "responseData", new JArray(IDs) } }); }
public JObject registerUser(JObject request) { //Verify user details request.TryGetValue("username", out JToken usernameValue); request.TryGetValue("password", out JToken passwordValue); if (usernameValue == null || passwordValue == null || usernameValue.Type == JTokenType.Null || passwordValue.Type == JTokenType.Null) { return(Templates.MissingArguments("username, password")); } string username = usernameValue.ToString(); string password = passwordValue.ToString(); //Verify username if (!Misc.verifyUsernameLength(username) || !Misc.verifyUsernameRegex(username)) { return(Templates.InvalidUsername); } //Check if password is a SHA-512 hash. //This checks whether the password string is the correct length for a SHA-512 hash, and if it is a proper hexadecimal number. //It's possible for people directly calling the API to create a user with a password that wasn't salted with their username (should we fix this?), but I doubt anyone would do that. //Also regex is weird and I do not like it. if (password.Length != 128 && !System.Text.RegularExpressions.Regex.IsMatch(password, @"\A\b[0-9a-fA-F]+\b\Z")) { return(Templates.InvalidPassword); } //Check if username already exists if (GetObject <User>(username, "Username") != null) { return(Templates.AlreadyExists(username)); } //Create user long token = (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; User user = new User(username, password, token, UserPermission.User); user.Upload(Connection); //Create response object JObject response = new JObject() { { "reason", null }, { "responseData", new JObject() { { "userToken", (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds }, { "permissionLevel", 0 } } } }; return(response); }
public JObject getProductItems(JObject request) { // Get request arguments request.TryGetValue("products", out JToken requestProductIds); request.TryGetValue("itemIds", out JToken requestItemIds); // Verify the presence of at least one argument if (requestProductIds == null && requestItemIds == null) { return(Templates.MissingArguments("products", "itemIds")); } // Verify the argument if (requestProductIds != null && (requestProductIds.Type != JTokenType.Array || requestProductIds.Any(x => x.Type != JTokenType.String))) { return(Templates.InvalidArgument("products")); } if (requestItemIds != null && (requestItemIds.Type != JTokenType.Array || requestItemIds.Any(x => x.Type != JTokenType.Integer))) { return(Templates.InvalidArgument("itemIds")); } //Create base response var responseData = new JObject(); JObject response = new JObject() { { "reason", null }, { "responseData", responseData } }; // Prepare values requestProductIds = requestProductIds ?? new JArray(); requestItemIds = requestItemIds ?? new JArray(); // Request ProductItem data from database ILookup <string, ProductItem> productItemData = Core_getProductItems(requestProductIds.ToObject <string[]>(), requestItemIds.ToObject <int[]>()); // Add all grouped productItems as dictionaries to responseData foreach (var data in productItemData) { // Creates an array with the key of the productId, containing all associated items var items = new JArray(); foreach (var productItem in data) { items.Add(productItem.Id); } responseData[data.Key] = items; } return(response); }
/// <summary> /// Gets the user info from the request and sets the <see cref="CurrentUser"/> value. /// If <see cref="CurrentUser"/> is already set, this function does nothing. /// </summary> /// <remarks> /// In case this returns false, the response value must be returned to the client. /// </remarks> /// <param name="request">The request from whom to take the user info.</param> /// <param name="response">A response JObject. In case of an error, this will be an error JSON. Otherwise always null.</param> /// <returns>True if no errors were encountered. Otherwise false.</returns> private bool GetUser(JObject request, out JObject response) { // Prevent redundant calls if (CurrentUser != null) { response = null; return(true); } request.TryGetValue("username", out JToken username); request.TryGetValue("token", out JToken token); // Verify arguments var missing = new List <string>(); if (username == null) { missing.Add("username"); } if (token == null) { missing.Add("token"); } if (missing.Any()) { response = Templates.MissingArguments(missing.ToArray()); return(false); } // If the token can't be parsed, respond with 'InvalidArgument' if (!long.TryParse(token.ToString(), out long _)) { response = Templates.InvalidArgument("token"); return(false); } // Get user, or if no user was found, respond with "InvalidLogin" CurrentUser = GetObject <User>(username, "username"); if (CurrentUser == null) { response = Templates.InvalidLogin; return(false); } // Verification succeeded response = null; return(true); }
public JObject login(JObject request) { //Verify user details request.TryGetValue("username", out JToken usernameValue); request.TryGetValue("password", out JToken passwordValue); if (usernameValue.Type == JTokenType.Null || passwordValue.Type == JTokenType.Null) { return(Templates.MissingArguments("username, password")); } string username = usernameValue.ToString(); string password = passwordValue.ToString(); User user = GetObject <User>(username, "Username"); if (user == null || user.Password != password) { return(Templates.InvalidLogin); } long token = (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; user.Token = token; user.Update(Connection); //Create + return response object JObject response = new JObject() { { "reason", null }, { "responseData", new JObject() { { "token", token }, { "permissionLevel", (int)user.Permission } } } }; 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 deleteProductItems(JObject request) { //Get arguments request.TryGetValue("productID", out JToken requestProductId); request.TryGetValue("count", out JToken requestCount); // Verify presence of arguments var failedVerifications = new List <string>(); if (requestProductId == null) { failedVerifications.Add("productID"); } if (requestCount == null) { failedVerifications.Add("count"); } if (failedVerifications.Any()) { return(Templates.MissingArguments(failedVerifications.ToArray())); } // Verify arguments if (requestProductId.Type != JTokenType.String) { failedVerifications.Add("productId"); } if (requestCount.Type != JTokenType.Integer || ((int)requestCount) < 0) { failedVerifications.Add("count"); } if (failedVerifications.Any()) { return(Templates.InvalidArguments(failedVerifications.ToArray())); } // Get all productItems var condition = new MySqlConditionBuilder("product", MySqlDbType.String, requestProductId.ToString()); var productItems = Connection.Select <ProductItem>(condition).ToArray(); // Return bare response if no items exist if (!productItems.Any()) { return(new JObject() { { "reason", null }, { "responseData", new JObject() { { "deleted", 0 }, { "ignored", 0 } } } }); } // Get all aquired loans that have yet to end condition = new MySqlConditionBuilder("product_item", MySqlDbType.Int32, productItems.Select(x => x.Id).Cast <object>().ToArray()); condition.And() .Column("end") .GreaterThanOrEqual() .Operand(DateTime.Now, MySqlDbType.DateTime); condition.And() .Column("is_item_acquired") .Equals().True(); var loans = Connection.Select <LoanItem>(condition).ToArray(); // Create function to track how many product items were ignored and how many weren't int ignored = 0; int notIgnored = 0; bool shouldIgnoreLoanedItem(ProductItem item) { bool b = loans.FirstOrDefault(x => x.ProductItem == item.Id) != null; if (notIgnored != (int)requestCount) { if (b) { ignored++; } else { notIgnored++; } } return(b); } // Filter out items that are loaned out var deletableItems = productItems.Where(x => !shouldIgnoreLoanedItem(x)).Take((int)requestCount).ToArray(); // Delete all items foreach (var item in deletableItems) { Connection.Delete(item); } //Create base response return(new JObject() { { "reason", null }, { "responseData", new JObject() { { "deleted", notIgnored }, { "ignored", ignored } } } }); }
public JObject addProductCategory(JObject request) { //Get arguments string categoryID; request.TryGetValue("categoryID", out JToken categoryIDValue); request.TryGetValue("name", out JToken nameValue); if (categoryIDValue == null || categoryIDValue.Type != JTokenType.String || nameValue == null || nameValue.Type != JTokenType.Object ) { return(Templates.MissingArguments("categoryID, name")); } else { categoryID = categoryIDValue.ToObject <string>(); if (categoryID == "default" || categoryID == "uncategorized") { return(Templates.InvalidArgument("categoryID")); } } //Get languages string en; string nl = null; string ar = null; JObject names = nameValue.ToObject <JObject>(); names.TryGetValue("en", out JToken enValue); names.TryGetValue("nl", out JToken nlValue); names.TryGetValue("ar", out JToken arValue); if (enValue != null && enValue.Type == JTokenType.String) { en = names["en"].ToObject <string>(); } else { return(Templates.MissingArguments("en")); } if (nlValue != null && nlValue.Type == JTokenType.String) { nl = names["nl"].ToObject <string>(); } if (arValue != null && arValue.Type == JTokenType.String) { ar = names["ar"].ToObject <string>(); } //Check if category already exists ProductCategory category = GetObject <ProductCategory>(categoryID); if (category != null) { return(Templates.AlreadyExists(categoryID)); } //Create category, languageitem LanguageItem item = new LanguageItem(categoryID + "_name", en, nl, ar); item.Upload(Connection); category = new ProductCategory(categoryID, item.Id); category.Upload(Connection); //Create response return(new JObject() { { "reason", null }, { "success", true } }); }
public JObject updateUser(JObject request) { //Get arguments string username; string password; int permission = -2; request.TryGetValue("username", out JToken usernameValue); request.TryGetValue("password", out JToken passwordValue); request.TryGetValue("permission", out JToken permissionValue); if (usernameValue == null || usernameValue.Type != JTokenType.String) { return(Templates.MissingArguments("username")); } else { username = usernameValue.ToObject <string>(); } if (passwordValue == null || passwordValue.Type != JTokenType.String) { password = null; } else { password = passwordValue.ToObject <string>(); if (password.Length != 128 && !System.Text.RegularExpressions.Regex.IsMatch(password, @"\A\b[0-9a-fA-F]+\b\Z")) { return(Templates.InvalidPassword); } } if (permissionValue != null && permissionValue.Type == JTokenType.Integer) { permission = permissionValue.ToObject <int>(); } //Check permission User currentUser = GetObject <User>(request["username"].ToObject <string>(), "Username"); if (currentUser.Username != username) { if (currentUser.Permission != UserPermission.Admin) { return(Templates.AccessDenied); } } else if (permission != -2) { return(Templates.AccessDenied); } //Get user User user = GetObject <User>(username, "Username"); if (user == null) { return(Templates.NoSuchUser(username)); } //Edit user if (password != null) { user.Password = password; } if (permission != -2) { user.Permission = (UserPermission)permission; } user.Update(Connection); //Create response return(new JObject() { { "reason", null }, }); }
public JObject getProductAvailability(JObject request) { //Get arguments request.TryGetValue("products", out JToken productValue); if (productValue == null || (productValue.Type != JTokenType.String && productValue.Type != JTokenType.Array)) { return(Templates.MissingArguments("statType")); } //Parse arguments List <string> productIDs = new List <string>(); if (productValue.Type == JTokenType.String) { //TODO Allow * to be used as value, selecting all products productIDs.Add(productValue.ToObject <string>()); } else if (productValue.Type == JTokenType.Array) { productIDs = productValue.ToObject <List <string> >(); } // Build condition that matches all relevant productItems and get said productItems // The lookup groups the productItems and loanItems to a single product id. var condition = new MySqlConditionBuilder("product", MySqlDbType.String, productIDs.ToArray()); var productItemsArray = Connection.Select <ProductItem>(condition).ToArray(); var productItems = productItemsArray.ToLookup(x => x.ProductId); // Build condition that matches all relevand loanItems and get said loanItems condition = new MySqlConditionBuilder("product_item", MySqlDbType.Int32, productItemsArray.Select(x => x.Id.Value).Cast <object>().ToArray()); var loanItems = Connection.Select <LoanItem>(condition).ToLookup(x => productItemsArray.First(y => y.Id == x.ProductItem).ProductId); // DateTimeSpan representing now->midnight for filtering relevant loans DateTimeSpan today = new DateTimeSpan(DateTime.Now, DateTime.Now.Date.AddDays(1)); // Build response data var responseData = new JObject(); foreach (var productID in productIDs) { var items = productItems[productID]; var loans = loanItems[productID]; var relevantLoans = loans.Where(x => today.Overlaps(x.Start, x.End)).ToArray(); var entry = new JObject() { { "total", items.Count() }, { "totalReservations", loans.Count() }, { "reservations", relevantLoans.Length }, { "loanedOut", relevantLoans.Count(x => x.IsAcquired) }, { "inStock", items.Count() - relevantLoans.Count(x => x.IsAcquired) }, { "available", items.Count() - relevantLoans.Length } }; responseData.Add(productID, entry); } //Return response return(new JObject() { { "reason", null }, { "responseData", responseData } }); }
public JObject deleteProduct(JObject request) { //Get arguments request.TryGetValue("productID", out JToken idValue); if (idValue == null || idValue.Type != JTokenType.String) { return(Templates.MissingArguments("productID")); } // Prepare values string productID = idValue.ToString(); //Check if product exists Product product = GetObject <Product>(productID); if (product == null) { return(Templates.NoSuchProduct(productID)); } // Check if items or acquired loans exist var condition = new MySqlConditionBuilder("product", MySqlDbType.String, productID); var items = Connection.Select <ProductItem>(condition).ToList(); // Check for associated loans if any items exist if (items.Any()) { // Get associated loans that are acquired and end after today condition = new MySqlConditionBuilder("product_item", MySqlDbType.Int32, items.Select(x => x.Id).Cast <object>().ToArray()); condition.And() .Column("end") .GreaterThanOrEqual() .Operand(DateTime.Now, MySqlDbType.DateTime); condition.And() .Column("is_item_acquired") .Equals().True(); List <bool> loans_isAcquired = Connection.Select <LoanItem>(new string[] { "is_item_acquired" }, condition).Select(x => (bool)x[0]).ToList(); // If any active loans are aquired, respond with CannotDelete if (loans_isAcquired.Any()) { return(Templates.CannotDelete("This product still has active loans.")); } } // Delete image if it isnt the default image product.Delete(Connection); if (product.Image != "default") { product.GetImage(Connection)?.Delete(Connection); } // Delete name languageItem if it isnt the default languageItem if (product.Name != "0") { product.GetName(Connection)?.Delete(Connection); } // Delete description languageItem if it isnt the default languageItem if (product.Description != "0") { product.GetDescription(Connection)?.Delete(Connection); } //Create base response return(new JObject() { { "reason", null }, }); }
public JObject updateProduct(JObject request) { //Validate arguments string productID; string newProductID = null; string categoryID = null; string manufacturer = null; string extension = null; byte[] imageData = null; JObject names = null; JObject descriptions = null; JObject newImage = null; request.TryGetValue("productID", out JToken idValue); request.TryGetValue("newProductID", out JToken newIDValue); request.TryGetValue("categoryID", out JToken categoryIDValue); request.TryGetValue("manufacturer", out JToken manufacturerValue); request.TryGetValue("name", out JToken nameValue); request.TryGetValue("description", out JToken descriptionValue); request.TryGetValue("image", out JToken imageValue); if (idValue == null || idValue.Type != JTokenType.String) { return(Templates.MissingArguments("productID")); } else { productID = idValue.ToObject <string>(); if (productID == "default") { return(Templates.InvalidArgument("categoryID")); } } if (newIDValue != null && newIDValue.Type == JTokenType.String) { newProductID = newIDValue.ToObject <string>(); } if (categoryIDValue != null && categoryIDValue.Type == JTokenType.String) { categoryID = categoryIDValue.ToObject <string>(); } if (manufacturerValue != null && manufacturerValue.Type == JTokenType.String) { manufacturer = manufacturerValue.ToObject <string>(); } if (nameValue != null && nameValue.Type == JTokenType.Object) { names = nameValue.ToObject <JObject>(); } if (descriptionValue != null && descriptionValue.Type == JTokenType.Object) { descriptions = descriptionValue.ToObject <JObject>(); } if (imageValue != null && imageValue.Type == JTokenType.Object) { newImage = imageValue.ToObject <JObject>(); newImage.TryGetValue("data", out JToken dataValue); newImage.TryGetValue("extension", out JToken extensionValue); if (extensionValue != null && extensionValue.Type == JTokenType.String) { extension = extensionValue.ToObject <string>(); if (!Image.ImageFormats.Contains(extension)) { return(Templates.InvalidArgument("extension")); } } if (dataValue != null && dataValue.Type == JTokenType.String) { imageData = (byte[])dataValue; } } //Get product, if it exists Product product = GetObject <Product>(productID); if (product == null) { return(Templates.NoSuchProduct(productID)); } //If a new ID was given, check if it exists first. Product newProduct = GetObject <Product>(newProductID); if (newProduct != null) { return(Templates.AlreadyExists(productID)); } ///////////////Image //Edit image if needed; Image image = product.GetImage(Connection); if (newImage != null) { string oldID = image.Id; if (image.Id == "default") { image = new Image(product.Id + "_image", image.Data, image.Extension); } if (extension != null) { image.Extension = extension; } if (imageData != null) { image.Data = imageData; } if (oldID != image.Id) { image.Upload(Connection); product.UpdateTrace(); product.Image = image.Id; product.Update(Connection); } else { image.Update(Connection); } } ///////////////Name //Edit the LanguageItem if needed; LanguageItem name = product.GetName(Connection); if (names != null) { if (names.TryGetValue("en", out JToken enValue)) { if (enValue.Type == JTokenType.String) { name.en = enValue.ToObject <string>(); } } if (names.TryGetValue("nl", out JToken nlValue)) { if (nlValue.Type == JTokenType.String) { name.nl = nlValue.ToObject <string>(); } } if (names.TryGetValue("ar", out JToken arValue)) { if (arValue.Type == JTokenType.String) { name.ar = arValue.ToObject <string>(); } } name.Update(Connection); } ///////////////Description //Edit the LanguageItem if needed; LanguageItem description = product.GetDescription(Connection); if (descriptions != null) { if (descriptions.TryGetValue("en", out JToken enValue)) { if (enValue.Type == JTokenType.String) { description.en = enValue.ToObject <string>(); } } if (descriptions.TryGetValue("nl", out JToken nlValue)) { if (nlValue.Type == JTokenType.String) { description.nl = nlValue.ToObject <string>(); } } if (descriptions.TryGetValue("ar", out JToken arValue)) { if (arValue.Type == JTokenType.String) { description.ar = arValue.ToObject <string>(); } } description.Update(Connection); } //If a new ID was specified, change the product ID. if (newProductID != null) { image.Id = newProductID + "_image"; image.Update(Connection); product.Image = image.Id; name.Id = newProductID + "_name"; name.Update(Connection); description.Id = newProductID + "_description"; description.Update(Connection); product.Name = name.Id; product.UpdateTrace(); product.Id = newProductID; } ///////////////Product //If a new category was specified, check if it exists. If it does, change the product category if (categoryID != null) { ProductCategory category = GetObject <ProductCategory>(categoryID); if (category == null) { return(Templates.NoSuchProductCategory(categoryID)); } else { product.Category = categoryID; } } //If a new manufacturer was specified, change it. if (manufacturer != null) { product.Manufacturer = manufacturer; } product.Update(Connection); //Create response return(new JObject() { { "reason", null }, { "success", true } }); }
public JObject addProduct(JObject request) { //Get arguments string productID; string manufacturer; string categoryID; request.TryGetValue("productID", out JToken productIDValue); request.TryGetValue("categoryID", out JToken categoryIDValue); request.TryGetValue("manufacturer", out JToken manufacturerValue); request.TryGetValue("description", out JToken descriptionValue); request.TryGetValue("name", out JToken nameValue); // Verify presence of arguments List <string> failedVerifications = new List <string>(); if (productIDValue == null) { failedVerifications.Add("productID"); } if (categoryIDValue == null) { failedVerifications.Add("categoryID"); } if (manufacturerValue == null) { failedVerifications.Add("manufacturer"); } if (nameValue == null) { failedVerifications.Add("name"); } if (failedVerifications.Any()) { return(Templates.MissingArguments(failedVerifications.ToArray())); } // Verify arguments if (productIDValue.Type != JTokenType.String) { failedVerifications.Add("productID"); } if (categoryIDValue.Type != JTokenType.String) { failedVerifications.Add("categoryID"); } if (manufacturerValue.Type != JTokenType.String) { failedVerifications.Add("manufacturer"); } if (nameValue.Type != JTokenType.Object) { failedVerifications.Add("name"); } if (failedVerifications.Any()) { return(Templates.InvalidArguments(failedVerifications.ToArray())); } // Prepare values productID = productIDValue.ToObject <string>(); manufacturer = manufacturerValue.ToObject <string>(); categoryID = categoryIDValue.ToObject <string>(); // Get image request.TryGetValue("image", out JToken imageValue); string extension = null; byte[] imageData = null; if (imageValue != null && imageValue.Type == JTokenType.Object) { JObject image = imageValue.ToObject <JObject>(); image.TryGetValue("data", out JToken dataValue); image.TryGetValue("extension", out JToken extensionValue); if (extensionValue != null && extensionValue.Type == JTokenType.String && dataValue != null && dataValue.Type == JTokenType.String) { extension = extensionValue.ToObject <string>(); imageData = (byte[])dataValue; if (!Image.ImageFormats.Contains(extension)) { return(Templates.InvalidArgument("extension")); } } else { return(Templates.MissingArguments("data, extension")); } } // Get languages string en; string nl = null; string ar = null; JObject names = nameValue.ToObject <JObject>(); names.TryGetValue("en", out JToken nameEnValue); names.TryGetValue("nl", out JToken nameNlValue); names.TryGetValue("ar", out JToken nameArValue); if (nameEnValue != null && nameEnValue.Type == JTokenType.String) { en = names["en"].ToObject <string>(); } else { return(Templates.MissingArguments("name: en")); } if (nameNlValue != null && nameNlValue.Type == JTokenType.String) { nl = names["nl"].ToObject <string>(); } if (nameArValue != null && nameArValue.Type == JTokenType.String) { ar = names["ar"].ToObject <string>(); } LanguageItem name = new LanguageItem(productID + "_name", en, nl, ar); LanguageItem description; if (descriptionValue != null && descriptionValue.Type == JTokenType.Object) { //Get description JObject desc = descriptionValue.ToObject <JObject>(); desc.TryGetValue("en", out JToken descEnValue); desc.TryGetValue("nl", out JToken descNlValue); desc.TryGetValue("ar", out JToken descArValue); if (descEnValue != null && descEnValue.Type == JTokenType.String) { en = desc["en"].ToObject <string>(); } else { return(Templates.MissingArguments("description: en")); } if (descNlValue != null && descNlValue.Type == JTokenType.String) { nl = desc["nl"].ToObject <string>(); } if (descArValue != null && descArValue.Type == JTokenType.String) { ar = desc["ar"].ToObject <string>(); } description = new LanguageItem(productID + "_description", en, nl, ar); } else { description = new LanguageItem(productID + "_description", null); } //Check if product already exists Product product = GetObject <Product>(productID); if (product != null) { return(Templates.AlreadyExists(productID)); } //Check if category exists ProductCategory category = GetObject <ProductCategory>(categoryID); if (category == null) { return(Templates.NoSuchProductCategory(categoryID)); } //Create product, languageItem, image name.Upload(Connection); description.Upload(Connection); if (imageData != null) { Image image = new Image(productID + "_image", imageData, extension); image.Upload(Connection); product = new Product(productID, manufacturer, categoryID, productID + "_name", productID + "_description", image.Id); } else { product = new Product(productID, manufacturer, categoryID, productID + "_name", productID + "_description"); } product.Upload(Connection); //Create response return(new JObject() { { "reason", null }, }); }
public JObject updateProductCategory(JObject request) { //Validate arguments string categoryID; string newCategoryID = null; JObject names = null; request.TryGetValue("categoryID", out JToken categoryIDValue); request.TryGetValue("newCategoryID", out JToken newCategoryIDValue); request.TryGetValue("name", out JToken nameValue); if (categoryIDValue == null || categoryIDValue.Type != JTokenType.String) { return(Templates.MissingArguments("categoryID")); } else { categoryID = categoryIDValue.ToObject <string>(); if (categoryID == "default" || categoryID == "uncategorized") { return(Templates.InvalidArgument("categoryID")); } } if (newCategoryIDValue != null && newCategoryIDValue.Type == JTokenType.String) { newCategoryID = newCategoryIDValue.ToObject <string>(); } if (nameValue != null && nameValue.Type == JTokenType.Object) { names = nameValue.ToObject <JObject>(); } //Get product, if it exists ProductCategory category = GetObject <ProductCategory>(categoryID); if (category == null) { return(Templates.NoSuchProductCategory(categoryID)); } ///////////////LanguageItem //Edit the LanguageItem if needed; LanguageItem item = category.GetName(Connection); if (names != null) { if (names.TryGetValue("en", out JToken enValue)) { if (enValue.Type == JTokenType.String) { item.en = enValue.ToObject <string>(); } } if (names.TryGetValue("nl", out JToken nlValue)) { if (nlValue.Type == JTokenType.String) { item.nl = nlValue.ToObject <string>(); } } if (names.TryGetValue("ar", out JToken arValue)) { if (arValue.Type == JTokenType.String) { item.ar = arValue.ToObject <string>(); } } item.Update(Connection); } //If a new product ID was specified, check if it already exists. If it doesn't, change the product ID. if (newCategoryID != null) { ProductCategory newProduct = GetObject <ProductCategory>(newCategoryID); if (newProduct != null) { return(Templates.AlreadyExists(categoryID)); } else { item.Id = newCategoryID + "_name"; item.Update(Connection); category.Name = item.Id; category.UpdateTrace(); category.Id = newCategoryID; } } category.Update(Connection); //Create response return(new JObject() { { "reason", null }, { "success", true } }); }