feat: migrate playback domain to modular architecture
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"log"
|
||||
"mal/internal/domain"
|
||||
"mal/internal/server"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
@@ -10,38 +10,70 @@ import (
|
||||
)
|
||||
|
||||
type PlaybackHandler struct {
|
||||
svc domain.PlaybackService
|
||||
svc domain.PlaybackService
|
||||
animeSvc domain.AnimeService
|
||||
}
|
||||
|
||||
func NewPlaybackHandler(svc domain.PlaybackService) *PlaybackHandler {
|
||||
return &PlaybackHandler{svc: svc}
|
||||
func NewPlaybackHandler(svc domain.PlaybackService, animeSvc domain.AnimeService) *PlaybackHandler {
|
||||
return &PlaybackHandler{svc: svc, animeSvc: animeSvc}
|
||||
}
|
||||
|
||||
func (h *PlaybackHandler) Register(r *gin.Engine) {
|
||||
log.Println("Registering playback routes")
|
||||
r.GET("/watch/:id", h.HandleWatchPage)
|
||||
r.POST("/api/watch-progress", h.HandleSaveProgress)
|
||||
}
|
||||
|
||||
func (h *PlaybackHandler) HandleWatchPage(c *gin.Context) {
|
||||
log.Printf("Route /watch/:id triggered for ID: %s", c.Param("id"))
|
||||
id, _ := strconv.Atoi(c.Param("id"))
|
||||
ep := c.DefaultQuery("ep", "1")
|
||||
mode := c.DefaultQuery("mode", "sub")
|
||||
|
||||
userID := "" // TODO: get from auth context
|
||||
data, err := h.svc.BuildWatchData(c.Request.Context(), id, []string{}, ep, mode, userID)
|
||||
if err != nil {
|
||||
c.Status(http.StatusNotFound)
|
||||
return
|
||||
user, _ := c.Get("User")
|
||||
userID := ""
|
||||
if u, ok := user.(*domain.User); ok {
|
||||
userID = u.ID
|
||||
}
|
||||
|
||||
c.HTML(http.StatusOK, "watch.gohtml", gin.H{
|
||||
"WatchData": data,
|
||||
data, err := h.svc.BuildWatchData(c.Request.Context(), id, []string{}, ep, mode, userID)
|
||||
if err != nil {
|
||||
log.Printf("BuildWatchData failed for ID %d: %v", id, err)
|
||||
// Try to at least get anime info for the error page
|
||||
anime, _ := h.animeSvc.GetAnimeByID(c.Request.Context(), id)
|
||||
c.HTML(http.StatusOK, "watch.gohtml", gin.H{
|
||||
"Error": err.Error(),
|
||||
"Anime": anime,
|
||||
"Episodes": []domain.EpisodeData{},
|
||||
"CurrentPath": c.Request.URL.Path,
|
||||
"User": user,
|
||||
"CurrentEpID": ep,
|
||||
"WatchData": map[string]any{"Episodes": []domain.EpisodeData{}, "Providers": []any{}},
|
||||
})
|
||||
return
|
||||
}
|
||||
log.Printf("BuildWatchData succeeded for ID %d", id)
|
||||
|
||||
// Merge data from service with handler-specific context
|
||||
responseData := gin.H{
|
||||
"User": user,
|
||||
"CurrentPath": c.Request.URL.Path,
|
||||
})
|
||||
}
|
||||
for k, v := range data {
|
||||
responseData[k] = v
|
||||
}
|
||||
|
||||
c.HTML(http.StatusOK, "watch.gohtml", responseData)
|
||||
log.Printf("c.HTML finished for ID %d", id)
|
||||
}
|
||||
|
||||
func (h *PlaybackHandler) HandleSaveProgress(c *gin.Context) {
|
||||
userID := "" // TODO: get from auth context
|
||||
user, _ := c.Get("User")
|
||||
userID := ""
|
||||
if u, ok := user.(*domain.User); ok {
|
||||
userID = u.ID
|
||||
}
|
||||
|
||||
var req struct {
|
||||
MalID int64 `json:"mal_id"`
|
||||
Episode int `json:"episode"`
|
||||
|
||||
Reference in New Issue
Block a user