Gramli/FileApi
50.8
Adequate · 21 September 2026
1.4k
lines of production code
C#
with TypeScript
4
measurements over time
What this system is
This release introduces the new File.API service and its corresponding Angular frontend, enabling file upload, download, export, and format conversion between JSON, XML, and YAML. The architecture is expanded with a comprehensive domain model, repository implementations, and a file conversion pipeline, all built on .NET 10 and Angular 19. Additionally, the solution structure is modernized with .slnx format and enhanced IDE debugging support, while extensive integration, system, and unit tests are added to ensure reliability.
Features
Added development launch configuration and updated solution structure
A new \FileSol.slnLaunch\ file was added to enable one-click debugging of the API and frontend services in the IDE. The solution file was migrated to the new \.slnx\ format, which reorganizes the project structure to explicitly group and reference test projects (Integration, System, and Unit tests) alongside the main application projects.
src · high confidence
Added file repository implementations for database operations
Introduced new repository classes, FileCommandsRepository and FileQueriesRepository, which implement the IFileCommandsRepository and IFileQueriesRepository interfaces respectively. These repositories handle file creation and retrieval from the database using Entity Framework Core, including mapping DTOs to entities via Mapster and returning results through the FluentResults library.
src/File.Infrastructure/Database/Repositories · high confidence
Added file storage entity and database context
Introduced a new Entity Framework Core setup for file storage. A new FileEntity class defines the schema with properties for Id, FileName, ContentType, and Data. A corresponding FileContext DbContext class was added to manage the Files DbSet, enabling database interactions for file storage.
src/File.Infrastructure/Database/EFContext · high confidence
Added localized error message resources
Introduced new localized error messages for the file infrastructure, specifically for conversion failures, empty conversion data, and missing files. These are defined in the newly added \ErrorMessages.resx\ and the corresponding \ErrorMessages.Designer.cs\ class, enabling the application to display user-friendly, localized error strings for these specific scenarios.
src/File.Infrastructure/Resources · high confidence
Added localized error messages for file operations and validation
New localized error messages have been added to support file operations and validation. The \ErrorMessages\ resource now includes strings for \ConvertFileFailed\, \ExportFileFailed\, \FileNotExist\, \ReadFileStreamFailed\, and \SaveFileFailed\. Additionally, the \ValidationErrorMessages\ resource provides strings for \FileIsEmpty\, \InvalidRequest\, \MaximalFileSize\, \UnsuportedConversion\, \UnsupportedExtension\, and \UnsupportedFormat\. These changes enable the application to display user-friendly, localized error messages for file handling and validation scenarios.
src/File.Core/Resources · high confidence
Initial Angular frontend scaffolding for file management
The File.Frontend module is introduced, providing a complete Angular 19 application for file operations. This includes the main application component with a table for displaying file metadata, buttons for uploading, converting, downloading, and exporting files, and a modal for selecting file extensions. The implementation integrates with a backend API via an HTTP service, manages loading states, and supports internationalization through a custom multi-path translation loader for English text.
src/File.Frontend · high confidence
Initial configuration setup for file operations
The File.Core module now registers all file-related command and query handlers (AddFiles, GetFilesInfo, DownloadFile, ExportFile, ConvertTo) along with their corresponding validators (AddFiles, ConvertTo, ExportFile, FileByOptions) via the new ContainerConfigurationExtension. This enables the application to process file uploads, retrieve file information, download files, export files, and convert file formats, with built-in validation for each operation.
src/File.Core/Configuration · high confidence
Initial release of the File.API service
Introduces the File.API application, a .NET 8 web service that exposes file upload and conversion endpoints. The service is configured with specific file handling rules, allowing XML, YAML, JSON, TXT, and CSV formats, with defined export capabilities between them. It includes CORS, Swagger, and exception middleware, and relies on the SmallApiToolkit for endpoint building.
src/File.API · high confidence
Introduce core abstractions for file operations
Added new interfaces in the File.Core.Abstractions layer to define contracts for file management. This includes handlers for adding, downloading, exporting, and converting files, alongside corresponding validators for commands and queries. The update also introduces repository interfaces for file commands and queries, as well as a service interface for file conversion, establishing the structural foundation for these capabilities.
src/File.Core/Abstractions · high confidence
Introduce file format conversion between JSON, XML, and YAML
Added a new file conversion infrastructure that enables converting files between JSON, XML, and YAML formats. The change introduces a \FileConversionService\ that orchestrates the conversion process, utilizing a factory pattern (\IFileConverterFactory\) to select the appropriate converter (e.g., \JsonToXmlFileConverter\, \XmlToJsonFileConverter\, \YamlToJsonFileConverter\) based on source and destination extensions. The implementation includes specific converters for each supported pair (JSON↔XML, JSON↔YAML, XML↔YAML) and an \EncodingFactory\ to handle character encoding detection. This provides a unified way to transform file contents between these three data interchange formats.
src/File.Infrastructure/FileConversions · high confidence
Introduce file management API endpoints
Added a new endpoint builder for file operations, registering routes for uploading, downloading, retrieving file information, parsing, exporting, and converting files. The implementation uses the SmallApiToolkit for endpoint registration and includes specific handlers for each operation, such as AddFiles, DownloadFile, GetFilesInfo, Export, and ConvertTo.
src/File.API/EndpointBuilders · high confidence
Introduce file upload configuration options
Added new configuration classes, AllowedFile and FilesOptions, to define allowed file formats, content types, and export targets, along with a maximum file length setting for file uploads.
src/File.Domain/Options · medium confidence
Introduced query models for file operations
Added new query classes to handle file-related requests: ConvertToQuery for file conversion, DownloadFileQuery for downloading files by ID, and ExportFileQuery for exporting files with a specified extension.
src/File.Domain/Queries · high confidence
Introduces FormFileProxy to abstract file handling
A new FormFileProxy class has been added to the Files module, implementing the IFileProxy interface to wrap an IFormFile. This proxy exposes file metadata (ContentType, Length, FileName) and provides methods to copy the file content to a stream or retrieve it as a byte array, facilitating file processing within the API layer.
src/File.API/Files · high confidence
Introduces file query handlers for downloading, exporting, and converting files
Adds new query handlers to the File.Core module to support downloading files, exporting files with optional format conversion, and retrieving file metadata. The implementation includes validation for export and conversion requests, integrates with the SmallApiToolkit for HTTP responses, and utilizes Mapster for object mapping. Specific handlers include ConvertToQueryHandler, DownloadFileQueryHandler, ExportFileQueryHandler, and GetFilesInfoQueryHandler, each enforcing validation and error handling for their respective operations.
src/File.Core/Queries · high confidence
New extension methods for enumerables, file names, and FluentResults
Added three new extension classes in the File.Domain.Extensions namespace. EnumerableExtensions provides ForEach, ForEachAsync, and HasAny helpers for iterating and checking collections. FileNameExtensions adds a GetFileExtension method to extract file extensions from file name strings. FluentResultExtensions adds ToErrorMessages and JoinToMessage helpers to format error lists from the FluentResults library.
src/File.Domain/Extensions · high confidence
Register file conversion and database services in the infrastructure layer
The application now registers the file conversion pipeline (IEncodingFactory, IFileConverterFactory, IFileConvertService) and database dependencies (In-Memory FileContext, FileCommandsRepository, FileQueriesRepository) via the new ContainerConfigurationExtension. This enables the system to handle file uploads and perform file conversions using in-memory storage for testing or development.
src/File.Infrastructure/Configuration · medium confidence
Behavioural changes
Add structured logging event definitions for file operations
A new LogEvents class was added to define specific integer error codes for general, stream, and database issues related to adding, getting, and exporting files, as well as general errors for file conversion.
src/File.Domain/Logging · high confidence
Add validation for file operations
Introduces new validation logic for file operations, including AddFilesCommand, ConvertToQuery, DownloadFileQuery, and ExportFileQuery. The changes add validators and specification holders for each operation, ensuring that file uploads, conversions, downloads, and exports are validated against defined rules. This includes checks for file name, content type, file size, and supported conversions.
src/File.Core/Validation · high confidence
AddFilesCommandHandler implementation for file upload processing
A new AddFilesCommandHandler has been added to process file upload commands. The handler validates incoming requests, iterates through uploaded files to create DTOs, and persists them via a repository. It handles potential I/O exceptions during file processing and returns a response containing any error messages encountered during the save operation.
src/File.Core/Commands · medium confidence
Added custom content type mapping and JSON file download handler
The File.API service now supports serving YAML files by registering a custom content type mapping for the '.yaml' extension. Additionally, a new handler extension was added to support downloading files as JSON responses, converting file data into a base64-encoded JSON structure containing the file's content type, file name, and length.
src/File.API/Extensions · medium confidence
Added logging and CORS configuration extensions
A new extension class was added to configure application logging to output to the console and to set up a specific CORS policy allowing requests from localhost:4200 and 127.0.0.1:4200 with all headers and methods.
src/File.API/Configuration · high confidence
Introduce new domain DTOs and commands for file handling
Added new data transfer objects and commands to support file operations. This includes the AddFilesCommand for processing file collections, and several DTOs: BaseFileDto for common file metadata (name, content type, length), FileDto for binary file data, FileInfoDto for file identification, and StringContentFileDto for string-based content. These changes establish the data structures used across the file domain.
src/File.Domain/Dtos · high confidence
Test coverage
Added integration tests for file format converters; Added system test helper extensions for HTTP client and response handling; Added system tests for file API endpoints; Added unit tests for file handling and validation logic.
Dependencies
Upgrade to .NET 10 and Angular 19
The project has been upgraded to target .NET 10.0 across all C\# projects, with package references updated to version 10.0.0 for Microsoft.AspNetCore.OpenApi, SmallApiToolkit, Swashbuckle.AspNetCore, Microsoft.Extensions.\*, and Microsoft.AspNetCore.Mvc.Testing. The frontend has been upgraded to Angular 19.1.4 and its associated tooling (Angular CLI and build tools) to version 19.1.6. Additionally, the solution now uses central package management via Directory.Packages.props to standardize dependency versions.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 60 → 51 (-9.6)
- Rubric changed (rubric-2026.08.18 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 98 → 93 (-5.0)
- Architecture 87 → 88 (+0.3)
- Maturity 77 → 77 (+0.2)
- Readiness 54 → 40 (-14.0)
- Security 54 → 43 (-10.9)
- Accessibility 67 → 69 (+1.8)
Resolved (56)
- Bounded contexts not declared
- Coverage not measured — analyzer environment
- Critical CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- Critical CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- Critical CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- …and 36 more
New (217)
- Critical CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- Critical CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- Critical CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- Critical CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- Documentation: no contributor guidance (README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- High CVE: [GHSA redacted] (src/File.Frontend/package-lock.json)
- …and 197 more
Architecture
- Unchanged — 2 containers · 0 contexts · 0 edges
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
Gramli/FileApi was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit ba7740030874776e7db21c4d5c7877037e59c22d — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-28e75b8e3254.