Browse Source

event based registration. email as user id. email registration module stub.

Andrii Zadorozhnii 11 years ago
parent
commit
c98eabf042
7 changed files with 82 additions and 46 deletions
  1. 5 5
      src/avz.erl
  2. 26 0
      src/email.erl
  3. 7 5
      src/facebook.erl
  4. 11 9
      src/github.erl
  5. 12 10
      src/google.erl
  6. 10 8
      src/microsoft.erl
  7. 11 9
      src/twitter.erl

+ 5 - 5
src/avz.erl

@@ -11,19 +11,19 @@ buttons(Methods) -> [ M:login_button() || M <- Methods].
 
 
 event(init) -> [];
 event(init) -> [];
 event(logout) -> wf:user(undefined), wf:redirect(?LOGIN_PAGE);
 event(logout) -> wf:user(undefined), wf:redirect(?LOGIN_PAGE);
-event(login) -> wf:redirect(?AFTER_LOGIN);
 event(to_login) -> wf:redirect(?LOGIN_PAGE);
 event(to_login) -> wf:redirect(?LOGIN_PAGE);
+event({register, #user{}=U}) -> kvs:add(U), login_user(U);
+event({login, #user{}=U}) -> login_user(U);
 event({Method,Event}) -> Method:event({Method,Event});
 event({Method,Event}) -> Method:event({Method,Event});
 event(Ev) ->  error_logger:info_msg("Page Event ~p",[Ev]).
 event(Ev) ->  error_logger:info_msg("Page Event ~p",[Ev]).
 
 
 api_event(plusLogin, Args, Term) -> google:api_event(plusLogin, Args, Term);
 api_event(plusLogin, Args, Term) -> google:api_event(plusLogin, Args, Term);
 api_event(fbLogin, Args, Term)   -> facebook:api_event(fbLogin, Args, Term);
 api_event(fbLogin, Args, Term)   -> facebook:api_event(fbLogin, Args, Term);
-api_event(winLogin, Args, Term)   -> microsoft:api_event(winLogin, Args, Term);
+api_event(winLogin, Args, Term)  -> microsoft:api_event(winLogin, Args, Term);
 api_event(Name, Args, Term)      -> error_logger:info_msg("Unknown API event: ~p ~p ~p",[Name, Args, Term]).
 api_event(Name, Args, Term)      -> error_logger:info_msg("Unknown API event: ~p ~p ~p",[Name, Args, Term]).
 
 
 login_user(User) -> wf:user(User), wf:redirect(?AFTER_LOGIN).
 login_user(User) -> wf:user(User), wf:redirect(?AFTER_LOGIN).
 login(Key, Args)-> case Args of [{error, E}|_Rest] -> error_logger:info_msg("oauth error: ~p", [E]);
 login(Key, Args)-> case Args of [{error, E}|_Rest] -> error_logger:info_msg("oauth error: ~p", [E]);
     _ -> case kvs:get(user,Key:email_prop(Args,Key)) of
     _ -> case kvs:get(user,Key:email_prop(Args,Key)) of
-              {ok,Existed} -> {_Id, RegData} = Key:registration_data(Args, Key, Existed), login_user(RegData);
-              {error,_} -> {_Id, RegData} = Key:registration_data(Args, Key, #user{}),
-                  kvs:put(RegData), login_user(RegData) end end.
+              {ok,Existed} -> RegData = Key:registration_data(Args, Key, Existed), (wf_context:page_module()):event({login, RegData});
+              {error,_} -> RegData = Key:registration_data(Args, Key, #user{}), (wf_context:page_module()):event({register, RegData}) end end.

+ 26 - 0
src/email.erl

@@ -0,0 +1,26 @@
+-module(email).
+-author('Andrii Zadorozhnii').
+-include_lib("avz/include/avz.hrl").
+-include_lib("n2o/include/wf.hrl").
+-include_lib("kvs/include/users.hrl").
+-compile(export_all).
+-export(?API).
+
+registration_data(Props, email, Ori)->
+  Email = email_prop(Props, email),
+  Ori#user{ id = Email,
+            display_name = Email,
+            email = Email,
+            register_date = now(),
+            status = ok,
+            password = kvs:sha(proplists:get_value(<<"password">>,Props))}.
+
+email_prop(Props, _) -> binary_to_list(proplists:get_value(<<"email">>, Props)).
+
+login_button() -> #button{id=login, class=[btn, "btn-info", "btn-large"], body= <<"Sign in">>, postback={email, loginemail}, source=[user,pass]}.
+event({email,loginemail}) -> avz:login(email, [{<<"email">>, list_to_binary(wf:q(user))}, {<<"password">>, wf:q(pass)}]);
+event(_) -> ok.
+api_event(_,_,_) -> ok.
+callback() -> ok.
+sdk() -> [].
+

+ 7 - 5
src/facebook.erl

@@ -19,17 +19,19 @@ registration_data(Props, facebook, Ori)->
         undefined -> {1, 1, 1970};
         undefined -> {1, 1, 1970};
         BD -> list_to_tuple([list_to_integer(X) || X <- string:tokens(binary_to_list(BD), "/")]) end,
         BD -> list_to_tuple([list_to_integer(X) || X <- string:tokens(binary_to_list(BD), "/")]) end,
     error_logger:info_msg("User Ori: ~p",[Ori]),
     error_logger:info_msg("User Ori: ~p",[Ori]),
-    error_logger:info_msg("Props: ~p",[Props]), 
-    { proplists:get_value(<<"id">>, Props), 
-      Ori#user{ display_name = UserName,
+    error_logger:info_msg("Props: ~p",[Props]),
+    Id = proplists:get_value(<<"id">>, Props),
+    Email = email_prop(Props, facebook),
+    Ori#user{   id = Email,
+                display_name = UserName,
                 avatar = "https://graph.facebook.com/" ++ UserName ++ "/picture",
                 avatar = "https://graph.facebook.com/" ++ UserName ++ "/picture",
-                email = email_prop(Props, facebook_id),
+                email = Email,
                 name = proplists:get_value(<<"first_name">>, Props),
                 name = proplists:get_value(<<"first_name">>, Props),
                 surname = proplists:get_value(<<"last_name">>, Props),
                 surname = proplists:get_value(<<"last_name">>, Props),
                 facebook_id = Id,
                 facebook_id = Id,
                 age = {element(3, BirthDay), element(1, BirthDay), element(2, BirthDay)},
                 age = {element(3, BirthDay), element(1, BirthDay), element(2, BirthDay)},
                 register_date = erlang:now(),
                 register_date = erlang:now(),
-                status = ok }}.
+                status = ok }.
 
 
 email_prop(Props, _) -> binary_to_list(proplists:get_value(<<"email">>, Props)).
 email_prop(Props, _) -> binary_to_list(proplists:get_value(<<"email">>, Props)).
 
 

+ 11 - 9
src/github.erl

@@ -50,15 +50,17 @@ callback() ->
 registration_data(Props, github, Ori) ->
 registration_data(Props, github, Ori) ->
     Id = proplists:get_value(<<"id">>, Props),
     Id = proplists:get_value(<<"id">>, Props),
     Name = proplists:get_value(<<"name">>, Props),
     Name = proplists:get_value(<<"name">>, Props),
-    {Id, Ori#user{  username = binary_to_list(proplists:get_value(<<"login">>, Props)),
-                    display_name = Name,
-                    avatar = proplists:get_value(<<"avatar_url">>, Props),
-                    email = email_prop(Props, github),
-                    name  = Name,
-                    surname = [],
-                    github_id = Id,
-                    register_date = erlang:now(),
-                    status = ok }}.
+    Email = email_prop(Props, github),
+    Ori#user{   id= Email,
+                username = binary_to_list(proplists:get_value(<<"login">>, Props)),
+                display_name = Name,
+                avatar = proplists:get_value(<<"avatar_url">>, Props),
+                email = Email,
+                name  = Name,
+                surname = [],
+                github_id = Id,
+                register_date = erlang:now(),
+                status = ok }.
 
 
 email_prop(Props, github) ->
 email_prop(Props, github) ->
     Mail = proplists:get_value(<<"email">>, Props),
     Mail = proplists:get_value(<<"email">>, Props),

+ 12 - 10
src/google.erl

@@ -16,16 +16,18 @@ registration_data(Props, google, Ori)->
     GivenName = proplists:get_value(<<"givenName">>, Name#struct.lst),
     GivenName = proplists:get_value(<<"givenName">>, Name#struct.lst),
     FamilyName = proplists:get_value(<<"familyName">>, Name#struct.lst),
     FamilyName = proplists:get_value(<<"familyName">>, Name#struct.lst),
     Image = proplists:get_value(<<"image">>, Props),
     Image = proplists:get_value(<<"image">>, Props),
-    {Id, Ori#user{ display_name = proplists:get_value(<<"displayName">>, Props),
-                   avatar = lists:nth(1,string:tokens(
-                       binary_to_list(proplists:get_value(<<"url">>, Image#struct.lst)), "?")),
-                   email = email_prop(Props,google),
-                   name = GivenName,
-                   surname = FamilyName,
-                   googleplus_id = Id,
-                   register_date = erlang:now(),
-                   sex = proplists:get_value(gender, Props),
-                   status = ok }}.
+    Email = email_prop(Props,google),
+    Ori#user{   id = Email,
+                display_name = proplists:get_value(<<"displayName">>, Props),
+                avatar = lists:nth(1,string:tokens(
+                        binary_to_list(proplists:get_value(<<"url">>, Image#struct.lst)), "?")),
+                email = Email,
+                name = GivenName,
+                surname = FamilyName,
+                googleplus_id = Id,
+                register_date = erlang:now(),
+                sex = proplists:get_value(gender, Props),
+                status = ok }.
 
 
 email_prop(Props, _) -> binary_to_list(proplists:get_value(<<"email">>, Props)).
 email_prop(Props, _) -> binary_to_list(proplists:get_value(<<"email">>, Props)).
 
 

+ 10 - 8
src/microsoft.erl

@@ -25,14 +25,16 @@ registration_data(Props, microsoft, Ori)->
     Id = proplists:get_value(<<"id">>, Props),
     Id = proplists:get_value(<<"id">>, Props),
     GivenName = proplists:get_value(<<"first_name">>, Props),
     GivenName = proplists:get_value(<<"first_name">>, Props),
     FamilyName = proplists:get_value(<<"last_name">>, Props),
     FamilyName = proplists:get_value(<<"last_name">>, Props),
-    {Id, Ori#user{ display_name = proplists:get_value(<<"name">>, Props),
-                   email = email_prop(Props,microsoft),
-                   name = GivenName,
-                   surname = FamilyName,
-                   googleplus_id = Id,
-                   register_date = erlang:now(),
-                   sex = proplists:get_value(<<"gender">>, Props),
-                   status = ok }}.
+    Email = email_prop(Props,microsoft),
+    Ori#user{   id = Email,
+                display_name = proplists:get_value(<<"name">>, Props),
+                email = Email,
+                name = GivenName,
+                surname = FamilyName,
+                googleplus_id = Id,
+                register_date = erlang:now(),
+                sex = proplists:get_value(<<"gender">>, Props),
+                status = ok }.
 
 
 email_prop(Props, _) -> binary_to_list(proplists:get_value(<<"id">>, Props)) ++ "@microsoft".
 email_prop(Props, _) -> binary_to_list(proplists:get_value(<<"id">>, Props)) ++ "@microsoft".
 
 

+ 11 - 9
src/twitter.erl

@@ -12,15 +12,17 @@
 registration_data(Props, twitter, Ori)->
 registration_data(Props, twitter, Ori)->
     Id = proplists:get_value(<<"id_str">>, Props),
     Id = proplists:get_value(<<"id_str">>, Props),
     UserName = binary_to_list(proplists:get_value(<<"screen_name">>, Props)),
     UserName = binary_to_list(proplists:get_value(<<"screen_name">>, Props)),
-    {Id, Ori#user{  username = re:replace(UserName, "\\.", "_", [{return, list}]),
-                    display_name = proplists:get_value(<<"screen_name">>, Props),
-                    avatar = proplists:get_value(<<"profile_image_url">>, Props),
-                    name = proplists:get_value(<<"name">>, Props),
-                    email = email_prop(Props,twitter),
-                    surname = [],
-                    twitter_id = Id,
-                    register_date = erlang:now(),
-                    status = ok }}.
+    Email = email_prop(Props,twitter),
+    Ori#user{   id = Email,
+                username = re:replace(UserName, "\\.", "_", [{return, list}]),
+                display_name = proplists:get_value(<<"screen_name">>, Props),
+                avatar = proplists:get_value(<<"profile_image_url">>, Props),
+                name = proplists:get_value(<<"name">>, Props),
+                email = Email,
+                surname = [],
+                twitter_id = Id,
+                register_date = erlang:now(),
+                status = ok }.
 
 
 email_prop(Props, twitter) -> binary_to_list(proplists:get_value(<<"screen_name">>, Props)) ++ "@twitter".
 email_prop(Props, twitter) -> binary_to_list(proplists:get_value(<<"screen_name">>, Props)) ++ "@twitter".