Update project dependencies (#12664)#12665
Conversation
WalkthroughThe changes pin GitHub Actions, update .NET and Xcode versions, refresh NuGet and tooling dependencies, migrate boilerplate storage APIs, refactor service and middleware extension syntax, and align SDK references and documentation. ChangesPlatform refresh
Estimated code review effort: 3 (Moderate) | ~25 minutes Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs`:
- Line 3: Update the attachment storage implementation using the FluentStorage
8.0.0 API surface: replace the incompatible IStore type and ObjectExists,
OpenRead, DeleteObject, SetBytes, and SetObject calls with their supported
blob-storage equivalents, or align the package dependency with the API currently
used. Keep attachment read, write, existence, and deletion behavior unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: ef74f081-eaf8-4127-8fda-814de19cbd52
📒 Files selected for processing (67)
.devcontainer/devcontainer.json.github/workflows/admin-sample.cd.yml.github/workflows/bit.ci.BlazorES2019.yml.github/workflows/bit.ci.BlazorUI.yml.github/workflows/bit.ci.Bmotion.yml.github/workflows/bit.ci.Brouter.yml.github/workflows/bit.ci.Bswup.yml.github/workflows/bit.ci.Butil.yml.github/workflows/bit.ci.Templates.yml.github/workflows/bit.ci.Websites.yml.github/workflows/bit.ci.release.yml.github/workflows/bit.full.ci.yml.github/workflows/blazorui.demo.cd.yml.github/workflows/nuget.org.yml.github/workflows/prerelease.nuget.org.yml.github/workflows/sales-module-demo.cd.yml.github/workflows/todo-sample.cd.ymlsrc/Besql/Demo/Bit.Besql.Demo.Client/Bit.Besql.Demo.Client.csprojsrc/Besql/Demo/Bit.Besql.Demo/Bit.Besql.Demo.csprojsrc/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csprojsrc/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csprojsrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csprojsrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csprojsrc/BlazorUI/Tests/Bit.BlazorUI.Tests/Bit.BlazorUI.Tests.csprojsrc/Bmotion/Bit.Bmotion.Demos/Bit.Bmotion.Demos.csprojsrc/Bmotion/Tests/Bit.Bmotion.Tests/Bit.Bmotion.Tests.csprojsrc/Brouter/InteralDemos/Auto/Bit.Brouter.Demos.Auto.Client/Bit.Brouter.Demos.Auto.Client.csprojsrc/Brouter/InteralDemos/Auto/Bit.Brouter.Demos.Auto/Bit.Brouter.Demos.Auto.csprojsrc/Brouter/InteralDemos/Wasm/Bit.Brouter.Demos.Wasm.Client/Bit.Brouter.Demos.Wasm.Client.csprojsrc/Brouter/InteralDemos/Wasm/Bit.Brouter.Demos.Wasm/Bit.Brouter.Demos.Wasm.csprojsrc/Brouter/Tests/Bit.Brouter.Tests/Bit.Brouter.Tests.csprojsrc/Bswup/Bit.Bswup.Demo/Bit.Bswup.Demo.csprojsrc/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/Bit.Bswup.NewDemo.Client.csprojsrc/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.csprojsrc/Bswup/FullDemo/Client/Bit.Bswup.Demo.Client.csprojsrc/Bswup/FullDemo/Server/Bit.Bswup.Demo.Server.csprojsrc/Butil/Demo/Bit.Butil.Demo.Maui/Bit.Butil.Demo.Maui.csprojsrc/Butil/Demo/Bit.Butil.Demo.Web/Bit.Butil.Demo.Web.csprojsrc/Butil/tests/Bit.Butil.E2ETests/ci/bit.ci.Butil.e2e.ymlsrc/ResxTranslator/Bit.ResxTranslator/Bit.ResxTranslator.csprojsrc/Templates/Boilerplate/Bit.Boilerplate/.devcontainer/devcontainer.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.docs/16- CI-CD Pipeline and Environments.mdsrc/Templates/Boilerplate/Bit.Boilerplate/.github/workflows/cd-template.ymlsrc/Templates/Boilerplate/Bit.Boilerplate/.github/workflows/ci.ymlsrc/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Infrastructure/Data/Migrations/20260119232453_Initial.Designer.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Infrastructure/Data/Migrations/AppOfflineDbContextModelSnapshot.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Maui/MauiProgram.Services.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Program.Services.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Windows/Program.Services.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.propssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/.config/dotnet-tools.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/Services/UserProfileImagesStorageHealthCheck.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/.config/dotnet-tools.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cssrc/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csprojsrc/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csprojsrc/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csprojsrc/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csprojsrc/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razorsrc/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csprojsrc/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csprojsrc/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csprojsrc/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csprojsrc/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csprojsrc/global.json
| //+:cnd:noEmit | ||
| using ImageMagick; | ||
| using FluentStorage.Blobs; | ||
| using FluentStorage.Storage; |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🌐 Web query:
What version of FluentStorage NuGet package introduced the IStore interface with ObjectExists, OpenRead, DeleteObject, SetBytes, and SetObject methods?
💡 Result:
The FluentStorage NuGet package does not contain an IStore interface that includes the methods ObjectExists, OpenRead, DeleteObject, SetBytes, and SetObject [1][2][3][4]. Instead, FluentStorage uses the IBlobStorage interface as its primary unified interface for blob storage operations [3][4][5]. While the requested methods align closely with common blob storage functionality, they appear to be confused with or misidentified from another library. In FluentStorage, the IBlobStorage interface provides methods such as ExistsAsync, OpenReadAsync, DeleteAsync, and various read/write methods to interact with blob storage providers [6][7]. The library was originally known as Storage.NET before being rebranded as FluentStorage in version 5.0.0 [8][9][10].
Citations:
- 1: https://github.com/robinrodricks/FluentStorage/wiki/Getting-Started
- 2: https://github.com/robinrodricks/FluentStorage/blob/develop/README.md
- 3: https://github.com/robinrodricks/FluentStorage
- 4: https://github.com/inghamc/FluentStorage
- 5: https://github.com/robinrodricks/FluentStorage/wiki/Custom-Sinks
- 6: https://mintlify.wiki/IntentArchitect/Intent.Modules.NET/modules/cloud/azure-blobstorage
- 7: Enhance Azure Blob Storage SDK with OpenReadAsync for Efficient Streaming Over DownloadAsync robinrodricks/FluentStorage#97
- 8: https://github.com/sharpjs/Sharp.BlobStorage
- 9: https://github.com/robinrodricks/FluentStorage/blob/develop/RELEASES.md
- 10: robinrodricks/FluentStorage@2b83e58
🏁 Script executed:
git ls-files | rg 'Directory\.Packages\.props|AttachmentController\.cs|UserProfileImagesStorageHealthCheck\.cs|csproj$'Repository: bitfoundation/bitplatform
Length of output: 5810
🏁 Script executed:
sed -n '1,220p' src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props && printf '\n---\n' && sed -n '1,280p' src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs && printf '\n---\n' && sed -n '1,220p' src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/Services/UserProfileImagesStorageHealthCheck.csRepository: bitfoundation/bitplatform
Length of output: 32011
🌐 Web query:
FluentStorage 8.0.0 IStore ObjectExists OpenRead DeleteObject SetBytes SetObject FluentStorage.Storage
💡 Result:
FluentStorage is a.NET polycloud storage library that provides a unified interface for interacting with various cloud storage providers [1][2]. In recent versions of FluentStorage, the primary interface for object storage is IBlobStorage rather than IStore [3][2]. Based on the library's architecture, the operations you mentioned correspond to the following standard methods available on the blob storage interface: ObjectExists: Typically implemented as ExistsAsync(string fullPath, CancellationToken cancellationToken = default). OpenRead: Implemented as OpenReadAsync(string fullPath, CancellationToken cancellationToken = default). DeleteObject: Implemented as DeleteAsync(string fullPath, CancellationToken cancellationToken = default). SetBytes: While there is no method explicitly named SetBytes, you can write data to a blob using WriteAsync(string fullPath, Stream dataStream, bool append = false, CancellationToken cancellationToken = default). To write a byte array, you would typically wrap the bytes in a MemoryStream and pass it to WriteAsync. SetObject: If you are referring to serializing and storing an object, FluentStorage does not provide a direct SetObject method; you would typically serialize your object to a stream or byte array and use the WriteAsync method. The FluentStorage.Storage namespace contains the core abstractions and factory classes, such as StorageFactory, used to instantiate storage providers [4]. For technical implementation details, it is recommended to refer to the library's official GitHub wiki, as method signatures and patterns are consistent across supported providers [5][2].
Citations:
- 1: https://github.com/robinrodricks/FluentStorage
- 2: https://github.com/robinrodricks/FluentStorage/blob/develop/README.md
- 3: https://github.com/inghamc/FluentStorage
- 4: https://github.com/robinrodricks/FluentStorage/tree/develop/FluentStorage
- 5: https://github.com/robinrodricks/FluentStorage/wiki/Getting-Started
🏁 Script executed:
rg -n --hidden --glob '!**/bin/**' --glob '!**/obj/**' '\bIStore\b|\bObjectExists\b|\bOpenRead\b|\bDeleteObject\b|\bSetBytes\b|\bSetObject\b' src/Templates/Boilerplate/Bit.Boilerplate/srcRepository: bitfoundation/bitplatform
Length of output: 2889
🏁 Script executed:
sed -n '80,120p' src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.csRepository: bitfoundation/bitplatform
Length of output: 2851
🌐 Web query:
site:github.com/robinrodricks/FluentStorage IStore FluentStorage.Storage StorageFactory.Disk AzureBlobStorage.FromSharedKey 8.0.0
💡 Result:
FluentStorage is a.NET library that provides a unified abstraction layer for various cloud and local storage providers [1][2]. Regarding your query elements: - FluentStorage is the main library [1]. - StorageFactory is the central class used to initialize storage instances [3][4]. - While there is no standard method named AzureBlobStorage.FromSharedKey directly on the StorageFactory, FluentStorage provides factory methods for Azure Blob Storage, typically accessed via StorageFactory.Blobs [3]. - Versions up to at least 2025.1.0 are documented in the repository [5]. There is no official "8.0.0" release indicated in the repository's major release history or standard versioning pattern (which appears to follow a date-based or incremental scheme like 6.0.0 or 2025.1.0) [5]. For Azure Blob Storage, the library typically uses connection strings (via StorageFactory.Blobs.FromConnectionString) or BlobServiceClient instances (via AzureBlobStorage factory methods) for authentication [3][6][5]. If you are looking to authenticate using shared keys, you should ensure you are using the latest version of the FluentStorage.Azure.Blobs package and consult the current documentation for supported factory methods, as specific APIs for credential types may change across versions [5].
Citations:
- 1: https://github.com/robinrodricks/FluentStorage
- 2: https://github.com/robinrodricks/FluentStorage/blob/develop/README.md
- 3: https://github.com/robinrodricks/FluentStorage/wiki/Getting-Started
- 4: https://github.com/robinrodricks/FluentStorage/tree/develop/FluentStorage
- 5: https://github.com/robinrodricks/FluentStorage/blob/develop/RELEASES.md
- 6: Creation of Azure storage from connection string failed for shared key credentials robinrodricks/FluentStorage#66
FluentStorage API mismatch IStore and the ObjectExists/OpenRead/DeleteObject/SetBytes/SetObject calls don’t match the pinned FluentStorage 8.0.0 surface; this needs to use the package’s actual blob-storage API or update the dependency.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs`
at line 3, Update the attachment storage implementation using the FluentStorage
8.0.0 API surface: replace the incompatible IStore type and ObjectExists,
OpenRead, DeleteObject, SetBytes, and SetObject calls with their supported
blob-storage equivalents, or align the package dependency with the API currently
used. Keep attachment read, write, existence, and deletion behavior unchanged.
closes #12664
Summary by CodeRabbit
Maintenance
Bug Fixes
Compatibility