-module(ls_org). -export([ add/1, delete/1, get/1, add_trigger/2, list/0, list/2, stream/3, set_metadata/2, remove_trigger/2, execute_trigger/3, reverse_trigger/3, resource_inc/3, resource_dec/3 ]). -ignore_xref([ add/1, delete/1, get/1, add_trigger/2, list/0, list/2, remove_trigger/2, execute_trigger/3, set_metadata/2, resource_inc/3, resource_dec/3 ]). %%%=================================================================== %%% org Functions %%%=================================================================== -spec set_metadata(User::fifo:user_id(), Attrs::fifo:attr_list()) -> {error, no_servers} | ok. set_metadata(Org, Attrs) -> send(libsnarl_msg:org_set_metadata(r(), Org, Attrs)). %%-------------------------------------------------------------------- %% @doc Retrievs a list of all org id's. %% @end %%-------------------------------------------------------------------- -spec list() -> {error, no_servers} | {ok, [fifo:org_id()]}. list() -> send(libsnarl_msg:org_list(r())). %%-------------------------------------------------------------------- %% @doc Retrievs a filtered list for orgs. %% @end %%-------------------------------------------------------------------- -spec list(Reqs::[fifo:matcher()], boolean()) -> {error, no_servers} | {ok, [{Rank::integer(), fifo:org_id()}]} | {ok, [{Rank::integer(), fifo:org()}]}. list(Reqs, Full) -> send(libsnarl_msg:org_list(r(), Reqs, Full)). %%-------------------------------------------------------------------- %% @doc Streams the VM's in chunks. %% @end %%-------------------------------------------------------------------- -spec stream(Reqs::[fifo:matcher()], mdns_client_lib:stream_fun(), term()) -> {ok, [{Ranking::integer(), fifo:org_id()}]} | {ok, [{Ranking::integer(), fifo:org()}]} | {'error', 'no_servers'}. stream(Reqs, StreamFn, Acc0) -> case libsnarl_server:stream({org, stream, r(), Reqs}, StreamFn, Acc0) of {reply, Reply} -> Reply; noreply -> ok; E -> E end. %%-------------------------------------------------------------------- %% @doc Retrieves org data from the server. %% @end %%-------------------------------------------------------------------- -spec get(Org::fifo:org_id()) -> not_found | {error, no_servers} | {ok, fifo:org()}. get(Org) -> send(libsnarl_msg:org_get(r(), Org)). %%-------------------------------------------------------------------- %% @doc Adds a new org. %% @end %%-------------------------------------------------------------------- -spec add(Org::fifo:org_id()) -> {error, no_servers} | duplicate | {ok, UUID :: fifo:org_id()}. add(Org) -> send(libsnarl_msg:org_add(r(), Org)). %%-------------------------------------------------------------------- %% @doc Deletes a org. %% @spec delete(Org::binary()) -> %% {error, not_found|no_servers} | ok %% @end %%-------------------------------------------------------------------- -spec delete(Org::fifo:org_id()) -> {error, no_servers} | not_found | ok. delete(Org) -> send(libsnarl_msg:org_delete(r(), Org)). %%-------------------------------------------------------------------- %% @doc Adds a trigger to an organisation. %% @end %%-------------------------------------------------------------------- -spec add_trigger(Org::fifo:org_id(), Trigger::fifo:trigger()) -> {error, no_servers} | not_found | ok. add_trigger(Org, Trigger) -> send(libsnarl_msg:org_add_trigger(r(), Org, Trigger)). %%-------------------------------------------------------------------- %% @doc Removes a trigger from an organisation. %% @end %%-------------------------------------------------------------------- -spec remove_trigger(Org::fifo:org_id(), Trigger::fifo:trigger()) -> {error, no_servers} | not_found | ok. remove_trigger(Org, Trigger) -> send(libsnarl_msg:org_remove_trigger(r(), Org, Trigger)). %%-------------------------------------------------------------------- %% @doc Executes the triggers on an org. %% @end %%-------------------------------------------------------------------- -spec execute_trigger(Org::fifo:org_id(), Event::fifo:event(), Payload::term()) -> {error, no_servers} | not_found | ok. execute_trigger(Org, Event, Payload) -> send(libsnarl_msg:org_execute_trigger(r(), Org, Event, Payload)). %%-------------------------------------------------------------------- %% @doc Reverses the triggers on an org. %% @end %%-------------------------------------------------------------------- -spec reverse_trigger(Org::fifo:org_id(), Event::fifo:event(), Payload::term()) -> {error, no_servers} | not_found | ok. reverse_trigger(Org, Event, Payload) -> send(libsnarl_msg:org_reverse_trigger(r(), Org, Event, Payload)). %%-------------------------------------------------------------------- %% @doc Adds a value to a orgs resource. %% @end %%-------------------------------------------------------------------- -spec resource_inc(Org::fifo:org_id(), Resource::binary(), Delta::pos_integer()) -> {error, no_servers} | not_found | ok. resource_inc(Org, Res, Delta) -> send(libsnarl_msg:org_resource_inc(r(), Org, Res, Delta)). %%-------------------------------------------------------------------- %% @doc Substracts a value to a orgs resource. %% @end %%-------------------------------------------------------------------- -spec resource_dec(Org::fifo:org_id(), Resource::binary(), Delta::pos_integer()) -> {error, no_servers} | not_found | ok. resource_dec(Org, Res, Delta) -> send(libsnarl_msg:org_resource_dec(r(), Org, Res, Delta)). %%%=================================================================== %%% Internal Functions %%%=================================================================== %%-------------------------------------------------------------------- %% @private %% @doc Sends a message. %% @spec send(Msg::term()) -> {ok, Reply::term()} | {error, no_server} %% @end %%-------------------------------------------------------------------- -spec send(Msg::fifo:snarl_org_message()) -> ok | not_found | duplicate | {ok, Reply::term()} | {error, no_servers}. send(Msg) -> case libsnarl_server:call(Msg) of {reply, Reply} -> Reply; E -> E end. r() -> application:get_env(libsnarl, realm, <<"default">>).