Files
xIdentityService/Controllers/XIBaseEntityController.cs
T
2024-01-25 04:44:02 +03:30

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
}
}