Maxim Sokhatsky 12 years ago
parent
commit
dabb21b2e7
3 changed files with 102 additions and 376 deletions
  1. 0 63
      src/map_reduce.erl
  2. 41 215
      src/membership_packages.erl
  3. 61 98
      src/users.erl

+ 0 - 63
src/map_reduce.erl

@@ -3,69 +3,6 @@
 -include_lib("stdlib/include/qlc.hrl").
 -include_lib("stdlib/include/qlc.hrl").
 -compile(export_all).
 -compile(export_all).
 
 
-get_single_tables(Setting,UId,GameFSM,_Convert, LeftList) ->
-    GetPropList = fun(Key,Setngs) -> 
-                   case Setngs of
-                        undefined -> undefined;
-                        _Else -> proplists:get_value(Key, Setngs)
-                   end end,
-
-    Rounds = GetPropList(rounds, Setting),
-    GameMode = GetPropList(game_mode, Setting),
-    Speed = GetPropList(speed, Setting),
-    Game = GetPropList(game, Setting),
-    PaidOnly = GetPropList(paid_only, Setting),
-    Lucky = false,
-
-    MaxUsers = case GameFSM of
-                   "tavla" ->
-                       case GameMode of standard -> 2; paired -> 10; _ -> 10 end;
-                   "okey" -> 4 end,
-
-    Check = fun(Param,Value) -> 
-                   case Param of
-                        undefined -> true;
-                        _Else -> Param == Value
-                   end end,
-
-    Cursor = fun(Id,FilterFree,FilterUser) ->
-                qlc:cursor(qlc:q([V || {{_,_,_K},_,V={game_table,creator=C,
-                                                   rounds=R, game_type=G,
-                                                   users=U, game_speed=S,
-                                                   game_mode=GM,
-                                                   paid_only = PO,
-                                                   feel_lucky = L}} <- gproc:table(props),
-                           FilterFree(MaxUsers - length(U)),
-                           FilterUser(C,Id),
-                           Check(Game,G),
-                           Check(Speed,S),
-                           Check(GameMode,GM),
-                           Check(Rounds,R),
-                           Check(Lucky, L),
-                           Check(PaidOnly, PO)])
-                )
-    end,
-    OneAvailable   = fun(N) -> N == 1 end,
-    TwoAvailable   = fun(N) -> N == 2 end,
-    ThreeAvailable = fun(N) -> N == 3 end,
-    MoreAvailable  = fun(N) -> N > 3 end,
-    NotAvailable   = fun(N) -> N == 0 end,
-    Others         = fun(IterUser,CurrentUser) -> IterUser =/= CurrentUser end,
-    Own            = fun(IterUser,CurrentUser) -> IterUser == CurrentUser end,
-
-    case LeftList of
-        one_other -> qlc:next_answers(Cursor(UId, OneAvailable, Others), 10);
-        one_own -> qlc:next_answers(Cursor(UId, OneAvailable, Own), 10);
-        two_other -> qlc:next_answers(Cursor(UId, TwoAvailable, Others), 10);
-        two_own -> qlc:next_answers(Cursor(UId, TwoAvailable, Own), 10);
-        three_other -> qlc:next_answers(Cursor(UId, ThreeAvailable, Others), 10);
-        three_own -> qlc:next_answers(Cursor(UId, ThreeAvailable, Own), 10);
-        more_other -> qlc:next_answers(Cursor(UId, MoreAvailable, Others), 10);
-        more_own -> qlc:next_answers(Cursor(UId, MoreAvailable, Own), 10);
-        nomore_other -> qlc:next_answers(Cursor(UId, NotAvailable, Others), 10);
-        nomore_own -> qlc:next_answers(Cursor(UId, NotAvailable, Own), 10)
-    end.
-
 map_reduce(Module, Fun, Args)->
 map_reduce(Module, Fun, Args)->
     lists:flatten([ case rpc:call(Node, Module, Fun, Args) of
     lists:flatten([ case rpc:call(Node, Module, Fun, Args) of
                        {badrpc, _Reason} -> [];
                        {badrpc, _Reason} -> [];

+ 41 - 215
src/membership_packages.erl

@@ -1,60 +1,37 @@
 -module(membership_packages).
 -module(membership_packages).
 -author('Vladimir Baranov <baranoff.vladimir@gmail.com>').
 -author('Vladimir Baranov <baranoff.vladimir@gmail.com>').
--include("membership_packages.hrl").
--include("log.hrl").
--include("accounts.hrl").
+-include_lib("kvs/include/membership_packages.hrl").
+-include_lib("kvs/include/log.hrl").
+-include_lib("kvs/include/accounts.hrl").
 -compile(export_all).
 -compile(export_all).
 
 
 -type package_id() :: integer().
 -type package_id() :: integer().
 -type list_options()::[{payment_type, payment_type()}|{available_for_sale, boolean()}].
 -type list_options()::[{payment_type, payment_type()}|{available_for_sale, boolean()}].
 
 
--spec add_package(#membership_package{})->{ok, Id::package_id()}|{error, Reason::any()}.
 add_package(#membership_package{}=Package)->
 add_package(#membership_package{}=Package)->
     Id = generate_id(),
     Id = generate_id(),
     save_package(Package#membership_package{id = Id}).
     save_package(Package#membership_package{id = Id}).
 
 
--spec get_package(any())-> {ok, #membership_package{}} | {error, Reason::any()}.
 get_package(PackageId)->
 get_package(PackageId)->
     case kvs:get(membership_package, PackageId) of
     case kvs:get(membership_package, PackageId) of
-        {ok, #membership_package{} = Package}->
-            {ok, Package};
-        {error, Reason}->
-            {error, Reason}
-    end.
+        {ok, #membership_package{} = Package}-> {ok, Package};
+        {error, Reason}-> {error, Reason} end.
 
 
--spec list_packages(SelectOptions::list_options())->[#membership_package{}].
 list_packages(Options) ->
 list_packages(Options) ->
-    Predicate =
-        fun(MP = #membership_package{}) ->
-                check_conditions(Options, MP, true)
-        end,
-
+    Predicate = fun(MP = #membership_package{}) -> check_conditions(Options, MP, true) end,
     select(membership_package, Predicate).
     select(membership_package, Predicate).
 
 
--spec list_packages()->[#membership_package{}].
-list_packages()->
-     kvs:all(membership_package).
+list_packages()-> kvs:all(membership_package).
 
 
--spec available_for_sale(package_id(), boolean()) -> ok | {error, any()}.
 available_for_sale(PackageId, State) ->
 available_for_sale(PackageId, State) ->
     case get_package(PackageId) of
     case get_package(PackageId) of
-        {ok, Package} ->
-            case save_package(
-                   Package#membership_package{available_for_sale = State}) of
-                {ok, _} ->
-                    ok;
-                Error ->
-                    Error
-            end;
-        {error, Reason}->
-            {error, Reason}
-    end.
+        {ok, Package} -> case save_package(Package#membership_package{available_for_sale = State}) of
+            {ok, _} -> ok;
+            Error -> Error end;
+        {error, Reason}-> {error, Reason} end.
 
 
--spec add_purchase(#membership_purchase{}) -> {ok, PurchaseId::string()}.
-add_purchase(#membership_purchase{} = MP) ->
-    add_purchase(#membership_purchase{} = MP, undefined, undefined).
+add_purchase(#membership_purchase{} = MP) -> add_purchase(#membership_purchase{} = MP, undefined, undefined).
 
 
--spec add_purchase(#membership_purchase{}, purchase_state(), StateInfo::any()) -> {ok, PurchaseId::string()}.
 add_purchase(#membership_purchase{} = MP, State0, Info) ->
 add_purchase(#membership_purchase{} = MP, State0, Info) ->
     case kvs:get(membership_purchase, MP#membership_purchase.id) of
     case kvs:get(membership_purchase, MP#membership_purchase.id) of
         {ok, _} -> {error, already_bought_that_one};
         {ok, _} -> {error, already_bought_that_one};
@@ -88,16 +65,11 @@ add_purchase(#membership_purchase{} = MP, State0, Info) ->
             store_riak:add_purchase_to_user(Purchase#membership_purchase.user_id, Purchase)
             store_riak:add_purchase_to_user(Purchase#membership_purchase.user_id, Purchase)
     end.
     end.
 
 
--spec get_purchase(string())-> {ok, #membership_purchase{}} | {error, Reason::any()}.
 get_purchase(PurchaseId)->
 get_purchase(PurchaseId)->
     case kvs:get(membership_purchase, PurchaseId) of
     case kvs:get(membership_purchase, PurchaseId) of
-        {ok, #membership_purchase{} = Package}->
-            {ok, Package};
-        {error, Reason}->
-            {error, Reason}
-    end.
+        {ok, #membership_purchase{} = Package}-> {ok, Package};
+        {error, Reason}-> {error, Reason} end.
 
 
--spec set_purchase_state(term(), purchase_state(), term()) -> ok.
 set_purchase_state(MPId, NewState, Info) ->
 set_purchase_state(MPId, NewState, Info) ->
     case kvs:get(membership_purchase, MPId) of 
     case kvs:get(membership_purchase, MPId) of 
       {ok, MP} ->
       {ok, MP} ->
@@ -136,8 +108,6 @@ set_purchase_state(MPId, NewState, Info) ->
     Error -> ?INFO("Can't set purchase state, not yet in db"), Error
     Error -> ?INFO("Can't set purchase state, not yet in db"), Error
     end.
     end.
 
 
-
--spec set_purchase_info(term(), term()) -> ok | {error, not_found}.
 set_purchase_info(MPId, Info) ->
 set_purchase_info(MPId, Info) ->
     {ok, MP} = kvs:get(membership_purchase, MPId),
     {ok, MP} = kvs:get(membership_purchase, MPId),
     kvs:put(MP#membership_purchase{info = Info}).
     kvs:put(MP#membership_purchase{info = Info}).
@@ -145,122 +115,46 @@ set_purchase_info(MPId, Info) ->
 set_purchase_external_id(MPId, ExternalId) ->
 set_purchase_external_id(MPId, ExternalId) ->
     {ok, MP} = kvs:get(membership_purchase, MPId),
     {ok, MP} = kvs:get(membership_purchase, MPId),
     case MP#membership_purchase.external_id of
     case MP#membership_purchase.external_id of
-        ExternalId ->
-            ok;
-        _ ->
-            kvs:put(MP#membership_purchase{external_id = ExternalId})
-    end.
+        ExternalId -> ok;
+        _ -> kvs:put(MP#membership_purchase{external_id = ExternalId}) end.
 
 
--spec create_storage()-> ok.
-create_storage()->
-    %% FIXME: usage of direct mnesia calls
-    ok = store_mnesia:create_table(membership_package,
-                                    record_info(fields, membership_package),
-                                    [{storage, permanent}]),
-    ok = store_mnesia:create_table(membership_purchase,
-                                    record_info(fields, membership_purchase),
-                                    [{storage, permanent}]).
-
--spec list_purchases() -> list(#membership_purchase{}).
-list_purchases() ->
-    kvs:all(membership_purchase).
-
--spec list_purchases(SelectOptions::list()) -> list(#membership_purchase{}).
-list_purchases(SelectOptions) ->
-    Predicate =
-        fun(MP = #membership_purchase{}) ->
-                check_conditions(SelectOptions, MP, true)
-        end,
+list_purchases() -> kvs:all(membership_purchase).
 
 
+list_purchases(SelectOptions) ->
+    Predicate = fun(MP = #membership_purchase{}) -> check_conditions(SelectOptions, MP, true) end,
     select(membership_purchase, Predicate).
     select(membership_purchase, Predicate).
 
 
--spec purchase_id() -> string().
 purchase_id() ->
 purchase_id() ->
-    %% get next generated id for membership purchase
     NextId = kvs:next_id("membership_purchase"),
     NextId = kvs:next_id("membership_purchase"),
     lists:concat([timestamp(), "_", NextId]).
     lists:concat([timestamp(), "_", NextId]).
 
 
-
-%% FIXME: temporary! Delete in production.
--spec add_sample_data()-> [ok|{error, any()}].
 add_sample_data()->
 add_sample_data()->
-    SamplePackages = [#membership_package{
-                         no = 1,
-                         amount = 7,
-                         deducted_for_gifts = 0,
-                         quota = 7,
-                         net_membership = 7},
-     #membership_package{
-                         no = 2,
-                         amount = 12,
-                         deducted_for_gifts = 5,
-                         quota = 15,
-                         net_membership = 7},
-     #membership_package{
-                         no = 3,
-                         amount = 12,
-                         deducted_for_gifts = 0,
-                         quota = 15,
-                         net_membership = 12},
-     #membership_package{
-                         no = 4,
-                         amount = 25,
-                         deducted_for_gifts = 10,
-                         quota = 30,
-                         net_membership = 15},
-     #membership_package{
-                         no = 5,
-                         amount = 30,
-                         deducted_for_gifts = 0,
-                         quota = 60,
-                         net_membership = 30},
-     #membership_package{
-                         no = 6,
-                         amount = 50,
-                         deducted_for_gifts = 20,
-                         quota = 60,
-                         net_membership = 30},
-     #membership_package{
-                         no = 7,
-                         amount = 50,
-                         deducted_for_gifts = 0,
-                         quota = 90,
-                         net_membership = 50},
-     #membership_package{
-                         no = 8,
-                         amount = 100,
-                         deducted_for_gifts = 40,
-                         quota = 120,
-                         net_membership = 60}],
-
-    WithPaymentTypes =
-        [Package#membership_package{id = generate_id(),
-                                    payment_type=Payment} ||
+    SamplePackages = [
+    #membership_package{no = 1, amount = 7,   deducted_for_gifts = 0,  quota = 7,   net_membership = 7},
+    #membership_package{no = 2, amount = 12,  deducted_for_gifts = 5,  quota = 15,  net_membership = 7},
+    #membership_package{no = 3, amount = 12,  deducted_for_gifts = 0,  quota = 15,  net_membership = 12},
+    #membership_package{no = 4, amount = 25,  deducted_for_gifts = 10, quota = 30,  net_membership = 15},
+    #membership_package{no = 5, amount = 30,  deducted_for_gifts = 0,  quota = 60,  net_membership = 30},
+    #membership_package{no = 6, amount = 50,  deducted_for_gifts = 20, quota = 60,  net_membership = 30},
+    #membership_package{no = 7, amount = 50,  deducted_for_gifts = 0,  quota = 90,  net_membership = 50},
+    #membership_package{no = 8, amount = 100, deducted_for_gifts = 40, quota = 120, net_membership = 60}],
+    WithPaymentTypes = [
+        Package#membership_package{id = generate_id(), payment_type=Payment} ||
             Payment <- [facebook, credit_card, wire_transfer, paypal, mobile],
             Payment <- [facebook, credit_card, wire_transfer, paypal, mobile],
             Package <- SamplePackages],
             Package <- SamplePackages],
-
-	%%make all packages enable for sale
-    Enabled = [P#membership_package{available_for_sale = true} ||
-                  P <- WithPaymentTypes],
-
+    Enabled = [P#membership_package{available_for_sale = true} || P <- WithPaymentTypes],
     kvs:put(Enabled).
     kvs:put(Enabled).
 
 
 generate_id()->
 generate_id()->
     Id = kvs:next_id("membership_package"),
     Id = kvs:next_id("membership_package"),
     integer_to_list(Id).
     integer_to_list(Id).
 
 
-%% return default value if value match Undefined spec
 default_if_undefined(Value, Undefined, Default) ->
 default_if_undefined(Value, Undefined, Default) ->
     case Value of
     case Value of
-        Undefined ->
-            Default;
-        _ ->
-            Value
-    end.
+        Undefined -> Default;
+        _ -> Value end.
 
 
-%% charge user account with kakush and quota.
 charge_user_account(MP) ->
 charge_user_account(MP) ->
-    %% Charge user account
     OrderId = MP#membership_purchase.id,
     OrderId = MP#membership_purchase.id,
     Package = MP#membership_purchase.membership_package,
     Package = MP#membership_purchase.membership_package,
     Kakush = Package#membership_package.deducted_for_gifts,
     Kakush = Package#membership_package.deducted_for_gifts,
@@ -281,92 +175,24 @@ charge_user_account(MP) ->
                    [UserId, OrderId, E])
                    [UserId, OrderId, E])
     end.
     end.
 
 
-
-%% get all records from database, filter them with predicate.
-%% FIXME: temporary hack to provide mnesias select functionality with riak
 select(RecordType, Predicate) ->
 select(RecordType, Predicate) ->
     All = kvs:all(RecordType),
     All = kvs:all(RecordType),
-	lists:filter(Predicate, All).
-
+    lists:filter(Predicate, All).
 
 
 save_package(Package) ->
 save_package(Package) ->
     case kvs:put([Package]) of
     case kvs:put([Package]) of
-        ok ->
-            {ok, Package#membership_package.id};
-        {error, Reason}->
-            {error, Reason}
-    end.
+        ok -> {ok, Package#membership_package.id};
+        {error, Reason}-> {error, Reason} end.
 
 
 timestamp()->
 timestamp()->
     {Y, Mn, D} = erlang:date(),
     {Y, Mn, D} = erlang:date(),
     {H, M, S} = erlang:time(),
     {H, M, S} = erlang:time(),
-    lists:flatten(
-      io_lib:format("~b~2..0b~2..0b_~2..0b~2..0b~2..0b", [Y, Mn, D, H, M, S])).
+    lists:flatten(io_lib:format("~b~2..0b~2..0b_~2..0b~2..0b~2..0b", [Y, Mn, D, H, M, S])).
 
 
-%% Packages conditions
 check_conditions(_, _, false) -> false;
 check_conditions(_, _, false) -> false;
-check_conditions([{available_for_sale, AS}|T],
-                 MP = #membership_package{available_for_sale = AS1}, _) ->
-    check_conditions(T, MP, AS == AS1);
-check_conditions([{payment_type, PT}|T],
-                 MP = #membership_package{payment_type = PT1}, _) ->
-    check_conditions(T, MP, PT == PT1);
-
-%%TODO: Add purchase conditions
+check_conditions([{available_for_sale, AS}|T], MP = #membership_package{available_for_sale = AS1}, _) -> check_conditions(T, MP, AS == AS1);
+check_conditions([{payment_type, PT}|T], MP = #membership_package{payment_type = PT1}, _) -> check_conditions(T, MP, PT == PT1);
 check_conditions([], _, true) -> true.
 check_conditions([], _, true) -> true.
 
 
-%% @private
-delete_package(PackageId) ->
-    kvs:delete(membership_package, PackageId).
-
-setup() ->
-    % Uncomment to run tests with dbg:
-    % dbg:tracer(),
-    % dbg:p(all, call),
-    % dbg:tpl(membership_packages, []),
-    TestPackages =
-        [#membership_package{no=1,
-                             payment_type=test_payment_x,
-                             amount = 100,
-                             deducted_for_gifts = 5,
-                             quota = 300,
-                             net_membership = 7,
-                             available_for_sale = true
-                            },
-         #membership_package{no=2,
-                             payment_type=test_payment_y,
-                             amount = 100,
-                             deducted_for_gifts = 5,
-                             quota = 300,
-                             net_membership = 7
-                            },
-         #membership_package{no=3,
-                             payment_type=test_payment_y,
-                             amount = 100,
-                             deducted_for_gifts = 5,
-                             quota = 300,
-                             net_membership = 7
-                            }],
-
-     [Id || {ok, Id} <-
-                [{ok, _} = ?MODULE:add_package(Package) || Package <- TestPackages]].
-
-cleanup(Ids) ->
-    [ok = delete_package(PackageId) || PackageId <- Ids].
-
-get_monthly_purchase_limit() ->
-    MostExpencivePackageWorth = lists:max([P#membership_package.amount || P <- kvs:all(membership_package), P#membership_package.available_for_sale]),
-    ?MP_MONTHLY_LIMIT_MULTIPLIER * MostExpencivePackageWorth.
-
-check_limit_over(UId, PackageId) ->
-    Limit = ?MP_MONTHLY_LIMIT_MULTIPLIER, %get_monthly_purchase_limit(),
-    {ok, Package} = membership_packages:get_package(PackageId),
-    PackagePrice = Package#membership_package.amount,
-    {{CurYear, CurMonth, _}, _} = calendar:now_to_datetime(now()),
-    UserMonthlyPurchases = [begin
-        {{Year, Month, _}, _} = calendar:now_to_datetime(P#membership_purchase.start_time),
-        {Year, Month, P}
-    end || P <- kvs:purchases(UId)],
-    ThisMonthPurchases = [P || {Y, M, P} <- UserMonthlyPurchases, Y == CurYear, M == CurMonth],
-    ThisMonthTotal = lists:sum([(P#membership_purchase.membership_package)#membership_package.amount || P <- ThisMonthPurchases]),
-    (ThisMonthTotal + PackagePrice) > Limit.
+delete_package(PackageId) -> kvs:delete(membership_package, PackageId).
+

+ 61 - 98
src/users.erl

@@ -39,7 +39,7 @@ process_register(#user{username=U} = RegisterData0) ->
     accounts:create_account(U),
     accounts:create_account(U),
     {ok, DefaultQuota} = kvs:get(config, "accounts/default_quota",  300),
     {ok, DefaultQuota} = kvs:get(config, "accounts/default_quota",  300),
     accounts:transaction(U, quota, DefaultQuota, #tx_default_assignment{}),
     accounts:transaction(U, quota, DefaultQuota, #tx_default_assignment{}),
-    init_mq(U, []),
+    init_mq(U),
     {ok, U}.
     {ok, U}.
 
 
 check_username(Name, FbId) ->
 check_username(Name, FbId) ->
@@ -66,17 +66,14 @@ get({email, Email}) -> kvs:user_by_email(Email);
 get(UId) -> kvs:get(user, UId).
 get(UId) -> kvs:get(user, UId).
 
 
 subscribe(Who, Whom) ->
 subscribe(Who, Whom) ->
-    case is_user_blocked(Who, Whom) of
-        false -> Record = #subscription{key={Who,Whom}, who = Who, whom = Whom},
-                 kvs:put(Record),
-                 subscribe_user_mq(user, Who, Whom);
-        true  -> do_nothing
-    end.
+    Record = #subscription{key={Who,Whom}, who = Who, whom = Whom},
+    kvs:put(Record),
+    subscription_mq(user, add, Who, Whom).
 
 
 unsubscribe(Who, Whom) ->
 unsubscribe(Who, Whom) ->
     case subscribed(Who, Whom) of
     case subscribed(Who, Whom) of
         true  -> kvs:delete(subscription, {Who, Whom}),
         true  -> kvs:delete(subscription, {Who, Whom}),
-                 remove_subscription_mq(user, Who, Whom);
+                 subscription_mq(user, remove, Who, Whom);
         false -> skip end.
         false -> skip end.
 
 
 subscriptions(undefined)-> [];
 subscriptions(undefined)-> [];
@@ -88,26 +85,6 @@ subscribed(Who, Whom) ->
         {ok, _} -> true;
         {ok, _} -> true;
         _ -> false end.
         _ -> false end.
 
 
-block(Who, Whom) ->
-    ?INFO("~w:block_user/2 Who=~p Whom=~p", [?MODULE, Who, Whom]),
-    unsubscribe(Who, Whom),
-    kvs:block_user(Who, Whom),
-    nsx_msg:notify_user_block(Who, Whom).
-
-unblock(Who, Whom) ->
-    ?INFO("~w:unblock_user/2 Who=~p Whom=~p", [?MODULE, Who, Whom]),
-    kvs:unblock_user(Who, Whom),
-    nsx_msg:notify_user_unblock(Who, Whom).
-
-blocked_users(UserId) -> kvs:list_blocks(UserId).
-
-get_blocked_users_feed_id(UserId) ->
-    UsersId = kvs:list_blocks(UserId),
-    Users = kvs:select(user, fun(#user{username=U})-> lists:member(U, UsersId) end),
-    {UsersId, [Fid || #user{feed=Fid} <- Users]}.
-
-is_user_blocked(Who, Whom) -> kvs:is_user_blocked(Who,Whom).
-
 update_user(#user{username=UId,name=Name,surname=Surname} = NewUser) ->
 update_user(#user{username=UId,name=Name,surname=Surname} = NewUser) ->
     OldUser = case kvs:get(user,UId) of
     OldUser = case kvs:get(user,UId) of
         {error,notfound} -> NewUser;
         {error,notfound} -> NewUser;
@@ -119,9 +96,7 @@ update_user(#user{username=UId,name=Name,surname=Surname} = NewUser) ->
         false -> kvs:update_user_name(UId,Name,Surname)
         false -> kvs:update_user_name(UId,Name,Surname)
     end.
     end.
 
 
-subscribe_user_mq(Type, MeId, ToId) -> process_subscription_mq(Type, add, MeId, ToId).
-remove_subscription_mq(Type, MeId, ToId) -> process_subscription_mq(Type, delete, MeId, ToId).
-process_subscription_mq(Type, Action, MeId, ToId) ->
+subscription_mq(Type, Action, MeId, ToId) ->
     {ok, Channel} = mqs:open([]),
     {ok, Channel} = mqs:open([]),
     Routes = case Type of
     Routes = case Type of
                  user -> rk_user_feed(ToId);
                  user -> rk_user_feed(ToId);
@@ -129,11 +104,12 @@ process_subscription_mq(Type, Action, MeId, ToId) ->
              end,
              end,
     case Action of
     case Action of
         add -> bind_user_exchange(Channel, MeId, Routes);
         add -> bind_user_exchange(Channel, MeId, Routes);
-        delete -> catch(unbind_user_exchange(Channel, MeId, Routes))
+        remove -> unbind_user_exchange(Channel, MeId, Routes)
     end,
     end,
     mqs_channel:close(Channel).
     mqs_channel:close(Channel).
 
 
-init_mq(User, Groups) ->
+init_mq(User=#user{}) ->
+    Groups = groups:list_groups_per_user(User),
     ?INFO("~p init mq. users: ~p", [User, Groups]),
     ?INFO("~p init mq. users: ~p", [User, Groups]),
     UserExchange = ?USER_EXCHANGE(User),
     UserExchange = ?USER_EXCHANGE(User),
     ExchangeOptions = [{type, <<"fanout">>}, durable, {auto_delete, false}],
     ExchangeOptions = [{type, <<"fanout">>}, durable, {auto_delete, false}],
@@ -141,83 +117,70 @@ init_mq(User, Groups) ->
     ?INFO("Cration Exchange: ~p,",[{Channel,UserExchange,ExchangeOptions}]),
     ?INFO("Cration Exchange: ~p,",[{Channel,UserExchange,ExchangeOptions}]),
     mqs_channel:create_exchange(Channel, UserExchange, ExchangeOptions), ?INFO("Created OK"),
     mqs_channel:create_exchange(Channel, UserExchange, ExchangeOptions), ?INFO("Created OK"),
     Relations = build_user_relations(User, Groups),
     Relations = build_user_relations(User, Groups),
-    [bind_user_exchange(Channel, User, RK) || RK <- [rk([feed, delete, User])|Relations]],
-    mqs_channel:close(Channel),
-    ok.
-
-init_mq_for_user(User) -> init_mq(User, groups:list_groups_per_user(User) ).
-
-build_user_relations(User, Groups) ->
-    %% Feed Keys. Subscribe for self events, system and groups events
-    %% feed.FeedOwnerType.FeedOwnerId.ElementType.ElementId.Action
-    %% feed.system.ElementType.Action
-    [rk_user_feed(User),
-     rk( [db, user, User, put] ),
-     rk( [subscription, user, User, add_to_group]),
-     rk( [subscription, user, User, remove_from_group]),
-     rk( [subscription, user, User, leave_group]),
-     rk( [login, user, User, update_after_login]),
-     rk( [likes, user, User, add_like]),
-     rk( [personal_score, user, User, add]),
-     rk( [feed, user, User, count_entry_in_statistics] ),
-     rk( [feed, user, User, count_comment_in_statistics] ),
-     rk( [feed, user, User, post_note] ),
-     rk( [subscription, user, User, subscribe_user]),
-     rk( [subscription, user, User, remove_subscribe]),
-     rk( [subscription, user, User, set_user_game_status]),
-     rk( [subscription, user, User, update_user]),
-     rk( [subscription, user, User, block_user]),
-     rk( [subscription, user, User, unblock_user]),
-     rk( [affiliates, user, User, create_affiliate]),
-     rk( [affiliates, user, User, delete_affiliate]),
-     rk( [affiliates, user, User, enable_to_look_details]),
-     rk( [affiliates, user, User, disable_to_look_details]),
-     rk( [purchase, user, User, set_purchase_external_id]),
-     rk( [purchase, user, User, set_purchase_state]),
-     rk( [purchase, user, User, set_purchase_info]),
-     rk( [purchase, user, User, add_purchase]),
-     rk( [transaction, user, User, add_transaction]),
-     rk( [invite, user, User, add_invite_to_issuer]),
-     rk( [tournaments, user, User, create]),
-     rk( [tournaments, user, User, create_and_join]),
-     rk( [gifts, user, User, buy_gift]),
-     rk( [gifts, user, User, give_gift]),
-     rk( [gifts, user, User, mark_gift_as_deliving]),
-     rk( [feed, system, '*', '*']) |
-     [rk_group_feed(G) || G <- Groups]].
+    [bind_user_exchange(Channel, User, RK) || RK <- Relations],
+    mqs_channel:close(Channel);
 
 
-bind_user_exchange(Channel, User, RoutingKey) -> {bind, RoutingKey, mqs_channel:bind_exchange(Channel, ?USER_EXCHANGE(User), ?NOTIFICATIONS_EX, RoutingKey)}.
-unbind_user_exchange(Channel, User, RoutingKey) -> {unbind, RoutingKey, mqs_channel:unbind_exchange(Channel, ?USER_EXCHANGE(User), ?NOTIFICATIONS_EX, RoutingKey)}.
-bind_group_exchange(Channel, Group, RoutingKey) -> {bind, RoutingKey, mqs_channel:bind_exchange(Channel, ?GROUP_EXCHANGE(Group), ?NOTIFICATIONS_EX, RoutingKey)}.
-unbind_group_exchange(Channel, Group, RoutingKey) -> {unbind, RoutingKey, mqs_channel:unbind_exchange(Channel, ?GROUP_EXCHANGE(Group), ?NOTIFICATIONS_EX, RoutingKey)}.
-
-init_mq_for_group(Group) ->
+init_mq(Group=#group{}) ->
     GroupExchange = ?GROUP_EXCHANGE(Group),
     GroupExchange = ?GROUP_EXCHANGE(Group),
-    ExchangeOptions = [{type, <<"fanout">>},
-                       durable,
-                       {auto_delete, false}],   
+    ExchangeOptions = [{type, <<"fanout">>}, durable, {auto_delete, false}],
     {ok, Channel} = mqs:open([]),
     {ok, Channel} = mqs:open([]),
     ok = mqs_channel:create_exchange(Channel, GroupExchange, ExchangeOptions),
     ok = mqs_channel:create_exchange(Channel, GroupExchange, ExchangeOptions),
     Relations = build_group_relations(Group),
     Relations = build_group_relations(Group),
     [bind_group_exchange(Channel, Group, RK) || RK <- Relations],
     [bind_group_exchange(Channel, Group, RK) || RK <- Relations],
-    mqs_channel:close(Channel),
-    ok.
-
-build_group_relations(Group) ->
-    [
-        rk( [db, group, Group, put] ),
-        rk( [db, group, Group, update_group] ),
-        rk( [db, group, Group, remove_group] ),
-        rk( [likes, group, Group, add_like]),   % for comet mostly
-        rk( [feed, delete, Group] ),
-        rk( [feed, group, Group, '*', '*', '*'] )
+    mqs_channel:close(Channel).
+
+build_user_relations(User, Groups) -> [
+    rk( [db, user, User, put] ),
+    rk( [subscription, user, User, add_to_group]),
+    rk( [subscription, user, User, remove_from_group]),
+    rk( [subscription, user, User, leave_group]),
+    rk( [login, user, User, update_after_login]),
+    rk( [likes, user, User, add_like]),
+    rk( [feed, delete, User]),
+    rk( [feed, user, User, '*', '*', '*']),
+    rk( [feed, user, User, count_entry_in_statistics] ),
+    rk( [feed, user, User, count_comment_in_statistics] ),
+    rk( [feed, user, User, post_note] ),
+    rk( [subscription, user, User, subscribe_user]),
+    rk( [subscription, user, User, remove_subscribe]),
+    rk( [subscription, user, User, set_user_game_status]),
+    rk( [subscription, user, User, update_user]),
+    rk( [subscription, user, User, block_user]),
+    rk( [subscription, user, User, unblock_user]),
+    rk( [payment, user, User, set_purchase_external_id]),
+    rk( [payment, user, User, set_purchase_state]),
+    rk( [payment, user, User, set_purchase_info]),
+    rk( [payment, user, User, add]),
+    rk( [transaction, user, User, add]),
+    rk( [invite, user, User, add]),
+    rk( [meeting, user, User, create]),
+    rk( [meeting, user, User, join]),
+    rk( [purchase, user, User, buy_gift]),
+    rk( [purchase, user, User, give_gift]),
+    rk( [purchase, user, User, mark_gift_as_deliving]),
+    rk( [feed, system, '*', '*']) |
+    [rk_group_feed(G) || G <- Groups]
     ].
     ].
 
 
+build_group_relations(Group) -> [
+    rk( [db, group, Group, put] ),
+    rk( [db, group, Group, update_group] ),
+    rk( [db, group, Group, remove_group] ),
+    rk( [likes, group, Group, add_like]),   % for comet mostly
+    rk( [feed, delete, Group] ),
+    rk( [feed, group, Group, '*', '*', '*'] )
+    ].
 
 
-rk(List) -> mqs_lib:list_to_key(List).
 rk_user_feed(User) -> rk([feed, user, User, '*', '*', '*']).
 rk_user_feed(User) -> rk([feed, user, User, '*', '*', '*']).
 rk_group_feed(Group) -> rk([feed, group, Group, '*', '*', '*']).
 rk_group_feed(Group) -> rk([feed, group, Group, '*', '*', '*']).
 
 
+bind_user_exchange(Channel, User, RoutingKey) -> {bind, RoutingKey, mqs_channel:bind_exchange(Channel, ?USER_EXCHANGE(User), ?NOTIFICATIONS_EX, RoutingKey)}.
+unbind_user_exchange(Channel, User, RoutingKey) -> {unbind, RoutingKey, mqs_channel:unbind_exchange(Channel, ?USER_EXCHANGE(User), ?NOTIFICATIONS_EX, RoutingKey)}.
+bind_group_exchange(Channel, Group, RoutingKey) -> {bind, RoutingKey, mqs_channel:bind_exchange(Channel, ?GROUP_EXCHANGE(Group), ?NOTIFICATIONS_EX, RoutingKey)}.
+unbind_group_exchange(Channel, Group, RoutingKey) -> {unbind, RoutingKey, mqs_channel:unbind_exchange(Channel, ?GROUP_EXCHANGE(Group), ?NOTIFICATIONS_EX, RoutingKey)}.
+
+rk(List) -> mqs_lib:list_to_key(List).
+
 retrieve_connections(Id,Type) ->
 retrieve_connections(Id,Type) ->
     Friends = case Type of 
     Friends = case Type of 
                   user -> users:list_subscr_usernames(Id);
                   user -> users:list_subscr_usernames(Id);