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 bc33c17..ec8057e 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -58,47 +58,52 @@ func (s *Server) RegisterRoutes() http.Handler { // Swagger UI e.GET("/swagger/*", echoSwagger.WrapHandler) + // ============================================ + // Legacy Endpoints (Deprecated - use /api/v1/ instead) + // ============================================ + deprecatedMiddleware := middleware.DeprecationMiddleware + index := NewIndexHandler() - e.GET("/version", index.GetVersion) - e.GET("/dbtest", index.GetDBTest) - e.GET("/health", index.HealthCheck) - e.GET("/character", index.GetCharacter) - e.GET("/characters", index.GetCharacterList) + e.GET("/version", deprecatedMiddleware(index.GetVersion)) + e.GET("/dbtest", deprecatedMiddleware(index.GetDBTest)) + e.GET("/health", deprecatedMiddleware(index.HealthCheck)) + e.GET("/character", deprecatedMiddleware(index.GetCharacter)) + e.GET("/characters", deprecatedMiddleware(index.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