Just for fun, here is some Elm code:
maybeGetPageOrFolderUuid : List PageOrFolder -> Maybe PageOrFolder -> UUID.UUID -> Maybe PageOrFolder
maybeGetPageOrFolderUuid pageOrFolderList maybeMatch uuid =
List.foldl
(\entry acc ->
case entry of
FolderLink folder ->
if folder.uuid == uuid then
Just (FolderLink folder)
else
maybeGetPageOrFolderUuid folder.children acc uuid
PageLink page ->
if page.uuid == uuid then
Just (PageLink page)
else
acc
)
maybeMatch
pageOrFolderList
And here is some Elixir code:
@impl true
def connect(%{"token" => token}, socket, _connect_info) do
# max_age: 1209600 is equivalent to two weeks in seconds
case Phoenix.Token.verify(socket, "user socket", token, max_age: 1_209_600) do
{:ok, user_id} ->
case Bunn.User.get(user_id) do
nil ->
# no such user in db, assign a new uuid, visitor
now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
user = %Bunn.User{
id: user_id,
level: "Visitor",
inserted_at: now,
updated_at: now
}
Logger.debug(["user_socket | visitor user connected -> ", user.id])
{:ok, assign(socket, :user, user)}
user ->
Logger.debug([
"user_socket | registerd user connected -> ",
user.id,
" | ",
user.email
])
{:ok, assign(socket, :user, user)}
end
{:error, reason} ->
Logger.error(["user_socket | user not connected -> ", inspect(reason)])
:error
end
end