/// <summary>
        /// Creates a bookmark asyncronously
        /// </summary>
        /// <param name="newBookmark">The model to create</param>
        /// <returns>The created bookmark</returns>
        public async Task <Bookmark> CreateBookmarkAsync(NewBookmark newBookmark)
        {
            var modelHasOneResourceId = ModelHasOneResourceId(newBookmark);

            if (!modelHasOneResourceId)
            {
                throw new EcaBusinessException(MODEL_HAS_LESS_THAN_OR_MORE_THAN_ONE_RESOURCE_ID_ERROR);
            }

            var bookmarkAlreadyExists = BookmarkAlreadyExists(newBookmark);

            if (bookmarkAlreadyExists)
            {
                throw new EcaBusinessException(BOOKMARK_ALREADY_EXISTS_ERROR);
            }

            var resourceExists = await ResourceExists(newBookmark);

            if (!resourceExists)
            {
                throw new ModelNotFoundException(RESOURCE_DOES_NOT_EXIST_ERROR);
            }

            var bookmark = DoCreate(newBookmark);

            return(bookmark);
        }
        private async Task <bool> ResourceExists(NewBookmark newBookmark)
        {
            Object resource = null;

            if (newBookmark.OfficeId != null)
            {
                resource = await Context.Organizations.FindAsync(newBookmark.OfficeId);
            }
            else if (newBookmark.ProgramId != null)
            {
                resource = await Context.Programs.FindAsync(newBookmark.ProgramId);
            }
            else if (newBookmark.ProjectId != null)
            {
                resource = await Context.Projects.FindAsync(newBookmark.ProjectId);
            }
            else if (newBookmark.PersonId != null)
            {
                resource = await Context.People.FindAsync(newBookmark.PersonId);
            }
            else if (newBookmark.OrganizationId != null)
            {
                resource = await Context.Organizations.FindAsync(newBookmark.OrganizationId);
            }

            return(resource != null);
        }
        private bool BookmarkAlreadyExists(NewBookmark newBookmark)
        {
            var bookmark = Context.Bookmarks.Where(x => x.OfficeId == newBookmark.OfficeId &&
                                                   x.ProgramId == newBookmark.ProgramId &&
                                                   x.ProjectId == newBookmark.ProjectId &&
                                                   x.PersonId == newBookmark.PersonId &&
                                                   x.OrganizationId == newBookmark.OrganizationId &&
                                                   x.PrincipalId == newBookmark.PrincipalId).FirstOrDefault();

            return(bookmark != null);
        }
        private bool ModelHasOneResourceId(NewBookmark newBookmark)
        {
            var hasOneId = false;

            if ((newBookmark.OfficeId != null && newBookmark.ProgramId == null && newBookmark.ProjectId == null && newBookmark.PersonId == null && newBookmark.OrganizationId == null) ||
                (newBookmark.OfficeId == null && newBookmark.ProgramId != null && newBookmark.ProjectId == null && newBookmark.PersonId == null && newBookmark.OrganizationId == null) ||
                (newBookmark.OfficeId == null && newBookmark.ProgramId == null && newBookmark.ProjectId != null && newBookmark.PersonId == null && newBookmark.OrganizationId == null) ||
                (newBookmark.OfficeId == null && newBookmark.ProgramId == null && newBookmark.ProjectId == null && newBookmark.PersonId != null && newBookmark.OrganizationId == null) ||
                (newBookmark.OfficeId == null && newBookmark.ProgramId == null && newBookmark.ProjectId == null && newBookmark.PersonId == null && newBookmark.OrganizationId != null))
            {
                hasOneId = true;
            }

            return(hasOneId);
        }
        private Bookmark DoCreate(NewBookmark newBookmark)
        {
            var bookmark = new Bookmark
            {
                OfficeId       = newBookmark.OfficeId,
                ProgramId      = newBookmark.ProgramId,
                ProjectId      = newBookmark.ProjectId,
                PersonId       = newBookmark.PersonId,
                OrganizationId = newBookmark.OrganizationId,
                PrincipalId    = newBookmark.PrincipalId,
                AddedOn        = DateTimeOffset.Now,
                Automatic      = newBookmark.Automatic
            };

            this.Context.Bookmarks.Add(bookmark);

            return(bookmark);
        }