mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-05-31 14:11:54 +05:30 
			
		
		
		
	Move DB queries related to playlists in a separate module (1/3)
This commit is contained in:
		@@ -816,11 +816,8 @@ post "/data_control" do |env|
 | 
			
		||||
                index:          Random::Secure.rand(0_i64..Int64::MAX),
 | 
			
		||||
              })
 | 
			
		||||
 | 
			
		||||
              video_array = playlist_video.to_a
 | 
			
		||||
              args = arg_array(video_array)
 | 
			
		||||
 | 
			
		||||
              PG_DB.exec("INSERT INTO playlist_videos VALUES (#{args})", args: video_array)
 | 
			
		||||
              PG_DB.exec("UPDATE playlists SET index = array_append(index, $1), video_count = cardinality(index) + 1, updated = $2 WHERE id = $3", playlist_video.index, Time.utc, playlist.id)
 | 
			
		||||
              Invidious::Database::PlaylistVideos.insert(playlist_video)
 | 
			
		||||
              Invidious::Database::Playlists.update_video_added(playlist.id, playlist_video.index)
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								src/invidious/database/playlists.cr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								src/invidious/database/playlists.cr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,94 @@
 | 
			
		||||
require "./base.cr"
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# This module contains functions related to the "playlists" table.
 | 
			
		||||
#
 | 
			
		||||
module Invidious::Database::Playlists
 | 
			
		||||
  extend self
 | 
			
		||||
 | 
			
		||||
  # -------------------
 | 
			
		||||
  #  Insert / delete
 | 
			
		||||
  # -------------------
 | 
			
		||||
 | 
			
		||||
  def insert(playlist : InvidiousPlaylist)
 | 
			
		||||
    playlist_array = playlist.to_a
 | 
			
		||||
 | 
			
		||||
    request = <<-SQL
 | 
			
		||||
      INSERT INTO playlists
 | 
			
		||||
      VALUES (#{arg_array(playlist_array)})
 | 
			
		||||
    SQL
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec(request, args: playlist_array)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # this function is a bit special: it will also remove all videos
 | 
			
		||||
  # related to the given playlist ID in the "playlist_videos" table,
 | 
			
		||||
  # in addition to deleting said ID from "playlists".
 | 
			
		||||
  def delete(id : String)
 | 
			
		||||
    request = <<-SQL
 | 
			
		||||
      DELETE FROM playlist_videos * WHERE plid = $1;
 | 
			
		||||
      DELETE FROM playlists * WHERE id = $1
 | 
			
		||||
    SQL
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec(request, id)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # -------------------
 | 
			
		||||
  #  Update
 | 
			
		||||
  # -------------------
 | 
			
		||||
 | 
			
		||||
  def update_video_added(id : String, index : String | Int64)
 | 
			
		||||
    request = <<-SQL
 | 
			
		||||
      UPDATE playlists
 | 
			
		||||
      SET index = array_append(index, $1),
 | 
			
		||||
          video_count = cardinality(index) + 1,
 | 
			
		||||
          updated = $2
 | 
			
		||||
      WHERE id = $3
 | 
			
		||||
    SQL
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec(request, index, Time.utc, id)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def update_video_removed(id : String, index : String | Int64)
 | 
			
		||||
    request = <<-SQL
 | 
			
		||||
      UPDATE playlists
 | 
			
		||||
      SET index = array_remove(index, $1),
 | 
			
		||||
          video_count = cardinality(index) - 1,
 | 
			
		||||
          updated = $2
 | 
			
		||||
      WHERE id = $3
 | 
			
		||||
    SQL
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec(request, index, Time.utc, id)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# This module contains functions related to the "playlist_videos" table.
 | 
			
		||||
#
 | 
			
		||||
module Invidious::Database::PlaylistVideos
 | 
			
		||||
  extend self
 | 
			
		||||
 | 
			
		||||
  # -------------------
 | 
			
		||||
  #  Insert / Delete
 | 
			
		||||
  # -------------------
 | 
			
		||||
 | 
			
		||||
  def insert(video : PlaylistVideo)
 | 
			
		||||
    video_array = video.to_a
 | 
			
		||||
 | 
			
		||||
    request = <<-SQL
 | 
			
		||||
      INSERT INTO playlist_videos
 | 
			
		||||
      VALUES (#{arg_array(video_array)})
 | 
			
		||||
    SQL
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec(request, args: video_array)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def delete(index)
 | 
			
		||||
    request = <<-SQL
 | 
			
		||||
      DELETE FROM playlist_videos *
 | 
			
		||||
      WHERE index = $1
 | 
			
		||||
    SQL
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec(request, index)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@@ -261,10 +261,7 @@ def create_playlist(db, title, privacy, user)
 | 
			
		||||
    index:       [] of Int64,
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  playlist_array = playlist.to_a
 | 
			
		||||
  args = arg_array(playlist_array)
 | 
			
		||||
 | 
			
		||||
  db.exec("INSERT INTO playlists VALUES (#{args})", args: playlist_array)
 | 
			
		||||
  Invidious::Database::Playlists.insert(playlist)
 | 
			
		||||
 | 
			
		||||
  return playlist
 | 
			
		||||
end
 | 
			
		||||
@@ -282,10 +279,7 @@ def subscribe_playlist(db, user, playlist)
 | 
			
		||||
    index:       [] of Int64,
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  playlist_array = playlist.to_a
 | 
			
		||||
  args = arg_array(playlist_array)
 | 
			
		||||
 | 
			
		||||
  db.exec("INSERT INTO playlists VALUES (#{args})", args: playlist_array)
 | 
			
		||||
  Invidious::Database::Playlists.insert(playlist)
 | 
			
		||||
 | 
			
		||||
  return playlist
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -216,8 +216,7 @@ module Invidious::Routes::API::V1::Authenticated
 | 
			
		||||
      return error_json(403, "Invalid user")
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec("DELETE FROM playlist_videos * WHERE plid = $1", plid)
 | 
			
		||||
    PG_DB.exec("DELETE FROM playlists * WHERE id = $1", plid)
 | 
			
		||||
    Invidious::Database::Playlists.delete(plid)
 | 
			
		||||
 | 
			
		||||
    env.response.status_code = 204
 | 
			
		||||
  end
 | 
			
		||||
@@ -266,11 +265,8 @@ module Invidious::Routes::API::V1::Authenticated
 | 
			
		||||
      index:          Random::Secure.rand(0_i64..Int64::MAX),
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    video_array = playlist_video.to_a
 | 
			
		||||
    args = arg_array(video_array)
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec("INSERT INTO playlist_videos VALUES (#{args})", args: video_array)
 | 
			
		||||
    PG_DB.exec("UPDATE playlists SET index = array_append(index, $1), video_count = cardinality(index) + 1, updated = $2 WHERE id = $3", playlist_video.index, Time.utc, plid)
 | 
			
		||||
    Invidious::Database::PlaylistVideos.insert(playlist_video)
 | 
			
		||||
    Invidious::Database::Playlists.update_video_added(plid, playlist_video.index)
 | 
			
		||||
 | 
			
		||||
    env.response.headers["Location"] = "#{HOST_URL}/api/v1/auth/playlists/#{plid}/videos/#{playlist_video.index.to_u64.to_s(16).upcase}"
 | 
			
		||||
    env.response.status_code = 201
 | 
			
		||||
@@ -302,8 +298,8 @@ module Invidious::Routes::API::V1::Authenticated
 | 
			
		||||
      return error_json(404, "Playlist does not contain index")
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec("DELETE FROM playlist_videos * WHERE index = $1", index)
 | 
			
		||||
    PG_DB.exec("UPDATE playlists SET index = array_remove(index, $1), video_count = cardinality(index) - 1, updated = $2 WHERE id = $3", index, Time.utc, plid)
 | 
			
		||||
    Invidious::Database::PlaylistVideos.delete(index)
 | 
			
		||||
    Invidious::Database::Playlists.update_video_removed(plid, index)
 | 
			
		||||
 | 
			
		||||
    env.response.status_code = 204
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -122,8 +122,7 @@ module Invidious::Routes::Playlists
 | 
			
		||||
      return env.redirect referer
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec("DELETE FROM playlist_videos * WHERE plid = $1", plid)
 | 
			
		||||
    PG_DB.exec("DELETE FROM playlists * WHERE id = $1", plid)
 | 
			
		||||
    Invidious::Database::Playlists.delete(plid)
 | 
			
		||||
 | 
			
		||||
    env.redirect "/feed/playlists"
 | 
			
		||||
  end
 | 
			
		||||
@@ -363,15 +362,12 @@ module Invidious::Routes::Playlists
 | 
			
		||||
        index:          Random::Secure.rand(0_i64..Int64::MAX),
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      video_array = playlist_video.to_a
 | 
			
		||||
      args = arg_array(video_array)
 | 
			
		||||
 | 
			
		||||
      PG_DB.exec("INSERT INTO playlist_videos VALUES (#{args})", args: video_array)
 | 
			
		||||
      PG_DB.exec("UPDATE playlists SET index = array_append(index, $1), video_count = cardinality(index) + 1, updated = $2 WHERE id = $3", playlist_video.index, Time.utc, playlist_id)
 | 
			
		||||
      Invidious::Database::PlaylistVideos.insert(playlist_video)
 | 
			
		||||
      Invidious::Database::Playlists.update_video_added(playlist_id, playlist_video.index)
 | 
			
		||||
    when "action_remove_video"
 | 
			
		||||
      index = env.params.query["set_video_id"]
 | 
			
		||||
      PG_DB.exec("DELETE FROM playlist_videos * WHERE index = $1", index)
 | 
			
		||||
      PG_DB.exec("UPDATE playlists SET index = array_remove(index, $1), video_count = cardinality(index) - 1, updated = $2 WHERE id = $3", index, Time.utc, playlist_id)
 | 
			
		||||
      Invidious::Database::PlaylistVideos.delete(index)
 | 
			
		||||
      Invidious::Database::Playlists.update_video_removed(playlist_id, index)
 | 
			
		||||
    when "action_move_video_before"
 | 
			
		||||
      # TODO: Playlist stub
 | 
			
		||||
    else
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user