docbrown/lib/tasks/add_navigation_links.rake
Jeremy Friesen 0484c550c5
Create/update by NavigationLink identity (#16312)
Prior to this commit, we were treating all NavigationLink attributes as
unique.  So, were we to change a position of one of the NavigationLinks
during the add_navigation_links rake task, we would have created a new
NavigationLink (and the only one would have remained).

With this commit, we're introducing the concept of the NavigationLink's
surrogate identity, that is to say if we have two NavigationLink objects
with the same `url` and `name` we should consider them the same
NavigationLink.  This allows us to update properties of those
NavigationLinks (via the rake task) without the risk of creating new
entries.

This unblocks PR #16268 which addresses #16076.
2022-01-27 13:51:41 -05:00

225 lines
6.6 KiB
Ruby

# rubocop:disable Metrics/BlockLength
namespace :navigation_links do
def image_path(*paths)
File.read(Rails.root.join("app/assets/images/#{paths.join('/')}")).freeze
end
def twemoji_path(name)
image_path("twemoji", name)
end
reading_icon = twemoji_path("drawer.svg")
contact_icon = twemoji_path("contact.svg")
thumb_up_icon = twemoji_path("thumb-up.svg")
smart_icon = twemoji_path("smart.svg")
look_icon = twemoji_path("look.svg")
listing_icon = twemoji_path("listing.svg")
mic_icon = twemoji_path("mic.svg")
camera_icon = twemoji_path("camera.svg")
tag_icon = twemoji_path("tag.svg")
bulb_icon = twemoji_path("bulb.svg")
shopping_icon = twemoji_path("shopping.svg")
heart_icon = twemoji_path("heart.svg")
rainbowdev = image_path("rainbowdev.svg")
def perform_create_of_navigation_links?
# Someone really wants this
return true if ApplicationConfig["CREATE_NAVIGATION_LINKS"]
# This logic echoes the InternalPolicy behavior which is used in the
# Admin::AppliciationController.
return false if User.with_any_role(*Authorizer::RoleBasedQueries::ANY_ADMIN_ROLES).any?
true
end
desc "Create navigation links for new forem"
task create: :environment do
if perform_create_of_navigation_links?
puts "Creating navigation links"
# [@jeremyf] I went ahead and atomized these tasks so we _could_ call them individually if
# desired. I did not add descriptions so those tasks will not show up in the task
# list.
Rake::Task["navigation_links:find_or_create:readinglist"].invoke
Rake::Task["navigation_links:find_or_create:contact"].invoke
Rake::Task["navigation_links:find_or_create:code_of_conduct"].invoke
Rake::Task["navigation_links:find_or_create:privacy"].invoke
Rake::Task["navigation_links:find_or_create:terms"].invoke
else
# Adding just a bit of logging
Rails.logger.info "Skipping creation of navigation links"
end
end
namespace :find_or_create do
task readinglist: :environment do
NavigationLink.create_or_update_by_identity(
url: URL.url("readinglist"),
name: "Reading List",
icon: reading_icon,
display_only_when_signed_in: true,
position: 1,
section: :default,
)
end
task contact: :environment do
NavigationLink.create_or_update_by_identity(
name: "Contact",
url: URL.url("contact"),
icon: contact_icon,
display_only_when_signed_in: false,
position: 2,
section: :default,
)
end
task code_of_conduct: :environment do
NavigationLink.create_or_update_by_identity(
name: "Code of Conduct",
url: URL.url(Page::CODE_OF_CONDUCT_SLUG),
icon: thumb_up_icon,
display_only_when_signed_in: false,
position: 1,
section: :other,
)
end
task privacy: :environment do
NavigationLink.create_or_update_by_identity(
name: "Privacy Policy",
url: URL.url(Page::PRIVACY_SLUG),
icon: smart_icon,
display_only_when_signed_in: false,
position: 2,
section: :other,
)
end
task terms: :environment do
NavigationLink.create_or_update_by_identity(
name: "Terms of Use",
url: URL.url(Page::TERMS_SLUG),
icon: look_icon,
display_only_when_signed_in: false,
position: 3,
section: :other,
)
end
end
desc "Update DEV's navigation_links"
task update: :environment do
protocol = ApplicationConfig["APP_PROTOCOL"].freeze
domain = Rails.application&.initialized? ? Settings::General.app_domain : ApplicationConfig["APP_DOMAIN"]
base_url = "#{protocol}#{domain}".freeze
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/readinglist",
name: "Reading List",
icon: reading_icon,
display_only_when_signed_in: true,
position: 2,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/listings",
name: "Listings",
icon: listing_icon,
display_only_when_signed_in: false,
position: 3,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/pod",
name: "Podcasts",
icon: mic_icon,
display_only_when_signed_in: false,
position: 4,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/videos",
name: "Videos",
icon: camera_icon,
display_only_when_signed_in: false,
position: 5,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/tags",
name: "Tags",
icon: tag_icon,
display_only_when_signed_in: false,
position: 6,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/faq",
name: "FAQ",
icon: bulb_icon,
display_only_when_signed_in: false,
position: 7,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "https://shop.dev.to/",
name: "DEV Shop",
icon: shopping_icon,
display_only_when_signed_in: false,
position: 6,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/sponsors",
name: "Sponsors",
icon: heart_icon,
display_only_when_signed_in: false,
position: 7,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/about",
name: "About",
icon: rainbowdev,
display_only_when_signed_in: false,
position: 8,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/contact",
name: "Contact",
icon: contact_icon,
display_only_when_signed_in: false,
position: 9,
section: :default,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/code-of-conduct",
name: "Code of Conduct",
icon: thumb_up_icon,
display_only_when_signed_in: false,
position: 1,
section: :other,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/privacy",
name: "Privacy Policy",
icon: smart_icon,
display_only_when_signed_in: false,
position: 2,
section: :other,
)
NavigationLink.create_or_update_by_identity(
url: "#{base_url}/terms",
name: "Terms of Use",
icon: look_icon,
display_only_when_signed_in: false,
position: 3,
section: :other,
)
end
end
# rubocop:enable Metrics/BlockLength