using System.Linq.Expressions; using System.Reflection; using ApiSourceGeneratorHelper; using AutoMapPropertyHelper; using EntityFrameworkCore.Projectables; using EntityFrameworkCore.Projectables.Extensions; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using NejCommon.Utils; using Swashbuckle.AspNetCore.Annotations; using NejCommon.Models; using System.ComponentModel.DataAnnotations.Schema; namespace NejCommon.Controllers { public abstract class AutoChildController : AutoChildController where TType : class, new() where TRequest : class, IAutomappedAttribute, new() where TResponse : class, IAutomappedAttribute, new() { public AutoChildController(CommonDbContext appDb, IServiceProvider providers) : base(appDb, providers) { } } /// /// /// /// The underyling type /// The request type /// The response type [ApiController] public abstract class AutoChildController : ControllerBase where TType : class, new() where TGetResponse : class, IAutomappedAttribute, new() where TUpdateRequest : class, IAutomappedAttribute, new() where TUpdateResponse : class, IAutomappedAttribute, new() { protected readonly CommonDbContext db; protected readonly IServiceProvider providers; public AutoChildController(CommonDbContext appDb, IServiceProvider providers) : base() { db = appDb; this.providers = providers; } [NonAction] public abstract TType? GetQuery(TOwner comp); protected abstract void Assign(TOwner comp, TType query); public virtual bool Trackable => true; public virtual TType GetQueryHelper(TOwner owner){ var entity = GetQuery(owner); if (entity == null) { if (Trackable) entity = db.Create(); else entity = new TType(); Assign(owner, entity); } return entity; } /// /// Gets the /// /// /// Success /// There was an error [HttpGet] [Route("")] public virtual async Task>> Get([FromServices] TOwner owner) { var entity = GetQuery(owner); var dat = new TGetResponse().ApplyFrom(providers, entity); return TypedResults.Ok(dat); } /// /// Update company. /// /// /// /// Success /// There was an error [HttpPut] [Route("")] public virtual async Task, Ok>> Update([FromServices] TOwner owner, [FromBody] TUpdateRequest body) { var entity = GetQueryHelper(owner); /* if(entity is InvoiceBase inv){ //Console.Writeline(inv.InvoiceItems.Count); }*/ body.ApplyTo(providers, entity); var res = await db.ApiSaveChangesAsyncOk(providers, entity); //use the private constructor thru reflection var ctor = typeof(Results, Ok>).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0]; return (Results, Ok>)ctor.Invoke(new object[] { res.Result }); } } }