diff --git a/zero.Sqlite/Operations/DbOperations.Read.cs b/zero.Sqlite/Operations/DbOperations.Read.cs index 19e9d5ee..139da96e 100644 --- a/zero.Sqlite/Operations/DbOperations.Read.cs +++ b/zero.Sqlite/Operations/DbOperations.Read.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using ServiceStack.OrmLite; +using ServiceStack.OrmLite.Dapper; using zero.Extensions; using zero.Models; using zero.Utils; @@ -67,125 +68,30 @@ public partial class DbOperations : IDbOperations } - // /// - // public virtual async Task Any(Func, IQueryable> querySelector = default) where T : ZeroIdEntity, new() - // { - // querySelector ??= x => x; - // return await querySelector(Session.Query()).AnyAsync(); - // } - // - // - // /// - // public virtual async Task> Load(int pageNumber, int pageSize, Func, IQueryable> querySelector = default) where T : ZeroIdEntity, new() - // { - // IRavenQueryable queryable = Session.Query().Statistics(out QueryStatistics statistics); - // querySelector ??= x => x; - // - // List result = await querySelector(queryable).Paging(pageNumber, pageSize).ToListAsync(); - // return new Paged(result, statistics.TotalResults, pageNumber, pageSize); - // } - // - // - // /// - // public virtual async Task> Load(int pageNumber, int pageSize, Func, IQueryable> querySelector = default) - // where T : ZeroIdEntity, new() - // where TIndex : AbstractCommonApiForIndexes, new() - // { - // IRavenQueryable queryable = Session.Query().Statistics(out QueryStatistics statistics); - // querySelector ??= x => x; - // - // List result = await querySelector(queryable).Paging(pageNumber, pageSize).ToListAsync(); - // return new Paged(result, statistics.TotalResults, pageNumber, pageSize); - // } - // - // - // /// - // public virtual async Task> Load(Func, IQueryable> querySelector) where T : ZeroIdEntity, new() - // { - // IRavenQueryable queryable = Session.Query(); - // querySelector ??= x => x; - // - // return await querySelector(queryable).ToListAsync(); - // } - // - // - // /// - // public virtual async Task> Load(Func, IQueryable> querySelector) - // where T : ZeroIdEntity, new() - // where TIndex : AbstractCommonApiForIndexes, new() - // { - // IRavenQueryable queryable = Session.Query(); - // querySelector ??= x => x; - // - // return await querySelector(queryable).ToListAsync(); - // } - // - // - // /// - // public virtual async Task> Load(Expression> predicate) where T : ZeroIdEntity, new() - // { - // return await Session.Query().Where(predicate).ToListAsync(); - // } - // - // - // /// - // public virtual async Task> Load(Expression> predicate) - // where T : ZeroIdEntity, new() - // where TIndex : AbstractCommonApiForIndexes, new() - // { - // return await Session.Query().Where(predicate).ToListAsync(); - // } - // - // - // /// - // public virtual async Task> Load(int pageNumber, int pageSize, Func, IQueryable> querySelector = default) - // where T : ZeroIdEntity, new() - // where TProjection : ZeroIdEntity, new() - // where TIndex : AbstractCommonApiForIndexes, new() - // { - // IRavenQueryable queryable = Session.Query().Statistics(out QueryStatistics statistics); - // querySelector ??= x => x; - // - // List result = await querySelector(queryable).ProjectInto().Paging(pageNumber, pageSize).ToListAsync(); - // return new Paged(result, statistics.TotalResults, pageNumber, pageSize); - // } - // - // - // /// - // public virtual async Task> LoadAll() where T : ZeroIdEntity, new() - // { - // List items = new(); - // - // await foreach (T item in Stream(null)) - // { - // items.Add(item); - // } - // - // return items; - // } - // - // - // /// - // public virtual async IAsyncEnumerable Stream(Func, IQueryable> expression) where T : ZeroIdEntity, new() - // { - // IRavenQueryable query = Session.Query(); - // IQueryable queryable = query; - // - // if (expression != null) - // { - // queryable = expression(query); - // } - // - // var stream = await Session.Advanced.StreamAsync(queryable); - // - // while (await stream.MoveNextAsync()) - // { - // if (WhenActive(stream.Current.Document) == default) - // { - // continue; - // } - // - // yield return stream.Current.Document; - // } - // } + /// + public virtual async Task Any(Expression> querySelector = null) where T : ZeroIdEntity, new() + { + return await Db.ExistsAsync(querySelector ?? (x => true)); + } + + + /// + public virtual async Task> Load(Expression> querySelector) where T : ZeroIdEntity, new() + { + return await Db.SelectAsync(querySelector ?? (x => true)); + } + + + /// + public virtual async Task> LoadBySql(Func, SqlExpression> querySelector) where T : ZeroIdEntity, new() + { + return await Db.SelectAsync(querySelector(Db.From())); + } + + + /// + public virtual async Task> LoadAll() where T : ZeroIdEntity, new() + { + return await Db.SelectAsync(x => true); + } } \ No newline at end of file diff --git a/zero.Sqlite/Operations/DbOperations.cs b/zero.Sqlite/Operations/DbOperations.cs index 419b98b4..ad170dd9 100644 --- a/zero.Sqlite/Operations/DbOperations.cs +++ b/zero.Sqlite/Operations/DbOperations.cs @@ -151,6 +151,27 @@ public interface IDbOperations /// Task> LoadAsList(IEnumerable ids) where T : ZeroIdEntity, new(); + /// + /// Check if any items exist in this collection (with optional query) + /// + Task Any(Expression> querySelector = null) where T : ZeroIdEntity, new(); + + /// + /// Get entities by query + /// + Task> Load(Expression> querySelector) where T : ZeroIdEntity, new(); + + /// + /// Get entities by sql query + /// + Task> LoadBySql(Func, SqlExpression> querySelector) where T : ZeroIdEntity, new(); + + /// + /// Get all entities from this collection. + /// Warning: Don't use this method for large collections. Stream the results instead. + /// + Task> LoadAll() where T : ZeroIdEntity, new(); + /// /// Creates an entity with an optional validator /// diff --git a/zero/Localization/FluentValidationGermanLanguage.cs b/zero/Localization/FluentValidationGermanLanguage.cs new file mode 100644 index 00000000..b5556516 --- /dev/null +++ b/zero/Localization/FluentValidationGermanLanguage.cs @@ -0,0 +1,37 @@ +namespace zero.Localization; + +public class FluentValidationGermanLanguage +{ + public static readonly Dictionary Translations = new() + { + { "EmailValidator", "Keine gültige E-Mail-Adresse" }, + { "GreaterThanOrEqualValidator", "Der Wert muss grösser oder gleich '{ComparisonValue}' sein." }, + { "GreaterThanValidator", "Der Wert muss grösser sein als '{ComparisonValue}'." }, + { "LengthValidator", "Die Länge muss zwischen {MinLength} und {MaxLength} Zeichen liegen. Es wurden {TotalLength} Zeichen eingetragen." }, + { "MinimumLengthValidator", "Die Länge muss größer oder gleich {MinLength} sein. Sie haben {TotalLength} Zeichen eingegeben." }, + { "MaximumLengthValidator", "Die Länge muss kleiner oder gleich {MaxLength} sein. Sie haben {TotalLength} Zeichen eingegeben." }, + { "LessThanOrEqualValidator", "Der Wert muss kleiner oder gleich '{ComparisonValue}' sein." }, + { "LessThanValidator", "Der Wert muss kleiner sein als '{ComparisonValue}'." }, + { "NotEmptyValidator", "Dieses Feld darf nicht leer sein." }, + { "NotEqualValidator", "Dieser Wert darf nicht '{ComparisonValue}' sein." }, + { "NotNullValidator", "Dieses Feld darf nicht leer sein." }, + { "PredicateValidator", "Der Wert entspricht nicht der festgelegten Bedingung." }, + { "AsyncPredicateValidator", "Der Wert entspricht nicht der festgelegten Bedingung." }, + { "RegularExpressionValidator", "Dieses Feld weist ein ungültiges Format auf." }, + { "EqualValidator", "Der Wert muss gleich '{ComparisonValue}' sein." }, + { "ExactLengthValidator", "Dieses Feld muss genau {MaxLength} lang sein. Es wurden {TotalLength} eingegeben." }, + { "ExclusiveBetweenValidator", "Der Wert muss zwischen {From} und {To} sein (exklusiv). Es wurde {PropertyValue} eingegeben." }, + { "InclusiveBetweenValidator", "Der Wert muss zwischen {From} and {To} sein. Es wurde {PropertyValue} eingegeben." }, + { "CreditCardValidator", "Keine gültige Kreditkartennummer." }, + { "ScalePrecisionValidator", "Das Feld darf insgesamt nicht mehr als {ExpectedPrecision} Ziffern enthalten, mit Berücksichtigung von {ExpectedScale} Dezimalstellen. Es wurden {Digits} Ziffern und {ActualScale} Dezimalstellen gefunden." }, + { "EmptyValidator", "Dieses Feld sollte leer sein." }, + { "NullValidator", "Dieses Feld sollte leer sein." }, + { "EnumValidator", "Dieses Feld hat einen Wertebereich, der '{PropertyValue}' nicht enthält." }, + // Additional fallback messages used by clientside validation integration. + { "Length_Simple", "Die Länge muss zwischen {MinLength} und {MaxLength} Zeichen liegen." }, + { "MinimumLength_Simple", "Die Länge muss größer oder gleich {MinLength} sein." }, + { "MaximumLength_Simple", "Die Länge muss kleiner oder gleich {MaxLength} sein." }, + { "ExactLength_Simple", "Dieses Feld muss genau {MaxLength} lang sein." }, + { "InclusiveBetween_Simple", "Der Wert muss zwischen {From} and {To} sein." } + }; +} \ No newline at end of file diff --git a/zero/Localization/LanguageManagerExtensions.cs b/zero/Localization/LanguageManagerExtensions.cs new file mode 100644 index 00000000..42db29aa --- /dev/null +++ b/zero/Localization/LanguageManagerExtensions.cs @@ -0,0 +1,18 @@ +using FluentValidation.Resources; + +namespace zero.Localization; + +public static class LanguageManagerExtensions +{ + public static ILanguageManager AddGermanOverrides(this ILanguageManager manager) + { + if (manager is LanguageManager languageManager) + { + foreach (var kvp in FluentValidationGermanLanguage.Translations) + { + languageManager.AddTranslation("de", kvp.Key, kvp.Value); + } + } + return manager; + } +} \ No newline at end of file diff --git a/zero/Localization/ZeroLocalizationModule.cs b/zero/Localization/ZeroLocalizationModule.cs index 45d3e938..3a41a6d6 100644 --- a/zero/Localization/ZeroLocalizationModule.cs +++ b/zero/Localization/ZeroLocalizationModule.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc.Localization; +using FluentValidation; +using Microsoft.AspNetCore.Mvc.Localization; using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -12,6 +13,8 @@ internal class ZeroLocalizationModule : ZeroModule { // hint: think about using https://github.com/nuages-io/nuages-localization + ValidatorOptions.Global.LanguageManager.AddGermanOverrides(); + services.AddScoped(); services.AddScoped(); services.AddScoped();