private List <AspectEntity> FormatAspects(IEnumerable <dynamic> aspects)
        {
            var aspectsList = new List <AspectEntity>();

            foreach (var item in aspects)
            {
                AspectEntity entity = aspectsList.FirstOrDefault(x => x.AspectId == item.AspectId);
                if (entity == null)
                {
                    entity                  = new AspectEntity();
                    entity.DomainId         = item.DomainId;
                    entity.Text             = item.Text;
                    entity.Title            = item.Title;
                    entity.Framework        = item.Framework;
                    entity.Examples         = item.Examples;
                    entity.FurtherEducation = item.FurtherEducation;
                    entity.Levels           = item.Levels;
                    entity.OnlineResources  = item.OnlineResources;
                    entity.PeopleContact    = item.PeopleContact;
                    entity.AspectId         = item.AspectId;
                    entity.DomainName       = item.DomainName;
                    entity.ActionsList      = new List <ActionEntity>();
                    entity.Position         = item.Position;
                    aspectsList.Add(entity);
                }
                if (item.ActionId == null)
                {
                    continue;
                }

                var action = new ActionEntity
                {
                    Text        = item.ActionText,
                    Title       = item.ActionTitle,
                    ActionId    = item.ActionId,
                    Type        = item.Type,
                    LevelAction = item.LevelAction,
                    AspectId    = item.AspectId
                };

                entity.ActionsList.Add(action);
            }

            return(aspectsList);
        }
        public Result Update(AspectEntity entity)
        {
            var con    = new DapperConnectionManager();
            var query  = new QueryEntity();
            var result = new Result();

            using (var scope = new TransactionScope())
            {
                query.Entity = entity;
                query.Query  =
                    @"Update  Aspects set Title=@Title, Text=@Text, Examples=@Examples, OnlineResources=@OnlineResources, FurtherEducation =@FurtherEducation, PeopleContact = @PeopleContact, Levels = @Levels, Position = @Position
                                where AspectId = @AspectId";

                result = con.ExecuteQueryUnScoped(query);

                if (!result.Success)
                {
                    result.Message = "An error occurred";
                    return(result);
                }
                var aspectId = entity.AspectId;



                var listActionsToRemove = entity.ActionsList.Where(x => x.Removed);
                var listActionsToCreate = entity.ActionsList.Where(x => x.Created);
                var listActionsToCopy   = entity.ActionsList.Where(x => x.Added).ToList();

                foreach (var item in listActionsToRemove)
                {
                    var queryActionCreate = new QueryEntity
                    {
                        Query  = @"DELETE from AspectsActions where ActionId = @ActionId",
                        Entity = item
                    };
                    var resultAction = con.ExecuteQuery(queryActionCreate);
                    if (resultAction.Success)
                    {
                        continue;
                    }

                    result.Message = "An error occurred";
                    return(result);
                }


                foreach (var item in listActionsToCreate)
                {
                    var queryActionCreate = new QueryEntity
                    {
                        Query  = @"INSERT into Actions (Text, Title, Type) VALUES(@Text, @Title, @Type)",
                        Entity = item
                    };
                    var resultAction = con.InsertQueryUnScoped(queryActionCreate);

                    item.ActionId = (int)resultAction.Entity;
                    listActionsToCopy.Add(item);
                }


                foreach (var item in listActionsToCopy)
                {
                    item.AspectId = aspectId;
                    var queryActionCreate = new QueryEntity
                    {
                        Query  = @"INSERT into AspectsActions (AspectId, ActionId, LevelAction, Position) VALUES( @AspectId, @ActionId, @LevelAction, @Position)",
                        Entity = item
                    };
                    var resultAction = con.ExecuteQueryUnScoped(queryActionCreate);

                    if (resultAction.Success)
                    {
                        continue;
                    }

                    result.Message = "An error occurred";
                    return(result);
                }
                scope.Complete();
                result.Entity  = aspectId;
                result.Message = "The aspect has been created";
            }
            return(result);
        }
        public Result Insert(AspectEntity entity)
        {
            var con    = new DapperConnectionManager();
            var query  = new QueryEntity();
            var result = new Result();

            using (var scope = new TransactionScope())
            {
                var linkEntity = new LinkEntity
                {
                    Href   = " ",
                    Name   = entity.Title,
                    Type   = LinksTypes.ASPECT.ToString(),
                    Active = false
                };

                query.Entity = linkEntity;
                query.Query  = @"INSERT INTO Links (Name, Type, Href, Active) VALUES(@Name, @Type, @Href, @Active)";


                result = con.InsertQueryUnScoped(query);
                if (!result.Success)
                {
                    result.Message = "An error occurred";
                    return(result);
                }
                var linkId = (int)result.Entity;

                entity.LinkId = linkId;
                query.Entity  = entity;
                query.Query   = @"INSERT INTO Aspects (DomainId, LinkId, Title, Text, Examples, OnlineResources, FurtherEducation, PeopleContact, Levels) 
                                                    VALUES(@DomainId, @LinkId, @Title, @Text,@Examples, @OnlineResources, @FurtherEducation, @PeopleContact, @Levels )";

                result = con.InsertQueryUnScoped(query);

                if (!result.Success)
                {
                    result.Message = "An error occurred";
                    return(result);
                }
                var aspectId = (int)result.Entity;

                var listActionsToCreate = entity.ActionsList.Where(x => x.Created);
                var listActionsToCopy   = entity.ActionsList.Where(x => !x.Created).ToList();


                foreach (var item in listActionsToCreate)
                {
                    var queryActionCreate = new QueryEntity
                    {
                        Query  = @"INSERT into Actions (Text, Title, Type) VALUES(@Text, @Title, @Type)",
                        Entity = item
                    };
                    var resultAction = con.InsertQueryUnScoped(queryActionCreate);
                    if (!resultAction.Success)
                    {
                        result.Message = "An error occurred";
                        return(result);
                    }
                    item.ActionId = (int)resultAction.Entity;
                    listActionsToCopy.Add(item);
                }


                foreach (var item in listActionsToCopy)
                {
                    item.AspectId = aspectId;
                    var queryActionCreate = new QueryEntity
                    {
                        Query  = @"INSERT into AspectsActions (AspectId, ActionId, LevelAction, Position) VALUES( @AspectId, @ActionId, @LevelAction, @Position)",
                        Entity = item
                    };
                    var resultAction = con.ExecuteQueryUnScoped(queryActionCreate);
                    if (!resultAction.Success)
                    {
                        result.Message = "An error occurred";
                        result.Success = false;
                        return(result);
                    }
                }

                //update link with href

                var queryUpdateLink = new QueryEntity()
                {
                    Entity = new { Href = string.Concat("/aspects/", aspectId), LinkId = linkId },
                    Query  = "UPDATE Links set Href = @Href where LinkId = @LinkId"
                };
                var resultUpdateLink = con.ExecuteQueryUnScoped(queryUpdateLink);
                if (!resultUpdateLink.Success)
                {
                    result.Message = "An error occurred";
                    result.Success = false;
                    return(result);
                }


                scope.Complete();
                result.Entity  = aspectId;
                result.Message = "The aspect has been created";
            }
            return(result);
        }