protected override VerseData OnPostVerseForPoem(Poem poem, AddVerseModel verseModel, VerseEngineeringUser user)
        {
            Verse verse = verseService.GetById(verseModel.Id);

            if (verse == null)
            {
                verse = InsertCandidateVerseWithNoPreviousScratchVerseDefined(poem.Id, verseModel, user.UserId);
                return Mapper.Map<VerseData>(verse);
            }

            if ((verse.VerseType is ScratchVerseType) == false)
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent("Only Scratch verses can be submited to Candidates") });
            }

            if (verse.AuthorProfileId != user.UserId)
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Forbidden) { Content = new StringContent("You are not allowed to modify verse which wasn't written by you") });
            }

            if (poem.Id != verse.PoemId)
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent("Poem identifier is not equivalent with verse identifier") });
            }

            verseService.UpdateVerse(verse, verseService.GetVerseType<CandidateVerseType>());
            var response = Mapper.Map<VerseData>(verse);
            signalizerFactory.GetSignal<CandidateVerseAddedSignal<Raw>>()
                             .FromUser(user.UserId, user.Name)
                             .Send(poem.Id, response);
            return response;
        }
        protected override VerseData OnPostVerseForPoem(Poem poem, AddVerseModel verseModel, VerseEngineeringUser user)
        {
            Verse verse = new Verse
            {
                AuthorProfileId = user.UserId,
                FromIpAddress = string.Empty,
                LastEdit = DateTime.UtcNow,
                WrittenAt = DateTime.UtcNow,
                Location = string.Empty,
                OrderNr = 0,
                PoemId = poem.Id,
                Text = verseModel.Text,
            };

            verseService.Insert<ScratchVerseType>(verse);
            return Mapper.Map<VerseData>(verse);
        }
        protected override VerseData OnPostVerseForPoem(Poem poem, AddVerseModel verseModel, VerseEngineeringUser user)
        {
            Verse verse = verseService.GetById(verseModel.Id);

            if (verse == null)
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("No verse with such idetifier was found") });
            }

            if (verse.VerseType is CandidateVerseType == false)
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent("Only Candidate verses can be submited to Poem") });
            }

            if (poem.CurrentGm != user.UserId)
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Forbidden) { Content = new StringContent("You are not allowed to post poem verses unless you are game master") });
            }

            if (poem.Id != verse.PoemId)
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent("Poem identifier is not equivalent with verse identifier") });
            }

            verseService.UpdateVerse(verse, verseService.GetVerseType<PoemVerseType>());
            VerseData response = Mapper.Map<VerseData>(verse);
            signalizerFactory.GetSignal<PoemVerseAddedSignal<Raw>>()
                             .FromUser(user.UserId, user.Name)
                             .Send(poem.Id, response);

            if (IsGameMasterChanged(poem.CurrentGm, verse.AuthorProfileId))
            {
                UpdateGameMaster(poem, verse);
                signalizerFactory.GetSignal<PoemGameMasterChangedSignal<Raw>>()
                    .FromUser(user.UserId, user.Name)
                    .Send(poem.Id, Mapper.Map<UserProfileData>(poem.CurrentGameMasterUserProfile));
            }

            return response;
        }
 public VerseData PostVerseForPoem(AddVerseModel verseModel, [ModelBinder(typeof(VerseEngineeringApiUserBinder))] VerseEngineeringUser user)
 {
     Poem poem = GetPoemFromRequestForUser(verseModel.PoemId, user);
     return OnPostVerseForPoem(poem, verseModel, user);
 }
 protected abstract VerseData OnPostVerseForPoem(Poem poem, AddVerseModel verseModel, VerseEngineeringUser user);
        private Verse InsertCandidateVerseWithNoPreviousScratchVerseDefined(long poemId, AddVerseModel verseModel, long userId)
        {
            Verse verse = new Verse
            {
                AuthorProfileId = userId,
                FromIpAddress = string.Empty,
                LastEdit = DateTime.UtcNow,
                WrittenAt = DateTime.UtcNow,
                Location = string.Empty,
                OrderNr = 0,
                PoemId = poemId,
                Text = verseModel.Text,
            };

            verseService.Insert<CandidateVerseType>(verse);
            return verse;
        }