Start Implementing XBaseFileProvider ...

This commit is contained in:
2025-12-08 04:41:52 +03:30
parent 64969bf9b1
commit 4cf1e4d629
7 changed files with 433 additions and 149 deletions
+46 -16
View File
@@ -1,3 +1,4 @@
using System.Collections.Generic;
using xCommons.Extensions; using xCommons.Extensions;
using xFileService.Models.Dtos; using xFileService.Models.Dtos;
using xFileService.Models.Entities; using xFileService.Models.Entities;
@@ -11,7 +12,7 @@ namespace xFileService.Extensions
/// </summary> /// </summary>
/// <param name="source"></param> /// <param name="source"></param>
/// <returns></returns> /// <returns></returns>
public static XFileDto ToXFileDto(this XFile source) public static XFileDto ToDto(this XFile source)
{ {
// //
XFileDto result = null; XFileDto result = null;
@@ -21,25 +22,54 @@ namespace xFileService.Extensions
{ {
// //
result = new XFileDto(); result = new XFileDto();
result = result.UpdateData(source); result = result.UpdateData(
updateWith: source,
// propertyBlackList: new List<string>
// result = new XFileDto {
// { nameof(XFileDto.Owner),
// Id = source.Id, nameof(XFile.Deleted),
// Type = source.Type, nameof(XFile.References),
// OwnerId = source.OwnerId, }
// Name = source.Name, );
// Path = source.Path,
// Thumb = source.Thumb,
// ThumbPath = source.ThumbPath,
// UploadedOn = source.UploadedOn,
// FileName = source.FileName
// };
} }
// //
return result; return result;
} }
/// <summary>
/// Converts a Dto to Entity Representation ...
/// Ignore ID Property ...
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static XFile FromDto(this XFileDto source)
{
//
var result = new XFile();
//
if (!source.IsNull())
{
//
result = result.UpdateData(
updateWith: source,
propertyBlackList: new List<string>
{
nameof(XFile.Deleted),
nameof(XFile.References),
}
);
//
if (!source.References.IsNull() && source.References.HasChild()) {
result.References = source.References.ToListString();
}
}
//
return result;
}
} }
} }
+211
View File
@@ -0,0 +1,211 @@
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using xFileService.Models.Dtos;
using xFileService.Models.Entities;
using xIdentityModels.Models;
using xModels.Dtos;
using XFileDto = xFileService.Models.Dtos.XFileDto;
// using xModels.Dtos;
using xTagService.Interfaces;
namespace xFileService.Interfaces
{
public interface IXBaseFileProvider<TKey>
{
//
#region Props ...
/// <summary>
/// Specified Provider ...
/// </summary>
string ProvideFor { get; }
/// <summary>
/// Specified Provider Repositroy ...
/// </summary>
IXFileProvider Provider { get; }
/// <summary>
/// Tag Provider for Specified File ...
/// </summary>
/// <value></value>
IXBaseTagProvider<TKey> TagProvider { get; }
#endregion
//
#region Helper ...
/// <summary>
/// Get Specified Identifier ...
/// </summary>
/// <param name="forProvidedId"></param>
/// <returns></returns>
string GetIdentifier(TKey forProvidedId);
#endregion
//
#region Implementation ...
/// <summary>
/// Stream Specified File ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<FileStreamResult> Stream(Guid id);
/// <summary>
/// Stream Specified File ...
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
Task<FileStreamResult> Stream(string fileName);
/// <summary>
/// Download Specified File ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<PhysicalFileResult> Download(Guid id);
/// <summary>
/// Download Specified File ...
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
Task<PhysicalFileResult> Download(string fileName);
/// <summary>
/// Upload Files ...
/// </summary>
/// <param name="files"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<IEnumerable<XFileDto>> Upload(
IFormFileCollection files,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Remove Specified Files ...
/// </summary>
/// <param name="ids"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<IEnumerable<Guid>> Remove(
string ids,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// Retrieve Specified File Streaming Info ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<XFileStreamDescriptorDto> GetFileDescriptor(Guid id);
/// <summary>
/// Retrieve Specified File Streaming Info ...
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
Task<XFileStreamDescriptorDto> GetFileDescriptor(string fileName);
#endregion
//
#region Data Model ...
/// <summary>
/// Get Specified File Model ...
/// </summary>
/// <param name="id"></param>
/// <param name="ignoreSoftDeleteds"></param>
/// <returns></returns>
Task<XFileDto> Get(
Guid id
);
/// <summary>
/// Get All Exists File Models ...
/// </summary>
/// <param name="ignoreSoftDeleteds"></param>
/// <returns></returns>
Task<IEnumerable<XFileDto>> GetAll();
/// <summary>
/// find an Entity by providing a Conditional Expression ...
/// </summary>
/// <param name="whereClause"></param>
Task<XFileDto> FindOne(Expression<Func<XFile, bool>> whereClause);
/// <summary>
/// find a collection of Entities by proving a Conditional Expression ...
/// </summary>
/// <param name="whereClause"></param>
/// <returns></returns>
Task<IEnumerable<XFileDto>> FindMany(
Expression<Func<XFile, bool>> whereClause
);
/// <summary>
/// retrieve Entities based on XQuery Pagination structure ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<XQueryResult<XFileDto>> Query(
XQuery query
);
/// <summary>
/// retrieve Entities based on XQuery Pagination structure by providing a Conditional Expression ...
/// </summary>
/// <param name="whereClause"></param>
/// <param name="query"></param>
/// <returns></returns>
Task<XQueryResult<XFileDto>> ConditionalQuery(
Expression<Func<XFile, bool>> whereClause,
XQuery query
);
/// <summary>
/// Update an Entity values ...
/// </summary>
/// <param name="id"></param>
/// <param name="item"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<XFileDto> Update(
Guid id,
XFileDto item,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// remove an Entity ...
/// </summary>
/// <param name="item"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
Task<XFileDto> Remove(
Guid id,
XUserClaimsInfoDto userInfo = null
);
/// <summary>
/// count all exists Entities ...
/// </summary>
/// <returns></returns>
Task<int> Count();
/// <summary>
/// Check an Entity exists or not ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<bool> IsExists(
Guid id
);
#endregion
}
}
+24 -24
View File
@@ -29,6 +29,30 @@ namespace xFileService.Interfaces
XDataServiceConfiguration DataSercviceConfiguration { get; } XDataServiceConfiguration DataSercviceConfiguration { get; }
#endregion #endregion
//
#region Helpers ...
/// <summary>
/// Converts an Entity to Dto ...
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<XFileDto> ToDto(XFile model);
/// <summary>
/// Convert a List of Entities to Dto ...
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
Task<IEnumerable<XFileDto>> ToDtoList(IEnumerable<XFile> list);
/// <summary>
/// Converts an Entity Query Result to Dto ...
/// </summary>
/// <param name="queryResult"></param>
/// <returns></returns>
Task<XQueryResult<XFileDto>> ToDtoQueryResult(XQueryResult<XFile> queryResult);
#endregion
// //
#region Tools ... #region Tools ...
/// <summary> /// <summary>
@@ -189,29 +213,5 @@ namespace xFileService.Interfaces
Guid id Guid id
); );
#endregion #endregion
//
#region Helpers ...
/// <summary>
/// Converts an Entity to Dto ...
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<XFileDto> ToXFileDto(XFile model);
/// <summary>
/// Convert a List of Entities to Dto ...
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
Task<IEnumerable<XFileDto>> ToXDtoList(IEnumerable<XFile> list);
/// <summary>
/// Converts an Entity Query Result to Dto ...
/// </summary>
/// <param name="queryResult"></param>
/// <returns></returns>
Task<XQueryResult<XFileDto>> ToXDtoQueryResult(XQueryResult<XFile> queryResult);
#endregion
} }
} }
+3
View File
@@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using xCommons.Constants; using xCommons.Constants;
using xModels.Base; using xModels.Base;
using xModels.Dtos; using xModels.Dtos;
@@ -19,5 +20,7 @@ namespace xFileService.Models.Dtos
public string OwnerId { get; set; } public string OwnerId { get; set; }
public XPersonDto Owner { get; set; } public XPersonDto Owner { get; set; }
public IList<string> References = new List<string>();
} }
} }
+7
View File
@@ -64,5 +64,12 @@ namespace xFileService.Models.Entities
/// </summary> /// </summary>
/// <value></value> /// <value></value>
public string FileName { get; set; } public string FileName { get; set; }
/// <summary>
/// Comma Separated List Which Provides Pointer to Specified
/// Model for Describe ...
/// </summary>
/// <value></value>
public string References { get; set; }
} }
} }
+33
View File
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using xFileService.Interfaces;
using xTagService.Interfaces;
namespace xFileService.Providers
{
public class XBaseFileProvider<TKey> : IXBaseFileProvider<TKey>
{
//
#region Props ...
/// <summary>
/// Specified Provider ...
/// </summary>
public string ProvideFor { get; }
/// <summary>
/// Specified Provider Repositroy ...
/// </summary>
public IXFileProvider Provider { get; }
/// <summary>
/// Tag Provider for Specified File ...
/// </summary>
/// <value></value>
public IXBaseTagProvider<TKey> TagProvider { get; }
#endregion
}
}
+109 -109
View File
@@ -57,6 +57,106 @@ namespace xFileService.Providers
} }
#endregion #endregion
//
#region Helpers ...
/// <summary>
/// Converts an Entity to Dto ...
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<XFileDto> ToDto(XFile model)
{
//
XFileDto result = null;
//
if (!model.IsNullOrDefault())
{
//
result = model.ToDto();
//
// Prepare Inner API Providers Device Dto ...
var device = IdentityProvider.GetDevice();
var userInfo = await IdentityProvider.GetUserInfo(
device: device,
userSelectByParam: model.OwnerId
);
if (userInfo.IsNullOrDefault())
{
XException.NotFound.Throw();
}
//
result.Owner = userInfo.ToXPersonDto();
}
//
return result;
}
/// <summary>
/// Convert a List of Entities to Dto ...
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public async Task<IEnumerable<XFileDto>> ToDtoList(IEnumerable<XFile> list)
{
//
var result = new List<XFileDto>();
//
if (!list.IsNull() && list.HasChild())
{
//
foreach (var item in list)
{
//
var dto = await ToDto(item);
if (!dto.IsNullOrDefault())
{
result.Add(dto);
}
}
}
//
return result;
}
/// <summary>
/// Converts an Entity Query Result to Dto ...
/// </summary>
/// <param name="queryResult"></param>
/// <returns></returns>
public async Task<XQueryResult<XFileDto>> ToDtoQueryResult(XQueryResult<XFile> queryResult)
{
//
var result = new XQueryResult<XFileDto>();
//
if (!queryResult.IsNullOrDefault())
{
//
result.Page = queryResult.Page;
result.PageSize = queryResult.PageSize;
result.TotalItems = queryResult.TotalItems;
result.TotalPages = queryResult.TotalPages;
result.TotalFilteredItems = queryResult.TotalFilteredItems;
result.TotalFilteredPages = queryResult.TotalFilteredPages;
//
if (!queryResult.Items.IsNull() && queryResult.Items.HasChild())
{
result.Items = await ToDtoList(queryResult.Items);
}
}
//
return result;
}
#endregion
// //
#region Tools ... #region Tools ...
/// <summary> /// <summary>
@@ -280,7 +380,7 @@ namespace xFileService.Providers
// //
// Preparing Result ... // Preparing Result ...
var result = await ToXDtoList(entities); var result = await ToDtoList(entities);
// //
return result; return result;
@@ -569,7 +669,7 @@ namespace xFileService.Providers
} }
// //
var result = await ToXFileDto(entitiy); var result = await ToDto(entitiy);
if (result.IsNullOrDefault()) if (result.IsNullOrDefault())
{ {
XException.ActionFailed.Throw(); XException.ActionFailed.Throw();
@@ -594,7 +694,7 @@ namespace xFileService.Providers
if (!entities.IsNull() && entities.HasChild()) if (!entities.IsNull() && entities.HasChild())
{ {
// //
result = (await ToXDtoList(entities)) result = (await ToDtoList(entities))
.ToList(); .ToList();
} }
@@ -615,7 +715,7 @@ namespace xFileService.Providers
var entity = await FileRepository.FindOneAsync(whereClause); var entity = await FileRepository.FindOneAsync(whereClause);
if (!entity.IsNullOrDefault()) if (!entity.IsNullOrDefault())
{ {
result = await ToXFileDto(entity); result = await ToDto(entity);
} }
// //
@@ -639,7 +739,7 @@ namespace xFileService.Providers
if (!entities.IsNull() && entities.HasChild()) if (!entities.IsNull() && entities.HasChild())
{ {
// //
result = (await ToXDtoList(entities)) result = (await ToDtoList(entities))
.ToList(); .ToList();
} }
@@ -663,7 +763,7 @@ namespace xFileService.Providers
var queryResult = await FileRepository.QueryAsync(query); var queryResult = await FileRepository.QueryAsync(query);
if (!queryResult.IsNullOrDefault()) if (!queryResult.IsNullOrDefault())
{ {
result = await ToXDtoQueryResult(queryResult); result = await ToDtoQueryResult(queryResult);
} }
// //
@@ -691,7 +791,7 @@ namespace xFileService.Providers
); );
if (!queryResult.IsNullOrDefault()) if (!queryResult.IsNullOrDefault())
{ {
result = await ToXDtoQueryResult(queryResult); result = await ToDtoQueryResult(queryResult);
} }
// //
@@ -771,7 +871,7 @@ namespace xFileService.Providers
} }
// //
var result = await ToXFileDto(entity); var result = await ToDto(entity);
// //
return result; return result;
@@ -832,7 +932,7 @@ namespace xFileService.Providers
} }
// //
result = await ToXFileDto(entitiy); result = await ToDto(entitiy);
if (result.IsNullOrDefault()) if (result.IsNullOrDefault())
{ {
XException.ActionFailed.Throw(); XException.ActionFailed.Throw();
@@ -863,105 +963,5 @@ namespace xFileService.Providers
return await FileRepository.IsExistsAsync(id); return await FileRepository.IsExistsAsync(id);
} }
#endregion #endregion
//
#region Helpers ...
/// <summary>
/// Converts an Entity to Dto ...
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<XFileDto> ToXFileDto(XFile model)
{
//
XFileDto result = null;
//
if (!model.IsNullOrDefault())
{
//
result = model.ToXFileDto();
//
// Prepare Inner API Providers Device Dto ...
var device = IdentityProvider.GetDevice();
var userInfo = await IdentityProvider.GetUserInfo(
device: device,
userSelectByParam: model.OwnerId
);
if (userInfo.IsNullOrDefault())
{
XException.NotFound.Throw();
}
//
result.Owner = userInfo.ToXPersonDto();
}
//
return result;
}
/// <summary>
/// Convert a List of Entities to Dto ...
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public async Task<IEnumerable<XFileDto>> ToXDtoList(IEnumerable<XFile> list)
{
//
var result = new List<XFileDto>();
//
if (!list.IsNull() && list.HasChild())
{
//
foreach (var item in list)
{
//
var dto = await ToXFileDto(item);
if (!dto.IsNullOrDefault())
{
result.Add(dto);
}
}
}
//
return result;
}
/// <summary>
/// Converts an Entity Query Result to Dto ...
/// </summary>
/// <param name="queryResult"></param>
/// <returns></returns>
public async Task<XQueryResult<XFileDto>> ToXDtoQueryResult(XQueryResult<XFile> queryResult)
{
//
var result = new XQueryResult<XFileDto>();
//
if (!queryResult.IsNullOrDefault())
{
//
result.Page = queryResult.Page;
result.PageSize = queryResult.PageSize;
result.TotalItems = queryResult.TotalItems;
result.TotalPages = queryResult.TotalPages;
result.TotalFilteredItems = queryResult.TotalFilteredItems;
result.TotalFilteredPages = queryResult.TotalFilteredPages;
//
if (!queryResult.Items.IsNull() && queryResult.Items.HasChild())
{
result.Items = await ToXDtoList(queryResult.Items);
}
}
//
return result;
}
#endregion
} }
} }