A native integer is a number in the api type system too, and a between rule
that carries its own comparer is skipped when its bounds no longer read as an
interval, because the comparer itself is not on the descriptor.
The contribution context carries the property now, so a rule on another type,
the ordinal comparison of two strings for example, no longer publishes a
numeric bound. Two bounds are compared as decimals, which are exact for every
integral type, and only fall back to double for the magnitudes decimal can
not hold.
Range(Type, string, string) keeps its limits as strings until the first
validation. They are converted the way the attribute converts them, so the
reported limit is the one the server validates against whatever the culture
of the request is, and a magnitude outside the decimal range survives it.
Range(Type, string, string) keeps its limits as strings until the first
validation, so a numeric limit was reported in the culture that declared it
and could not be merged with a FluentValidation bound.
It reflects the statically evaluable FluentValidation rules of a DTO into the
api definition, so the client proxy generators see the same constraints the
attributes already provide. A rule is only published when it applies to every
instance of the type, which leaves out the conditional rules, the rules of a
non-default rule set and the rules of a RuleForEach.
Volo.Abp.FluentValidation keeps its own dependencies, it does not depend on
Volo.Abp.Http.
The RangeAttribute supports exclusive bounds since .NET 8, but they were lost
in the api definition. The bounds are also written with the invariant culture
now, so the api definition does not depend on the culture of the request.
This change hardens `AbpUnitOfWorkMiddleware` to avoid invalid second completion attempts when the response starts during end-of-pipeline UoW completion, and to skip early completion while a shared child UoW scope is still active. It adds active child-scope tracking in `UnitOfWorkExtensions`/`ChildUnitOfWork`, updates option docs to clarify behavior, and adds MVC tests plus controller/event-handler scenarios covering child-scope response flush and event-driven response writes during completion.
- Enable globally via CompleteUnitOfWorkOnResponseStarting or per path via the Urls list
- OpenIddict opts in its endpoints so token/session rows commit before the response
* Only the projected GetAsync passes it, that is the path Repository.GetAsync already covered
* Assert a single data query so a materialize-then-project implementation can not pass
* Opting out of the projection brings the entity based overrides back
* IQueryProjector replaces IQueryableMapper, the hooks can await other queries to join them
* A projection must return one row per entity, the total count and the paging come before it
* Pass the ambient cancellation token and detect the missing entity for value type DTOs
* Fall back to GetEntityByIdAsync when a by-id query can not be created
* Expose IQueryProjectionMapper implementations like IObjectMapper does
* Document query projection and cover EF Core, MongoDB and Mapperly
- IBlobPipelineContributor pipeline; encryption runs innermost with an authenticated end check
- Adapt FileSystem/AWS to forward-only streams; fail early on unsupported AES-GCM
- Introduced IByteArrayEncryptionService interface for encrypting and decrypting binary data with authenticated encryption.
- Implemented methods for encrypting and decrypting byte arrays and streams, including options for passphrase and salt.
- Enhanced blob storing tests to cover encryption scenarios, including tenant-specific passphrases and custom pipeline contributors.
- Added FakeInMemoryBlobProvider and various test containers to facilitate testing of blob storage with encryption.
- Created unit tests for ByteArrayEncryptionService to validate encryption and decryption functionality, including edge cases for tampered data and oversized chunks.
- Treat QUERY as a safe method like GET: excluded from audit logging and non-transactional UOW
- Add HTTP verb constants and Is* helpers to HttpMethodHelper