### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseClass.cs
using System;
using Microsoft.Extensions.Logging;
using xCommons.Extensions;
using xExceptions.Constants;
namespace xModels.Base {
///
/// a Base class which carry required things as a Father for it's childs ...
///
public abstract class XBaseClass {
//
#region Properties ...
///
/// LogTag which Specified for this class ...
///
private readonly string LOG_TAG;
///
/// logger instance ...
///
private readonly ILogger logger;
#endregion
//
#region Constructor ...
public XBaseClass (ILoggerFactory loggerFactory) {
//
// Preparing Log Tag ...
LOG_TAG = this.GetType ().Name;
//
Type classType = this.GetType ();
logger = loggerFactory.CreateLogger (classType);
}
#endregion
//
#region Protected ...
///
/// Extract Prepared Log MEssage ...
///
///
///
protected virtual string GetLogMessage (string message) {
//
// Prepare Log Message ...
message = $"{LOG_TAG} => {message}";
return message;
}
///
/// Logging specific Message ...
///
///
///
protected virtual void LogMessage (
string message,
LogLevel logLevel = LogLevel.Information
) {
//
// Validate Args ...
if (message.IsNullOrEmpty ()) {
throw XException.InvalidArgs
.ToException ();
}
//
// Prepare Log Message ...
message = GetLogMessage (message);
//
// Logging Message ...
logger.Log (
message: message,
logLevel: logLevel
);
}
///
/// Logging specific Message to Console ...
///
///
protected virtual void ConsoleMessage (string message) {
//
// Validate Args ...
if (message.IsNullOrEmpty ()) {
throw XException.InvalidArgs
.ToException ();
}
//
// Prepare Log Message ...
message = GetLogMessage (message);
//
// Logging Message ...
Console.WriteLine (message);
}
#endregion
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseDescriptor.cs
namespace xModels.Base {
///
/// Descriptors classes Map required data for creating Entities on Seeding time ...
/// this is a Base Descriptor class ...
///
public abstract class XBaseDescriptor { }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseDto.cs
namespace xModels.Base {
///
/// DTO - Data Transfer Objects is a kind of classes which Represent Entities ...
/// this is base Dto class ...
///
public abstract class XBaseDto { }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseEntity.cs
using System.ComponentModel.DataAnnotations;
namespace xModels.Base {
///
/// Base Entity Class
///
///
public abstract class XBaseEntity {
///
/// Entity Id
///
/// entity unique id
[Key]
[Required]
public T Id { get; set; }
///
/// Provided Soft Delete Behaviour ...
///
///
public bool Deleted { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseEntityDto.cs
namespace xModels.Base
{
///
/// Base Entity Related Dto Class ...
///
///
public abstract class XBaseEntityDto
{
///
/// Entity Id
///
/// entity unique id
public TKey Id { get; set; }
///
/// Provided Soft Delete Behaviour ...
///
///
public bool Deleted { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseGuidIDEntity.cs
using System;
namespace xModels.Base {
///
/// a BaseEntity Class which has Id of Guid type
///
public class XBaseGuidIDEntity : XBaseEntity { }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseGuidIDEntityDto.cs
using System;
namespace xModels.Base
{
public class XBaseGuidIDEntityDto : XBaseEntityDto
{ }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseIntIDEntity.cs
using System.ComponentModel.DataAnnotations;
namespace xModels.Base {
///
/// a BaseEntity Class which has Id of int type
///
public abstract class XBaseIntIDEntity : XBaseEntity { }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseIntIDEntityDto.cs
namespace xModels.Base
{
public class XBaseIntIDEntityDto : XBaseEntityDto
{ }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseLongIDEntity.cs
namespace xModels.Base
{
public class XBaseLongIDEntity : XBaseEntity
{ }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseLongIDEntityDto.cs
namespace xModels.Base
{
public class XBaseLongIDEntityDto : XBaseEntityDto
{ }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseRangeRequest.cs
using System.Collections.Generic;
namespace xModels.Base {
///
/// Range Request Classes Carry a List of Objects
///
///
public class XBaseRangeRequest {
public IEnumerable Items { get; set; } = new HashSet ();
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStorableDto.cs
namespace xModels.Base {
public abstract class XBaseStorableDto : XBaseDto {
public abstract TKey Id { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStorableDtoEventModel.cs
namespace xModels.Base
{
public class XBaseStorableDtoEventModel
{
public T Model { get; set; }
public XBaseStorableDtoEventModel(T model)
{
Model = model;
}
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStoreEvent.cs
using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using xModels.Interfaces;
namespace xModels.Base
{
public abstract class XBaseStoreEvent : IXBaseStoreEvents
where T : XBaseStorableDto
{
//
private readonly ISubject> onAddSubject;
private readonly ISubject> onUpdateSubject;
private readonly ISubject> onRemoveSubject;
//
private readonly ISubject>> onAddManySubject;
private readonly ISubject>> onUpdateManySubject;
private readonly ISubject>> onRemoveManySubject;
//
public IObservable> OnAddObservable => onAddSubject.AsObservable();
public IObservable> OnUpdateObservable => onUpdateSubject.AsObservable();
public IObservable> OnRemoveObservable => onRemoveSubject.AsObservable();
//
public IObservable>> OnAddManyObservable => onAddManySubject.AsObservable();
public IObservable>> OnUpdateManyObservable => onUpdateManySubject.AsObservable();
public IObservable>> OnRemoveManyObservable => onRemoveManySubject.AsObservable();
//
protected XBaseStoreEvent()
{
//
onAddSubject = new ReplaySubject>(1);
onUpdateSubject = new ReplaySubject>(1);
onRemoveSubject = new ReplaySubject>(1);
//
onAddManySubject = new ReplaySubject>>(1);
onUpdateManySubject = new ReplaySubject>>(1);
onRemoveManySubject = new ReplaySubject>>(1);
}
//
#region Base Actions ...
public void AddEvent(XBaseStorableDtoEventModel model)
{
onAddSubject.OnNext(model);
}
public void AddManyEvent(XBaseStorableDtoEventModel> model)
{
onAddManySubject.OnNext(model);
}
public void RemoveEvent(XBaseStorableDtoEventModel model)
{
onRemoveSubject.OnNext(model);
}
public void RemoveManyEvent(XBaseStorableDtoEventModel> model)
{
onRemoveManySubject.OnNext(model);
}
public void UpdateEvent(XBaseStorableDtoEventModel model)
{
onUpdateSubject.OnNext(model);
}
public void UpdateManyEvent(XBaseStorableDtoEventModel> model)
{
onUpdateManySubject.OnNext(model);
}
#endregion
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStringIDEntity.cs
using System;
namespace xModels.Base {
///
/// a BaseEntity Class which has Id of string type
///
public class XBaseStringIDEntity : XBaseEntity { }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStringIDEntityDto.cs
namespace xModels.Base
{
public class XBaseStringIDEntityDto : XBaseEntityDto
{ }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseValueContainer.cs
namespace xModels.Base
{
public class XBaseValueContainer
{
public T Value { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XBaseIndexedDto.cs
using xModels.Base;
namespace xModels.Dtos
{
public class XBaseIndexedDto : XBaseDto
{
public T Item { get; set; }
public TKey Key { get; set; }
public TIndex Index { get; set; }
}
public class XBaseIntIndexedDto : XBaseIndexedDto { }
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XDeviceDto.cs
using xCommons.Constants;
using xModels.Base;
namespace xModels.Dtos {
public class XDeviceDto : XBaseDto {
///
/// Operating System
///
/// device operating system identifier
public string Os { get; set; }
///
/// Operating System Version
///
/// which version of operatin system is in use
public string OsVersion { get; set; }
///
/// Device Browser
///
/// the Browser identifier
public string Browser { get; set; }
///
/// Browser Engine Agent
///
/// browser engine Agent
public string UserAgent { get; set; }
///
/// Type of client Device
///
/// represent device type XDeviceType
public XDeviceType DeviceType { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XFileDto.cs
using System;
using System.ComponentModel.DataAnnotations;
using xCommons.Constants;
using xModels.Base;
namespace xModels.Dtos {
public partial class XFileDto : XBaseDto {
[Required]
public string AuthorId { get; set; }
public XFileType Type { get; set; }
[Required]
[StringLength (255)]
public string Name { get; set; }
[StringLength (255)]
public string Thumb { get; set; }
[Required]
[StringLength (255)]
public string Path { get; set; }
[StringLength (255)]
public string ThumbPath { get; set; }
[Required]
public DateTime UploadedOn { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XObjectResponseResult.cs
namespace xModels.Dtos {
///
/// Some Requests Get Object Response Result of Data ...
///
public struct XObjectResponseResult {
public XObjectResponseResult (T responseObject, string responseText) {
this.Object = responseObject;
this.Text = responseText;
}
public T Object { get; }
public string Text { get; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XPersonDto.cs
using xModels.Base;
namespace xModels.Dtos
{
///
/// Since in Many Cases we have to Retrieve Specified User's Minimal
/// Infos for Handle Data Transfering, this Dto is Used ...
///
public class XPersonDto : XBaseDto
{
public string Username { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
public string Avatar { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XQuery.cs
using xModels.Base;
namespace xModels.Dtos {
///
/// Request a Page of Data Based on Query ...
/// this can used in every Data Providers ...
///
public class XQuery : XBaseDto {
///
/// an string for filtering results
///
///
public string Filter { get; set; } = null;
///
/// determines fully load object with it's relational fields or not
///
///
public bool ContainsDetail { get; set; } = false;
///
/// specifiy sorting of items
///
///
public string SortBy { get; set; } = nameof (XBaseIntIDEntity.Id);
///
/// specify sorting direction
///
///
public bool IsAscending { get; set; } = true;
///
/// specify page number
///
///
public int Page { get; set; } = 1;
///
/// specify page size
///
///
public int PageSize { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XQueryResult.cs
using System.Collections.Generic;
using xModels.Base;
namespace xModels.Dtos {
///
/// Result of a Requested Page of Data Based on Query ...
/// this can used in every Data Providers ...
///
public class XQueryResult : XBaseDto {
///
/// a collection of items for a page ...
///
///
public IEnumerable Items { get; set; }
///
/// Current Page Number ...
///
///
public long Page { get; set; }
///
/// Current Page Size ...
///
///
public long PageSize { get; set; }
///
/// Total Pages ...
///
///
public long TotalPages { get; set; }
///
/// Total Filtered Items Pages Count ...
///
///
public int TotalFilteredPages { get; set; }
///
/// Total Filtered Items ...
///
///
public long TotalFilteredItems { get; set; }
///
/// Total Exists Items ...
///
///
public long TotalItems { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XResourceDto.cs
using System.Collections.Generic;
using xModels.Base;
namespace xModels.Dtos
{
public class XLocaleResourceDto : XBaseDto
{
public string Language { get; set; }
public string Value { get; set; }
}
public class XResourceDto : XBaseDto
{
public string Resource { get; set; }
public IEnumerable Locales { get; set; } = new HashSet();
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XValidateRevisionRequest.cs
using System.ComponentModel.DataAnnotations;
namespace xModels.Dtos {
///
/// in some cases we have to validate a revision of request, this is a model
/// which used to request a revision validator ...
///
public class XValidateRevisionRequest {
[Required]
public string Revision { get; set; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Extensions\DIExtensions.cs
using Microsoft.Extensions.DependencyInjection;
using xCommons.Extensions;
using xExceptions.Constants;
using xModels.Base;
using xModels.Interfaces;
namespace xModels.Extensions {
public static class DIExtensions {
///
/// Register an Specific Store in DI ...
///
/// DI service collection ...
/// an implementation of inetrface of store ...
/// service lifetime
/// implementation of TType ...
/// an inetrface which implements IXBaseStore
/// type of an instance of XBaseStorable
/// type of key of StorableItem
///
public static void AddXStore (
this IServiceCollection services,
TImplementation store,
ServiceLifetime lifeTime = ServiceLifetime.Singleton
)
where TImplementation : TType
where TType : IXBaseStore
where TStoreItemDto : XBaseStorableDto {
//
// Validate Args ...
if (store.IsNull ()) {
throw XException.InvalidArgs
.ToException ();
}
//
// Register Service in DI ...
services.Add (new ServiceDescriptor (typeof (TType), typeof (TImplementation), lifeTime));
}
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Extensions\XModelExtensions.cs
using System.Collections.Generic;
using System.Linq;
using xCommons.Extensions;
using xModels.Dtos;
namespace xModels.Extensions
{
public static class XModelExtensions
{
///
/// Check to XDevice instance to be same or not
///
///
///
///
public static bool IsSameAs(this XDeviceDto source, XDeviceDto dest)
{
//
if (source.IsNull() ||
dest.IsNull())
{
return false;
}
//
var isSame = source.Os.ToNormalString() == dest.Os.ToNormalString() &&
source.OsVersion.ToNormalString() == dest.OsVersion.ToNormalString() &&
source.Browser.ToNormalString() == dest.Browser.ToNormalString() &&
source.UserAgent.ToNormalString() == dest.UserAgent.ToNormalString() &&
source.DeviceType == dest.DeviceType;
//
return isSame;
}
public static IEnumerable AsEnumerable(
this IEnumerable> source
)
{
return source.Select(i => i.Item);
}
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Interfaces\IXAuditable.cs
using System;
namespace xModels.Interfaces {
///
/// Some times we need to wrap Entities by some logs or audits ...
/// this class provide Audit fields for an Auditable Entity ...
///
public interface IXAuditable {
string UserAgent { get; }
string UserIp { get; }
DateTime TransactionTime { get; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Interfaces\IXBaseStore.cs
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using xModels.Base;
namespace xModels.Interfaces {
public interface IXBaseStore where T : XBaseStorableDto {
//
#region Retrieve ...
///
/// Retrieve all Exists Items ...
///
///
Task> GetAll ();
///
/// Retrieve specific Item by key ...
///
///
///
Task Get (TKey key);
///
/// retrieve items based on specific condition ...
///
///
///
Task> FindMany (Expression> condition);
///
/// retrieve item based on specific condition ...
///
///
///
Task FindOne (Expression> condition);
#endregion
//
#region Add ...
///
/// add specific item to Store ...
///
///
///
Task Add (T item);
///
/// Add a Collection of Items on Store ...
///
///
///
Task AddMany (XBaseRangeRequest items);
#endregion
//
#region Remove ...
///
/// Remove an item from store ...
///
///
///
Task Remove (T item);
///
/// remove an item by it's Key ...
///
///
///
Task RemoveByKey (TKey key);
///
/// remove a collection of items at once ...
///
///
///
Task RemoveMany(XBaseRangeRequest items);
#endregion
//
#region Update ...
///
/// Update Exists Item in store ...
///
///
///
///
///
///
///
Task Update (
T item,
ICollection propertyWhiteList = null,
ICollection propertyBlackList = null,
ICollection>> propertyValueProviders = null,
bool updateWithNullOrEmptyValues = false
);
///
/// Update a Collection of Exists Items ...
///
///
///
///
///
///
///
Task UpdateMany (
XBaseRangeRequest items,
ICollection propertyWhiteList = null,
ICollection propertyBlackList = null,
ICollection>> propertyValueProviders = null,
bool updateWithNullOrEmptyValues = false
);
#endregion
//
#region Exists ...
///
/// retrieve item(s) exists based on specific condition ...
///
///
///
Task IsExists (Expression> condition);
///
/// is exists an item by providing it's key ...
///
///
///
Task IsExistsByKey (TKey key);
#endregion
//
#region Count ...
///
/// Count Exists items ...
///
///
Task Count ();
#endregion
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Interfaces\IXBaseStoreEvents.cs
using System;
using System.Collections.Generic;
using xModels.Base;
namespace xModels.Interfaces
{
public interface IXBaseStoreEvents where T : XBaseStorableDto
{
//
void AddEvent(XBaseStorableDtoEventModel model);
void UpdateEvent(XBaseStorableDtoEventModel model);
void RemoveEvent(XBaseStorableDtoEventModel model);
//
void AddManyEvent(XBaseStorableDtoEventModel> model);
void UpdateManyEvent(XBaseStorableDtoEventModel> model);
void RemoveManyEvent(XBaseStorableDtoEventModel> model);
//
IObservable> OnAddObservable { get; }
IObservable> OnUpdateObservable { get; }
IObservable> OnRemoveObservable { get; }
//
IObservable>> OnAddManyObservable { get; }
IObservable>> OnUpdateManyObservable { get; }
IObservable>> OnRemoveManyObservable { get; }
}
}
### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Providers\XBaseInMemoryStore.cs
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using xCommons.Extensions;
using xModels.Base;
using xModels.Interfaces;
namespace xModels.Providers
{
public abstract class XBaseInMemoryStore : IXBaseStore
where T : XBaseStorableDto
{
///
/// this is main store of items ...
///
///
///
private static ConcurrentBag STORE = new ConcurrentBag();
//
private readonly IXBaseStoreEvents events;
//
#region Constructor ...
protected XBaseInMemoryStore(
IXBaseStoreEvents events = null
)
{
this.events = events;
}
#endregion
//
#region Retrieve ...
///
/// Retrieve all Exists Items ...
///
///
public Task> GetAll()
{
//
var result = STORE.AsEnumerable();
return Task.FromResult(result);
}
///
/// Retrieve specific Item by key ...
///
///
///
public Task Get(TKey key)
{
//
return IsExistsByKey(key)
.ContinueWith(isExistsTask =>
{
//
var isExists = isExistsTask
.RunTask();
//
if (!isExists)
{
return null;
}
//
try
{
var result = STORE
.FirstOrDefault(i => GetKey(i).Equals(key));
return result;
}
catch
{
return null;
}
});
}
///
/// retrieve items based on specific condition ...
///
///
///
public Task> FindMany(Expression> condition)
{
//
// Validate Args ...
if (condition.IsNull())
{
return Task.FromResult(new List().AsEnumerable());
}
//
var whereFunc = condition.Compile();
var result = STORE.Where(whereFunc);
//
return Task.FromResult(result);
}
///
/// retrieve item based on specific condition ...
///
///
///
public Task FindOne(Expression> condition)
{
//
// Validate Args ...
if (condition.IsNull())
{
return null;
}
//
var whereFunc = condition.Compile();
var result = STORE.FirstOrDefault(whereFunc);
//
return Task.FromResult(result);
}
#endregion
//
#region Add ...
///
/// add specific item to Store ...
///
///
///
public Task Add(T item)
{
//
// Validate Args ...
if (item.IsNull() || GetKey(item).IsNull())
{
return Task.FromResult(false);
}
//
// Try to add item ...
return IsExistsByKey(GetKey(item))
.ContinueWith(isExistsTask =>
{
//
// Check item exists in Store or not ...
var isExists = isExistsTask.RunTask();
if (isExists)
{
return false;
}
//
// Add Item to Store ...
STORE.Add(item);
OnAdd(item);
//
return true;
});
}
///
/// Add a Collection of Items on Store ...
///
///
///
public Task AddMany(XBaseRangeRequest items)
{
//
// Validate Args ...
if (
items.IsNull() ||
!items.Items.HasChild()
)
{
return Task.FromResult(false);
}
//
// Retrieve Must Add Items ...
var mustAddItems = items.Items
.Where(i => !GetKey(i)
.IsNull() && !STORE
.Any(si => GetKey(i).Equals(GetKey(si)))
);
if (!mustAddItems.HasChild())
{
return Task.FromResult(false);
}
//
// Add Items ...
try
{
//
mustAddItems
.ToList()
.ForEach(mi => STORE.Add(mi));
//
OnAddMany(mustAddItems);
//
return Task.FromResult(true);
}
catch
{
return Task.FromResult(false);
}
}
#endregion
//
#region Remove ...
///
/// Remove an item from store ...
///
///
///
public Task Remove(T item)
{
//
// Validate Args ...
if (
item.IsNull() ||
!STORE
.Any(i => GetKey(i)
.Equals(GetKey(item)))
)
{
return Task.FromResult(false);
}
//
try
{
//
RemoveItemFromStore(item);
return Task.FromResult(true);
}
catch
{
return Task.FromResult(false);
}
}
///
/// remove an item by it's Key ...
///
///
///
public Task RemoveByKey(TKey key)
{
return Get(key)
.ContinueWith(getTask =>
{
//
// retrieve item by it's Key ...
var item = getTask
.RunTask();
//
// Check item exists ...
if (item.IsNull())
{
return false;
}
//
// Try to remove item ...
var result = false;
try
{
//
result = Remove(item)
.RunTask();
}
catch
{
result = false;
}
//
return result;
});
}
///
/// remove a collection of items at once ...
///
///
///
public Task RemoveMany(XBaseRangeRequest items)
{
//
// Validate Args ...
if (
items.IsNull() ||
!items.Items.HasChild()
)
{
return Task.FromResult(false);
}
//
var mustRemovedItems = items.Items
.Where(i => STORE
.Any(si => GetKey(si).Equals(GetKey(i)))
);
if (!mustRemovedItems.HasChild())
{
return Task.FromResult(false);
}
//
try
{
//
RemoveItemsFromStore(mustRemovedItems);
return Task.FromResult(true);
}
catch
{
return Task.FromResult(false);
}
}
#endregion
//
#region Update ...
///
/// Update Exists Item in store ...
///
///
///
///
///
///
///
public Task Update(
T item,
ICollection propertyWhiteList = null,
ICollection propertyBlackList = null,
ICollection>> propertyValueProviders = null,
bool updateWithNullOrEmptyValues = false
)
{
return Get(GetKey(item))
.ContinueWith(getTask =>
{
//
var existsItem = getTask
.RunTask();
//
// Validate item Exists ...
if (existsItem.IsNull())
{
return null;
}
//
try
{
//
var updatedItem = existsItem;
updatedItem.UpdateData(
updateWith: item,
propertyWhiteList: propertyWhiteList,
propertyBlackList: propertyBlackList,
propertyValueProviders: propertyValueProviders,
updateWithNullOrEmptyValues: updateWithNullOrEmptyValues,
throwExceptionOnFails: true
);
//
RemoveItemFromStore(existsItem);
STORE.Add(updatedItem);
OnUpdate(item);
//
return updatedItem;
}
catch
{
return null;
}
});
}
///
/// Update a Collection of Exists Items ...
///
///
///
///
///
///
///
public Task UpdateMany(
XBaseRangeRequest items,
ICollection propertyWhiteList = null,
ICollection propertyBlackList = null,
ICollection>> propertyValueProviders = null,
bool updateWithNullOrEmptyValues = false
)
{
//
// Validate Args ...
if (
items.IsNull() ||
!items.Items.HasChild()
)
{
return Task.FromResult(false);
}
//
// retrieve must updated items ...
var mustUpdateItems = items
.Items
.Where(i => STORE
.Any(
si => GetKey(i).Equals(GetKey(si)))
);
if (!mustUpdateItems.HasChild())
{
return Task.FromResult(false);
}
//
// Do Tasks ...
var mustUpdateTasks = mustUpdateItems.Select(i => Update(
i,
propertyWhiteList: propertyWhiteList,
propertyBlackList: propertyBlackList,
propertyValueProviders: propertyValueProviders,
updateWithNullOrEmptyValues: updateWithNullOrEmptyValues
));
return Task.WhenAll(mustUpdateTasks)
.ContinueWith(updateTasks =>
{
//
var updatedItems = updateTasks
.RunTask();
//
if (!updatedItems.HasChild())
{
return false;
}
else
{
//
OnUpdateMany(mustUpdateItems);
return true;
}
});
}
#endregion
//
#region Exists ...
///
/// retrieve item(s) exists based on specific condition ...
///
///
///
public Task IsExists(Expression> condition)
{
//
// Validate Args ...
if (condition.IsNull())
{
return Task.FromResult(false);
}
//
var whereFunc = condition.Compile();
var result = STORE.Any(whereFunc);
//
return Task.FromResult(result);
}
///
/// is exists an item by providing it's key ...
///
///
///
public Task IsExistsByKey(TKey key)
{
return Task.Run(() =>
{
return STORE.Any(i => GetKey(i).Equals(key));
});
}
#endregion
//
#region Count ...
///
/// Count Exists items ...
///
///
public Task Count()
{
//
var result = STORE.Count();
return Task.FromResult(result);
}
#endregion
//
#region Keys ...
///
/// set Object Key ...
///
///
///
public void SetKey(
ref T item,
TKey id
)
{
//
var props = item.GetType().GetProperties();
var keyProp = props.FirstOrDefault(p => p.Name == "Id");
if (keyProp.IsNull())
{
return;
}
//
Type t = Nullable.GetUnderlyingType(keyProp.PropertyType) ?? keyProp.PropertyType;
object safeValue = (id == null) ? null : Convert.ChangeType(id, t);
keyProp.SetValue(item, safeValue, null);
}
///
/// Get Object Key ...
///
///
///
public TKey GetKey(T item)
{
//
var props = item.GetType().GetProperties();
var keyProp = props.FirstOrDefault(p => p.Name == "Id");
//
var keyString = string.Empty;
if (keyProp.IsNull())
{
keyString = string.Empty;
}
else
{
keyString = keyProp.GetValue(item).ToString();
}
//
if (keyString.IsNullOrEmpty())
{
return default(TKey);
}
//
// Prevent Deserializing issues throug JsonReader ...
if (keyString.IsGuid() && typeof(TKey) == typeof(Guid))
{
return item.Id;
}
//
TKey result;
try
{
result = keyString.FromJSON();
}
catch
{
result = keyString.ConvertTo();
}
return result;
}
#endregion
//
#region Private ...
private void RemoveItemFromStore(T item)
{
//
STORE = new ConcurrentBag(
STORE.Except(new[] { item })
);
//
OnRemove(item);
}
private void RemoveItemsFromStore(IEnumerable items)
{
//
STORE = new ConcurrentBag(
STORE.Except(items)
);
//
OnRemoveMany(items);
}
//
#region Event Notifiers ...
private void OnAdd(T item)
{
//
if (!events.IsNull())
{
events.AddEvent(new XBaseStorableDtoEventModel(item));
}
}
private void OnUpdate(T item)
{
//
if (!events.IsNull())
{
events.UpdateEvent(new XBaseStorableDtoEventModel(item));
}
}
private void OnRemove(T item)
{
//
if (!events.IsNull())
{
events.RemoveEvent(new XBaseStorableDtoEventModel(item));
}
}
private void OnAddMany(IEnumerable items)
{
//
if (!events.IsNull())
{
events.AddManyEvent(new XBaseStorableDtoEventModel>(items));
}
}
private void OnUpdateMany(IEnumerable items)
{
//
if (!events.IsNull())
{
events.UpdateManyEvent(new XBaseStorableDtoEventModel>(items));
}
}
private void OnRemoveMany(IEnumerable items)
{
//
if (!events.IsNull())
{
events.RemoveManyEvent(new XBaseStorableDtoEventModel>(items));
}
}
#endregion
#endregion
}
}