486 lines
16 KiB
C#
486 lines
16 KiB
C#
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
|
|
}
|
|
} |