using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using xCommons.Configurations; using xCommons.Controllers; using xCommons.Extensions; using xCommons.Providers; using xModels.Interfaces; using xExceptions.Constants; using xModels.Base; using xModels.Dtos; using xDataService.Interfaces; namespace xDataService.Controllers { public abstract class XBaseEntityController : XBaseController, IXEntityControllerActions where TEntity : XBaseEntity { public readonly IXBaseRepository repository; protected XBaseEntityController ( ILogger logger, XAppConfiguration appConfiguration, XValidationProvider validationProvider, IXBaseRepository repository ) : base ( logger, appConfiguration, validationProvider ) { // this.repository = repository; } // #region Interface Implementations ... // #region Retrieve ... [HttpGet ("{id}")] public virtual async Task> 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>> 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> 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>> 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>> 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>> 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> 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> 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 AddMany ( [FromBody] XBaseRangeRequest 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> 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> UpdateMany ( [FromBody] XBaseRangeRequest 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> 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> 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 RemoveMany ( [FromBody] XBaseRangeRequest 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 } }