Packages

A micro web framework for Gleam

Current section

Files

Jump to
bliss src example@middlewares.erl
Raw

src/example@middlewares.erl

-module(example@middlewares).
-compile(no_auto_import).
-export([track/1, authenticate/1, must_be_admin/1]).
-spec track(
fun((gleam@http@request:request(bitstring()), example@context:initial_context()) -> HBX)
) -> fun((gleam@http@request:request(bitstring()), example@context:initial_context()) -> HBX).
track(Handler) ->
fun(Req, Ctx) -> Handler(Req, Ctx) end.
-spec check_token(binary()) -> {ok, boolean()} | {error, nil}.
check_token(Token) ->
case Token =:= <<"Bearer 123"/utf8>> of
true ->
{ok, true};
false ->
{error, nil}
end.
-spec try_authenticate(
gleam@http@request:request(bitstring()),
example@context:initial_context()
) -> {ok, example@context:user()} | {error, nil}.
try_authenticate(Req, _) ->
case gleam@http@request:get_header(Req, <<"Authorization"/utf8>>) of
{error, _try} -> {error, _try};
{ok, Token} ->
case check_token(Token) of
{error, _try@1} -> {error, _try@1};
{ok, _@1} ->
Role = begin
_pipe = gleam@http@request:get_header(
Req,
<<"User-Role"/utf8>>
),
gleam@result:unwrap(_pipe, <<"user"/utf8>>)
end,
User = {user, <<"sam@sample.com"/utf8>>, Role},
{ok, User}
end
end.
-spec authenticate(
fun((gleam@http@request:request(bitstring()), example@context:context_authenticated()) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, bliss:response_error()})
) -> fun((gleam@http@request:request(bitstring()), example@context:initial_context()) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, bliss:response_error()}).
authenticate(Handler) ->
fun(Req, Ctx) -> case try_authenticate(Req, Ctx) of
{ok, User} ->
Context_authenticated = {context_authenticated,
erlang:element(2, Ctx),
User},
Handler(Req, Context_authenticated);
{error, _@1} ->
{error, unauthorised}
end end.
-spec must_be_admin(
fun((gleam@http@request:request(bitstring()), example@context:context_authenticated()) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, bliss:response_error()})
) -> fun((gleam@http@request:request(bitstring()), example@context:context_authenticated()) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, bliss:response_error()}).
must_be_admin(Handler) ->
fun(Req, Ctx) ->
Is_admin = erlang:element(3, erlang:element(3, Ctx))
=:= <<"admin"/utf8>>,
case Is_admin of
true ->
Handler(Req, Ctx);
false ->
{error, unauthorised}
end
end.