using System; using System.Threading.Tasks; using Erp.SqlQueryManager.Application.Contracts; using Erp.SqlQueryManager.Domain.Entities; using Erp.SqlQueryManager.Domain.Services; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; namespace Erp.SqlQueryManager.Application; public class SqlViewAppService : CrudAppService< SqlView, SqlViewDto, Guid, PagedAndSortedResultRequestDto, CreateSqlViewDto, UpdateSqlViewDto>, ISqlViewAppService { private readonly ISqlExecutorService _sqlExecutorService; public SqlViewAppService( IRepository repository, ISqlExecutorService sqlExecutorService) : base(repository) { _sqlExecutorService = sqlExecutorService; } public override async Task CreateAsync(CreateSqlViewDto input) { var entity = new SqlView( GuidGenerator.Create(), input.ViewName, input.SchemaName ?? "dbo", input.DisplayName, input.ViewDefinition, input.DataSourceCode, CurrentTenant.Id) { Description = input.Description, Category = input.Category, WithSchemaBinding = input.WithSchemaBinding }; await Repository.InsertAsync(entity); return ObjectMapper.Map(entity); } public override async Task UpdateAsync(Guid id, UpdateSqlViewDto input) { var entity = await Repository.GetAsync(id); entity.DisplayName = input.DisplayName; entity.Description = input.Description; entity.UpdateDefinition(input.ViewDefinition); entity.Category = input.Category; entity.WithSchemaBinding = input.WithSchemaBinding; await Repository.UpdateAsync(entity); return ObjectMapper.Map(entity); } public async Task DeployAsync(DeployViewDto input) { var view = await Repository.GetAsync(input.Id); // Drop if exists and requested if (input.DropIfExists) { await _sqlExecutorService.DropObjectAsync( view.ViewName, "VIEW", view.DataSourceCode, view.SchemaName); } // Deploy the view var result = await _sqlExecutorService.DeployViewAsync( view.ViewDefinition, view.DataSourceCode); if (result.Success) { view.MarkAsDeployed(); await Repository.UpdateAsync(view); } return MapExecutionResult(result); } public async Task CheckExistsAsync(Guid id) { var view = await Repository.GetAsync(id); return await _sqlExecutorService.CheckObjectExistsAsync( view.ViewName, "VIEW", view.DataSourceCode, view.SchemaName); } public async Task DropAsync(Guid id) { var view = await Repository.GetAsync(id); var result = await _sqlExecutorService.DropObjectAsync( view.ViewName, "VIEW", view.DataSourceCode, view.SchemaName); if (result.Success) { view.IsDeployed = false; await Repository.UpdateAsync(view); } return MapExecutionResult(result); } private SqlQueryExecutionResultDto MapExecutionResult(SqlExecutionResult result) { return new SqlQueryExecutionResultDto { Success = result.Success, Message = result.Message, Data = result.Data, RowsAffected = result.RowsAffected, ExecutionTimeMs = result.ExecutionTimeMs, Metadata = result.Metadata }; } }