using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Sozsoft.Mcp.Dtos;
using Sozsoft.Mcp.Services;
using Sozsoft.Platform;
using Sozsoft.Platform.ListForms.Select;
using Volo.Abp;
namespace Sozsoft.Mcp;
///
/// Veri yazma yuzeyi. Yazma her zaman bir ListForm ekraninin insert/update/delete
/// sozlesmesinden gecer; ekran yetkisi, tenant filtresi ve seed senkronizasyonu oradaki
/// yoldan aynen uygulanir.
///
[Authorize(PlatformConsts.AppCodes.DeveloperKits.McpServers.Write)]
public class McpDataAppService(
IMcpServerConfigProvider serverConfigProvider,
IListFormDataAppService listFormDataAppService)
: McpAppService(serverConfigProvider), IMcpDataAppService
{
public async Task InsertRowAsync(McpRowRequestDto input)
{
var request = await BuildRequestAsync(input, McpToolNames.InsertRow, requireKeys: false, requireValues: true);
var key = await listFormDataAppService.PostInsertAsync(request);
return new McpWriteResultDto { Key = ((object?)key)?.ToString() };
}
public async Task UpdateRowAsync(McpRowRequestDto input)
{
var request = await BuildRequestAsync(input, McpToolNames.UpdateRow, requireKeys: true, requireValues: true);
var affected = await listFormDataAppService.PostUpdateAsync(request);
return new McpWriteResultDto { AffectedRows = affected };
}
public async Task DeleteRowAsync(McpRowRequestDto input)
{
var request = await BuildRequestAsync(input, McpToolNames.DeleteRow, requireKeys: true, requireValues: false);
var affected = await listFormDataAppService.PostDeleteAsync(request);
return new McpWriteResultDto { AffectedRows = affected };
}
///
/// Istegi ekranin bekledigi bicime cevirir. Data JSON metni olarak verilir; ayni
/// bicim ekranin kopyalama yolunda da kullanilir.
///
private async Task BuildRequestAsync(
McpRowRequestDto input,
string toolName,
bool requireKeys,
bool requireValues)
{
Check.NotNull(input, nameof(input));
// AllowWrite kapaliysa yazma araclari McpToolPolicy tarafindan zaten reddedilir;
// burada ayri bir kontrol yok.
await EnsureToolAllowedAsync(toolName);
if (string.IsNullOrWhiteSpace(input.ListFormCode))
{
throw new UserFriendlyException(L[McpErrorCodes.ListFormCodeRequired]);
}
if (requireValues && (input.Values is null || input.Values.Count == 0))
{
throw new UserFriendlyException(L[McpErrorCodes.ValuesRequired]);
}
if (requireKeys && (input.Keys is null || input.Keys.Count == 0))
{
throw new UserFriendlyException(L[McpErrorCodes.KeysRequired]);
}
return new DataRequestDto
{
ListFormCode = input.ListFormCode,
Data = JsonSerializer.Serialize(input.Values ?? new Dictionary()),
Keys = [.. (input.Keys ?? []).Select(key => key!)]
};
}
}