summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
Diffstat (limited to 'src/login')
-rw-r--r--src/login/lgn_handler.erl19
-rw-r--r--src/login/query/lgn_sign_up.erl130
2 files changed, 146 insertions, 3 deletions
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)
+ }.