Current section
Files
Jump to
Current section
Files
lib/shrivel.ex
defmodule Shrivel do
defstruct [:short_url, :long_url, :segment]
def shorten(long_url) do
%Shrivel{long_url: long_url}
|> generate_short_url
end
def valid?(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
defp generate_short_url(shrivel) do
%{shrivel | short_url: Application.get_env(:shrivel, :host)}
|> add_segment
end
defp add_segment(shrivel) do
segment = generate_segment
%{shrivel | short_url: shrivel.short_url <> segment, segment: 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
end