TrinityText.Business 1.4.80-beta

This is a prerelease version of TrinityText.Business.
dotnet add package TrinityText.Business --version 1.4.80-beta
                    
NuGet\Install-Package TrinityText.Business -Version 1.4.80-beta
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="TrinityText.Business" Version="1.4.80-beta" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="TrinityText.Business" Version="1.4.80-beta" />
                    
Directory.Packages.props
<PackageReference Include="TrinityText.Business" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add TrinityText.Business --version 1.4.80-beta
                    
#r "nuget: TrinityText.Business, 1.4.80-beta"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package TrinityText.Business@1.4.80-beta
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=TrinityText.Business&version=1.4.80-beta&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=TrinityText.Business&version=1.4.80-beta&prerelease
                    
Install as a Cake Tool

#2026-10-01

  • Security: AutoMapper 14 (GHSA-rvv3-g6hj-g44x, DoS via uncontrolled recursion; fixes only in the commercial 15.x/16.x) replaced by Riok.Mapperly 4.3 (Apache-2.0, source generator: no reflection, no runtime graph walking). BusinessMapperProfile → internal BusinessMapper; services no longer take IMapper (hosts must remove AddAutoMapper(BusinessMapperProfile)). Unmapped DTO/entity members now break the build (RMG012)
  • Refactor: version 1.4.0 (public API: services lose the IMapper constructor parameter); mapping behavior is unchanged
  • Tests: BusinessMapperTests for every custom mapping rule

#2026-09-30

  • License: rollback to Automapper 14.0.0

#2026-09-29

  • Security: TextType.Name validated with PathSafety (used as export file name); export file paths canonicalised and confined to the export root (PathSafety.EnsureWithinRoot)
  • Security: widget expansion capped at 5 MB total (nested widgets could grow exponentially)
  • Security: tenant / website / file names validated in TransferService before FTP/SFTP navigation; publication payload website must match the publication website (Generate/Publish)
  • Security: removed hard-coded [TRINITY] database name from raw SQL in PublicationService; UpdateZipContent failures are now propagated
  • Security: IPublicationService.GetAll accepts an optional websites filter (null keeps previous behavior)
  • Security: widget content and placeholder values are CDATA-safe (]]> can no longer close the section and inject markup into published pages)
  • Security: XML schemas/contents parsed with DTD processing prohibited (SafeXml)
  • Security: file names validated with PathSafety; system folder names (site / language) validated in CreateFolderByName
  • Security: SaveFolder rejects missing / cross-website parents and cycles; GetFileLink is loop-safe
  • Security: images declaring more than MaxPixels (default 50 MP) are not decoded; null codec handled
  • Security: HTML-encoded values in publish/generate notification mails; null-safe FTP server name
  • Performance: GetFileIdByFullname (id only, no CONTENT) used for link resolution; new WidgetResolutionCache memoizes widget and link lookups across the pages of an export (new overloads on IWidgetUtilities)
  • Performance: DeleteFile via set-based delete and GetFileLink via metadata projection (no blob loading)
  • New: ExecuteUpdateAsync on IRepository<T> (set-based UPDATE of selected columns; EF Core + NHibernate implementations, UpdateSetters<T>)
  • Performance: RenameFile and MoveFile update the row in place (no blob load/rewrite); a moved file keeps its id (before: new row + delete)
  • Performance: file export loads one blob at a time (IFileManagerService.GetFileContent) instead of the whole folder; export paths confined to the export root
  • Performance: publication ZIP streamed from disk to SQL (IPublicationService.UpdateWithZipStream, VarBinary(max)); publication status updated with a targeted UPDATE (no entity graph rewrite)
  • Performance: publishable pages loaded without repeating the PageType schema XML on every row (page types loaded once)
  • Performance: ImportTexts inserts new texts in a single batch (AddRangeAsync); Excel import resolves text types via dictionary
  • Performance: multi-sheet Excel export in memory (no temp file)
  • Performance: remaining synchronous reads (GetAll*, NotDuplicated, folder/file lookups) are now async; PublicationService.GetAll no longer reads FTP credentials (new IRepository<FtpServer> constructor dependency, resolved by DI)
  • Performance: FTP transfers use FluentFTP AsyncFtpClient
  • Performance: thumbnails decoded directly at reduced size (SKCodec.GetScaledDimensions) with linear sampling; one codec per image operation (size limit, animation check and decode share it)
  • Performance: GetPublishableTextsByWebsite groups global texts by language once (ToLookup, Concat instead of Union); GetPublishableTexts skips the redundant SQL ORDER BY
  • Performance: CleanRevisions is a single set-based DELETE (no id list materialised)
  • Performance: default site / language folder creation reads the parent's children once
  • Performance: WidgetService.GetByKeys is async; owner/website filters use col == null || col == "" instead of IsNullOrWhiteSpace (index friendly)
  • New: Core/TrinityText.Domain/Db/indexes.sql with recommended non-clustered indexes (run manually on the database)
  • CI: releases.yml runs only on published (before: published/edited/released produced several packages per release), least-privilege permissions, concurrency, timeouts, API key via env, environment: nuget, offline tests before publishing, single build + pack --no-build; builds.yml also on pull requests, runs the offline tests and reports vulnerable packages; new dependabot.yml and codeql.yml
  • Packaging: symbol packages (snupkg), SourceLink, deterministic CI builds, MIT license acceptance not required; SkiaSharp.NativeAssets.Linux.NoDependencies added so image processing works on Linux
  • Fix: publish failure keeps the publication and its ZIP (status Failed) instead of deleting them; Generate/Publish consumers are idempotent (completed publications are skipped, a Publishing one only re-sends the publish message); mails only when an address is set and never with line breaks in the subject
  • Fix: a missing/corrupt ZIP or a failed compression is an error (before: empty upload reported as success, empty path returned); partial ZIP and export folder are removed on failure
  • Fix: export failures (folders/files/content not readable) abort the publication instead of producing an incomplete one; export paths use Path.Combine (Linux-safe) and are confined to the export root; site / language codes of the payload are validated; invalid XML characters removed from exported texts; empty OutputFilename falls back to the page type name; page errors report the page id and title
  • Fix: CleanRevisions rejects a limit lower than 1 (deleted every revision) and counts by REVISION_NUMBER
  • Fix: text selection no longer throws (Single) or silently drops texts when the same key exists at several levels
  • Fix: null and empty website/site/country are equivalent in duplicate checks and publish queries; text names upper-cased with the invariant culture (also on update); updating a text adds a revision even when none was loaded and never reuses the id of an existing revision; TextDTO → Text no longer maps the nested TextType
  • Fix: RemoveFolder deletes files and subfolders (foreign keys do not cascade); SaveFolder refuses to edit system folders, keeps the website and rejects duplicate sibling names; AddFile requires the folder to belong to the website; file links are unescaped when resolved; GetAllFolders sets Deletable; PasteFile/MoveFile error codes were swapped; moving a file into its own folder is a no-op
  • Fix: optional Number/DateTime page atoms can be empty; invariant culture in the page schema
  • Fix: Begin/Commit/RollbackTransaction nest (EF: an inner Begin used to roll back the outer transaction); CDN update is transactional and uses targeted UPDATEs; widget update checks duplicates; PublicationService.Create returns FTP/CDN, Get accepts a publication without payload
  • Fix: SFTP GetFile no longer returns a null Task, clients are disposed, files opened read-only, port honored; remote directory taken from the URL path (no more user:password@ / port as folder names); AWS translator reuses one client and reports errors instead of returning an empty translation; Excel import fails on unreadable files, collapses repeated rows, blank scope cells are null; widget lookup errors are no longer published as the widget key; thumbnail options validated
  • Tests: [TestCategory("Offline")] tests (no database) for PathSafety, WidgetUtilities, text selection, atoms, mapping, ZIP, transfer and the publish/generate consumers (MassTransit test harness)
  • Fix (NHibernate): Create returned the identifier cast to the entity (InvalidCastException) and Read passed the id array to GetAsync; Create/Update/Delete were never flushed outside a transaction; the mapping lacked FtpServer.PASSWORD, Publication.EMAIL/PAYLOAD/FK_FTPSERVER/FK_CDNSERVER, WebsiteConfiguration.URL/NOTE; Text.TEXTTYPE was mandatory; new revisions and CDN join rows were not persisted (cascade); many-to-one DeleteOrphans could delete the referenced entity; foreign keys to existing rows are now written from the scalar column (like EF Core) and the join tables use scalar composite keys
  • Fix: ExecuteDeleteAsync/ExecuteUpdateAsync ignore auto-includes (EF Core threw ArgumentOutOfRangeException on FtpServerPerCdnServer, breaking the CDN update); untyped texts were never published with NHibernate (IN (.., NULL)); duplicate check and import compare upper-cased names; CDN creation inserts the join rows after the server
  • Security: PathSafety also rejects control characters, Windows device names (CON, NUL, COM1, ...), trailing dots and names longer than 255
  • Security: widget token regex bounded (no quadratic scan on unclosed @[WIDGET() with a timeout, input size limit; nested widgets are expanded first and the ]]> protection is applied once to the whole expansion (a widget ending with ] nesting one starting with ]> could close the CDATA)
  • Security: FileUploadPolicy blocks server-side scripts, executables and web server configuration files (AddFile, RenameFile); CDN base URL must be http(s); FTP/SFTP address must be ftp:// / sftp:// without credentials; the transfer accepts only those schemes
  • Security: Excel import refuses rows of websites the caller cannot manage (allowedWebsites on IExcelService.GetTextsFromStream and ITextService.ImportTexts), invalid site/language names and sheets over 50,000 rows
  • Security: pages must be well-formed XML (no DTD, at most 200 levels, 5 M characters) to be saved; widgets are limited to 1 M characters; SafeXml limits characters and depth (the JSON conversion is recursive); GetPage caps the page size (1000) and cannot overflow
  • Security: vulnerable transitive packages pinned (System.Text.Json 8.0.5, System.Security.Cryptography.Xml 10.0.12, System.Net.Http / X509Certificates for NHibernate); the CI check of vulnerable packages now fails the build
  • Tests: SQLite in-memory fixture running the repository and service tests on EF Core and NHibernate, EF/NH/script parity tests, hardening tests
  • Performance: TextType.TEXTTYPEPERWEBSITES is no longer auto-included (every text row was multiplied by the number of websites of its type)
  • Performance: latest-revision loading and text import query in chunks of 1000 ids/names (no huge IN (...) lists); re-importing an unchanged sheet with override does not rewrite the texts
  • Performance: PageService search / publishable pages read the page columns only and load each PageType (with its schema XML) once; no SQL ORDER BY on the export; Save uses a targeted UPDATE and Remove a set-based delete
  • Fix: publishable pages of a site no longer include pages of languages the site does not publish
  • Performance: GetFile reads only the requested blob (content or thumbnail); overriding a file updates it in place without reading the old blobs; Remove of widgets / publications is a set-based delete; GetAllRevisions is ordered and does not load the text
  • Performance: one widget / link cache and one parsed schema per page type for the whole export; texts grouped once per language; ordinal placeholder replacement; GalleryAtom.Validate is linear
  • Performance: publication ZIP streamed from the database to a temporary file (IPublicationService.CopyZipTo) and extracted off the consumer thread (ICompressionFileService.DecompressFile); PublishWebsiteConsumer no longer loads the ZIP in memory; ZIP built with CompressionLevel.Fastest
  • Performance: SFTPTransferService uses the asynchronous SSH.NET API (no thread blocked for the whole transfer)
  • Performance: NHibernate batch fetching on TextType, PageType, FtpServer, CdnServer, Folder
  • New: Db/indexes.sql (foreign key and widget indexes) and Db/optional_optimizations.sql (Contenuti.CONTENUTO ntext → nvarchar(max), unique index on text revisions): run manually
  • Tests: page / widget behavior on both providers, end-to-end export and publish with fake services

#2026-06-12

  • Performance: Text.REVISIONS no longer auto-included; only the latest revision is loaded per text via a single correlated query (was eager-loading every historical revision with full content on every read)
  • Performance: removed redundant circular TextRevision.TEXT auto-include
  • Performance: CleanRevisions deletes excess revisions via SQL correlated count (no revision content loaded into memory)
  • Security: GetFileByFullname resolves same-named files by folder path (was NotImplementedException on multi-match)
  • Security: RemoveFolder refuses non-deletable folders and folders whose subtree contains system folders
  • Security: path-segment validation (PathSafety) on folder names, TextType/PageType Subfolder and OutputFilename to prevent traversal
  • Fix: Search sorting crash when only some sort fields were set (Nullable.Value on unset field)
  • Fix: TransferService.GetFile now returns the downloaded bytes (were discarded)
  • Fix: TrinityEFContext transaction field reset on commit/rollback + guarded begin (stale transaction from pooled context)

#2026-06-11

  • New: CountAsync on IRepository<T> (EF + NHibernate implementations)
  • Performance: async Search in TextService / PageService / WidgetService (CountAsync + ToListAsync)
  • Performance: async WriteAllBytesAsync / ReadAllBytesAsync in publication generation pipeline
  • Performance: O(n²) → O(n) folder tree build via ToLookup(ParentId)
  • Performance: direct DTO projection in GetAllFolders (no entity intermediate, async)
  • Performance: MaxBy instead of OrderByDescending().FirstOrDefault() in TextRevision mapping
  • Performance: JRaw in CreateJsonContentsDocument (no double-encoding, no dynamic dispatch)
  • Performance: ExcelMapperService single-sheet exports via MemoryStream (no temp file)
  • Performance: retry with exponential backoff in GenerateWebsiteConsumer (was busy retry, no delay)
  • Refactor: Sort extension — explicit Unordered handling, safer casts; preserves IQueryable.Expression.Type check (EF Core concrete queryable implements IOrderedQueryable<T> even before sorting, so runtime-type checks are unsafe)
  • Fix: SerializedFile async factory (Path.GetFileName, ReadAllBytesAsync)

#2026-06-10

  • New: provider-agnostic IRepository<T> (EF Core + NHibernate) with async query and bulk operations
  • Performance: eliminate N+1 queries in publishing, import, and website configuration flows
  • Performance: bulk ExecuteDeleteAsync for revisions and join tables
  • Performance: O(n²) → O(n) in text reduction via ToLookup indexing
  • Performance: direct DTO projection in file listing (optional blob columns)
  • Performance: widget resolution with compiled regex and per-call batched lookups
  • Performance: XML parsing via XDocument.Parse, element lookup via ToLookup
  • Performance: async blob streaming in publications (GetFieldValueAsync, sequential access)
  • Performance: stream-based FTP/SFTP transfers, deduplicated file enumeration
  • Fix: duplicate FTP entries on CDN update
  • Fix: SkiaSharp native resources properly disposed; correct output buffer

#2026-06-03

  • Security: add filename and folder name validation in FileManagerService (trim, invalid chars check)
  • Security: fix duplicate assignment of NAME in SaveFolder
  • Performance: fix N+1 query in GetFileLink (single query + in-memory traversal)
  • Performance: fix N+1 query in CheckFileToFolder (load filenames once into HashSet)
  • Performance: fix loop DELETE on text revisions in TextService.Remove
  • Performance: remove unused recursive method GetAllSubfoldersByFolder
  • Performance: remove async/await Task.FromResult overhead across all service methods (26 occurrences)
  • Refactor: fix multi-dot filename handling in CheckFileToFolder (use LastIndexOf)

#2026-03-16

  • Fix SFTPTransferService
  • Optimize ZipCompressionService

#2025-02-13

  • Add useOriginalFormat to AddFile interface
  • Introduce useMobile attribute in atom

#2025-02-05

  • Add SeparatorAtom support
  • Add "Extend" property in TextAtom
  • Fix "Mobile", "Target" support in ImageAtom
  • Add extra name, description support in ImageParticol

#2025-01-27

  • Fix publish error email
  • Update nuget packages

#2024-11-04

  • Fix gif animate compression bug

#2024-10-30

  • Improve export algorithm

#2024-10-29

  • Remove formatting problems

#2024-10-28

  • Clean code for better performance
  • Update packages

#2024-04-04

  • Update packages

#2024-03-31

  • Update packages
  • Fix warning

#2024-01-31

  • Migrate to NET8

#2023-10-05

  • Add DateTime Atom

#2023-07-08

  • Migrate to NET6
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (3)

Showing the top 3 NuGet packages that depend on TrinityText.Business:

Package Downloads
TrinityText.Utilities

Trinity Text utilities layer

TrinityText.ServiceBus.MassTransit

Trinity Text servicebus implementation with MassTransit

TrinityText.Utilities.AWS

Trinity Text utilities layer integration with Amazon AWS

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.4.80-beta 46 10/1/2026
1.3.79-beta 59 9/29/2026
1.3.78-beta 178 6/11/2026
1.3.77-beta 175 6/11/2026
1.3.76-beta 171 6/10/2026
1.3.75-beta 176 6/3/2026
1.3.74-beta 173 6/3/2026
1.2.73-beta 209 3/16/2026
1.2.72-beta 610 7/24/2025
1.2.71-beta 602 7/24/2025
1.2.70-beta 246 2/13/2025
1.2.69-beta 237 2/5/2025
1.2.68 304 11/4/2024
1.2.67-beta 237 10/30/2024
1.2.66-beta 233 10/30/2024
1.2.65-beta 235 10/29/2024
1.2.64-beta 237 10/29/2024
1.2.63-beta 240 10/28/2024
1.2.62-beta 270 5/7/2024
1.2.61-beta 245 5/7/2024
Loading failed