Browse Source

Merge pull request #11 from fycth/master

Bugfixes
Namdak Tonpa 10 years ago
parent
commit
c4a282badb
9 changed files with 54 additions and 26 deletions
  1. 2 0
      .gitignore
  2. 6 3
      src/avz.erl
  3. 21 0
      src/avz_userhelper.erl
  4. 1 1
      src/email.erl
  5. 16 14
      src/facebook.erl
  6. 2 2
      src/github.erl
  7. 3 3
      src/google.erl
  8. 1 1
      src/microsoft.erl
  9. 2 2
      src/twitter.erl

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+ebin
+

+ 6 - 3
src/avz.erl

@@ -13,7 +13,10 @@ event(init) -> [];
 event(logout) -> wf:user(undefined), wf:redirect(?LOGIN_PAGE);
 event(to_login) -> wf:redirect(?LOGIN_PAGE);
 event({register, #user{}=U}) -> kvs:add(U), login_user(U); % sample
-event({login, #user{}=U}) -> login_user(U);                % sample
+event({login, #user{}=U, N}) ->
+    Updated = avz_userhelper:updateUser(U,N),
+    kvs:put(Updated),
+    login_user(Updated);                % sample
 event({Method,Event}) -> Method:event({Method,Event});
 event(Ev) ->  error_logger:info_msg("Page Event ~p",[Ev]).
 
@@ -23,13 +26,13 @@ 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]).
 
 login_user(User) -> wf:user(User), wf:redirect(?AFTER_LOGIN).
-login(Key, [{error, E}|_Rest])-> error_logger:info_msg("oauth error: ~p", [E]);
+login(_Key, [{error, E}|_Rest])-> error_logger:info_msg("oauth error: ~p", [E]);
 login(Key, Args) ->
     wf:info("AVZ MODULE: ~p",[?CTX#cx.module]),
     case kvs:get(user,Key:email_prop(Args,Key)) of
         {ok,Existed} ->
             RegData = Key:registration_data(Args, Key, Existed),
-            (?CTX#cx.module):event({login, RegData});
+            (?CTX#cx.module):event({login, Existed, RegData});
         {error,_} ->
             RegData = Key:registration_data(Args, Key, #user{}),
             (?CTX#cx.module):event({register, RegData});

+ 21 - 0
src/avz_userhelper.erl

@@ -0,0 +1,21 @@
+-module(avz_userhelper).
+-export([updateProplist/2,updateUser/2]).
+
+-include_lib("kvs/include/user.hrl").
+
+updateProplist({K,V},P) ->
+    Prop = case P of undefined -> []; _P -> _P end,
+    case proplists:get_value(K,Prop) of
+        undefined -> [{K,V} | Prop];
+	        _ -> lists:keyreplace(K,1,Prop,{K,V})
+    end.
+
+updateUser(E,N) ->
+    Username = case E#user.username of undefined -> N#user.username; _ -> E#user.username end,
+    Tokens = N#user.tokens,
+    Images = N#user.images,
+    Names = case E#user.names of undefined -> N#user.names; _ -> E#user.names end,
+    Surnames = case E#user.surnames of undefined -> N#user.surnames; _ -> E#user.surnames end,
+    Birth = case E#user.birth of undefined -> N#user.birth; _ -> E#user.birth end,
+    Sex = case E#user.sex of undefined -> N#user.sex; _ -> E#user.sex end,
+    E#user{username=Username,tokens=Tokens,images=Images,names=Names,surnames=Surnames,birth=Birth,sex=Sex}.

+ 1 - 1
src/email.erl

@@ -12,7 +12,7 @@ registration_data(Props, email, Ori)->
             display_name = Email,
             email = Email,
             register_date = now(),
-            tokens = [{email,Email}|Ori#user.tokens],
+            tokens = avz_userhelper:updateProplist({email,Email},Ori#user.tokens),
             status = ok,
             password = kvs:sha(proplists:get_value(<<"password">>,Props))}.
 

+ 16 - 14
src/facebook.erl

@@ -1,16 +1,20 @@
 -module(facebook).
 -author('Andrii Zadorozhnii').
+
 -include_lib("avz/include/avz.hrl").
 -include_lib("n2o/include/wf.hrl").
 -include_lib("kvs/include/user.hrl").
+
 -compile(export_all).
 -export(?API).
+
 -define(HTTP_ADDRESS, case application:get_env(web, http_address) of {ok, A} -> A; _ -> "" end).
 -define(FB_APP_ID, case application:get_env(web, fb_id) of {ok, Id} -> Id; _-> "" end).
 -define(FB_BTN_CLASS, case application:get_env(web, fb_btn_class) of {ok, C} -> C; _ -> "btn-primary btn-large btn-lg" end).
+-define(FB_BTN_BODY, case application:get_env(wen,fb_btn_body) of {ok, _FBBTNBODY} -> _FBBTNBODY; _ -> [#i{class=[fa,"fa-facebook","fa-lg","icon-facebook","icon-large"]}, <<"Facebook">>] end).
 
 callback() -> ok.
-event({facebook,Event}) -> wf:wire("fb_login();"), ok.
+event({facebook,_Event}) -> wf:wire("fb_login();"), ok.
 api_event(fbLogin, Args, _Term)-> JSArgs = n2o_json:decode(Args), avz:login(facebook, JSArgs#struct.lst).
 
 registration_data(Props, facebook, Ori)->
@@ -18,33 +22,31 @@ registration_data(Props, facebook, Ori)->
     BirthDay = case proplists:get_value(<<"birthday">>, Props) of
         undefined -> {1, 1, 1970};
         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("Props: ~p",[Props]),
+%    error_logger:info_msg("User Ori: ~p",[Ori]),
+%    error_logger:info_msg("Props: ~p",[Props]),
     Email = email_prop(Props, facebook),
-    [UserName|_] = string:tokens(binary_to_list(Email),"@"), Cover = case proplists:get_value(<<"cover">>,Props) of undefined -> ""; P -> case proplists:get_value(<<"source">>,P#struct.lst) of undefined -> ""; C -> binary_to_list(C) end end,
+    [UserName|_] = string:tokens(binary_to_list(Email),"@"),
+    Cover = case proplists:get_value(<<"cover">>,Props) of undefined -> ""; P -> case proplists:get_value(<<"source">>,P#struct.lst) of undefined -> ""; C -> binary_to_list(C) end end,
     Ori#user{   id = Email,
                 display_name = UserName,
-                images = [{fb_avatar,"https://graph.facebook.com/" ++ binary_to_list(Id) ++ "/picture?type=large"},{fb_cover,Cover}|Ori#user.images],
+                images = avz_userhelper:updateProplist({fb_cover,Cover},avz_userhelper:updateProplist({fb_avatar,"https://graph.facebook.com/" ++ binary_to_list(Id) ++ "/picture?type=large"},Ori#user.images)),
                 email = Email,
                 names = proplists:get_value(<<"first_name">>, Props),
                 surnames = proplists:get_value(<<"last_name">>, Props),
-                tokens = [{facebook,Id}|Ori#user.tokens],
+                tokens = avz_userhelper:updateProplist({facebook,Id},Ori#user.tokens),
                 birth = {element(3, BirthDay), element(1, BirthDay), element(2, BirthDay)},
                 register_date = erlang:now(),
                 status = ok }.
 
-email_prop(Props, _) -> proplists:get_value(<<"email">>, Props).
+email_prop(Props, _) ->
+    proplists:get_value(<<"email">>, Props).
 
-login_button() -> #panel{class=["btn-group"], body=
-    #link{id=loginfb, class=[btn, ?FB_BTN_CLASS],
-        body=[#i{class=[fa,"fa-facebook","fa-lg","icon-facebook","icon-large"]}, <<"Facebook">>],
-           postback={facebook,loginClick}
-%    actions = "$('#loginfb').on('click', fb_login);"
-             }}.
+login_button() ->
+    #panel{class=["btn-group"], body=#link{id=loginfb, class=[btn, ?FB_BTN_CLASS],body=?FB_BTN_BODY, postback={facebook,loginClick} }}.
 
 sdk() ->
     wf:wire(#api{name=setFbIframe, tag=fb}),
     wf:wire(#api{name=fbAutoLogin, tag=fb}),
     wf:wire(#api{name=fbLogin, tag=fb}),
-  [ #dtl{bind_script=false, file="facebook_sdk", ext="dtl", folder="priv/static/js",
+    [ #dtl{bind_script=false, file="facebook_sdk", ext="dtl", folder="priv/static/js",
         bindings=[{appid, ?FB_APP_ID},{channelUrl, ?HTTP_ADDRESS ++ "/static/channel.html"} ] } ].

+ 2 - 2
src/github.erl

@@ -54,11 +54,11 @@ registration_data(Props, github, Ori) ->
     Ori#user{   id= Email,
                 username = binary_to_list(proplists:get_value(<<"login">>, Props)),
                 display_name = Name,
-                images = [{gh_avatar,proplists:get_value(<<"avatar_url">>, Props)}|Ori#user.images],
+                images = avz_userhelper:updateProplist({gh_avatar,proplists:get_value(<<"avatar_url">>, Props)},Ori#user.images),
                 email = Email,
                 names  = Name,
                 surnames = [],
-                tokens = [{github,Id}|Ori#user.tokens],
+                tokens = avz_userhelper:updateProplist({github,Id},Ori#user.tokens),
                 register_date = erlang:now(),
                 status = ok }.
 

+ 3 - 3
src/google.erl

@@ -16,14 +16,14 @@ registration_data(Props, google, Ori)->
     Image = proplists:get_value(<<"picture">>, Props),
     GivenName = proplists:get_value(<<"given_name">>, Props),
     FamilyName = proplists:get_value(<<"family_name">>, Props),
-    Email = proplists:get_value(<<"email">>,Props),
+    Email = email_prop(Props,google),
     Ori#user{   id = Email,
                 display_name = proplists:get_value(<<"displayName">>, Props),
-                images = [{google_avatar,Image}|Ori#user.images],
+                images = avz_userhelper:updateProplist({google_avatar,Image},Ori#user.images),
                 email = Email,
                 names = GivenName,
                 surnames = FamilyName,
-                tokens = [{google,Id}|Ori#user.tokens],
+                tokens = avz_userhelper:updateProplist({google,Id},Ori#user.tokens),
                 register_date = erlang:now(),
                 sex = proplists:get_value(<<"gender">>, Props),
                 status = ok }.

+ 1 - 1
src/microsoft.erl

@@ -31,7 +31,7 @@ registration_data(Props, microsoft, Ori)->
                 email = Email,
                 names = GivenName,
                 surnames = FamilyName,
-                tokens = [{microsoft,Id}|Ori#user.tokens],
+                tokens = avz_userhelper:updateProplist({microsoft,Id},Ori#user.tokens),
                 register_date = erlang:now(),
                 sex = proplists:get_value(<<"gender">>, Props),
                 status = ok }.

+ 2 - 2
src/twitter.erl

@@ -16,11 +16,11 @@ registration_data(Props, twitter, Ori)->
     Ori#user{   id = Email,
                 username = re:replace(UserName, "\\.", "_", [{return, list}]),
                 display_name = proplists:get_value(<<"screen_name">>, Props),
-                images = [{tw_avatar,proplists:get_value(<<"profile_image_url">>, Props)}|Ori#user.images],
+                images = avz_userhelper:updateProplist({tw_avatar,proplists:get_value(<<"profile_image_url">>, Props)},Ori#user.images),
                 names = proplists:get_value(<<"name">>, Props),
                 email = Email,
                 surnames = [],
-                tokens = [{twitter,Id}|Ori#user.tokens],
+                tokens = avz_userhelper:updateProplist({twitter,Id},Ori#user.tokens),
                 register_date = erlang:now(),
                 status = ok }.