using Microsoft.EntityFrameworkCore;
using ServicesDAO.Data;
using ServicesDAO.Repositories;
using System.Text.Json;
namespace DynamicCrud.Tests.Grpc;
///
/// Metadatos del modelo EF leídos sin abrir conexión: EF construye el modelo en memoria
/// a partir de las clases y sus atributos, así que basta una cadena de conexión sintácticamente
/// válida que nunca se usa. Sirve para saber cuál es la clave primaria de cada entidad, dato
/// que GetFields no expone por gRPC.
///
internal static class ModelMetadata
{
private static readonly Lazy _context = new(() =>
{
var options = new DbContextOptionsBuilder()
.UseMySQL("server=127.0.0.1;port=3306;user=none;password=none;database=none")
.UseSnakeCaseNamingConvention()
.Options;
return new CloudServicesDbContext(options);
});
///
/// Nombres de las propiedades que forman la clave primaria, en el mismo camelCase con el
/// que el servicio serializa los registros. Lista vacía si la entidad no declara PK.
///
internal static IReadOnlyList PrimaryKey(string modelName)
{
var type = ModelRegistry.Resolve(modelName);
if (type is null) return Array.Empty();
var pk = _context.Value.Model.FindEntityType(type)?.FindPrimaryKey();
if (pk is null) return Array.Empty();
return pk.Properties
.Select(p => JsonNamingPolicy.CamelCase.ConvertName(p.Name))
.ToList();
}
///
/// Los modelos con clave compuesta (o sin clave) no se pueden consultar por
/// GetById, que resuelve con un único valor vía FindAsync.
///
internal static bool HasSingleColumnKey(string modelName) => PrimaryKey(modelName).Count == 1;
/// Todos los modelos expuestos por el CRUD dinámico.
internal static IEnumerable