Current section

Files

Jump to
shrivel lib shrivel.ex
Raw

lib/shrivel.ex

defmodule Shrivel do
defstruct [:short_url, :long_url, :segment]
def shorten(url) do
case valid?(url) do
{:ok, url} ->
_shorten(url)
:error ->
{:error, "Not a valid URL"}
end
end
def valid?(url) do
if (is_valid_url?(url)) do
{:ok, url}
else
:error
end
end
def alreadyShort?(long_url, hostString) do
%{host: long_url_host} = URI.parse(long_url)
%{host: host} = URI.parse(hostString)
if (long_url_host === host) do
{:error, "already shortened"}
else
:ok
end
end
defp _shorten(url) do
result =
%{long_url: url}
|> getShortURLHost
|> add_segment
{:ok, result}
end
defp getShortURLHost(shrivel) do
Map.put(shrivel, :short_url, Application.get_env(:shrivel, :host))
end
defp add_segment(shrivel) do
segment = generate_segment
Map.put(shrivel, :segment, segment)
|> Map.put(:short_url, shrivel.short_url <> segment)
end
defp generate_segment() do
length = Application.get_env(:shrivel, :segment_length)
:crypto.strong_rand_bytes(length)
|> Base.url_encode64
|> binary_part(0, length)
end
defp is_valid_url?(url) do
Regex.match?(
~r/
^(?:(?:https?|ftp):\/\/)
(?:\S+(?::\S*)?@)?
(?:
(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})
(?!$172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})
(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}
(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))
|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)
(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)*
(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,}))\.?)(?::\d{2,5})?(?:[\/?#]\S*)?$
/ximu,
url
)
end
end