Packages
event_bus
1.0.0-beta2
1.7.0
1.6.2
1.6.1
1.6.0
retired
1.5.2
retired
1.5.1
retired
1.5.0
retired
1.4.4
retired
1.4.3
retired
1.4.2
retired
1.4.1
retired
1.4.0
retired
1.3.8
retired
1.3.7
retired
1.3.6
retired
1.3.5
retired
1.3.4
retired
1.3.3
retired
1.3.2
retired
1.3.1
retired
1.3.0
retired
1.2.0
retired
1.1.3
retired
1.1.2
retired
1.1.1
retired
1.1.0
retired
1.0.0
retired
1.0.0-beta4
retired
1.0.0-beta3
retired
1.0.0-beta2
retired
1.0.0-beta1
retired
0.9.0
retired
0.8.0
retired
0.7.0
retired
0.6.1
retired
0.6.0
retired
0.5.0
retired
0.4.1
retired
0.4.0
retired
0.3.1
retired
0.3.0
retired
0.2.1
retired
0.2.0
retired
0.1.0
retired
Traceable, extendable and minimalist event bus implementation for Elixir with built-in event store and event watcher based on ETS
Retired package: Deprecated
Current section
Files
Jump to
Current section
Files
lib/event_bus/store.ex
defmodule EventBus.Store do
@moduledoc """
Event store is a storage handler for events. It allows to create and delete
stores for a topic. And allows fetching, deleting and saving events for the
topic.
"""
use GenServer
alias EventBus.Model.Event
@backend Application.get_env(:event_bus, :store_backend,
EventBus.Service.Store)
@doc false
def start_link,
do: GenServer.start_link(__MODULE__, nil, name: __MODULE__)
@doc """
Register a topic to the store
"""
@spec register_topic(String.t | atom()) :: no_return()
def register_topic(topic),
do: GenServer.cast(__MODULE__, {:register_topic, topic})
@doc """
Unregister the topic from the store
"""
@spec unregister_topic(String.t | atom()) :: no_return()
def unregister_topic(topic),
do: GenServer.cast(__MODULE__, {:unregister_topic, topic})
@doc """
Delete an event from the store
"""
@spec delete({atom(), String.t | integer()}) :: no_return()
def delete({topic, id}),
do: GenServer.cast(__MODULE__, {:delete, {topic, id}})
@doc """
Save an event to the store
"""
@spec save(Event.t) :: :ok
def save(%Event{} = event),
do: GenServer.call(__MODULE__, {:save, event})
###########################################################################
# DELEGATIONS
###########################################################################
@doc """
Fetch an event from the store
"""
@spec fetch({atom(), String.t | integer()}) :: any()
defdelegate fetch(event_shadow),
to: @backend, as: :fetch
###########################################################################
# PRIVATE API
###########################################################################
@doc false
@spec handle_cast({:register_topic, String.t | atom()}, nil) :: no_return()
def handle_cast({:register_topic, topic}, state) do
@backend.register_topic(topic)
{:noreply, state}
end
@spec handle_cast({:unregister_topic, String.t | atom()}, nil) :: no_return()
def handle_cast({:unregister_topic, topic}, state) do
@backend.unregister_topic(topic)
{:noreply, state}
end
@spec handle_cast({:delete, {atom(), String.t | integer()}}, nil)
:: no_return()
def handle_cast({:delete, {topic, id}}, state) do
@backend.delete({topic, id})
{:noreply, state}
end
@doc false
@spec handle_call({:save, Event.t}, any(), nil) :: no_return()
def handle_call({:save, event}, _from, state) do
@backend.save(event)
{:reply, :ok, state}
end
end