Some checks are pending
Backend:
- src/food-market.api/Storage/IObjectStorage.cs — абстракция
(SaveAsync, OpenAsync, DeleteAsync, PublicUrl). Имя реализации (Kind)
для логов.
- LocalObjectStorage — ContentRoot/uploads/{key}. По умолчанию.
- MinioObjectStorage — S3-совместимый bucket, ключ-объекта совпадает с
тем что хранится в БД (products/{id:N}/{guid}.png). PutObject с явным
size (для NetworkStream копируем в MemoryStream).
- StorageOptions: Type=Local|Minio, Endpoint, AccessKey, SecretKey,
UseSsl, Bucket=food-market-uploads.
- StorageBootstrap.AddObjectStorage — DI-регистрация с runtime fallback
на Local если MinIO-config пустой; MinioBootstrap (IHostedService)
создаёт bucket на старте, ловит ошибку и не валит API.
- UploadsController: GET /uploads/{**path} → стримит из IObjectStorage
(cache-control 7 дней). Нужен когда MinIO активен — для Local nginx
раздаёт быстрее, но фолбэк работает.
- ProductImagesController отрефакторен на IObjectStorage; URL'ы в БД
остаются /uploads/products/{id}/{guid}.ext.
Тесты:
- StorageAbstractionTests (3/3 ✓): Local default, round-trip bytes,
PublicUrl pattern.
Stage-готовность:
- deploy/docker-compose.yml на стейдже обновлён (через scp): добавлен
minio container, depends_on в api, env переменные Storage__*.
Bucket автосоздаётся.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
38 lines
1.6 KiB
XML
38 lines
1.6 KiB
XML
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
<PropertyGroup>
|
|
<TargetFramework>net8.0</TargetFramework>
|
|
<RootNamespace>foodmarket.Api</RootNamespace>
|
|
<AssemblyName>foodmarket.Api</AssemblyName>
|
|
<UserSecretsId>food-market-api</UserSecretsId>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\food-market.domain\food-market.domain.csproj" />
|
|
<ProjectReference Include="..\food-market.application\food-market.application.csproj" />
|
|
<ProjectReference Include="..\food-market.infrastructure\food-market.infrastructure.csproj" />
|
|
<ProjectReference Include="..\food-market.shared\food-market.shared.csproj" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<PackageReference Include="Microsoft.AspNetCore.OpenApi" />
|
|
<PackageReference Include="Swashbuckle.AspNetCore" />
|
|
<PackageReference Include="OpenIddict.AspNetCore" />
|
|
<PackageReference Include="Serilog.AspNetCore" />
|
|
<PackageReference Include="Serilog.Sinks.Console" />
|
|
<PackageReference Include="Serilog.Sinks.File" />
|
|
<PackageReference Include="Hangfire.AspNetCore" />
|
|
<PackageReference Include="Hangfire.PostgreSql" />
|
|
<PackageReference Include="CsvHelper" />
|
|
<PackageReference Include="Minio" />
|
|
<PackageReference Include="ClosedXML" />
|
|
<PackageReference Include="prometheus-net.AspNetCore" />
|
|
<PackageReference Include="MediatR" />
|
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- Email-шаблоны embedded в сборку — см. EmailTemplates.LoadRaw. -->
|
|
<EmbeddedResource Include="Resources/EmailTemplates/*.html" />
|
|
</ItemGroup>
|
|
</Project>
|