mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-11-03 22:21:55 +00:00 
			
		
		
		
	Merge pull request #1584 from matthewmcgarvey/user-preferences
Extract out User Preferences endpoints
This commit is contained in:
		
							
								
								
									
										253
									
								
								src/invidious.cr
									
									
									
									
									
								
							
							
						
						
									
										253
									
								
								src/invidious.cr
									
									
									
									
									
								
							@@ -318,259 +318,12 @@ Invidious::Routing.get "/search", Invidious::Routes::Search, :search
 | 
			
		||||
Invidious::Routing.get "/login", Invidious::Routes::Login, :login_page
 | 
			
		||||
Invidious::Routing.post "/login", Invidious::Routes::Login, :login
 | 
			
		||||
Invidious::Routing.post "/signout", Invidious::Routes::Login, :signout
 | 
			
		||||
Invidious::Routing.get "/preferences", Invidious::Routes::UserPreferences, :show
 | 
			
		||||
Invidious::Routing.post "/preferences", Invidious::Routes::UserPreferences, :update
 | 
			
		||||
Invidious::Routing.get "/toggle_theme", Invidious::Routes::UserPreferences, :toggle_theme
 | 
			
		||||
 | 
			
		||||
# Users
 | 
			
		||||
 | 
			
		||||
get "/preferences" do |env|
 | 
			
		||||
  locale = LOCALES[env.get("preferences").as(Preferences).locale]?
 | 
			
		||||
 | 
			
		||||
  referer = get_referer(env)
 | 
			
		||||
 | 
			
		||||
  preferences = env.get("preferences").as(Preferences)
 | 
			
		||||
 | 
			
		||||
  templated "preferences"
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
post "/preferences" do |env|
 | 
			
		||||
  locale = LOCALES[env.get("preferences").as(Preferences).locale]?
 | 
			
		||||
  referer = get_referer(env)
 | 
			
		||||
 | 
			
		||||
  video_loop = env.params.body["video_loop"]?.try &.as(String)
 | 
			
		||||
  video_loop ||= "off"
 | 
			
		||||
  video_loop = video_loop == "on"
 | 
			
		||||
 | 
			
		||||
  annotations = env.params.body["annotations"]?.try &.as(String)
 | 
			
		||||
  annotations ||= "off"
 | 
			
		||||
  annotations = annotations == "on"
 | 
			
		||||
 | 
			
		||||
  annotations_subscribed = env.params.body["annotations_subscribed"]?.try &.as(String)
 | 
			
		||||
  annotations_subscribed ||= "off"
 | 
			
		||||
  annotations_subscribed = annotations_subscribed == "on"
 | 
			
		||||
 | 
			
		||||
  autoplay = env.params.body["autoplay"]?.try &.as(String)
 | 
			
		||||
  autoplay ||= "off"
 | 
			
		||||
  autoplay = autoplay == "on"
 | 
			
		||||
 | 
			
		||||
  continue = env.params.body["continue"]?.try &.as(String)
 | 
			
		||||
  continue ||= "off"
 | 
			
		||||
  continue = continue == "on"
 | 
			
		||||
 | 
			
		||||
  continue_autoplay = env.params.body["continue_autoplay"]?.try &.as(String)
 | 
			
		||||
  continue_autoplay ||= "off"
 | 
			
		||||
  continue_autoplay = continue_autoplay == "on"
 | 
			
		||||
 | 
			
		||||
  listen = env.params.body["listen"]?.try &.as(String)
 | 
			
		||||
  listen ||= "off"
 | 
			
		||||
  listen = listen == "on"
 | 
			
		||||
 | 
			
		||||
  local = env.params.body["local"]?.try &.as(String)
 | 
			
		||||
  local ||= "off"
 | 
			
		||||
  local = local == "on"
 | 
			
		||||
 | 
			
		||||
  speed = env.params.body["speed"]?.try &.as(String).to_f32?
 | 
			
		||||
  speed ||= CONFIG.default_user_preferences.speed
 | 
			
		||||
 | 
			
		||||
  player_style = env.params.body["player_style"]?.try &.as(String)
 | 
			
		||||
  player_style ||= CONFIG.default_user_preferences.player_style
 | 
			
		||||
 | 
			
		||||
  quality = env.params.body["quality"]?.try &.as(String)
 | 
			
		||||
  quality ||= CONFIG.default_user_preferences.quality
 | 
			
		||||
 | 
			
		||||
  volume = env.params.body["volume"]?.try &.as(String).to_i?
 | 
			
		||||
  volume ||= CONFIG.default_user_preferences.volume
 | 
			
		||||
 | 
			
		||||
  comments = [] of String
 | 
			
		||||
  2.times do |i|
 | 
			
		||||
    comments << (env.params.body["comments[#{i}]"]?.try &.as(String) || CONFIG.default_user_preferences.comments[i])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  captions = [] of String
 | 
			
		||||
  3.times do |i|
 | 
			
		||||
    captions << (env.params.body["captions[#{i}]"]?.try &.as(String) || CONFIG.default_user_preferences.captions[i])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  related_videos = env.params.body["related_videos"]?.try &.as(String)
 | 
			
		||||
  related_videos ||= "off"
 | 
			
		||||
  related_videos = related_videos == "on"
 | 
			
		||||
 | 
			
		||||
  default_home = env.params.body["default_home"]?.try &.as(String) || CONFIG.default_user_preferences.default_home
 | 
			
		||||
 | 
			
		||||
  feed_menu = [] of String
 | 
			
		||||
  5.times do |index|
 | 
			
		||||
    option = env.params.body["feed_menu[#{index}]"]?.try &.as(String) || ""
 | 
			
		||||
    if !option.empty?
 | 
			
		||||
      feed_menu << option
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  locale = env.params.body["locale"]?.try &.as(String)
 | 
			
		||||
  locale ||= CONFIG.default_user_preferences.locale
 | 
			
		||||
 | 
			
		||||
  dark_mode = env.params.body["dark_mode"]?.try &.as(String)
 | 
			
		||||
  dark_mode ||= CONFIG.default_user_preferences.dark_mode
 | 
			
		||||
 | 
			
		||||
  thin_mode = env.params.body["thin_mode"]?.try &.as(String)
 | 
			
		||||
  thin_mode ||= "off"
 | 
			
		||||
  thin_mode = thin_mode == "on"
 | 
			
		||||
 | 
			
		||||
  max_results = env.params.body["max_results"]?.try &.as(String).to_i?
 | 
			
		||||
  max_results ||= CONFIG.default_user_preferences.max_results
 | 
			
		||||
 | 
			
		||||
  sort = env.params.body["sort"]?.try &.as(String)
 | 
			
		||||
  sort ||= CONFIG.default_user_preferences.sort
 | 
			
		||||
 | 
			
		||||
  latest_only = env.params.body["latest_only"]?.try &.as(String)
 | 
			
		||||
  latest_only ||= "off"
 | 
			
		||||
  latest_only = latest_only == "on"
 | 
			
		||||
 | 
			
		||||
  unseen_only = env.params.body["unseen_only"]?.try &.as(String)
 | 
			
		||||
  unseen_only ||= "off"
 | 
			
		||||
  unseen_only = unseen_only == "on"
 | 
			
		||||
 | 
			
		||||
  notifications_only = env.params.body["notifications_only"]?.try &.as(String)
 | 
			
		||||
  notifications_only ||= "off"
 | 
			
		||||
  notifications_only = notifications_only == "on"
 | 
			
		||||
 | 
			
		||||
  # Convert to JSON and back again to take advantage of converters used for compatability
 | 
			
		||||
  preferences = Preferences.from_json({
 | 
			
		||||
    annotations:            annotations,
 | 
			
		||||
    annotations_subscribed: annotations_subscribed,
 | 
			
		||||
    autoplay:               autoplay,
 | 
			
		||||
    captions:               captions,
 | 
			
		||||
    comments:               comments,
 | 
			
		||||
    continue:               continue,
 | 
			
		||||
    continue_autoplay:      continue_autoplay,
 | 
			
		||||
    dark_mode:              dark_mode,
 | 
			
		||||
    latest_only:            latest_only,
 | 
			
		||||
    listen:                 listen,
 | 
			
		||||
    local:                  local,
 | 
			
		||||
    locale:                 locale,
 | 
			
		||||
    max_results:            max_results,
 | 
			
		||||
    notifications_only:     notifications_only,
 | 
			
		||||
    player_style:           player_style,
 | 
			
		||||
    quality:                quality,
 | 
			
		||||
    default_home:           default_home,
 | 
			
		||||
    feed_menu:              feed_menu,
 | 
			
		||||
    related_videos:         related_videos,
 | 
			
		||||
    sort:                   sort,
 | 
			
		||||
    speed:                  speed,
 | 
			
		||||
    thin_mode:              thin_mode,
 | 
			
		||||
    unseen_only:            unseen_only,
 | 
			
		||||
    video_loop:             video_loop,
 | 
			
		||||
    volume:                 volume,
 | 
			
		||||
  }.to_json).to_json
 | 
			
		||||
 | 
			
		||||
  if user = env.get? "user"
 | 
			
		||||
    user = user.as(User)
 | 
			
		||||
    PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences, user.email)
 | 
			
		||||
 | 
			
		||||
    if config.admins.includes? user.email
 | 
			
		||||
      config.default_user_preferences.default_home = env.params.body["admin_default_home"]?.try &.as(String) || config.default_user_preferences.default_home
 | 
			
		||||
 | 
			
		||||
      admin_feed_menu = [] of String
 | 
			
		||||
      5.times do |index|
 | 
			
		||||
        option = env.params.body["admin_feed_menu[#{index}]"]?.try &.as(String) || ""
 | 
			
		||||
        if !option.empty?
 | 
			
		||||
          admin_feed_menu << option
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      config.default_user_preferences.feed_menu = admin_feed_menu
 | 
			
		||||
 | 
			
		||||
      captcha_enabled = env.params.body["captcha_enabled"]?.try &.as(String)
 | 
			
		||||
      captcha_enabled ||= "off"
 | 
			
		||||
      config.captcha_enabled = captcha_enabled == "on"
 | 
			
		||||
 | 
			
		||||
      login_enabled = env.params.body["login_enabled"]?.try &.as(String)
 | 
			
		||||
      login_enabled ||= "off"
 | 
			
		||||
      config.login_enabled = login_enabled == "on"
 | 
			
		||||
 | 
			
		||||
      registration_enabled = env.params.body["registration_enabled"]?.try &.as(String)
 | 
			
		||||
      registration_enabled ||= "off"
 | 
			
		||||
      config.registration_enabled = registration_enabled == "on"
 | 
			
		||||
 | 
			
		||||
      statistics_enabled = env.params.body["statistics_enabled"]?.try &.as(String)
 | 
			
		||||
      statistics_enabled ||= "off"
 | 
			
		||||
      config.statistics_enabled = statistics_enabled == "on"
 | 
			
		||||
 | 
			
		||||
      CONFIG.default_user_preferences = config.default_user_preferences
 | 
			
		||||
      File.write("config/config.yml", config.to_yaml)
 | 
			
		||||
    end
 | 
			
		||||
  else
 | 
			
		||||
    if Kemal.config.ssl || config.https_only
 | 
			
		||||
      secure = true
 | 
			
		||||
    else
 | 
			
		||||
      secure = false
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if config.domain
 | 
			
		||||
      env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", domain: "#{config.domain}", value: preferences, expires: Time.utc + 2.years,
 | 
			
		||||
        secure: secure, http_only: true)
 | 
			
		||||
    else
 | 
			
		||||
      env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", value: preferences, expires: Time.utc + 2.years,
 | 
			
		||||
        secure: secure, http_only: true)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  env.redirect referer
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
get "/toggle_theme" do |env|
 | 
			
		||||
  locale = LOCALES[env.get("preferences").as(Preferences).locale]?
 | 
			
		||||
  referer = get_referer(env, unroll: false)
 | 
			
		||||
 | 
			
		||||
  redirect = env.params.query["redirect"]?
 | 
			
		||||
  redirect ||= "true"
 | 
			
		||||
  redirect = redirect == "true"
 | 
			
		||||
 | 
			
		||||
  if user = env.get? "user"
 | 
			
		||||
    user = user.as(User)
 | 
			
		||||
    preferences = user.preferences
 | 
			
		||||
 | 
			
		||||
    case preferences.dark_mode
 | 
			
		||||
    when "dark"
 | 
			
		||||
      preferences.dark_mode = "light"
 | 
			
		||||
    else
 | 
			
		||||
      preferences.dark_mode = "dark"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    preferences = preferences.to_json
 | 
			
		||||
 | 
			
		||||
    PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences, user.email)
 | 
			
		||||
  else
 | 
			
		||||
    preferences = env.get("preferences").as(Preferences)
 | 
			
		||||
 | 
			
		||||
    case preferences.dark_mode
 | 
			
		||||
    when "dark"
 | 
			
		||||
      preferences.dark_mode = "light"
 | 
			
		||||
    else
 | 
			
		||||
      preferences.dark_mode = "dark"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    preferences = preferences.to_json
 | 
			
		||||
 | 
			
		||||
    if Kemal.config.ssl || config.https_only
 | 
			
		||||
      secure = true
 | 
			
		||||
    else
 | 
			
		||||
      secure = false
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if config.domain
 | 
			
		||||
      env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", domain: "#{config.domain}", value: preferences, expires: Time.utc + 2.years,
 | 
			
		||||
        secure: secure, http_only: true)
 | 
			
		||||
    else
 | 
			
		||||
      env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", value: preferences, expires: Time.utc + 2.years,
 | 
			
		||||
        secure: secure, http_only: true)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  if redirect
 | 
			
		||||
    env.redirect referer
 | 
			
		||||
  else
 | 
			
		||||
    env.response.content_type = "application/json"
 | 
			
		||||
    "{}"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
post "/watch_ajax" do |env|
 | 
			
		||||
  locale = LOCALES[env.get("preferences").as(Preferences).locale]?
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										251
									
								
								src/invidious/routes/user_preferences.cr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								src/invidious/routes/user_preferences.cr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,251 @@
 | 
			
		||||
class Invidious::Routes::UserPreferences < Invidious::Routes::BaseRoute
 | 
			
		||||
  def show(env)
 | 
			
		||||
    locale = LOCALES[env.get("preferences").as(Preferences).locale]?
 | 
			
		||||
 | 
			
		||||
    referer = get_referer(env)
 | 
			
		||||
 | 
			
		||||
    preferences = env.get("preferences").as(Preferences)
 | 
			
		||||
 | 
			
		||||
    templated "preferences"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def update(env)
 | 
			
		||||
    locale = LOCALES[env.get("preferences").as(Preferences).locale]?
 | 
			
		||||
    referer = get_referer(env)
 | 
			
		||||
 | 
			
		||||
    video_loop = env.params.body["video_loop"]?.try &.as(String)
 | 
			
		||||
    video_loop ||= "off"
 | 
			
		||||
    video_loop = video_loop == "on"
 | 
			
		||||
 | 
			
		||||
    annotations = env.params.body["annotations"]?.try &.as(String)
 | 
			
		||||
    annotations ||= "off"
 | 
			
		||||
    annotations = annotations == "on"
 | 
			
		||||
 | 
			
		||||
    annotations_subscribed = env.params.body["annotations_subscribed"]?.try &.as(String)
 | 
			
		||||
    annotations_subscribed ||= "off"
 | 
			
		||||
    annotations_subscribed = annotations_subscribed == "on"
 | 
			
		||||
 | 
			
		||||
    autoplay = env.params.body["autoplay"]?.try &.as(String)
 | 
			
		||||
    autoplay ||= "off"
 | 
			
		||||
    autoplay = autoplay == "on"
 | 
			
		||||
 | 
			
		||||
    continue = env.params.body["continue"]?.try &.as(String)
 | 
			
		||||
    continue ||= "off"
 | 
			
		||||
    continue = continue == "on"
 | 
			
		||||
 | 
			
		||||
    continue_autoplay = env.params.body["continue_autoplay"]?.try &.as(String)
 | 
			
		||||
    continue_autoplay ||= "off"
 | 
			
		||||
    continue_autoplay = continue_autoplay == "on"
 | 
			
		||||
 | 
			
		||||
    listen = env.params.body["listen"]?.try &.as(String)
 | 
			
		||||
    listen ||= "off"
 | 
			
		||||
    listen = listen == "on"
 | 
			
		||||
 | 
			
		||||
    local = env.params.body["local"]?.try &.as(String)
 | 
			
		||||
    local ||= "off"
 | 
			
		||||
    local = local == "on"
 | 
			
		||||
 | 
			
		||||
    speed = env.params.body["speed"]?.try &.as(String).to_f32?
 | 
			
		||||
    speed ||= CONFIG.default_user_preferences.speed
 | 
			
		||||
 | 
			
		||||
    player_style = env.params.body["player_style"]?.try &.as(String)
 | 
			
		||||
    player_style ||= CONFIG.default_user_preferences.player_style
 | 
			
		||||
 | 
			
		||||
    quality = env.params.body["quality"]?.try &.as(String)
 | 
			
		||||
    quality ||= CONFIG.default_user_preferences.quality
 | 
			
		||||
 | 
			
		||||
    volume = env.params.body["volume"]?.try &.as(String).to_i?
 | 
			
		||||
    volume ||= CONFIG.default_user_preferences.volume
 | 
			
		||||
 | 
			
		||||
    comments = [] of String
 | 
			
		||||
    2.times do |i|
 | 
			
		||||
      comments << (env.params.body["comments[#{i}]"]?.try &.as(String) || CONFIG.default_user_preferences.comments[i])
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    captions = [] of String
 | 
			
		||||
    3.times do |i|
 | 
			
		||||
      captions << (env.params.body["captions[#{i}]"]?.try &.as(String) || CONFIG.default_user_preferences.captions[i])
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    related_videos = env.params.body["related_videos"]?.try &.as(String)
 | 
			
		||||
    related_videos ||= "off"
 | 
			
		||||
    related_videos = related_videos == "on"
 | 
			
		||||
 | 
			
		||||
    default_home = env.params.body["default_home"]?.try &.as(String) || CONFIG.default_user_preferences.default_home
 | 
			
		||||
 | 
			
		||||
    feed_menu = [] of String
 | 
			
		||||
    5.times do |index|
 | 
			
		||||
      option = env.params.body["feed_menu[#{index}]"]?.try &.as(String) || ""
 | 
			
		||||
      if !option.empty?
 | 
			
		||||
        feed_menu << option
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    locale = env.params.body["locale"]?.try &.as(String)
 | 
			
		||||
    locale ||= CONFIG.default_user_preferences.locale
 | 
			
		||||
 | 
			
		||||
    dark_mode = env.params.body["dark_mode"]?.try &.as(String)
 | 
			
		||||
    dark_mode ||= CONFIG.default_user_preferences.dark_mode
 | 
			
		||||
 | 
			
		||||
    thin_mode = env.params.body["thin_mode"]?.try &.as(String)
 | 
			
		||||
    thin_mode ||= "off"
 | 
			
		||||
    thin_mode = thin_mode == "on"
 | 
			
		||||
 | 
			
		||||
    max_results = env.params.body["max_results"]?.try &.as(String).to_i?
 | 
			
		||||
    max_results ||= CONFIG.default_user_preferences.max_results
 | 
			
		||||
 | 
			
		||||
    sort = env.params.body["sort"]?.try &.as(String)
 | 
			
		||||
    sort ||= CONFIG.default_user_preferences.sort
 | 
			
		||||
 | 
			
		||||
    latest_only = env.params.body["latest_only"]?.try &.as(String)
 | 
			
		||||
    latest_only ||= "off"
 | 
			
		||||
    latest_only = latest_only == "on"
 | 
			
		||||
 | 
			
		||||
    unseen_only = env.params.body["unseen_only"]?.try &.as(String)
 | 
			
		||||
    unseen_only ||= "off"
 | 
			
		||||
    unseen_only = unseen_only == "on"
 | 
			
		||||
 | 
			
		||||
    notifications_only = env.params.body["notifications_only"]?.try &.as(String)
 | 
			
		||||
    notifications_only ||= "off"
 | 
			
		||||
    notifications_only = notifications_only == "on"
 | 
			
		||||
 | 
			
		||||
    # Convert to JSON and back again to take advantage of converters used for compatability
 | 
			
		||||
    preferences = Preferences.from_json({
 | 
			
		||||
      annotations:            annotations,
 | 
			
		||||
      annotations_subscribed: annotations_subscribed,
 | 
			
		||||
      autoplay:               autoplay,
 | 
			
		||||
      captions:               captions,
 | 
			
		||||
      comments:               comments,
 | 
			
		||||
      continue:               continue,
 | 
			
		||||
      continue_autoplay:      continue_autoplay,
 | 
			
		||||
      dark_mode:              dark_mode,
 | 
			
		||||
      latest_only:            latest_only,
 | 
			
		||||
      listen:                 listen,
 | 
			
		||||
      local:                  local,
 | 
			
		||||
      locale:                 locale,
 | 
			
		||||
      max_results:            max_results,
 | 
			
		||||
      notifications_only:     notifications_only,
 | 
			
		||||
      player_style:           player_style,
 | 
			
		||||
      quality:                quality,
 | 
			
		||||
      default_home:           default_home,
 | 
			
		||||
      feed_menu:              feed_menu,
 | 
			
		||||
      related_videos:         related_videos,
 | 
			
		||||
      sort:                   sort,
 | 
			
		||||
      speed:                  speed,
 | 
			
		||||
      thin_mode:              thin_mode,
 | 
			
		||||
      unseen_only:            unseen_only,
 | 
			
		||||
      video_loop:             video_loop,
 | 
			
		||||
      volume:                 volume,
 | 
			
		||||
    }.to_json).to_json
 | 
			
		||||
 | 
			
		||||
    if user = env.get? "user"
 | 
			
		||||
      user = user.as(User)
 | 
			
		||||
      PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences, user.email)
 | 
			
		||||
 | 
			
		||||
      if config.admins.includes? user.email
 | 
			
		||||
        config.default_user_preferences.default_home = env.params.body["admin_default_home"]?.try &.as(String) || config.default_user_preferences.default_home
 | 
			
		||||
 | 
			
		||||
        admin_feed_menu = [] of String
 | 
			
		||||
        5.times do |index|
 | 
			
		||||
          option = env.params.body["admin_feed_menu[#{index}]"]?.try &.as(String) || ""
 | 
			
		||||
          if !option.empty?
 | 
			
		||||
            admin_feed_menu << option
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
        config.default_user_preferences.feed_menu = admin_feed_menu
 | 
			
		||||
 | 
			
		||||
        captcha_enabled = env.params.body["captcha_enabled"]?.try &.as(String)
 | 
			
		||||
        captcha_enabled ||= "off"
 | 
			
		||||
        config.captcha_enabled = captcha_enabled == "on"
 | 
			
		||||
 | 
			
		||||
        login_enabled = env.params.body["login_enabled"]?.try &.as(String)
 | 
			
		||||
        login_enabled ||= "off"
 | 
			
		||||
        config.login_enabled = login_enabled == "on"
 | 
			
		||||
 | 
			
		||||
        registration_enabled = env.params.body["registration_enabled"]?.try &.as(String)
 | 
			
		||||
        registration_enabled ||= "off"
 | 
			
		||||
        config.registration_enabled = registration_enabled == "on"
 | 
			
		||||
 | 
			
		||||
        statistics_enabled = env.params.body["statistics_enabled"]?.try &.as(String)
 | 
			
		||||
        statistics_enabled ||= "off"
 | 
			
		||||
        config.statistics_enabled = statistics_enabled == "on"
 | 
			
		||||
 | 
			
		||||
        CONFIG.default_user_preferences = config.default_user_preferences
 | 
			
		||||
        File.write("config/config.yml", config.to_yaml)
 | 
			
		||||
      end
 | 
			
		||||
    else
 | 
			
		||||
      if Kemal.config.ssl || config.https_only
 | 
			
		||||
        secure = true
 | 
			
		||||
      else
 | 
			
		||||
        secure = false
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      if config.domain
 | 
			
		||||
        env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", domain: "#{config.domain}", value: preferences, expires: Time.utc + 2.years,
 | 
			
		||||
          secure: secure, http_only: true)
 | 
			
		||||
      else
 | 
			
		||||
        env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", value: preferences, expires: Time.utc + 2.years,
 | 
			
		||||
          secure: secure, http_only: true)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    env.redirect referer
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def toggle_theme(env)
 | 
			
		||||
    locale = LOCALES[env.get("preferences").as(Preferences).locale]?
 | 
			
		||||
    referer = get_referer(env, unroll: false)
 | 
			
		||||
 | 
			
		||||
    redirect = env.params.query["redirect"]?
 | 
			
		||||
    redirect ||= "true"
 | 
			
		||||
    redirect = redirect == "true"
 | 
			
		||||
 | 
			
		||||
    if user = env.get? "user"
 | 
			
		||||
      user = user.as(User)
 | 
			
		||||
      preferences = user.preferences
 | 
			
		||||
 | 
			
		||||
      case preferences.dark_mode
 | 
			
		||||
      when "dark"
 | 
			
		||||
        preferences.dark_mode = "light"
 | 
			
		||||
      else
 | 
			
		||||
        preferences.dark_mode = "dark"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      preferences = preferences.to_json
 | 
			
		||||
 | 
			
		||||
      PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences, user.email)
 | 
			
		||||
    else
 | 
			
		||||
      preferences = env.get("preferences").as(Preferences)
 | 
			
		||||
 | 
			
		||||
      case preferences.dark_mode
 | 
			
		||||
      when "dark"
 | 
			
		||||
        preferences.dark_mode = "light"
 | 
			
		||||
      else
 | 
			
		||||
        preferences.dark_mode = "dark"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      preferences = preferences.to_json
 | 
			
		||||
 | 
			
		||||
      if Kemal.config.ssl || config.https_only
 | 
			
		||||
        secure = true
 | 
			
		||||
      else
 | 
			
		||||
        secure = false
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      if config.domain
 | 
			
		||||
        env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", domain: "#{config.domain}", value: preferences, expires: Time.utc + 2.years,
 | 
			
		||||
          secure: secure, http_only: true)
 | 
			
		||||
      else
 | 
			
		||||
        env.response.cookies["PREFS"] = HTTP::Cookie.new(name: "PREFS", value: preferences, expires: Time.utc + 2.years,
 | 
			
		||||
          secure: secure, http_only: true)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if redirect
 | 
			
		||||
      env.redirect referer
 | 
			
		||||
    else
 | 
			
		||||
      env.response.content_type = "application/json"
 | 
			
		||||
      "{}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in New Issue
	
	Block a user