internal bool TryAddPage(JournalEntity journalEntity, JournalPageEntity page, out Exception exception)
        {
            bool result = false;

            exception = null;

            try
            {
                // connecting to, or creating a brand new given journal's DB
                using (var db = GetInternalStorageContext(journalEntity))
                {
                    // inserting a page
                    db.GetCollection <JournalPageEntity>("JournalPages").Insert(page);

                    // adding references
                    page.Journal = journalEntity;

                    page.StorageContext = this;

                    result = true;
                }
            }
            catch (Exception ex)
            {
                // setting our exception
                exception = ex;
                result    = false;
            }

            return(result);
        }
        private JournalEntity CreateJournalInternal(Guid id, string displayName, string hexColor)
        {
            #region Creating Journal
            var journal = new JournalEntity
            {
                Id                      = id,
                StorageContext          = this,
                IsSoftDeleted           = false,
                DateCreated             = DateTime.UtcNow,
                DateUpdated             = DateTime.UtcNow,
                FrontCoverSolidBrushHex = hexColor,
                FrontCoverSolidColorHex = hexColor,
                DisplayName             = displayName,
                Width                   = 205,
                X         = 350,
                Y         = 490,
                ZoomLevel = 1
            };

            this.Journals.AddJournal(journal);
            #endregion

            // loading pages
            var pages = journal.Pages;

            #region Creating Front Cover & First Two Pages
            JournalPageEntity cover = new JournalPageEntity
            {
                Id          = 1,
                DateCreated = DateTime.UtcNow,
                DateUpdated = DateTime.UtcNow,
                IsCoverPage = true
            };

            journal.Pages.AddPage(cover);

            JournalPageEntity page1 = new JournalPageEntity
            {
                Id          = 2,
                DateCreated = DateTime.UtcNow,
                DateUpdated = DateTime.UtcNow,
                IsCoverPage = false
            };

            journal.Pages.AddPage(page1);

            JournalPageEntity page2 = new JournalPageEntity
            {
                Id          = 3,
                DateCreated = DateTime.UtcNow,
                DateUpdated = DateTime.UtcNow,
                IsCoverPage = false
            };

            journal.Pages.AddPage(page2);
            #endregion

            return(journal);
        }
        internal bool TrySavePage(JournalEntity journalEntity, JournalPageEntity page, out Exception exception)
        {
            bool result = false;

            exception = null;

            if (!journalEntity.Pages.Exists(page))
            {
                return(TryAddPage(journalEntity, page, out exception));
            }

            try
            {
                // connecting to, or creating a brand new given journal's DB
                using (var db = GetInternalStorageContext(journalEntity))
                {
                    var id = new BsonValue(page.Id);

                    // looking for page
                    var pageInCollection = db.GetCollection <JournalPageEntity>("JournalPages").FindById(id);

                    if (pageInCollection == null)
                    {
                        exception = new KeyNotFoundException("Page exists in memory, but doesn't exist in the storage in Journal: " + journalEntity.DisplayName);
                        result    = false;
                    }

                    // saving a page
                    result = db.GetCollection <JournalPageEntity>("JournalPages").Update(page);

                    // we are good to go
                }
            }
            catch (Exception ex)
            {
                // setting our exception
                exception = ex;
                result    = false;
            }

            return(result);
        }
        internal bool TryRemovePage(JournalEntity journalEntity, JournalPageEntity page, out Exception exception)
        {
            bool result = false;

            exception = null;

            try
            {
                // connecting to, or creating a brand new given journal's DB
                using (var db = GetInternalStorageContext(journalEntity))
                {
                    var id = new BsonValue(page.Id);

                    // looking for page
                    var pageInCollection = db.GetCollection <JournalPageEntity>("JournalPages").FindById(id);

                    if (pageInCollection == null)
                    {
                        exception = new KeyNotFoundException("Page doesn't exist with a given id in Journal: " + journalEntity.DisplayName);
                        result    = false;
                    }

                    // removing a page with a given Id
                    db.GetCollection <JournalPageEntity>("JournalPages").Delete(id);

                    // we are good to go
                    result = true;
                }
            }
            catch (Exception ex)
            {
                // setting our exception
                exception = ex;
                result    = false;
            }

            return(result);
        }
        public void SavePage(JournalPageEntity page)
        {
            Exception ex;

            TrySavePage(page.Journal, page, out ex);
        }