using System; using System.Collections.Generic; using System.Threading.Tasks; using Sozsoft.Platform.DeveloperKit; using Sozsoft.Platform.Entities; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Sozsoft.Platform; namespace Platform.Api.Application; public class CrudEndpointGenerateAppService : CrudAppService< CrudEndpoint, CrudEndpointDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateCrudEndpointDto>, ICrudEndpointAppService { public CrudEndpointGenerateAppService( IRepository repository) : base(repository) { } [HttpGet("api/app/crud-endpoint-generate/active-endpoints")] [Authorize(PlatformConsts.AppCodes.DeveloperKits.CrudEndpoints)] public virtual async Task> GetActiveEndpointsAsync() { var endpoints = await Repository.GetListAsync(x => x.IsActive); return await MapToGetListOutputDtosAsync(endpoints); } [HttpGet("api/app/crud-endpoint-generate/endpoints-by-entity/{entityName}")] [Authorize(PlatformConsts.AppCodes.DeveloperKits.CrudEndpoints)] public virtual async Task> GetEndpointsByEntityAsync(string entityName) { var endpoints = await Repository.GetListAsync(x => x.EntityName == entityName); return ObjectMapper.Map, List>(endpoints); } [HttpPost("api/app/crud-endpoint-generate/{id}/toggle")] [Authorize(PlatformConsts.AppCodes.DeveloperKits.CrudEndpoints)] public virtual async Task ToggleAsync(Guid id) { var endpoint = await Repository.GetAsync(id); endpoint.IsActive = !endpoint.IsActive; await Repository.UpdateAsync(endpoint, autoSave: true); return ObjectMapper.Map(endpoint); } [HttpPost("api/app/crud-endpoint-generate/generate-crud-endpoints/{entityName}")] [Authorize(PlatformConsts.AppCodes.DeveloperKits.CrudEndpoints)] public virtual async Task> GenerateCrudEndpointsAsync(string entityName) { // CRUD endpointleri oluştur var endpoints = new List { new() { EntityName = entityName, Method = "GET", Path = $"/api/app/crudendpoint/{entityName}", OperationType = "GetList", IsActive = true, CsharpCode = GenerateGetAllCode(entityName) }, new() { EntityName = entityName, Method = "GET", Path = $"/api/app/crudendpoint/{entityName}/{{id}}", OperationType = "GetById", IsActive = true, CsharpCode = GenerateGetByIdCode(entityName) }, new() { EntityName = entityName, Method = "POST", Path = $"/api/app/crudendpoint/{entityName}", OperationType = "Create", IsActive = true, CsharpCode = GenerateCreateCode(entityName) }, new() { EntityName = entityName, Method = "PUT", Path = $"/api/app/crudendpoint/{entityName}/{{id}}", OperationType = "Update", IsActive = true, CsharpCode = GenerateUpdateCode(entityName) }, new() { EntityName = entityName, Method = "DELETE", Path = $"/api/app/crudendpoint/{entityName}/{{id}}", OperationType = "Delete", IsActive = true, CsharpCode = GenerateDeleteCode(entityName) } }; // Var olanları sil var existingEndpoints = await Repository .GetListAsync(x => x.EntityName == entityName); await Repository.DeleteManyAsync(existingEndpoints); // Yeni endpointleri ekle await Repository.InsertManyAsync(endpoints, autoSave: true); var result = ObjectMapper.Map, List>(endpoints); return new PagedResultDto { Items = result, TotalCount = result.Count }; } private string GenerateGetAllCode(string entityName) { return $@"[HttpGet] public async Task>> GetAll{entityName}sAsync() {{ var entities = await _context.{entityName}s.ToListAsync(); return Ok(entities); }}"; } private string GenerateGetByIdCode(string entityName) { return $@"[HttpGet(""{{id}}"")] public async Task> Get{entityName}Async(Guid id) {{ var entity = await _context.{entityName}s.FindAsync(id); if (entity == null) {{ return NotFound($""{entityName} with ID {{id}} not found""); }} return Ok(entity); }}"; } private string GenerateCreateCode(string entityName) { return $@"[HttpPost] public async Task> Create{entityName}Async({entityName} {entityName.ToLower()}) {{ _context.{entityName}s.Add({entityName.ToLower()}); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(Get{entityName}Async), new {{ id = {entityName.ToLower()}.Id }}, {entityName.ToLower()}); }}"; } private string GenerateUpdateCode(string entityName) { return $@"[HttpPut(""{{id}}"")] public async Task Update{entityName}Async(Guid id, {entityName} {entityName.ToLower()}) {{ if (id != {entityName.ToLower()}.Id) {{ return BadRequest(""ID mismatch""); }} _context.Entry({entityName.ToLower()}).State = EntityState.Modified; try {{ await _context.SaveChangesAsync(); }} catch (DbUpdateConcurrencyException) {{ if (!await {entityName}ExistsAsync(id)) {{ return NotFound($""{entityName} with ID {{id}} not found""); }} throw; }} return NoContent(); }}"; } private string GenerateDeleteCode(string entityName) { return $@"[HttpDelete(""{{id}}"")] public async Task Delete{entityName}Async(Guid id) {{ var {entityName.ToLower()} = await _context.{entityName}s.FindAsync(id); if ({entityName.ToLower()} == null) {{ return NotFound($""{entityName} with ID {{id}} not found""); }} _context.{entityName}s.Remove({entityName.ToLower()}); await _context.SaveChangesAsync(); return NoContent(); }} private async Task {entityName}ExistsAsync(Guid id) {{ return await _context.{entityName}s.AnyAsync(e => e.Id == id); }}"; } }