/// <summary>
        /// Gets the updated navigation title card for the database edge field details page.
        /// </summary>
        /// <param name="databaseEdgeField">Represents the current database edge field.</param>
        /// <returns>The navigation title card for the database edge field details page.</returns>
        public static NavigationTitleCardViewModel GetDatabaseEdgeFieldNavigationTitleCard(DatabaseEdgeField databaseEdgeField)
        {
            // Get the corresponding navigation title card.
            var navigationTitleCard = DatabaseEdgeFieldNavigationTitleCard;

            // Update the title and subtitle.
            navigationTitleCard.Title    = databaseEdgeField.Name;
            navigationTitleCard.Subtitle = databaseEdgeField.Id;
            // Return the navigation title card.
            return(navigationTitleCard);
        }
Exemple #2
0
        /// <summary>
        /// Creates the items in the database.
        /// </summary>
        /// <param name="serviceProvider">The application service provider.</param>
        /// <param name="token">The cancellation token for the task.</param>
        public async Task CreateAsync(IServiceProvider serviceProvider, CancellationToken token)
        {
            // Check if there weren't any valid items found.
            if (Items == null)
            {
                // Throw an exception.
                throw new TaskException("No valid items could be found with the provided data.");
            }
            // Check if the exception item should be shown.
            var showExceptionItem = Items.Count() > 1;
            // Get the total number of batches.
            var count = Math.Ceiling((double)Items.Count() / ApplicationDbContext.BatchSize);

            // Go over each batch.
            for (var index = 0; index < count; index++)
            {
                // Check if the cancellation was requested.
                if (token.IsCancellationRequested)
                {
                    // Break.
                    break;
                }
                // Get the items in the current batch.
                var batchItems = Items
                                 .Skip(index * ApplicationDbContext.BatchSize)
                                 .Take(ApplicationDbContext.BatchSize);
                // Get the IDs of the items in the current batch.
                var batchIds = batchItems
                               .Where(item => !string.IsNullOrEmpty(item.Id))
                               .Select(item => item.Id);
                var batchNames = batchItems
                                 .Where(item => !string.IsNullOrEmpty(item.Name))
                                 .Select(item => item.Name)
                                 .Distinct();
                // Check if any of the IDs are repeating in the list.
                if (batchIds.Distinct().Count() != batchIds.Count())
                {
                    // Throw an exception.
                    throw new TaskException("Two or more of the manually provided IDs are duplicated.");
                }
                // Get the IDs of the related entities that appear in the current batch.
                var batchDatabaseIds = batchItems
                                       .Where(item => item.Database != null)
                                       .Select(item => item.Database)
                                       .Where(item => !string.IsNullOrEmpty(item.Id))
                                       .Select(item => item.Id)
                                       .Distinct();
                // Define the list of items to get.
                var databases = new List <Database>();
                var existingDatabaseEdgeFieldNames = new List <string>();
                var validBatchIds = new List <string>();
                // Use a new scope.
                using (var scope = serviceProvider.CreateScope())
                {
                    // Use a new context instance.
                    using var context = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();
                    // Get the related entities that appear in the current batch.
                    databases = context.Databases
                                .Include(item => item.DatabaseType)
                                .Where(item => batchDatabaseIds.Contains(item.Id))
                                .ToList();
                    existingDatabaseEdgeFieldNames = context.DatabaseEdgeFields
                                                     .Where(item => batchNames.Contains(item.Name))
                                                     .Select(item => item.Name)
                                                     .ToList();
                    // Get the valid IDs, that do not appear in the database.
                    validBatchIds = batchIds
                                    .Except(context.DatabaseEdgeFields
                                            .Where(item => batchIds.Contains(item.Id))
                                            .Select(item => item.Id))
                                    .ToList();
                }
                // Save the items to add.
                var databaseEdgeFieldsToAdd = new List <DatabaseEdgeField>();
                // Go over each item in the current batch.
                foreach (var batchItem in batchItems)
                {
                    // Check if the ID of the item is not valid.
                    if (!string.IsNullOrEmpty(batchItem.Id) && !validBatchIds.Contains(batchItem.Id))
                    {
                        // Continue.
                        continue;
                    }
                    // Check if there is another database edge field with the same name.
                    if (existingDatabaseEdgeFieldNames.Any(item => item == batchItem.Name) || databaseEdgeFieldsToAdd.Any(item => item.Name == batchItem.Name))
                    {
                        // Throw an exception.
                        throw new TaskException("A database edge field with the same name already exists.", showExceptionItem, batchItem);
                    }
                    // Check if there was no database provided.
                    if (batchItem.Database == null || string.IsNullOrEmpty(batchItem.Database.Id))
                    {
                        // Throw an exception.
                        throw new TaskException("There was no database provided.", showExceptionItem, batchItem);
                    }
                    // Get the database.
                    var database = databases
                                   .FirstOrDefault(item => item.Id == batchItem.Database.Id);
                    // Check if there was no database found.
                    if (database == null)
                    {
                        // Throw an exception.
                        throw new TaskException("There was no database found.", showExceptionItem, batchItem);
                    }
                    // Check if the database is generic.
                    if (database.DatabaseType.Name == "Generic")
                    {
                        // Throw an exception.
                        throw new TaskException("The database edge field can't be generic.", showExceptionItem, batchItem);
                    }
                    // Define the new item.
                    var databaseEdgeField = new DatabaseEdgeField
                    {
                        DateTimeCreated = DateTime.UtcNow,
                        Name            = batchItem.Name,
                        Description     = batchItem.Description,
                        Url             = batchItem.Url,
                        IsSearchable    = batchItem.IsSearchable,
                        DatabaseId      = database.Id
                    };
                    // Check if there is any ID provided.
                    if (!string.IsNullOrEmpty(batchItem.Id))
                    {
                        // Assign it to the item.
                        database.Id = batchItem.Id;
                    }
                    // Add the item to the list.
                    databaseEdgeFieldsToAdd.Add(databaseEdgeField);
                }
                // Create the items.
                await IEnumerableExtensions.CreateAsync(databaseEdgeFieldsToAdd, serviceProvider, token);
            }
        }
Exemple #3
0
        public async Task <IActionResult> OnPostAsync()
        {
            // Check if there aren't any databases of non-generic type.
            if (!_context.Databases.Where(item => item.DatabaseType.Name != "Generic").Any())
            {
                // Display a message.
                TempData["StatusMessage"] = "Error: No databases of non-generic type could be found. Please create a database first.";
                // Redirect to the index page.
                return(RedirectToPage("/Administration/Databases/DatabaseEdgeFields/Index"));
            }
            // Check if the provided model isn't valid.
            if (!ModelState.IsValid)
            {
                // Add an error to the model.
                ModelState.AddModelError(string.Empty, "An error has been encountered. Please check again the input fields.");
                // Redisplay the page.
                return(Page());
            }
            // Check if there is another database edge field with the same name.
            if (_context.DatabaseEdgeFields.Any(item => item.Name == Input.Name))
            {
                // Add an error to the model
                ModelState.AddModelError(string.Empty, $"A database edge field with the name \"{Input.Name}\" already exists.");
                // Redisplay the page.
                return(Page());
            }
            // Get the corresponding database.
            var database = _context.Databases
                           .Where(item => item.DatabaseType.Name != "Generic")
                           .FirstOrDefault(item => item.Id == Input.DatabaseString || item.Name == Input.DatabaseString);

            // Check if no database has been found.
            if (database == null)
            {
                // Add an error to the model
                ModelState.AddModelError(string.Empty, "No non-generic database could be found with the provided ID.");
                // Redisplay the page.
                return(Page());
            }
            // Define the new database node field.
            var databaseEdgeField = new DatabaseEdgeField
            {
                Name            = Input.Name,
                Description     = Input.Description,
                Url             = Input.Url,
                IsSearchable    = Input.IsSearchable,
                DatabaseId      = database.Id,
                Database        = database,
                DateTimeCreated = DateTime.Now
            };

            // Mark it for addition.
            _context.DatabaseEdgeFields.Add(databaseEdgeField);
            // Save the changes to the database.
            await _context.SaveChangesAsync();

            // Display a message.
            TempData["StatusMessage"] = "Success: 1 database edge field created successfully.";
            // Redirect to the index page.
            return(RedirectToPage("/Administration/Databases/DatabaseEdgeFields/Index"));
        }