/// <summary> /// This method returns the reference key and version for the suple reftype/value pair. /// </summary> /// <param name="transform">The transform.</param> /// <param name="reference">The tuple reference.</param> /// <returns>Returns the response holder with a response code of 200 if successful</returns> public override async Task <IResponseHolder <Tuple <K, string> > > VersionRead(EntityTransformHolder <K, E> transform, Tuple <string, string> reference) { if (transform == null) { throw new ArgumentNullException(nameof(transform), "The EntityTransformHolder cannot be null."); } try { var resolve = await RedisResolveReference(transform, reference); if (resolve.Item1) { return new PersistenceResponseHolder <Tuple <K, string> > { StatusCode = 200, IsSuccess = true, Id = transform.KeySerializer(resolve.Item2), VersionId = resolve.Item3, Entity = new Tuple <K, string>(resolve.Item2, resolve.Item3) } } ; return(new PersistenceResponseHolder <Tuple <K, string> > { StatusCode = 404, IsSuccess = false }); } catch (Exception) { return(new PersistenceResponseHolder <Tuple <K, string> > { StatusCode = 500, IsSuccess = false }); } }
/// <summary> /// This method writes out the references for the entity. /// </summary> /// <param name="batch">The redis batch.</param> /// <param name="transform">The entity transform.</param> /// <param name="reference">The reference.</param> /// <param name="key">The root key.</param> /// <param name="version">The entity version.</param> /// <param name="expiry">Expiry time of the key</param> /// <returns>Returns an async task.</returns> protected virtual List <Task> WriteReference(IBatch batch, EntityTransformHolder <K, E> transform, Tuple <string, string> reference, K key, string version, TimeSpan?expiry = null) { //entityreference.{entitytype}.{keytype i.e., EMAIL, ID etc.} RedisKey hashkey = RedisReferenceKeyGet(transform, transform.ReferenceHashMaker(reference)); return(new List <Task>(3) { batch.HashSetAsync(hashkey, cnKeyEntityId, transform.KeySerializer(key), when: When.Always), batch.HashSetAsync(hashkey, cnKeyVersion, version, when: When.Always), batch.KeyExpireAsync(hashkey, expiry ?? mEntityTtl) }); }
/// <summary> /// This method creates the hash table key to hold the entity information in Redis cache. /// </summary> /// <param name="transform">The transform object.</param> /// <param name="key">The entity key.</param> /// <returns>Returns the redis key.</returns> protected virtual RedisKey RedisKeyGet(EntityTransformHolder <K, E> transform, K key) { return($"entity.{transform.EntityName}.{transform.KeySerializer(key)}"); }
/// <summary> /// This method reads the version from the cache. /// </summary> /// <param name="transform">The entity transform.</param> /// <param name="key">The entity key.</param> /// <returns>Returns the async task.</returns> public override async Task <IResponseHolder <Tuple <K, string> > > VersionRead(EntityTransformHolder <K, E> transform, K key) { if (transform == null) { throw new ArgumentNullException(nameof(transform), "The EntityTransformHolder cannot be null."); } try { IDatabase rDb = mLazyConnection.Value.GetDatabase(); RedisKey hashkey = RedisKeyGet(transform, key); //Entity RedisValue result = await rDb.HashGetAsync(hashkey, cnKeyVersion); if (result.HasValue) { return new PersistenceResponseHolder <Tuple <K, string> > { StatusCode = 200, IsSuccess = true, VersionId = result, Id = transform.KeySerializer(key), Entity = new Tuple <K, string>(key, result) } } ; return(new PersistenceResponseHolder <Tuple <K, string> > { StatusCode = 404, IsSuccess = false }); } catch (Exception) { return(new PersistenceResponseHolder <Tuple <K, string> > { StatusCode = 500, IsSuccess = false }); } }
/// <summary> /// Reads the entity from the cache, if it is present. /// </summary> /// <param name="transform">The transform.</param> /// <param name="key">The entity key.</param> /// <returns>Returns the response holder.</returns> public override async Task <IResponseHolder <E> > Read(EntityTransformHolder <K, E> transform, K key) { if (transform == null) { throw new ArgumentNullException(nameof(transform), "The EntityTransformHolder cannot be null."); } try { IDatabase rDb = mLazyConnection.Value.GetDatabase(); RedisKey hashkey = RedisKeyGet(transform, key); //Entity RedisValue result = await rDb.HashGetAsync(hashkey, cnKeyEntity); if (result.HasValue) { var entity = transform.CacheEntitySerializer.Deserializer(result); return(new PersistenceResponseHolder <E> { StatusCode = 200, Content = result, IsSuccess = true, Entity = entity, Id = transform.KeySerializer(key), VersionId = transform.Version?.EntityVersionAsString(entity) }); } return(new PersistenceResponseHolder <E> { StatusCode = 404, IsSuccess = false }); } catch (Exception) { return(new PersistenceResponseHolder <E> { StatusCode = 500, IsSuccess = false }); } }