Current section
Files
Jump to
Current section
Files
src/example@queries.erl
-module(example@queries).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/example/queries.gleam").
-export([find_user_by_email/2, find_posts_for_user/2, create_user/3, create_post/3, follow_user/3, feed_for_user/3, delete_user_posts/2, delete_user_and_posts/2]).
-export_type([feed_post/0]).
-type feed_post() :: {feed_post, integer(), binary(), binary()}.
-file("src/example/queries.gleam", 11).
-spec find_user_by_email(gloo@repo:repo(), binary()) -> {ok,
example@schema:user()} |
{error, gloo@error:gloo_error()}.
find_user_by_email(R, Email) ->
_pipe = gloo@query:from(example@schema:users()),
_pipe@1 = gloo@query:where(
_pipe,
{eq, <<"email"/utf8>>, gloo@sql:string(Email)}
),
gloo@repo:query_one(R, _pipe@1).
-file("src/example/queries.gleam", 20).
-spec find_posts_for_user(gloo@repo:repo(), integer()) -> {ok,
list(example@schema:post())} |
{error, gloo@error:gloo_error()}.
find_posts_for_user(R, User_id) ->
_pipe = gloo@query:from(example@schema:posts()),
_pipe@1 = gloo@query:where(
_pipe,
{eq, <<"user_id"/utf8>>, gloo@sql:int(User_id)}
),
_pipe@2 = gloo@query:order_by(_pipe@1, <<"inserted_at"/utf8>>, desc),
gloo@repo:query_all(R, _pipe@2).
-file("src/example/queries.gleam", 30).
-spec create_user(gloo@repo:repo(), binary(), binary()) -> {ok,
example@schema:user()} |
{error, gloo@error:gloo_error()}.
create_user(R, Email, Name) ->
_pipe = gloo@query:insert(
gloo@query:from(example@schema:users()),
example@schema:users(),
[{<<"email"/utf8>>, gloo@sql:string(Email)},
{<<"name"/utf8>>, gloo@sql:string(Name)}]
),
_pipe@1 = gloo@query:returning_columns(
_pipe,
[<<"id"/utf8>>, <<"email"/utf8>>, <<"name"/utf8>>]
),
_pipe@2 = gloo@query:returning(
_pipe@1,
erlang:element(4, example@schema:users())
),
gloo@repo:query_one(R, _pipe@2).
-file("src/example/queries.gleam", 44).
-spec create_post(gloo@repo:repo(), integer(), binary()) -> {ok,
example@schema:post()} |
{error, gloo@error:gloo_error()}.
create_post(R, User_id, Body) ->
_pipe = gloo@query:insert(
gloo@query:from(example@schema:posts()),
example@schema:posts(),
[{<<"user_id"/utf8>>, gloo@sql:int(User_id)},
{<<"body"/utf8>>, gloo@sql:string(Body)}]
),
_pipe@1 = gloo@query:returning_columns(
_pipe,
[<<"id"/utf8>>, <<"user_id"/utf8>>, <<"body"/utf8>>]
),
_pipe@2 = gloo@query:returning(
_pipe@1,
erlang:element(4, example@schema:posts())
),
gloo@repo:query_one(R, _pipe@2).
-file("src/example/queries.gleam", 58).
-spec follow_user(gloo@repo:repo(), integer(), integer()) -> {ok, integer()} |
{error, gloo@error:gloo_error()}.
follow_user(R, Follower_id, Followee_id) ->
_pipe = gloo@query:insert(
gloo@query:from(example@schema:follows()),
example@schema:follows(),
[{<<"follower_id"/utf8>>, gloo@sql:int(Follower_id)},
{<<"followee_id"/utf8>>, gloo@sql:int(Followee_id)}]
),
gloo@repo:query_execute(R, _pipe).
-file("src/example/queries.gleam", 76).
-spec feed_for_user(gloo@repo:repo(), integer(), integer()) -> {ok,
list(feed_post())} |
{error, gloo@error:gloo_error()}.
feed_for_user(R, User_id, Limit) ->
Decoder = begin
gleam@dynamic@decode:field(
0,
{decoder, fun gleam@dynamic@decode:decode_int/1},
fun(Post_id) ->
gleam@dynamic@decode:field(
1,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Author_name) ->
gleam@dynamic@decode:field(
2,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Body) ->
gleam@dynamic@decode:success(
{feed_post, Post_id, Author_name, Body}
)
end
)
end
)
end
)
end,
_pipe = gloo@sql:'query'(
<<"SELECT p.id, u.name, p.body
FROM posts p
JOIN users u ON u.id = p.user_id
WHERE p.user_id IN (
SELECT followee_id FROM follows WHERE follower_id = $1
)
ORDER BY p.inserted_at DESC
LIMIT $2"/utf8>>
),
_pipe@1 = gloo@sql:param(_pipe, gloo@sql:int(User_id)),
_pipe@2 = gloo@sql:param(_pipe@1, gloo@sql:int(Limit)),
_pipe@3 = gloo@sql:returns(_pipe@2, Decoder),
gloo@repo:sql_all(R, _pipe@3).
-file("src/example/queries.gleam", 103).
-spec delete_user_posts(gloo@repo:repo(), integer()) -> {ok, integer()} |
{error, gloo@error:gloo_error()}.
delete_user_posts(R, User_id) ->
_pipe = gloo@sql:'query'(<<"DELETE FROM posts WHERE user_id = $1"/utf8>>),
_pipe@1 = gloo@sql:param(_pipe, gloo@sql:int(User_id)),
gloo@repo:sql_execute(R, _pipe@1).
-file("src/example/queries.gleam", 114).
-spec delete_user_and_posts(gloo@repo:repo(), integer()) -> {ok, nil} |
{error, gloo@error:gloo_error()}.
delete_user_and_posts(R, User_id) ->
gloo@repo:transaction(
R,
fun(Tx) ->
gleam@result:'try'(
delete_user_posts(Tx, User_id),
fun(_) ->
gleam@result:'try'(
begin
_pipe = gloo@query:from(example@schema:follows()),
_pipe@1 = gloo@query:delete(_pipe),
_pipe@2 = gloo@query:where(
_pipe@1,
{'or',
[{eq,
<<"follower_id"/utf8>>,
gloo@sql:int(User_id)},
{eq,
<<"followee_id"/utf8>>,
gloo@sql:int(User_id)}]}
),
gloo@repo:query_execute(Tx, _pipe@2)
end,
fun(_) ->
gleam@result:'try'(
gloo@repo:execute(
Tx,
<<"DELETE FROM users WHERE id = $1"/utf8>>,
[gloo@sql:int(User_id)]
),
fun(_) -> {ok, nil} end
)
end
)
end
)
end
).