sozsoft-platform/api/modules/Sozsoft.Mcp/Sozsoft.Mcp.HttpApi/Tools/McpReportTools.cs

80 lines
4.4 KiB
C#

using System.ComponentModel;
using System.Threading.Tasks;
using ModelContextProtocol.Server;
using Sozsoft.Mcp.Dtos;
namespace Sozsoft.Mcp.Tools;
/// <summary>
/// Rapor kategorisi ve DynamicReport sablonu araclari. Sablon HTML'dir ve
/// <c>/admin/reports/DynamicReport/view/{Id}</c> ile basilir; bir ekran kaydiyla acildiginda
/// <c>{{AlanAdi}}</c> yer tutuculari o kaydin alanlariyla doldurulur.
/// </summary>
[McpServerToolType]
public sealed class McpReportTools(IMcpReportAppService reportAppService)
{
[McpServerTool(Name = McpToolNames.ListReportTemplates, ReadOnly = true)]
[Description("Rapor kategorilerini ve rapor sablonlarini listeler; HTML dondurmez. Sablon kaydederken kategori adi buradan secilir.")]
public async Task<McpReportCatalogDto> ListReportTemplatesAsync(
[Description("Sablon adi ya da aciklamasi icinde aranacak metin. Bos birakilabilir.")]
string? search = null)
=> await reportAppService.GetReportTemplatesAsync(search);
[McpServerTool(Name = McpToolNames.GetReportTemplate, ReadOnly = true)]
[Description("Bir rapor sablonunun HTML icerigini, yer tutucularini ve goruntuleme adresini dondurur. Degistirmeden once oku.")]
public async Task<McpReportTemplateDto> GetReportTemplateAsync(
[Description("Sablonun Id'si ya da adi.")]
string template)
=> await reportAppService.GetReportTemplateAsync(template);
[McpServerTool(Name = McpToolNames.SaveReportCategory, Destructive = true, Idempotent = true)]
[Description("Rapor kategorisini ada gore kaydeder: yoksa ekler, varsa gunceller. Kayit bir ekran kaydindan basilan HTML sablonu ise var olan 'Raporlar' kategorisini kullan; yeni kategori yalnizca istenince acilir.")]
public async Task<McpReportCategoryDto> SaveReportCategoryAsync(
[Description("Kategorinin adi; kimligidir.")]
string name,
[Description("Aciklama.")]
string? description = null,
[Description("Ikon adi.")]
string? icon = null)
=> await reportAppService.SaveReportCategoryAsync(new McpReportCategorySaveRequestDto
{
Name = name,
Description = description,
Icon = icon
});
[McpServerTool(Name = McpToolNames.SaveReportTemplate, Destructive = true, Idempotent = true)]
[Description("DynamicReport sablonunu ada gore kaydeder: yoksa ekler, varsa gunceller; guncellemede verilmeyen alanlar korunur. Sablon A4'e basilan HTML'dir (Standard Taahhutname gibi). listFormCode verilirse HTML icindeki {{AlanAdi}} yer tutuculari o ekranin alanlarina gore dogrulanir ve cevapta rowButton doner: bu butonu ekranin CommandColumnJson listesine ekle (deploy_wizard), VisibleExpression ile kosullandir. Sozlesme icin get_dev_guide 9.12.")]
public async Task<McpReportTemplateDto> SaveReportTemplateAsync(
[Description("Sablonun adi; kimligidir.")]
string name,
[Description("Kategori adi ya da Id'si. Yeni sablonda zorunlu; kayit HTML'i icin 'Raporlar'.")]
string? category = null,
[Description("Basilacak HTML. Kayit alanlari {{AlanAdi}} ile, rapor tarihi @@date ile yazilir. Yeni sablonda zorunlu, guncellemede bos birakilirsa mevcut icerik korunur.")]
string? htmlContent = null,
[Description("Aciklama.")]
string? description = null,
[Description("'active' ya da 'passive'. Yeni sablonda varsayilan 'active'.")]
string? status = null,
[Description("Sablonun basilacagi ekranin kodu (ornegin katilimci listesi). Verilirse yer tutucular dogrulanir ve satir butonu doner.")]
string? listFormCode = null,
[Description("Satir butonunun dil anahtari. Verilmezse App.Platform.View.")]
string? buttonText = null)
=> await reportAppService.SaveReportTemplateAsync(new McpReportTemplateSaveRequestDto
{
Name = name,
Category = category,
HtmlContent = htmlContent,
Description = description,
Status = status,
ListFormCode = listFormCode,
ButtonText = buttonText
});
[McpServerTool(Name = McpToolNames.DeleteReportTemplate, Destructive = true, Idempotent = false)]
[Description("Rapor sablonunu siler. Sablonu acan satir butonlari ekranlardan ayrica kaldirilir.")]
public async Task DeleteReportTemplateAsync(
[Description("Sablonun Id'si ya da adi.")]
string template)
=> await reportAppService.DeleteReportTemplateAsync(template);
}