public LittleUrl CheckUrl(string longUrl)
        {
            try
            {
                if (!string.IsNullOrEmpty(longUrl))
                {
                    LittleUrl retUrl = _myMongoDb.GetCollection <LittleUrl>(_mongoCollection)
                                       .Find <LittleUrl>(url => url.LongUrl == longUrl).FirstOrDefault();
                    if (retUrl != null)
                    {
                        // If the Url is deleted, undelete it before returning
                        if (retUrl.IsDeleted)
                        {
                            retUrl = ToggleDelete(retUrl.ShortUrl, false);
                        }

                        return(retUrl);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(null);
        }
 public void InsertUrl(LittleUrl url)
 {
     try
     {
         _myMongoDb.GetCollection <LittleUrl>(_mongoCollection).InsertOne(url);
     }
     catch (Exception ex)
     {
         throw ex;
     }
     return;
 }
        public LittleUrl GetUrl(string shortUrl, bool deleted)
        {
            try
            {
                // Call purge when a fetch operation is called
                //   Purge runs just once a day
                if (_lastPurgeDate.AddDays(1) < DateTime.UtcNow)
                {
                    PurgeUrls();
                }

                if (!string.IsNullOrEmpty(shortUrl))
                {
                    // Find matching and undeleted URL
                    var query = Builders <LittleUrl> .Filter.And(
                        Builders <LittleUrl> .Filter.Where(url => url.ShortUrl == shortUrl),
                        Builders <LittleUrl> .Filter.Or(
                            Builders <LittleUrl> .Filter.Exists(url => url.IsDeleted, false),
                            Builders <LittleUrl> .Filter.Where(url => url.IsDeleted == deleted)
                            )
                        );

                    LittleUrl retUrl = _myMongoDb.GetCollection <LittleUrl>(_mongoCollection)
                                       .Find <LittleUrl>(query)
                                       .FirstOrDefault();

                    if (retUrl != null)
                    {
                        // Update last accessed time
                        TouchUrl(shortUrl);
                        return(retUrl);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(null);
        }
        public LittleUrl ToggleDelete(string shortUrl, bool deleteFlag)
        {
            LittleUrl returnUrl = null;

            try
            {
                DateTime purgeDate = DateTime.UtcNow.AddDays(_retentionDays);

                // Logical Delete or Undelete
                if (deleteFlag)
                {
                    // Delete
                    var urlUpdates = Builders <LittleUrl> .Update
                                     //  Set IsDeleted = True
                                     .Set(url => url.IsDeleted, deleteFlag)
                                     //  Set DeletedDate = Now
                                     .Set(url => url.DeletedTime, DateTime.UtcNow)
                                     //  Set PurgeDate = 90 days out (at midnight)
                                     .Set(url => url.PurgeDate, new DateTime(purgeDate.Year,
                                                                             purgeDate.Month,
                                                                             purgeDate.Day,
                                                                             23,
                                                                             59,
                                                                             59,
                                                                             999,
                                                                             DateTimeKind.Utc));

                    // Update if found
                    var options = new FindOneAndUpdateOptions <LittleUrl>
                    {
                        IsUpsert       = false,
                        ReturnDocument = ReturnDocument.After
                    };

                    returnUrl = _myMongoDb.GetCollection <LittleUrl>(_mongoCollection)
                                .FindOneAndUpdate <LittleUrl>(
                        url => url.ShortUrl == shortUrl,
                        urlUpdates,
                        options);
                }
                else
                {
                    // Undelete
                    var urlUpdates = Builders <LittleUrl> .Update
                                     //  Set IsDeleted = False
                                     .Set(url => url.IsDeleted, deleteFlag)
                                     //  Set DeletedDate = Reset
                                     .Set(url => url.DeletedTime, DateTime.MinValue)
                                     //  Set PurgeDate = Reset
                                     .Set(url => url.PurgeDate, DateTime.MinValue);

                    // Update if found
                    var options = new FindOneAndUpdateOptions <LittleUrl>
                    {
                        IsUpsert       = false,
                        ReturnDocument = ReturnDocument.After
                    };

                    returnUrl = _myMongoDb.GetCollection <LittleUrl>(_mongoCollection)
                                .FindOneAndUpdate <LittleUrl>(
                        url => url.ShortUrl == shortUrl,
                        urlUpdates,
                        options);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(returnUrl);
        }