feat(server): add OpenNest.Server SQLite nest storage API
SQLite-backed (Microsoft.Data.Sqlite, WAL) minimal API storing NestRecord
metadata plus the .nest archive as a BLOB. Endpoints: GET/POST /api/nests,
GET /api/nests/{id}[/file], PUT /api/nests/{id}/file, PUT
/api/nests/{id}/metadata, DELETE /api/nests/{id}, GET /healthz. Multipart
upload contract matches RemoteNestRepository (metadata JSON part + file
part). Added to OpenNest.sln, builds standalone on Linux. Dockerfile
publishes to a runtime image listening on :8090 with a /app/data volume
for the SQLite file. docs/nest-storage.md documents the wire contract,
endpoints and deployment.
Full curl round trip verified manually against a running instance:
upload (server-assigned id + computed fileSize), list, get, byte-exact
file download, metadata-only update (archive unchanged), file update
(new archive persisted), 404s for unknown ids, delete, post-delete 404.
This commit is contained in:
@@ -48,6 +48,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenNest.FrontEnd.Tests", "
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenNest.Reporting", "OpenNest.Reporting\OpenNest.Reporting.csproj", "{5C3708F5-DD69-436D-B412-7FF360DDB3DC}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenNest.Server", "OpenNest.Server\OpenNest.Server.csproj", "{A2FC654E-8F13-4AD7-BED2-455F2B690961}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -298,6 +300,18 @@ Global
|
||||
{5C3708F5-DD69-436D-B412-7FF360DDB3DC}.Release|x64.Build.0 = Release|Any CPU
|
||||
{5C3708F5-DD69-436D-B412-7FF360DDB3DC}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{5C3708F5-DD69-436D-B412-7FF360DDB3DC}.Release|x86.Build.0 = Release|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A2FC654E-8F13-4AD7-BED2-455F2B690961}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
Reference in New Issue
Block a user