Skip to content

Commit 8eb522f

Browse files
hhvrcclaude
andcommitted
Unify DesktopRepositoryServer into RepositoryServer and add firmware support
Rename DesktopRepositoryServer to RepositoryServer with unified namespace OpenShock.RepositoryServer. Reorganize controllers into V1 (backwards-compat desktop endpoints at /v1/) and V2 (desktop at /v2/desktop/, firmware at /v2/firmware/). Add full firmware repository with chips, boards, versions, artifacts, and release notes backed by PostgreSQL enums and EF Core entities. Includes public OTA endpoints and admin CRUD with token auth. Update Docker, CI/CD workflows, and generate AddFirmwareTables migration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent a7f6087 commit 8eb522f

86 files changed

Lines changed: 2604 additions & 370 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/ci-build.yml‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ jobs:
2424
fail-fast: false
2525
matrix:
2626
include:
27-
- name: desktop-repository-server-tunit
28-
project: DesktopRepositoryServer.Tests/DesktopRepositoryServer.Tests.csproj
27+
- name: repository-server-tunit
28+
project: RepositoryServer.Tests/RepositoryServer.Tests.csproj
2929

3030
steps:
3131
- name: Checkout
@@ -47,8 +47,8 @@ jobs:
4747
fail-fast: false
4848
matrix:
4949
include:
50-
- dockerfile: docker/DesktopRepositoryServer.Dockerfile
51-
image: desktop-repository-server
50+
- dockerfile: docker/RepositoryServer.Dockerfile
51+
image: repository-server
5252

5353
steps:
5454
- name: Checkout
@@ -72,7 +72,7 @@ jobs:
7272
image: ${{ matrix.image }}
7373
platforms: ${{ inputs.platforms || 'linux/amd64' }}
7474
tag-prefix: ${{ inputs.tag-prefix || 'rn' }}
75-
75+
7676
promote-image:
7777
name: Promote Image (${{ matrix.image }})
7878
needs: [build, tests]
@@ -82,8 +82,8 @@ jobs:
8282
fail-fast: false
8383
matrix:
8484
include:
85-
- image: desktop-repository-server
86-
85+
- image: repository-server
86+
8787
steps:
8888
- name: Checkout
8989
uses: actions/checkout@v6
@@ -101,7 +101,7 @@ jobs:
101101
image: ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ matrix.image }}
102102
run-tag: ${{ inputs.tag-prefix || 'rn' }}-${{ github.run_number }}-a${{ github.run_attempt }}
103103
latest: ${{ inputs.latest || false }}
104-
104+
105105
deploy-prod-workflow:
106106
runs-on: ubuntu-latest
107107
needs: promote-image
@@ -113,8 +113,8 @@ jobs:
113113
with:
114114
token: ${{ secrets.GITOPS_PAT }}
115115
repository: openshock/kubernetes-cluster-gitops
116-
event-type: update-desktop-repository-server-prod
116+
event-type: update-repository-server-prod
117117
client-payload: |
118118
{
119119
"tag": "${{ inputs.tag-prefix || 'rn' }}-${{ github.run_number }}-a${{ github.run_attempt }}"
120-
}
120+
}

‎.github/workflows/ci-tag.yml‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ name: ci-tag
88

99
env:
1010
REGISTRY: ghcr.io
11-
IMAGE_NAME: ${{ github.repository_owner }}/api
11+
IMAGE_NAME: ${{ github.repository_owner }}/repository-server
1212

1313
jobs:
14-
14+
1515
build-release:
1616
runs-on: ubuntu-latest
17-
17+
1818
steps:
1919

2020
- name: Checkout
@@ -42,33 +42,33 @@ jobs:
4242
id: meta
4343
uses: docker/metadata-action@v5
4444
with:
45-
images: ${{ env.REGISTRY }}/${{ github.repository_owner }}/desktop-repository-server
45+
images: ${{ env.REGISTRY }}/${{ github.repository_owner }}/repository-server
4646
flavor: |
4747
latest=false
4848
tags: |
4949
type=raw,value=latest,enable=${{ steps.latest-tag.outputs.tag == github.ref_name }}
5050
type=semver,pattern={{major}},enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }}
5151
type=semver,pattern={{major}}.{{minor}}
5252
type=semver,pattern={{major}}.{{minor}}.{{patch}}
53-
53+
5454
- name: Build and push
5555
uses: docker/build-push-action@v6
5656
with:
5757
context: .
58-
file: Dockerfile
58+
file: docker/RepositoryServer.Dockerfile
5959
push: true
6060
tags: ${{ steps.meta.outputs.tags }}
6161
labels: ${{ steps.meta.outputs.labels }}
6262
platforms: linux/amd64,linux/arm64
63-
64-
63+
64+
6565
release:
6666
runs-on: ubuntu-latest
6767
needs: build-release
68-
68+
6969
steps:
7070
- name: Create release
7171
uses: softprops/action-gh-release@v2
7272
with:
7373
tag_name: ${{ github.ref_name }}
74-
prerelease: ${{ contains(github.ref_name, '-rc') }}
74+
prerelease: ${{ contains(github.ref_name, '-rc') }}

‎CLAUDE.md‎

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# OpenShock Repository Server
2+
3+
## Project Overview
4+
Unified repository server for distributing OpenShock desktop app modules and firmware OTA updates. ASP.NET Core Web API with PostgreSQL/EF Core backend.
5+
6+
## Tech Stack
7+
- .NET 10, ASP.NET Core (SlimBuilder)
8+
- PostgreSQL via Npgsql + EF Core (with DbContext pooling)
9+
- Serilog (console + Grafana Loki)
10+
- OpenTelemetry (Prometheus exporter)
11+
- API Versioning (Asp.Versioning) — URL-based: `/v1/`, `/v2/desktop/`, `/v2/firmware/`
12+
- FlexLabs.EntityFrameworkCore.Upsert for upserts
13+
- MiniValidation for config validation
14+
- Semver NuGet package for semver parsing
15+
- TUnit for tests
16+
- Scalar for API docs UI
17+
- Docker (Alpine) with self-signed HTTPS cert generation
18+
19+
## Project Structure
20+
```
21+
RepositoryServer/ # Main web API project
22+
AuthenticationHandlers/ # Custom AdminToken auth handler
23+
Config/ # ApiConfig, DbConfig, RepoConfig, MetricsConfig, FirmwareConfig
24+
Controllers/
25+
OpenShockControllerBase.cs # Shared base controller
26+
V1/ # Legacy desktop endpoints (backwards compat)
27+
RepoController.cs # GET /v1/ — desktop module manifest
28+
AdminController.cs # /v1/admin/... — desktop module CRUD
29+
V2/
30+
Desktop/ # Same as V1 under new prefix
31+
RepoController.cs # GET /v2/desktop/
32+
AdminController.cs # /v2/desktop/admin/...
33+
Firmware/
34+
LatestController.cs # GET /v2/firmware/latest/{channel}
35+
VersionsController.cs # GET /v2/firmware/versions[/{version}]
36+
BoardsController.cs # GET /v2/firmware/boards
37+
ChipsController.cs # GET /v2/firmware/chips
38+
AdminController.cs # /v2/firmware/admin/... CRUD
39+
Errors/ # Static error factories (AuthResultError, ExceptionError)
40+
ExceptionHandler/ # Global IExceptionHandler + RequestInfo logging
41+
Migrations/ # EF Core migrations (Initial + AddFirmwareTables)
42+
Models/ # Desktop module DTOs
43+
Models/Firmware/ # Firmware DTOs (response + admin request)
44+
Problems/ # RFC 7807 problem details (OpenShockProblem base)
45+
RepoServerDb/ # EF Core entities + RepoServerContext
46+
Utils/ # ByteArrayHexConverter, SemVersionConverter, etc.
47+
Program.cs # App startup and middleware pipeline
48+
49+
RepositoryServer.Tests/ # TUnit test project
50+
docker/
51+
RepositoryServer.Dockerfile
52+
entrypoint.sh # Cert gen + `dotnet OpenShock.RepositoryServer.dll`
53+
appsettings.Container.json
54+
```
55+
56+
## Namespace
57+
`OpenShock.RepositoryServer` (renamed from `OpenShock.Desktop.RepositoryServer`)
58+
59+
## Key Patterns
60+
- **Auth**: Custom `AdminTokenAuthentication` handler, `AuthSchemas.AdminToken` scheme
61+
- **Error Handling**: `OpenShockProblem` base class → `ToObjectResult()` for RFC 7807
62+
- **Config**: Bind root config to `ApiConfig`, validated with MiniValidator, registered as singleton
63+
- **DB Migrations**: `MigrationOpenShockContext` subclass for migration tooling, auto-applied on startup
64+
- **JSON**: CamelCase, custom `SemVersionConverter` + `ByteArrayHexConverter`
65+
- **Upsert**: FlexLabs `.Upsert().On().RunAsync()` pattern
66+
- **CORS**: Allow all origins/methods/headers
67+
- **Metrics**: Prometheus at `/metrics`, restricted to private networks
68+
69+
## Database
70+
- PostgreSQL, connection in `ApiConfig.Db.Conn`
71+
- Desktop tables: `modules` (PK: id), `versions` (composite PK: version+module, FK→modules CASCADE)
72+
- Firmware tables: `firmware_chips`, `firmware_boards`, `firmware_versions`, `firmware_artifacts`, `firmware_release_notes`
73+
- Firmware enums: `firmware_channel`, `firmware_artifact_type`, `firmware_release_note_type`, `firmware_chip_architecture`
74+
- URL convention for firmware artifacts: `{CdnBaseUrl}/{version}/{boardId}/{artifactType}.bin`
75+
76+
## CI/CD
77+
- `ci-build.yml`: Test + build Docker + promote image + deploy prod (on master)
78+
- `ci-tag.yml`: Release builds on semver tags, multi-arch (amd64+arm64)
79+
- Image: `ghcr.io/openshock/repository-server`
80+
- GitOps dispatch: `update-repository-server-prod` → `openshock/kubernetes-cluster-gitops`
81+
82+
## Commands
83+
- Build: `dotnet build RepositoryServer/RepositoryServer.csproj`
84+
- Test: `dotnet test RepositoryServer.Tests/RepositoryServer.Tests.csproj`
85+
- Docker: `docker build -f docker/RepositoryServer.Dockerfile .`
86+
- Migration: `dotnet ef migrations add <Name> --project RepositoryServer`

‎DesktopRepositoryServer/Migrations/MigrationOpenShockContextModelSnapshot.cs‎

Lines changed: 0 additions & 118 deletions
This file was deleted.

0 commit comments

Comments
 (0)