Initial Commit ...
This commit is contained in:
@@ -0,0 +1,211 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using xCommons.Configurations;
|
||||
using xCommons.Constants;
|
||||
using xCommons.Controllers;
|
||||
using xCommons.Extensions;
|
||||
using xCommons.Providers;
|
||||
using xExceptions.Constants;
|
||||
using xIdentityModels.Constants;
|
||||
using xIdentityModels.Models;
|
||||
using xIdentityService.Interfaces;
|
||||
|
||||
namespace xIdentityService.Controllers {
|
||||
public abstract class XIBaseController : XBaseController {
|
||||
private readonly IXIdentityProvider identityProvider;
|
||||
|
||||
public XIBaseController (
|
||||
ILogger logger,
|
||||
XAppConfiguration appConfiguration,
|
||||
IXIdentityProvider identityProvider,
|
||||
XValidationProvider validationProvider
|
||||
) : base (
|
||||
logger,
|
||||
appConfiguration,
|
||||
validationProvider
|
||||
) {
|
||||
this.identityProvider = identityProvider;
|
||||
}
|
||||
|
||||
//
|
||||
#region User Handlers NonActions ...
|
||||
/// <summary>
|
||||
/// Retrieve User Identifier Base on XActionRequest
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <param name="forceNotNull"></param>
|
||||
/// <param name="excludes"></param>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public string GetUserSelectByParam (
|
||||
XActionRequest model,
|
||||
bool forceNotNull = true,
|
||||
ICollection<XUserSelectBy> excludes = null) {
|
||||
//
|
||||
// Validate Args ...
|
||||
ValidationProvider.NotNull (model);
|
||||
|
||||
//
|
||||
var result = identityProvider.GetUserSelectByParam (
|
||||
model,
|
||||
forceNotNull,
|
||||
excludes);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve Access Token
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task<string> GetAccessToken () {
|
||||
//
|
||||
var accessToken = Request.Headers[XAuthorization.Header]
|
||||
.ToString ();
|
||||
if (accessToken.IsNullOrEmpty ()) {
|
||||
accessToken = await HttpContext
|
||||
.GetTokenAsync (XAuthorization.AccessToken);
|
||||
}
|
||||
|
||||
//
|
||||
if (accessToken
|
||||
.ToNormalString ()
|
||||
.Contains (XAuthorization.TokenIdentifier
|
||||
.ToNormalString ())) {
|
||||
accessToken = accessToken
|
||||
.Remove (0, XAuthorization.TokenIdentifier.Length);
|
||||
}
|
||||
|
||||
//
|
||||
return accessToken;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve Refresh Token
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task<string> GetRefreshToken () {
|
||||
//
|
||||
var refreshToken = Request.Headers[XAuthorization.RefreshToken]
|
||||
.ToString ();
|
||||
if (refreshToken.IsNullOrEmpty ()) {
|
||||
refreshToken = await HttpContext
|
||||
.GetTokenAsync (XAuthorization.RefreshToken);
|
||||
}
|
||||
|
||||
//
|
||||
return refreshToken;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve Access Token Expiration Date
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task<long> GetTokenExpiresAt () {
|
||||
//
|
||||
var expiresAtStr = Request.Headers[XAuthorization.ExpiresAt]
|
||||
.ToString ();
|
||||
if (expiresAtStr.IsNullOrEmpty ()) {
|
||||
expiresAtStr = await HttpContext
|
||||
.GetTokenAsync (XAuthorization.ExpiresAt);
|
||||
}
|
||||
|
||||
//
|
||||
var expiresAt = expiresAtStr.ConvertTo<long> ();
|
||||
|
||||
//
|
||||
return expiresAt;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve All Required Tokens
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task<XLoginResponse> RetrieveTokensAsXLoginResponse () {
|
||||
//
|
||||
var accessToken = await GetAccessToken ();
|
||||
var refreshToken = await GetRefreshToken ();
|
||||
var expiresAt = await GetTokenExpiresAt ();
|
||||
|
||||
//
|
||||
return new XLoginResponse {
|
||||
AccessToken = accessToken,
|
||||
RefreshToken = refreshToken,
|
||||
ExpiresAt = expiresAt
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve All Required Tokens
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task<XTokenResponse> RetrieveTokensAsXTokenResponse () {
|
||||
//
|
||||
var accessToken = await GetAccessToken ();
|
||||
var refreshToken = await GetRefreshToken ();
|
||||
var expiresAt = await GetTokenExpiresAt ();
|
||||
|
||||
//
|
||||
return new XTokenResponse {
|
||||
AccessToken = accessToken,
|
||||
RefreshToken = refreshToken,
|
||||
ExpiresAt = expiresAt
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrive UserInfo
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task<XUserClaimsInfoDto> GetUserInfo () {
|
||||
//
|
||||
var claims = User.Claims ?? null;
|
||||
if (!claims.HasChild ()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var xTokens = await RetrieveTokensAsXTokenResponse ();
|
||||
var result = new XUserClaimsInfoDto (
|
||||
xTokens.AccessToken,
|
||||
xTokens.RefreshToken,
|
||||
xTokens.ExpiresAt,
|
||||
User.Claims
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validate User Authenticated and Retrieve User Info
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task<XUserClaimsInfoDto> ValidateAndGetUserInfo () {
|
||||
//
|
||||
if (!User.Identity.IsAuthenticated) {
|
||||
XException.NotAuthorized.Throw ();
|
||||
}
|
||||
|
||||
//
|
||||
var result = await GetUserInfo ();
|
||||
if (result.IsNull ()) {
|
||||
XException.NotAuthorized.Throw ();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,486 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using xCommons.Attributes;
|
||||
using xCommons.Configurations;
|
||||
using xCommons.Extensions;
|
||||
using xCommons.Providers;
|
||||
using xDataService.Interfaces;
|
||||
using xExceptions.Constants;
|
||||
using xIdentityService.Interfaces;
|
||||
using xModels.Base;
|
||||
using xModels.Dtos;
|
||||
using xModels.Interfaces;
|
||||
|
||||
namespace xIdentityService.Controllers {
|
||||
[Authorize]
|
||||
[RequireXPowered (false)]
|
||||
public abstract class XIBaseEntityController<TEntity, TKey> : XIBaseController, IXEntityControllerActions<TEntity, TKey>
|
||||
where TEntity : XBaseEntity<TKey> {
|
||||
public readonly IXBaseRepository<TEntity, TKey> repository;
|
||||
|
||||
protected XIBaseEntityController (
|
||||
ILogger logger,
|
||||
XAppConfiguration appConfiguration,
|
||||
IXIdentityProvider identityProvider,
|
||||
XValidationProvider validationProvider,
|
||||
IXBaseRepository<TEntity, TKey> repository
|
||||
) : base (
|
||||
logger,
|
||||
appConfiguration,
|
||||
identityProvider,
|
||||
validationProvider
|
||||
) {
|
||||
//
|
||||
this.repository = repository;
|
||||
}
|
||||
|
||||
//
|
||||
#region Interface Implementations ...
|
||||
//
|
||||
#region Retrieve ...
|
||||
[HttpGet ("{id}")]
|
||||
public virtual async Task<ActionResult<TEntity>> Get (
|
||||
[FromRoute] TKey id, [FromQuery] bool ignoreSoftDeleteds = true, [FromQuery] bool containsDetail = false
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
ValidationProvider.NotNull (id);
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.GetAsync (
|
||||
id,
|
||||
ignoreSoftDeleteds : ignoreSoftDeleteds,
|
||||
containsDetail : containsDetail
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public virtual async Task<ActionResult<IEnumerable<TEntity>>> GetAll (
|
||||
[FromQuery] bool ignoreSoftDeleteds = true, [FromQuery] bool containsDetail = false
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.GetAllAsync (
|
||||
ignoreSoftDeleteds: ignoreSoftDeleteds,
|
||||
containsDetail: containsDetail
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet ("FindOne/{query}")]
|
||||
public virtual async Task<ActionResult<TEntity>> FindOne (
|
||||
[FromRoute] string query, [FromQuery] bool ignoreSoftDeleteds = true, [FromQuery] bool containsDetail = false
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
ValidationProvider.NotEmpty (query);
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.FindOneAsync (t =>
|
||||
t.PropValuesContains (query),
|
||||
ignoreSoftDeleteds : ignoreSoftDeleteds,
|
||||
containsDetail : containsDetail
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet ("FindMany/{query}")]
|
||||
public virtual async Task<ActionResult<IEnumerable<TEntity>>> FindMany (
|
||||
[FromRoute] string query, [FromQuery] bool ignoreSoftDeleteds = true, [FromQuery] bool containsDetail = false
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
ValidationProvider.NotEmpty (query);
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.FindManyAsync (t =>
|
||||
t.PropValuesContains (query),
|
||||
ignoreSoftDeleteds : ignoreSoftDeleteds,
|
||||
containsDetail : containsDetail
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet ("Query")]
|
||||
public virtual async Task<ActionResult<XQueryResult<TEntity>>> Query (
|
||||
[FromQuery] XQuery query, [FromQuery] bool ignoreSoftDeleteds = true
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
ValidationProvider.NotNull (query);
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.QueryAsync (
|
||||
query,
|
||||
ignoreSoftDeleteds : ignoreSoftDeleteds
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// TODO: Fix this ...
|
||||
// [HttpGet ("RequestPage")]
|
||||
// public virtual async Task<ActionResult<XPageResponse<TEntity>>> RequestPage (
|
||||
// [FromQuery] XPageRequest request, [FromQuery] bool ignoreSoftDeleteds = true, [FromQuery] bool containsDetail = false
|
||||
// ) {
|
||||
// //
|
||||
// try {
|
||||
// //
|
||||
// // Validate Args ...
|
||||
// ValidationProvider.NotNull (request);
|
||||
|
||||
// //
|
||||
// // Get Result ...
|
||||
// var result = await repository
|
||||
// .RequestPageAsync (
|
||||
// request,
|
||||
// ignoreSoftDeleteds : ignoreSoftDeleteds,
|
||||
// containsDetail : containsDetail
|
||||
// );
|
||||
|
||||
// //
|
||||
// return Ok (result
|
||||
// .ToDynamicObject ());
|
||||
// } catch (Exception ex) {
|
||||
// //
|
||||
// var result = GetExceptionActionResult (ex);
|
||||
// return result;
|
||||
// }
|
||||
// }
|
||||
#endregion
|
||||
|
||||
//
|
||||
#region Add ...
|
||||
[HttpPost]
|
||||
public virtual async Task<ActionResult<TEntity>> Add (
|
||||
[FromBody] TEntity item
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!ModelState.IsValid) {
|
||||
XException.InvalidArgs.Throw ();
|
||||
}
|
||||
ValidationProvider.NotNull (item);
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.AddAsync (
|
||||
item,
|
||||
saveChanges : true
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPost ("AddOrUpdate")]
|
||||
public virtual async Task<ActionResult<TEntity>> AddOrUpdate (
|
||||
[FromBody] TEntity item
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!ModelState.IsValid) {
|
||||
XException.InvalidArgs.Throw ();
|
||||
}
|
||||
ValidationProvider.NotNull (item);
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.AddOrUpdateAsync (
|
||||
item,
|
||||
saveChanges : true
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPost ("AddMany")]
|
||||
public virtual async Task<ActionResult> AddMany (
|
||||
[FromBody] XBaseRangeRequest<TEntity> request
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!ModelState.IsValid) {
|
||||
XException.InvalidArgs.Throw ();
|
||||
}
|
||||
await ValidationProvider
|
||||
.GroupValidationBuilder ()
|
||||
.AddNotNull (request)
|
||||
.AddNotZeroChilds (request.Items)
|
||||
.ValidateGroupAsync ();
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
await repository
|
||||
.AddRangeAsync (
|
||||
request.Items,
|
||||
saveChanges : true
|
||||
);
|
||||
|
||||
//
|
||||
return Ok ();
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
//
|
||||
#region Update ...
|
||||
[HttpPut ("{id}")]
|
||||
public virtual async Task<ActionResult<TEntity>> Update (
|
||||
[FromRoute] TKey id, [FromBody] TEntity item
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!ModelState.IsValid) {
|
||||
XException.InvalidArgs.Throw ();
|
||||
}
|
||||
await ValidationProvider
|
||||
.GroupValidationBuilder ()
|
||||
.AddNotNull (id, item)
|
||||
.ValidateGroupAsync ();
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.UpdateAsync (
|
||||
id,
|
||||
item,
|
||||
saveChanges : true
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPost ("UpdateMany")]
|
||||
public virtual async Task<ActionResult<bool>> UpdateMany (
|
||||
[FromBody] XBaseRangeRequest<TEntity> request
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!ModelState.IsValid) {
|
||||
XException.InvalidArgs.Throw ();
|
||||
}
|
||||
await ValidationProvider
|
||||
.GroupValidationBuilder ()
|
||||
.AddNotNull (request)
|
||||
.AddNotZeroChilds (request.Items)
|
||||
.ValidateGroupAsync ();
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.UpdateRangeAsync (
|
||||
request.Items,
|
||||
saveChanges : true
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
//
|
||||
#region Exists ...
|
||||
[HttpGet ("{id}/IsExists")]
|
||||
public virtual async Task<ActionResult<bool>> IsExists (
|
||||
[FromRoute] TKey id, [FromQuery] bool ignoreSoftDeleteds = true
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
ValidationProvider.NotNull (id);
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.IsExistsAsync (
|
||||
id,
|
||||
ignoreSoftDeleteds : ignoreSoftDeleteds
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
//
|
||||
#region Remove ...
|
||||
[HttpDelete ("{id}")]
|
||||
public virtual async Task<ActionResult<TEntity>> Remove (
|
||||
[FromRoute] TKey id,
|
||||
bool softDelete = true
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
ValidationProvider.NotNull (id);
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
var result = await repository
|
||||
.RemoveAsync (
|
||||
id,
|
||||
saveChanges : true,
|
||||
softDelete : softDelete
|
||||
);
|
||||
|
||||
//
|
||||
return Ok (result
|
||||
.ToDynamicObject ());
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPost ("RemoveMany")]
|
||||
public virtual async Task<ActionResult> RemoveMany (
|
||||
[FromBody] XBaseRangeRequest<TEntity> request,
|
||||
bool softDelete = true
|
||||
) {
|
||||
//
|
||||
try {
|
||||
//
|
||||
// Validate Args ...
|
||||
await ValidationProvider
|
||||
.GroupValidationBuilder ()
|
||||
.AddNotNull (request)
|
||||
.AddNotZeroChilds (request.Items)
|
||||
.ValidateGroupAsync ();
|
||||
|
||||
//
|
||||
// Get Result ...
|
||||
await repository
|
||||
.RemoveRangeAsync (
|
||||
request.Items,
|
||||
saveChanges : true,
|
||||
softDelete : softDelete
|
||||
);
|
||||
|
||||
//
|
||||
return Ok ();
|
||||
} catch (Exception ex) {
|
||||
//
|
||||
var result = GetExceptionActionResult (ex);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user