From 2f407f6eefc9cb4ad1096e75a93eebe68b585b56 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 1 Jun 2026 19:41:17 +0200 Subject: [PATCH] feat: Add deprecation middleware for legacy endpoints - Create middleware/deprecation.go with DeprecationMiddleware - Adds Warning and Deprecation headers to old endpoints - Apply middleware to all non-/api/v1 routes: /version, /dbtest, /health, /character*, /download*, /sync/*, /music/* - Message: 'Deprecated: This endpoint is deprecated. Use /api/v1/ endpoints instead.' Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe --- internal/server/middleware/deprecation.go | 16 ++++++ internal/server/routes.go | 70 ++++++++++++----------- 2 files changed, 53 insertions(+), 33 deletions(-) create mode 100644 internal/server/middleware/deprecation.go diff --git a/internal/server/middleware/deprecation.go b/internal/server/middleware/deprecation.go new file mode 100644 index 0000000..cd30eaa --- /dev/null +++ b/internal/server/middleware/deprecation.go @@ -0,0 +1,16 @@ +package middleware + +import ( + "github.com/labstack/echo/v5" +) + +// DeprecationMiddleware adds deprecation warning to responses +// for old endpoints that are being phased out in favor of /api/v1/* +func DeprecationMiddleware(next echo.HandlerFunc) echo.HandlerFunc { + return func(c *echo.Context) error { + // Add deprecation warning header + c.Response().Header().Add("Warning", `299 - "Deprecated: This endpoint is deprecated. Use /api/v1/ endpoints instead."`) + c.Response().Header().Add("Deprecation", "true") + return next(c) + } +} diff --git a/internal/server/routes.go b/internal/server/routes.go index 42685ba..b30603c 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -13,7 +13,6 @@ import ( echoMiddleware "github.com/labstack/echo/v5/middleware" echoSwagger "github.com/swaggo/echo-swagger/v2" "go.uber.org/zap" - "music-server/internal/logging" ) // @Title MusicServer API @@ -59,51 +58,56 @@ func (s *Server) RegisterRoutes() http.Handler { // Swagger UI e.GET("/swagger/*", echoSwagger.WrapHandler) + // ============================================ + // Legacy Endpoints (Deprecated - use /api/v1/ instead) + // ============================================ + deprecatedMiddleware := middleware.DeprecationMiddleware + health := NewHealthHandler() - e.GET("/health", health.HealthCheck) + e.GET("/health", deprecatedMiddleware(health.HealthCheck)) version := NewVersionHandler() - e.GET("/version", version.GetLatestVersion) - e.GET("/version/history", version.GetVersionHistory) + e.GET("/version", deprecatedMiddleware(version.GetLatestVersion)) + e.GET("/version/history", deprecatedMiddleware(version.GetVersionHistory)) character := NewCharacterHandler() - e.GET("/character", character.GetCharacter) - e.GET("/characters", character.GetCharacterList) + e.GET("/character", deprecatedMiddleware(character.GetCharacter)) + e.GET("/characters", deprecatedMiddleware(character.GetCharacterList)) download := NewDownloadHandler() - e.GET("/download", download.checkLatest) - e.GET("/download/list", download.listAssetsOfLatest) - e.GET("/download/windows", download.downloadLatestWindows) - e.GET("/download/linux", download.downloadLatestLinux) + e.GET("/download", deprecatedMiddleware(download.checkLatest)) + e.GET("/download/list", deprecatedMiddleware(download.listAssetsOfLatest)) + e.GET("/download/windows", deprecatedMiddleware(download.downloadLatestWindows)) + e.GET("/download/linux", deprecatedMiddleware(download.downloadLatestLinux)) sync := NewSyncHandler() syncGroup := e.Group("/sync") - syncGroup.GET("", sync.SyncGamesNewOnlyChanges) - syncGroup.GET("/progress", sync.SyncProgress) - syncGroup.GET("/new", sync.SyncGamesNewOnlyChanges) - syncGroup.GET("/full", sync.SyncGamesNewFull) - syncGroup.GET("/new/full", sync.SyncGamesNewFull) - syncGroup.GET("/quick", sync.SyncGamesNewOnlyChanges) - syncGroup.GET("/reset", sync.ResetGames) + syncGroup.GET("", deprecatedMiddleware(sync.SyncGamesNewOnlyChanges)) + syncGroup.GET("/progress", deprecatedMiddleware(sync.SyncProgress)) + syncGroup.GET("/new", deprecatedMiddleware(sync.SyncGamesNewOnlyChanges)) + syncGroup.GET("/full", deprecatedMiddleware(sync.SyncGamesNewFull)) + syncGroup.GET("/new/full", deprecatedMiddleware(sync.SyncGamesNewFull)) + syncGroup.GET("/quick", deprecatedMiddleware(sync.SyncGamesNewOnlyChanges)) + syncGroup.GET("/reset", deprecatedMiddleware(sync.ResetGames)) music := NewMusicHandler() musicGroup := e.Group("/music") - musicGroup.GET("", music.GetSong) - musicGroup.GET("/soundTest", music.GetSoundCheckSong) - musicGroup.GET("/reset", music.ResetMusic) - musicGroup.GET("/rand", music.GetRandomSong) - musicGroup.GET("/rand/low", music.GetRandomSongLowChance) - musicGroup.GET("/rand/classic", music.GetRandomSongClassic) - musicGroup.GET("/info", music.GetSongInfo) - musicGroup.GET("/list", music.GetPlayedSongs) - musicGroup.GET("/next", music.GetNextSong) - musicGroup.GET("/previous", music.GetPreviousSong) - musicGroup.GET("/all", music.GetAllGamesRandom) - musicGroup.GET("/all/order", music.GetAllGames) - musicGroup.GET("/all/random", music.GetAllGamesRandom) - musicGroup.PUT("/played", music.PutPlayed) - musicGroup.GET("/addQue", music.AddLatestToQue) - musicGroup.GET("/addPlayed", music.AddLatestPlayed) + musicGroup.GET("", deprecatedMiddleware(music.GetSong)) + musicGroup.GET("/soundTest", deprecatedMiddleware(music.GetSoundCheckSong)) + musicGroup.GET("/reset", deprecatedMiddleware(music.ResetMusic)) + musicGroup.GET("/rand", deprecatedMiddleware(music.GetRandomSong)) + musicGroup.GET("/rand/low", deprecatedMiddleware(music.GetRandomSongLowChance)) + musicGroup.GET("/rand/classic", deprecatedMiddleware(music.GetRandomSongClassic)) + musicGroup.GET("/info", deprecatedMiddleware(music.GetSongInfo)) + musicGroup.GET("/list", deprecatedMiddleware(music.GetPlayedSongs)) + musicGroup.GET("/next", deprecatedMiddleware(music.GetNextSong)) + musicGroup.GET("/previous", deprecatedMiddleware(music.GetPreviousSong)) + musicGroup.GET("/all", deprecatedMiddleware(music.GetAllGamesRandom)) + musicGroup.GET("/all/order", deprecatedMiddleware(music.GetAllGames)) + musicGroup.GET("/all/random", deprecatedMiddleware(music.GetAllGamesRandom)) + musicGroup.PUT("/played", deprecatedMiddleware(music.PutPlayed)) + musicGroup.GET("/addQue", deprecatedMiddleware(music.AddLatestToQue)) + musicGroup.GET("/addPlayed", deprecatedMiddleware(music.AddLatestPlayed)) // ============================================ // API v1 Routes with Token Authentication