public async Task <DistributionModel> OnQuestion(string key, PrelanderTagModel model)
        {
            try
            {
                this.Action.Trace("q.start");
                GetPrelander(model.prelanderid);
                if (this.Prelander == null)
                {
                    return new DistributionModel()
                           {
                               Status = false
                           }
                }
                ;

                this.Action.Trace("q.after prelander");

                var tag = PrelandersCache.Instance.GetTag(this.Prelander.ID, model.tag);
                if (tag == null)
                {
                    return new DistributionModel()
                           {
                               Status = false
                           }
                }
                ;
                this.Action.Trace("q.after tag");

                var answer = PrelandersCache.Instance.GetAnswer(this.Prelander.ID, model.tag, model.answer);
                if (answer == null)
                {
                    return new DistributionModel()
                           {
                               Status = false
                           }
                }
                ;

                this.Action.Trace("q.after answer");

                this.RecreateTagModel(this.Action.prelander_data);
                if (this.TagManager.ContainsKey(model.tag))
                {
                    this.TagManager[model.tag] = model.index;

                    this.Action.prelander_data = this.ActionPrelanderCache;
                    this.Action.UpdateLater();
                }

                this.Action.Trace("q.after recreate and update");

                var interaction = new PrelanderTagActionInteractionDM(this.Database)
                {
                    prelanderid    = this.Prelander.ID,
                    actionid       = this.Action.GetStringID(),
                    prelandertagid = tag.GetStringID(),
                    answerid       = answer.GetStringID()
                };
                interaction.InsertLater();

                this.Action.Trace("q.after interaction");

                this.UpdateTagManager();
                this.Database.TransactionalManager.RunAsync();
                this.Action.Trace("q.after update");
                DashboardSocket.OnActionUpdate(this.Action);
                return(new DistributionModel()
                {
                    Status = true
                });
            }
            catch (Exception e)
            {
                this.Logger.StartLoggin("")
                .Add("where", "pl-onQuestion")
                .Add("model.answer", model.answer)
                .Add("model.tag", model.tag)
                .OnException(e);
                return(new DistributionModel()
                {
                    Status = false
                });
            }
        }
        public async Task <DistributionModel> OnInit(string key, PrelanderInitModel model)
        {
            try
            {
                GetPrelander(model.prelanderid);
                if (this.Prelander == null)
                {
                    this.Logger.StartLoggin(this.Action.GetStringID())
                    .Where("pl-init")
                    .Add("tagCount", model.tags != null ? model.tags.Count.ToString() : "null")
                    .Add(model.tags)
                    .OnException(new Exception("Could not get prealnder from id: " + model.prelanderid));
                    return(new DistributionModel()
                    {
                        Status = false
                    });
                }

                if (this.Prelander.Answers == null || this.Prelander.Tags == null || this.Prelander.Tags.Count == 0 || this.Prelander.Answers.Count == 0)
                {
                    foreach (var tag in model.tags)
                    {
                        var newTag = new PrelanderTagDM(this.Database)
                        {
                            prelandertagid = string.Format("{0}.{1}.{2}", this.Prelander.ID, (tag.isQuestion ? "a" : "t"), tag.name),
                            name           = tag.name,
                            value          = tag.value,
                            prelanderid    = this.Prelander.ID,
                            isQuestion     = tag.isQuestion
                        };
                        newTag.InsertLater();
                        this.Prelander.Tags.Add(newTag);

                        if (tag.answers != null)
                        {
                            for (int i = 0; i < tag.answers.Length; i++)
                            {
                                var newAnswer = new PrelanderTagAnswerDM(this.Database)
                                {
                                    answerid       = string.Format("{0}-{1}", newTag.GetStringID(), i),
                                    prelandertagid = newTag.GetStringID(),
                                    prelanderid    = this.Prelander.ID,
                                    tagName        = tag.name,
                                    name           = string.Format("ccqa" + i),
                                    value          = tag.answers[i]
                                };
                                newAnswer.InsertLater();
                                this.Prelander.Answers.Add(newAnswer);
                            }
                        }
                    }
                }

                this.Action.Trace("init.before tag manager");

                foreach (var tag in model.tags)
                {
                    this.TagManager.Add(tag.name, null);
                }

                this.Action.Trace("init.after tag manager");

                this.Action.prelanderid     = this.Prelander.ID;
                this.Action.prelandertypeid = this.Prelander.Type.ID;
                this.Action.prelander_data  = this.ActionPrelanderCache;
                this.Action.UpdateLater();
                DashboardSocket.OnActionUpdate(this.Action);
                this.Action.Trace("init.after update");

                this.UpdateTagManager();
                this.Action.Trace("init.after update tag manager");
                this.Database.TransactionalManager.RunAsync();
                return(new DistributionModel()
                {
                    Status = true
                });
            }
            catch (Exception e)
            {
                this.Logger.StartLoggin("")
                .Add("where", "pl-init")
                .Add("tagCount", model.tags != null ? model.tags.Count.ToString() : "null")
                .Add(model.tags)
                .OnException(e);
                return(new DistributionModel()
                {
                    Status = false
                });
            }
        }