feat: add downloadable release management for desktop client
Frontend CI / Frontend (push) Successful in 4m1s
Backend CI / Backend (push) Failing after 8m51s

- Extend DesktopClientReleaseCheckResponse with platform, arch, and channel fields.
- Introduce DesktopClientDownloadableRelease and DesktopClientDownloadableReleaseListResponse interfaces for managing downloadable releases.
- Implement ListDownloadable method in DesktopClientReleaseService to retrieve downloadable releases based on the specified channel.
- Update DesktopClientReleaseCheckResult to include platform, arch, and channel information.
- Add resolveInstallerDownloadURL method to handle download URL resolution for releases.
- Create new endpoint in DesktopReleaseHandler for listing downloadable releases.
- Update router to include the new downloadable releases route.
- Enhance tests to cover the new functionality for resolving download URLs and listing downloadable releases.
This commit is contained in:
2026-05-31 19:28:35 +08:00
parent de9c52be6d
commit d6866cd85b
8 changed files with 1419 additions and 201 deletions
@@ -85,6 +85,15 @@ func (h *DesktopReleaseHandler) DownloadURLPublic(c *gin.Context) {
response.Success(c, data)
}
func (h *DesktopReleaseHandler) ListDownloadable(c *gin.Context) {
data, err := h.svc.ListDownloadable(c.Request.Context(), c.DefaultQuery("channel", "stable"))
if err != nil {
response.Error(c, err)
return
}
response.Success(c, data)
}
func (h *DesktopReleaseHandler) UpdaterFeedPublic(c *gin.Context) {
feed, err := h.svc.ResolveLatestUpdaterFeed(c.Request.Context(), opsapp.DesktopClientReleaseCheckInput{
Platform: firstNonEmpty(c.Param("platform"), c.Query("platform")),
@@ -98,6 +98,9 @@ func RegisterRoutes(app *bootstrap.App) {
media := tenantProtected.Group("/media")
media.GET("/platforms", mediaHandler.ListPlatforms)
desktopClient := tenantProtected.Group("/desktop-client")
desktopClient.GET("/releases/downloadable", desktopReleaseHandler.ListDownloadable)
mediaSupplyHandler := NewMediaSupplyHandler(app)
mediaSupply := tenantProtected.Group("/media-supply")
mediaSupply.GET("/resources", mediaSupplyHandler.ListResources)