Skip to main content

src/gdav@multiget_events.erl

-module(gdav@multiget_events).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gdav/multiget_events.gleam").
-export([request/2, build/2, response/1]).
-export_type([request_builder/0]).

-type request_builder() :: {request_builder, binary(), list(binary())}.

-file("src/gdav/multiget_events.gleam", 15).
-spec request(binary(), list(binary())) -> request_builder().
request(Collection_path, Hrefs) ->
    {request_builder, Collection_path, Hrefs}.

-file("src/gdav/multiget_events.gleam", 19).
-spec build(request_builder(), gdav:credentials()) -> gleam@http@request:request(binary()).
build(Builder, Credentials) ->
    Headers = [{<<"Depth"/utf8>>, <<"1"/utf8>>},
        {<<"Prefer"/utf8>>, <<"return-minimal"/utf8>>},
        {<<"Content-Type"/utf8>>, <<"application/xml; charset=utf-8"/utf8>>}],
    Href_elements = begin
        _pipe = gleam@list:map(
            erlang:element(3, Builder),
            fun(Href) ->
                <<<<"<d:href>"/utf8, Href/binary>>/binary, "</d:href>"/utf8>>
            end
        ),
        gleam@string:join(_pipe, <<""/utf8>>)
    end,
    Body = <<<<<<<<<<<<"<c:calendar-multiget xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\">"/utf8,
                            "<d:prop>"/utf8>>/binary,
                        "<d:getetag />"/utf8>>/binary,
                    "<c:calendar-data />"/utf8>>/binary,
                "</d:prop>"/utf8>>/binary,
            Href_elements/binary>>/binary,
        "</c:calendar-multiget>"/utf8>>,
    gdav@internal:request(
        Credentials,
        {other, <<"REPORT"/utf8>>},
        erlang:element(2, Builder),
        Headers,
        Body
    ).

-file("src/gdav/multiget_events.gleam", 50).
-spec response(gleam@http@response:response(binary())) -> {ok,
        list(gdav:event_entry())} |
    {error, gdav:dav_error()}.
response(Res) ->
    case erlang:element(2, Res) of
        S when (S >= 200) andalso (S < 300) ->
            gleam@result:'try'(
                gdav@internal@xml:parse_multistatus(erlang:element(4, Res)),
                fun(Responses) ->
                    Entries = gleam@list:filter_map(
                        Responses,
                        fun(R) ->
                            Find = fun(Ns, Local) ->
                                gdav@internal@xml:find_text(
                                    erlang:element(4, R),
                                    Ns,
                                    Local
                                )
                            end,
                            case {Find(<<"DAV:"/utf8>>, <<"getetag"/utf8>>),
                                Find(
                                    <<"urn:ietf:params:xml:ns:caldav"/utf8>>,
                                    <<"calendar-data"/utf8>>
                                )} of
                                {{ok, Etag}, {ok, Data}} ->
                                    {ok,
                                        {event_entry,
                                            erlang:element(2, R),
                                            Etag,
                                            Data}};

                                {_, _} ->
                                    {error, nil}
                            end
                        end
                    ),
                    {ok, Entries}
                end
            );

        404 ->
            {error, not_found};

        401 ->
            {error, authentication_failed};

        403 ->
            {error, authentication_failed};

        _ ->
            {error, {unexpected_response, Res}}
    end.