summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/battle/btl_handler.erl2
-rw-r--r--src/db/logic/db_access.erl78
-rw-r--r--src/login/lgn_handler.erl19
-rw-r--r--src/login/query/lgn_sign_up.erl130
-rw-r--r--src/map/map_handler.erl2
-rw-r--r--src/shared/io/shr_database.erl126
-rw-r--r--src/shared/shr_janitor.erl35
-rw-r--r--src/shared/struct/shr_db_query.erl31
-rw-r--r--src/shared/struct/shr_db_user.erl12
-rw-r--r--src/shared/struct/shr_player.erl4
10 files changed, 389 insertions, 50 deletions
diff --git a/src/battle/btl_handler.erl b/src/battle/btl_handler.erl
index 87c8e63..0bcd40a 100644
--- a/src/battle/btl_handler.erl
+++ b/src/battle/btl_handler.erl
@@ -21,7 +21,7 @@ start (TimedCachesManagerPid) ->
case shr_database:fetch(battle_db, <<"0">>, admin) of
{ok, _} -> ok;
not_found ->
- shr_database:insert
+ shr_database:insert_at
(
battle_db,
<<"0">>,
diff --git a/src/db/logic/db_access.erl b/src/db/logic/db_access.erl
index 1591ead..0a18edb 100644
--- a/src/db/logic/db_access.erl
+++ b/src/db/logic/db_access.erl
@@ -11,7 +11,10 @@
(
[
read/3,
- insert/5,
+ remove/3,
+ reserve/3,
+ insert_at/5,
+ insert/4,
query/1
]
).
@@ -25,18 +28,28 @@ query_transaction (Query) ->
ID = shr_db_query:get_entry_id(Query),
[Item] = mnesia:read(DB, ID),
{ok, UpdatedItem} = shr_db_query:apply_to(Query, Item),
- % FIXME: handle return value, mnesia:write -> (transaction abort | ok).
- % FIXME: is this an atomic OP? Is the lock freed afterwards?
+
mnesia:write(DB, UpdatedItem, sticky_write),
+
+ ok.
+
+-spec add_new_item (atom(), shr_db_item:type()) -> 'ok'.
+add_new_item (DB, Item) ->
+ ID = shr_db_item:get_id(Item),
+ [] = mnesia:read(DB, ID),
+
+ mnesia:write(DB, Item, sticky_write),
+
ok.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec read
(
atom(),
- any(),
+ binary(),
shr_db_user:user()
)
-> ({'aborted', any()} | {'atomic', ({'ok', any()} | 'not_found')}).
@@ -47,7 +60,7 @@ read (DB, ID, Cred) ->
true =
shr_db_user:can_access
(
- shr_db_item:get_write_permission(Item),
+ shr_db_item:get_read_permission(Item),
Cred
),
{'atomic', {ok, shr_db_item:get_value(Item)}};
@@ -55,18 +68,65 @@ read (DB, ID, Cred) ->
Other -> {'aborted', Other}
end.
--spec insert
+-spec insert_at
(
atom(),
- any(),
+ binary(),
shr_db_user:permission(),
shr_db_user:permission(),
any())
-> ({'aborted', any()} | {'atomic', 'ok'}).
-insert (DB, ID, ReadPerm, WritePerm, Value) ->
+insert_at (DB, ID, ReadPerm, WritePerm, Value) ->
Item = shr_db_item:new(ID, ReadPerm, WritePerm, Value),
- mnesia:transaction(fun mnesia:write/3, [DB, Item, sticky_write]).
+ mnesia:transaction(fun add_new_item/2, [DB, Item]).
+
+-spec insert
+ (
+ atom(),
+ shr_db_user:permission(),
+ shr_db_user:permission(),
+ any())
+ -> ({'aborted', any()} | {'atomic', {'ok', binary()}}).
+insert (DB, ReadPerm, WritePerm, Value) ->
+ ID = <<"?">>, %% TODO: gen new ID.
+ case insert_at(DB, ID, ReadPerm, WritePerm, Value) of
+ {'atomic', 'ok'} -> {'atomic', {'ok', ID}};
+ {aborted, Val} -> {aborted, Val}
+ end.
-spec query (shr_db_query:type()) -> ({'aborted', any()} | {'atomic', 'ok'}).
query (Query) ->
mnesia:transaction(fun query_transaction/1, [Query]).
+
+-spec reserve
+ (
+ atom(),
+ binary(),
+ shr_db_user:user()
+ )
+ -> ({'aborted', any()} | {'atomic', 'ok'}).
+reserve (DB, ID, Cred) ->
+ insert_at
+ (
+ DB,
+ ID,
+ [Cred],
+ [Cred],
+ {
+ reserved,
+ <<"?">> %% TODO: timestamp
+ }
+ ).
+
+-spec remove
+ (
+ atom(),
+ binary(),
+ shr_db_user:user()
+ )
+ -> ({'aborted', any()} | {'atomic', ({'ok', any()} | 'not_found')}).
+remove (_DB, _ID, _Cred) ->
+ %% TODO: unimplemented
+ %% Don't forget to checkt that Cred has write access before removing the
+ %% value.
+ {'aborted', 'unimplemented'}.
diff --git a/src/login/lgn_handler.erl b/src/login/lgn_handler.erl
index dc154b0..fe87bc6 100644
--- a/src/login/lgn_handler.erl
+++ b/src/login/lgn_handler.erl
@@ -17,7 +17,7 @@ ensure_player_exists (ID, Username, Password, Email) ->
case shr_database:fetch(player_db, ID, admin) of
{ok, _} -> ok;
not_found ->
- shr_database:insert
+ shr_database:insert_at
(
player_db,
ID,
@@ -27,10 +27,10 @@ ensure_player_exists (ID, Username, Password, Email) ->
)
end,
- case shr_database:fetch(login_db, ID, admin) of
+ case shr_database:fetch(login_db, Username, admin) of
{ok, _} -> ok;
not_found ->
- shr_database:insert
+ shr_database:insert_at
(
login_db,
Username,
@@ -40,6 +40,19 @@ ensure_player_exists (ID, Username, Password, Email) ->
)
end,
+ case shr_database:fetch(login_db, Email, admin) of
+ {ok, _} -> ok;
+ not_found ->
+ shr_database:insert_at
+ (
+ login_db,
+ Email,
+ any,
+ any,
+ ID
+ )
+ end,
+
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/src/login/query/lgn_sign_up.erl b/src/login/query/lgn_sign_up.erl
new file mode 100644
index 0000000..ce35557
--- /dev/null
+++ b/src/login/query/lgn_sign_up.erl
@@ -0,0 +1,130 @@
+-module(lgn_sign_up).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-include("../../../include/yaws_api.hrl").
+
+-record
+(
+ input,
+ {
+ username :: binary(),
+ password :: binary(),
+ email :: binary()
+ }
+).
+
+-record
+(
+ query_state,
+ {
+ player :: shr_player:type()
+ }
+).
+
+-type input() :: #input{}.
+-type query_state() :: #query_state{}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export([out/1]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec parse_input (binary()) -> input().
+parse_input (Req) ->
+ JSONReqMap = jiffy:decode(Req, [return_maps]),
+ Username = maps:get(<<"usr">>, JSONReqMap),
+ Password = maps:get(<<"pwd">>, JSONReqMap),
+ Email = maps:get(<<"eml">>, JSONReqMap),
+
+ #input
+ {
+ username = Username,
+ password = Password,
+ email = Email
+ }.
+
+-spec register_user (input()) -> query_state().
+register_user (Input) ->
+ Username = Input#input.username,
+ Password = Input#input.password,
+ Email = Input#input.email,
+
+ shr_janitor:new(login_db, Username),
+ shr_janitor:new(login_db, Email),
+
+ ok = shr_database:reserve(login_db, Username, janitor),
+ ok = shr_database:reserve(login_db, Email, janitor),
+
+ Player = shr_player:new(<<"">>, Username, Password, Email),
+
+ {ok, PlayerID} = shr_database:insert(player_db, janitor, janitor, Player),
+
+ shr_janitor:new(player_db, PlayerID),
+
+ LoginUpdateQueryOps =
+ [
+ shr_db_query:set_value(PlayerID),
+ shr_db_query:set_read_permission(any),
+ shr_db_query:set_write_permission([{user, PlayerID}])
+ ],
+
+ PlayerUpdateQueryOps =
+ [
+ shr_db_query:set_field(shr_player:get_id_field(), PlayerID),
+ shr_db_query:set_read_permission(any),
+ shr_db_query:set_write_permission([{user, PlayerID}])
+ ],
+
+ ok =
+ shr_database:commit
+ (
+ shr_db_query:new(login_db, Username, janitor, LoginUpdateQueryOps)
+ ),
+
+ ok =
+ shr_database:commit
+ (
+ shr_db_query:new(login_db, Email, janitor, LoginUpdateQueryOps)
+ ),
+
+ ok =
+ shr_database:commit
+ (
+ shr_db_query:new(player_db, PlayerID, janitor, PlayerUpdateQueryOps)
+ ),
+
+ #query_state
+ {
+ player = shr_player:set_id(PlayerID, Player)
+ }.
+
+-spec generate_reply(query_state()) -> binary().
+generate_reply (QueryState) ->
+ Player = QueryState#query_state.player,
+
+ SetSession = lgn_set_session:generate(Player),
+ Output = jiffy:encode([SetSession]),
+
+ Output.
+
+-spec handle (binary()) -> binary().
+handle (Req) ->
+ Input = parse_input(Req),
+ %% TODO: validate input
+ QueryState = register_user(Input),
+ generate_reply(QueryState).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+out(A) ->
+ {
+ content,
+ "application/json; charset=UTF-8",
+ handle(A#arg.clidata)
+ }.
diff --git a/src/map/map_handler.erl b/src/map/map_handler.erl
index 9c7f4ce..0866315 100644
--- a/src/map/map_handler.erl
+++ b/src/map/map_handler.erl
@@ -21,7 +21,7 @@ start (TimedCachesManagerPid) ->
case shr_database:fetch(map_db, <<"0">>, admin) of
{ok, _} -> ok;
not_found ->
- shr_database:insert
+ shr_database:insert_at
(
map_db,
<<"0">>,
diff --git a/src/shared/io/shr_database.erl b/src/shared/io/shr_database.erl
index 60327a5..c1792dc 100644
--- a/src/shared/io/shr_database.erl
+++ b/src/shared/io/shr_database.erl
@@ -10,8 +10,11 @@
-export
(
[
- insert/5,
+ insert_at/5,
+ insert/4,
+ remove/3,
fetch/3,
+ reserve/3,
commit/1
]
).
@@ -19,60 +22,137 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec get_db_node () -> node().
-get_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()).
+-spec get_debug_db_node () -> node().
+get_debug_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()).
--spec do_remote_operation (atom(), list(any())) ->
- (
- {'badrpc', any()}
- | {'aborted', any()}
- | {'atomic', ({'ok', any()} | 'ok' | 'not_found')}
- ).
-do_remote_operation (Op, Params) ->
- rpc:call(get_db_node(), db_access, Op, Params).
+-spec get_random_db_node () -> node().
+get_random_db_node () ->
+ get_debug_db_node().
+
+-spec get_db_node_for (binary()) -> node().
+get_db_node_for (_ObjectID) ->
+ get_debug_db_node().
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec insert
+-spec insert_at
(
atom(),
- any(),
+ binary(),
shr_db_user:permission(),
shr_db_user:permission(),
any()
)
-> 'ok'.
-insert (DB, ObjectID, ReadPerm, WritePerm, Value) ->
+insert_at (DB, ObjectID, ReadPerm, WritePerm, Value) ->
+ DBNode = get_db_node_for(ObjectID),
+
{atomic, _} =
- do_remote_operation(insert, [DB, ObjectID, ReadPerm, WritePerm, Value]),
+ rpc:call
+ (
+ DBNode,
+ db_access,
+ insert_at,
+ [DB, ObjectID, ReadPerm, WritePerm, Value]
+ ),
io:format
(
- "~nshr_database:insert(~p) -> ok.~n",
- [{DB, ObjectID, ReadPerm, WritePerm, Value}]
+ "~nshr_database:insert_at(~p) ! ~p -> ok.~n",
+ [{DB, ObjectID, ReadPerm, WritePerm, Value}, DBNode]
),
ok.
+-spec insert
+ (
+ atom(),
+ shr_db_user:permission(),
+ shr_db_user:permission(),
+ any()
+ )
+ -> {'ok', binary()}.
+insert (DB, ReadPerm, WritePerm, Value) ->
+ DBNode = get_random_db_node(),
+
+ {atomic, {ok, ID}} =
+ rpc:call(DBNode, db_access, insert, [DB, ReadPerm, WritePerm, Value]),
+
+ io:format
+ (
+ "~nshr_database:insert(~p) ! ~p -> ok.~n",
+ [{DB, ReadPerm, WritePerm, Value}, DBNode]
+ ),
+
+ {ok, ID}.
+
-spec fetch
(
atom(),
- any(),
+ binary(),
shr_db_user:user()
)
-> ({'ok', any()} | 'not_found').
fetch (DB, ObjectID, Cred) ->
- {atomic, Reply} = do_remote_operation(read, [DB, ObjectID, Cred]),
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, Reply} = rpc:call(DBNode, db_access, read, [DB, ObjectID, Cred]),
+
io:format
(
- "~nshr_database:fetch(~p) -> ~p.~n",
- [{DB, ObjectID, Cred}, Reply]
+ "~nshr_database:fetch(~p) ! ~p -> ~p.~n",
+ [{DB, ObjectID, Cred}, DBNode, Reply]
),
+
Reply.
-spec commit (shr_db_query:type()) -> 'ok'.
commit (Query) ->
- {atomic, ok} = do_remote_operation(query, [Query]),
- io:format("~nshr_database:commit(~p) -> ok.~n", [Query]),
+ DBNode = get_db_node_for(shr_db_query:get_entry_id(Query)),
+
+ {atomic, ok} = rpc:call(DBNode, db_access, query, [Query]),
+
+ io:format("~nshr_database:commit(~p) ! ~p -> ok.~n", [Query, DBNode]),
+
+ ok.
+
+-spec remove
+ (
+ atom(),
+ binary(),
+ shr_db_user:user()
+ )
+ -> ('ok' | 'not_found').
+remove (DB, ObjectID, Cred) ->
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, _} = rpc:call(DBNode, db_access, remove, [DB, ObjectID, Cred]),
+
+ io:format
+ (
+ "~nshr_database:remove(~p) ! ~p -> ok.~n",
+ [{DB, ObjectID, Cred}, DBNode]
+ ),
+
+ ok.
+
+-spec reserve
+ (
+ atom(),
+ binary(),
+ shr_db_user:user()
+ )
+ -> ('ok' | 'not_found').
+reserve (DB, ObjectID, Cred) ->
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, _} = rpc:call(DBNode, db_access, reserve, [DB, ObjectID, Cred]),
+
+ io:format
+ (
+ "~nshr_database:reserve(~p) ! ~p -> ok.~n",
+ [{DB, ObjectID, Cred}, DBNode]
+ ),
+
ok.
diff --git a/src/shared/shr_janitor.erl b/src/shared/shr_janitor.erl
new file mode 100644
index 0000000..097a729
--- /dev/null
+++ b/src/shared/shr_janitor.erl
@@ -0,0 +1,35 @@
+-module(shr_janitor).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export
+(
+ [
+ new/2,
+ core/2
+ ]
+).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+core (DB, ItemID) ->
+ receive
+ after
+ 60000 ->
+ shr_database:remove(DB, ItemID, janitor)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec new (atom(), binary()) -> ok.
+new (DB, ItemID) ->
+ spawn(shr_janitor, core, [DB, ItemID]),
+
+ ok.
diff --git a/src/shared/struct/shr_db_query.erl b/src/shared/struct/shr_db_query.erl
index e1f6156..5310f00 100644
--- a/src/shared/struct/shr_db_query.erl
+++ b/src/shared/struct/shr_db_query.erl
@@ -73,8 +73,8 @@
-type db_query() :: #db_query{}.
--opaque op() :: db_query_op().
--opaque type() :: db_query().
+-type op() :: db_query_master_op().
+-type type() :: db_query().
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -87,7 +87,10 @@
new/4,
set_field/2,
add_to_field/3,
- update_indexed/3
+ update_indexed/3,
+ set_value/1,
+ set_read_permission/1,
+ set_write_permission/1
]
).
-export
@@ -190,6 +193,15 @@ new (DBName, ObjectID, User, Ops) ->
set_field (Field, Value) ->
#set_field { field = Field, value = Value }.
+-spec set_value (any()) -> op().
+set_value (Value) -> #set_val { val= Value }.
+
+-spec set_read_permission (shr_db_user:permission()) -> op().
+set_read_permission (Perm) -> #set_read_perm { perm = Perm }.
+
+-spec set_write_permission (shr_db_user:permission()) -> op().
+set_write_permission (Perm) -> #set_write_perm { perm = Perm }.
+
-spec add_to_field (non_neg_integer(), list(any()), boolean()) -> op().
add_to_field (Field, Values, IsPrefix) ->
#add_to_field { field = Field, values = Values, head = IsPrefix}.
@@ -217,12 +229,13 @@ get_entry_id (#db_query{ id = Result }) -> Result.
)
-> ({'ok', shr_db_item:type()} | 'error').
apply_to (DBQuery, DBItem) ->
- true =
- shr_db_user:can_access
- (
- shr_db_item:get_write_permission(DBItem),
- get_user(DBQuery)
- ),
+ ObjectWPerm = shr_db_item:get_write_permission(DBItem),
+ User = get_user(DBQuery),
+
+ io:format("~p accessing obj with ~p perm.~n", [User, ObjectWPerm]),
+
+ true = shr_db_user:can_access (ObjectWPerm, User),
+
MOps = DBQuery#db_query.ops,
{ok, lists:foldl(fun apply_master_op_to/2, DBItem, MOps)}.
diff --git a/src/shared/struct/shr_db_user.erl b/src/shared/struct/shr_db_user.erl
index 01840e2..991fb64 100644
--- a/src/shared/struct/shr_db_user.erl
+++ b/src/shared/struct/shr_db_user.erl
@@ -4,8 +4,8 @@
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-type db_named_user() :: {'user', any()}.
--type db_user() :: (db_named_user() | 'admin' | 'any').
--type db_permission() :: (list(db_named_user()) | 'any').
+-type db_user() :: (db_named_user() | 'admin' | 'any' | 'janitor').
+-type db_permission() :: (list(db_named_user()) | 'any' | 'janitor').
-type user() :: db_user().
@@ -27,5 +27,9 @@
-spec can_access (permission(), user()) -> boolean().
can_access (_, admin) -> true;
can_access (any, _) -> true;
-can_access (List, {'user', User}) ->
- lists:member(User, List).
+can_access (janitor, janitor) -> true;
+can_access (List, {user, User}) ->
+ lists:member({user, User}, List);
+can_access (janitor, janitor) -> true;
+can_access (List, janitor) ->
+ lists:member(janitor, List).
diff --git a/src/shared/struct/shr_player.erl b/src/shared/struct/shr_player.erl
index 6364eb2..2b394c6 100644
--- a/src/shared/struct/shr_player.erl
+++ b/src/shared/struct/shr_player.erl
@@ -48,6 +48,7 @@
get_maps/1,
get_characters/1,
+ set_id/2,
set_username/2,
set_password/2,
new_token/1,
@@ -138,6 +139,9 @@ get_maps (Player) -> Player#player.maps.
-spec get_characters (type()) -> list(binary()).
get_characters (Player) -> Player#player.characters.
+-spec set_id (binary(), type()) -> type().
+set_id (Val, Player) -> Player#player{ id = Val }.
+
-spec set_username (binary(), type()) -> type().
set_username (Val, Player) -> Player#player{ username = Val }.