From 37e14ec2f8791746e4ec5688a99cd79c5251c1b9 Mon Sep 17 00:00:00 2001 From: Juan Rodriguez Date: Wed, 31 Jul 2024 08:07:08 +0200 Subject: [PATCH] refactor: sha256 slug generation --- app/controllers/link.cr | 3 ++- app/services/slug.cr | 9 +++++++++ bit.cr | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 app/services/slug.cr diff --git a/app/controllers/link.cr b/app/controllers/link.cr index 1feb807..8cba83a 100644 --- a/app/controllers/link.cr +++ b/app/controllers/link.cr @@ -9,6 +9,7 @@ module App::Controllers::Link class Create < App::Lib::BaseController include App::Models include App::Lib + include App::Services def call(env) user = env.get("user").as(User) @@ -29,7 +30,7 @@ module App::Controllers::Link attempts = 0 loop do - slug = Random::Secure.urlsafe_base64(attempts >= 2 ? 6 : 5).gsub(/[^a-zA-Z0-9]/, "") + slug = SlugService.generate_base64(url, 5 + attempts) unless Database.get_by(Link, slug: slug) link.slug = slug break diff --git a/app/services/slug.cr b/app/services/slug.cr new file mode 100644 index 0000000..ce96a10 --- /dev/null +++ b/app/services/slug.cr @@ -0,0 +1,9 @@ +require "digest" + +module App::Services::SlugService + def self.generate_base64(link : String, size : Int32) : String + hash = Digest::SHA256.digest(link) + base64_encoded = Base64.urlsafe_encode(hash).strip.tr("+/", "") + base64_encoded[0, size] + end +end diff --git a/bit.cr b/bit.cr index 4ebd68e..2c365ad 100644 --- a/bit.cr +++ b/bit.cr @@ -5,6 +5,7 @@ require "./app/lib/*" require "./app/models/*" require "./app/serializers/*" require "./app/middlewares/*" +require "./app/services/*" require "./app/routes"