Skip to content
CAI
Software that uses CAICheck a score

Gramli/FileApi

50.8

Adequate · 21 September 2026

1.4k

lines of production code

C#

with TypeScript

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

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.