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 AllModels => ModelRegistry.All.Keys.Select(k => new object[] { k }); /// Modelos con clave primaria simple — los que admiten GetById. internal static IEnumerable SingleKeyModels => ModelRegistry.All.Keys.Where(HasSingleColumnKey).Select(k => new object[] { k }); }