app/controllers/playlists/songs_controller.rb
Rama master · réplica de lectura del repositorio original.
# frozen_string_literal: true
class Playlists::SongsController < ApplicationController
before_action :find_playlist
before_action :find_song, only: [ :move, :destroy ]
before_action :redirect_to_built_in_playlist, only: [ :index ]
def index
@pagy, @songs = pagy(@playlist.songs.includes(:artist))
end
def create
@song = Song.find(params[:song_id])
@playlist.songs.push(@song)
respond_to do |format|
format.json { render partial: "songs/song", locals: { song: @song } }
format.html { redirect_to({ action: "index" }, notice: t("notice.added_to_playlist")) }
end
rescue ActiveRecord::RecordNotUnique
respond_to do |format|
format.json { render_json_error("DuplicatePlaylistSong", t("error.already_in_playlist"), :bad_request) }
format.html { redirect_back_or_to root_path, alert: t("error.already_in_playlist") }
end
end
def destroy
@playlist.songs.destroy(@song)
if @playlist.songs.empty?
respond_to do |format|
format.json { render partial: "songs/song", locals: { song: @song } }
format.html { redirect_to action: "index" }
end
else
respond_to do |format|
format.json { render partial: "songs/song", locals: { song: @song } }
format.turbo_stream
end
end
end
def move
moving_song = @playlist.playlists_songs.find_by!(song_id: @song.id)
destination_song = @playlist.playlists_songs.find_by!(song_id: params[:destination_song_id])
moving_song.insert_at!(destination_song.position)
respond_to do |format|
format.html { head :ok }
format.json { head :no_content }
end
end
def destroy_all
@playlist.songs.clear
respond_to do |format|
format.json { head :no_content }
format.html { redirect_to action: "index" }
end
end
private
def find_playlist
@playlist = Current.user.all_playlists.find(params[:playlist_id])
end
def find_song
@song = @playlist.songs.find(params[:id])
end
def redirect_to_built_in_playlist
redirect_to current_playlist_songs_path if @playlist.current?
redirect_to favorite_playlist_songs_path if @playlist.favorite?
end
end