aboutsummaryrefslogtreecommitdiff
path: root/apps/dreki/src/dreki_world_tasks.erl
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dreki/src/dreki_world_tasks.erl')
-rw-r--r--apps/dreki/src/dreki_world_tasks.erl66
1 files changed, 66 insertions, 0 deletions
diff --git a/apps/dreki/src/dreki_world_tasks.erl b/apps/dreki/src/dreki_world_tasks.erl
new file mode 100644
index 0000000..c27a7dc
--- /dev/null
+++ b/apps/dreki/src/dreki_world_tasks.erl
@@ -0,0 +1,66 @@
+-module(dreki_world_tasks).
+-include("dreki.hrl").
+-define(PREFIX, {objects, 'dreki_world_tasks'}).
+
+%% Types
+-type db() :: term().
+-type args() :: #{db_name => binary()}.
+
+%% storage-specific
+-export([start/1, open/1, sync/1, close/1, stop/1]).
+-export([all/1, count/1, exists/2, get/2, create/2, update/2, delete/2]).
+
+start(_) -> {ok, dreki_world_tasks}.
+open(_) -> {ok, dreki_world_tasks}.
+close(_) -> ok.
+stop(_) -> ok.
+sync(_) -> noop.
+
+all(_) ->
+ Results = plum_db:fold(fun ({_, Value}, Acc) ->
+ [Value | Acc]
+ end, [], ?PREFIX),
+ {ok, Results}.
+
+count(_) ->
+ Results = plum_db:fold(fun (_, Acc) ->
+ Acc + 1
+ end, 0, {objects, 'dreki_world_tasks'}),
+ {ok, Results}.
+
+exists(T, Id) ->
+ case get(T, Id) of
+ {ok, _} -> true;
+ _ -> false
+ end.
+
+get(_, Id) ->
+ case dreki_world:get(?PREFIX, Id) of
+ {ok, Val} -> {ok, Val};
+ not_found -> {error, {task_not_found, Id}}
+ end.
+
+create(T, Task = #dreki_task{id = Id}) ->
+ case get(T, Id) of
+ {ok, _} -> {error, {exists, Id}};
+ {error, {task_not_found, _}} ->
+ ok = plum_db:put(?PREFIX, Id, T),
+ ok = dreki_world:refresh_index(Task),
+ get(T, Id)
+ end.
+
+update(T, Task = #dreki_task{id = Id}) ->
+ case get(T, Id) of
+ Error = {error, {task_not_found, _}} -> Error;
+ {ok, _OldTask} ->
+ ok = plum_db:put(?PREFIX, Id, T),
+ ok = dreki_world:refresh_index(Task),
+ get(T, Id)
+ end.
+
+delete(T, #dreki_task{id = Id}) ->
+ {error, {dreki_world_tasks, delete_not_implemented}}.
+
+
+refresh_index(#dreki_task{uri = URI, tags = Tags, roles = Roles}) ->
+ dreki_world:refresh_index(tasks, #{uri => URI, tags => Tags, roles => Roles}).