last step is Implement using ConnectionId and Push Hub's in Tag Provider ...

This commit is contained in:
2025-12-08 22:47:52 +03:30
parent bb03fb0f40
commit 7e174fc14a
3 changed files with 556 additions and 4 deletions
+445
View File
@@ -0,0 +1,445 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using xCommons.Configurations;
using xCommons.Extensions;
using xCommons.Providers;
using xIdentityService.Controllers;
using xIdentityService.Interfaces;
using xModels.Dtos;
using xTagService.Interfaces;
using xTagService.Models.Dtos;
using xTagService.Models.Entities;
namespace xTagService.Controllers
{
public class XTagServiceControllerBase : XIBaseProviderController, IXTagServiceControllerActions
{
//
#region Props ...
public IXTagProvider TagProvider { get; }
#endregion
//
#region Constructor ...
public XTagServiceControllerBase(
ILogger logger,
IXTagProvider tagProvider,
XAppConfiguration appConfiguration,
IXIdentityProvider identityProvider,
XValidationProvider validationProvider
) : base(
logger,
appConfiguration,
identityProvider,
validationProvider
)
{
//
TagProvider = tagProvider;
}
#endregion
//
#region Actions ...
/// <summary>
/// Add Tag by Providing Dto ...
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost("Add")]
public async Task<ActionResult<XTagDto>> Add(
[FromBody] XTagDto model
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
var result = await TagProvider.Add(
model: model,
connectionId: connectionId
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Update Specified Tag ...
/// </summary>
/// <param name="id"></param>
/// <param name="model"></param>
/// <returns></returns>
[HttpPut("Update")]
public async Task<ActionResult<XTagDto>> Update(
[FromQuery] int id,
[FromBody] XTagDto model
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
var result = await TagProvider.Update(
id: id,
model: model,
connectionId: connectionId
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Remove Specified Tag by ID ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("Remove")]
public async Task<ActionResult<XTagDto>> Remove(
[FromQuery] int id
)
{
//
// Do ...
try
{
//
// Retrieve User Info ...
var userInfo = await GetUserInfo();
var connectionId = GetConnectionId();
bool isAdmin = userInfo.Roles.Any(r => r.ToNormalString() == "admin");
var userId = userInfo.UserId;
//
var result = await TagProvider.Remove(
id: id,
connectionId: connectionId
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Retrieve Specified Tag Dto by ID ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("")]
public async Task<ActionResult<XTagDto>> Get(
[FromQuery] int id
)
{
//
// Do ...
try
{
//
var result = await TagProvider.Get(
id: id
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Retrieve Specified Tag Dto by it's Label ...
/// </summary>
/// <param name="tag"></param>
/// <returns></returns>
[HttpGet("GetTag")]
public async Task<ActionResult<XTagDto>> GetTag(
[FromQuery] string tag
)
{
//
// Do ...
try
{
//
var result = await TagProvider.GetTag(
tag: tag
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Retrieve All Exists Tags ...
/// </summary>
/// <returns></returns>
[HttpGet("All")]
public async Task<ActionResult<IEnumerable<XTagDto>>> GetAll()
{
//
// Do ...
try
{
//
var result = await TagProvider.GetAll();
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Search For Specified Tag by Providing a query on Label ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpGet("FindOne")]
public async Task<ActionResult<XTagDto>> FindOne(
[FromQuery] string query
)
{
//
// Do ...
try
{
//
Expression<Func<XTag, bool>> whereClause = t =>
!query.IsNullOrEmpty() &&
t.Tag.ToNormalString()
.Contains(query.ToNormalString());
var result = await TagProvider.FindOne(
whereClause: whereClause
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Search For Specified Tags By Providing Query on Labels ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpGet("FindMany")]
public async Task<ActionResult<IEnumerable<XTagDto>>> FindMany(
[FromQuery] string query
)
{
//
// Do ...
try
{
//
Expression<Func<XTag, bool>> whereClause = t =>
!query.IsNullOrEmpty() &&
t.Tag.ToNormalString()
.Contains(query.ToNormalString());
var result = await TagProvider.FindMany(
whereClause: whereClause
);
//
return Ok(result
.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Retrieve Tags based on Query Model ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpGet("Query")]
public async Task<ActionResult<XQueryResult<XTagDto>>> Query(
[FromQuery] XQuery query
)
{
//
// Do ...
try
{
//
var result = await TagProvider
.Query(query);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Count Exists Tags ...
/// </summary>
/// <returns></returns>
[HttpGet("Count")]
public async Task<ActionResult<int>> Count()
{
//
// Do ...
try
{
//
var result = await TagProvider
.Count();
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Check Tag Exists by ID ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("IsExists")]
public async Task<ActionResult<bool>> IsExists(
[FromRoute] int id
)
{
//
// Do ...
try
{
//
var result = await TagProvider
.IsExists(id);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Check Tag Exists by Providing Label ...
/// </summary>
/// <param name="tag"></param>
/// <returns></returns>
[HttpGet("IsTagExists")]
public async Task<ActionResult<bool>> IsTagExists(
[FromQuery] string tag
)
{
//
// Do ...
try
{
//
var result = await TagProvider
.IsTagExists(tag);
//
return Ok(result.
ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
#endregion
}
}
+11 -4
View File
@@ -4,7 +4,6 @@ using System.Linq.Expressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;
using xDataService.Configuration;
using xIdentityModels.Models;
using xIdentityService.Interfaces;
using xModels.Dtos;
using xTagService.Hubs;
@@ -54,8 +53,12 @@ namespace xTagService.Interfaces
/// Add Specified Tag ...
/// </summary>
/// <param name="model"></param>
/// <param name="connectionId"></param>
/// <returns></returns>
Task<XTagDto> Add(XTagDto model);
Task<XTagDto> Add(
XTagDto model,
string connectionId = null
);
/// <summary>
/// Retrieve Specified Item as Dto ...
@@ -113,9 +116,11 @@ namespace xTagService.Interfaces
/// Remove Specified Dto ...
/// </summary>
/// <param name="id"></param>
/// <param name="connectionId"></param>
/// <returns></returns>
Task<XTagDto> Remove(
int id
int id,
string connectionId = null
);
/// <summary>
@@ -123,10 +128,12 @@ namespace xTagService.Interfaces
/// </summary>
/// <param name="id"></param>
/// <param name="model"></param>
/// <param name="connectionId"></param>
/// <returns></returns>
Task<XTagDto> Update(
int id,
XTagDto model
XTagDto model,
string connectionId = null
);
/// <summary>
+100
View File
@@ -0,0 +1,100 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using xModels.Dtos;
using xTagService.Models.Dtos;
namespace xTagService.Interfaces
{
public interface IXTagServiceControllerActions
{
//
#region Actions ...
/// <summary>
/// Add Tag by Providing Dto ...
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<ActionResult<XTagDto>> Add(XTagDto model);
/// <summary>
/// Retrieve Specified Tag Dto by ID ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ActionResult<XTagDto>> Get(int id);
/// <summary>
/// Retrieve Specified Tag Dto by it's Label ...
/// </summary>
/// <param name="tag"></param>
/// <returns></returns>
Task<ActionResult<XTagDto>> GetTag(string tag);
/// <summary>
/// Retrieve All Exists Tags ...
/// </summary>
/// <returns></returns>
Task<ActionResult<IEnumerable<XTagDto>>> GetAll();
/// <summary>
/// Search For Specified Tag by Providing a query on Label ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<ActionResult<XTagDto>> FindOne(string query);
/// <summary>
/// Search For Specified Tags By Providing Query on Labels ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<ActionResult<IEnumerable<XTagDto>>> FindMany(string query);
/// <summary>
/// Retrieve Tags based on Query Model ...
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
Task<ActionResult<XQueryResult<XTagDto>>> Query(XQuery query);
/// <summary>
/// Update Specified Tag ...
/// </summary>
/// <param name="id"></param>
/// <param name="model"></param>
/// <returns></returns>
Task<ActionResult<XTagDto>> Update(
int id,
XTagDto model
);
/// <summary>
/// Remove Specified Tag by ID ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ActionResult<XTagDto>> Remove(int id);
/// <summary>
/// Count Exists Tags ...
/// </summary>
/// <returns></returns>
Task<ActionResult<int>> Count();
/// <summary>
/// Check Tag Exists by ID ...
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ActionResult<bool>> IsExists(int id);
/// <summary>
/// Check Tag Exists by Providing Label ...
/// </summary>
/// <param name="tag"></param>
/// <returns></returns>
Task<ActionResult<bool>> IsTagExists(string tag);
#endregion
}
}