コード例 #1
0
ファイル: AdminController.cs プロジェクト: SOBotics/Higgs
        public IActionResult RegisterDashboard([FromBody] CreateDashboardRequest request)
        {
            if (string.IsNullOrWhiteSpace(request.BotName))
            {
                return(BadRequest(new ErrorResponse("Name is required")));
            }
            if (string.IsNullOrWhiteSpace(request.Description))
            {
                return(BadRequest(new ErrorResponse("Description is required")));
            }
            if (string.IsNullOrWhiteSpace(request.Secret))
            {
                return(BadRequest(new ErrorResponse("Secret is required")));
            }
            if (_dbContext.Dashboards.Any(b => b.DashboardName == request.DashboardName))
            {
                return(BadRequest(new ErrorResponse($"Dashboard with name '{request.DashboardName}' already exists")));
            }

            var userId = User.GetUserId();

            if (!userId.HasValue)
            {
                throw new HttpStatusException(HttpStatusCode.Unauthorized);
            }

            var dashboard = new DbDashboard
            {
                Scopes             = new List <DbDashboardScope>(),
                Feedbacks          = new List <DbFeedback>(),
                ConflictExceptions = new List <DbConflictException>()
            };

            FillDashboardDetails(dashboard, request);

            if (request.OwnerAccountId.HasValue && User.HasClaim(Scopes.SCOPE_ADMIN))
            {
                dashboard.OwnerAccountId = request.OwnerAccountId.Value;
            }

            _dbContext.Dashboards.Add(dashboard);
            _dbContext.DashboardScopes.Add(new DbDashboardScope
            {
                Dashboard = dashboard,
                ScopeName = Scopes.SCOPE_BOT
            });

            _dbContext.SaveChanges();
            return(Json(dashboard.Id));
        }
コード例 #2
0
ファイル: AdminController.cs プロジェクト: SOBotics/Higgs
        private void FillDashboardDetails(DbDashboard existingDashboard, CreateDashboardRequest request)
        {
            if (request.Feedbacks == null)
            {
                request.Feedbacks = new List <CreateBotRequestFeedback>();
            }
            if (request.Feedbacks.GroupBy(f => f.Id).Any(g => g.Count() > 1))
            {
                throw new HttpStatusException(HttpStatusCode.BadRequest, "Duplicate feedback ids");
            }

            if (request.ConflictExceptions == null)
            {
                request.ConflictExceptions = new List <CreateBotRequestExceptions>();
            }
            if (request.ConflictExceptions.GroupBy(f => f.Id).Any(g => g.Count() > 1))
            {
                throw new HttpStatusException(HttpStatusCode.BadRequest, "Duplicate conflict exception ids");
            }

            ConflictHelper.AssertUniqueConflictFeedbacks(request.ConflictExceptions.Select(c => c.BotResponseConflictFeedbacks));

            existingDashboard.BotName       = request.BotName;
            existingDashboard.DashboardName = request.DashboardName;
            existingDashboard.Description   = request.Description;

            if (!string.IsNullOrWhiteSpace(request.Secret))
            {
                existingDashboard.Secret = BCrypt.Net.BCrypt.HashPassword(request.Secret);
            }

            if (request.OwnerAccountId.HasValue && User.HasClaim(Scopes.SCOPE_ADMIN))
            {
                existingDashboard.OwnerAccountId = request.OwnerAccountId.Value;
            }

            existingDashboard.FavIcon                    = request.FavIcon;
            existingDashboard.Homepage                   = request.Homepage;
            existingDashboard.LogoUrl                    = request.LogoUrl;
            existingDashboard.TabTitle                   = request.TabTitle;
            existingDashboard.RequiredFeedback           = request.RequiredFeedback;
            existingDashboard.RequiredFeedbackConflicted = request.RequiredFeedbackConflicted;

            var createdFeedbacks = new Dictionary <int, DbFeedback>();

            CollectionUpdater.UpdateCollection(
                existingDashboard.Feedbacks.ToDictionary(f => f.Id, f => f),
                request.Feedbacks.ToDictionary(f => f.Id, f => f),
                newFeedback =>
            {
                var dbFeedbackType = new DbFeedback
                {
                    Dashboard    = existingDashboard,
                    Name         = newFeedback.Name,
                    Colour       = newFeedback.Colour,
                    Icon         = newFeedback.Icon,
                    IsActionable = newFeedback.IsActionable,
                    IsEnabled    = newFeedback.IsEnabled
                };
                existingDashboard.Feedbacks.Add(dbFeedbackType);
                _dbContext.Feedbacks.Add(dbFeedbackType);

                createdFeedbacks.Add(newFeedback.Id, dbFeedbackType);
            },
                (existingFeedback, newFeedback) =>
            {
                existingFeedback.Name         = newFeedback.Name;
                existingFeedback.Colour       = newFeedback.Colour;
                existingFeedback.Icon         = newFeedback.Icon;
                existingFeedback.IsActionable = newFeedback.IsActionable;
                existingFeedback.IsEnabled    = newFeedback.IsEnabled;
            },
                existingFeedback => { }
                );

            if (existingDashboard.Feedbacks.GroupBy(f => f.Name, StringComparer.OrdinalIgnoreCase).Any(g => g.Count() > 1))
            {
                throw new HttpStatusException(HttpStatusCode.BadRequest, "Feedback names must be unique");
            }

            CollectionUpdater.UpdateCollection(
                existingDashboard.ConflictExceptions.ToDictionary(ce => ce.Id, ce => ce),
                request.ConflictExceptions.ToDictionary(ce => ce.Id, ce => ce),
                newConflict =>
            {
                var dbConflictException = new DbConflictException
                {
                    Dashboard        = existingDashboard,
                    IsConflict       = newConflict.IsConflict,
                    RequiresAdmin    = newConflict.RequiresAdmin,
                    RequiredFeedback = newConflict.RequiredFeedback
                };

                foreach (var conflictFeedbackId in newConflict.BotResponseConflictFeedbacks)
                {
                    var newConflictException = new DbConflictExceptionFeedback
                    {
                        ConflictException = dbConflictException
                    };

                    if (conflictFeedbackId < 0)
                    {
                        if (createdFeedbacks.ContainsKey(conflictFeedbackId))
                        {
                            newConflictException.Feedback = createdFeedbacks[conflictFeedbackId];
                        }
                        else
                        {
                            throw new HttpStatusException(HttpStatusCode.BadRequest, "Invalid FeedbackId for conflict");
                        }
                    }
                    else
                    {
                        newConflictException.FeedbackId = conflictFeedbackId;
                    }
                    _dbContext.ConflictExceptionFeedbacks.Add(newConflictException);
                }

                existingDashboard.ConflictExceptions.Add(dbConflictException);
                _dbContext.ConflictExceptions.Add(dbConflictException);
            },
                (existingConflict, newConflict) =>
            {
                existingConflict.IsConflict       = newConflict.IsConflict;
                existingConflict.RequiresAdmin    = newConflict.RequiresAdmin;
                existingConflict.RequiredFeedback = newConflict.RequiredFeedback;

                CollectionUpdater.UpdateCollection(
                    existingConflict.ConflictExceptionFeedbacks.ToDictionary(d => d.FeedbackId, d => d),
                    newConflict.BotResponseConflictFeedbacks.ToDictionary(d => d, d => d),
                    newConflictFeedbackId =>
                {
                    var newConflictException = new DbConflictExceptionFeedback
                    {
                        ConflictException = existingConflict
                    };
                    if (newConflictFeedbackId < 0)
                    {
                        if (createdFeedbacks.ContainsKey(newConflictFeedbackId))
                        {
                            newConflictException.Feedback = createdFeedbacks[newConflictFeedbackId];
                        }
                        else
                        {
                            throw new HttpStatusException(HttpStatusCode.BadRequest, "Invalid FeedbackId for conflict");
                        }
                    }
                    else
                    {
                        newConflictException.FeedbackId = newConflictFeedbackId;
                    }
                    _dbContext.ConflictExceptionFeedbacks.Add(newConflictException);
                },
                    (existingConflictFeedback, newConflictFeedback) => { },
                    existingConflictFeedback =>
                {
                    _dbContext.ConflictExceptionFeedbacks.Remove(existingConflictFeedback);
                }
                    );
            },
                existingConflict =>
            {
                _dbContext.ConflictExceptions.Remove(existingConflict);
            }
                );
        }