groups.erl 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. -module(groups).
  2. -compile(export_all).
  3. -include_lib("kvs/include/users.hrl").
  4. -include_lib("kvs/include/groups.hrl").
  5. -include_lib("kvs/include/feeds.hrl").
  6. -include_lib("kvs/include/log.hrl").
  7. retrieve_groups(User) ->
  8. ?INFO("retrieve_groups: ~p",[User]),
  9. case participate(User) of
  10. [] -> [];
  11. Gs -> UC_GId = lists:sublist(lists:reverse(
  12. lists:sort([{group_members_count(GId), GId} || GId <- Gs])),
  13. 20),
  14. Result = [begin case get_group(GId) of
  15. {ok, Group} -> {Group#group.name,GId,UC};
  16. _ -> undefined end end || {UC, GId} <- UC_GId],
  17. [X||X<-Result,X/=undefined] end.
  18. create_group_directly_to_db(UId, GId, Name, Desc, Publicity) ->
  19. FId = kvs:feed_create(),
  20. CTime = erlang:now(),
  21. kvs:put(#group{username = GId,
  22. name = Name,
  23. description = Desc,
  24. publicity = Publicity,
  25. creator = UId,
  26. created = CTime,
  27. owner = UId,
  28. feed = FId}),
  29. users:init_mq_for_group(GId),
  30. add_to_group_directly_to_db(UId, GId, member),
  31. GId.
  32. add_to_group(Who, GId, Type, Owner) -> nsx_msg:notify(["subscription", "user", Owner, "add_to_group"], {GId, Who, Type}).
  33. add_to_group_directly_to_db(UId, GId, Type) ->
  34. kvs:put(#group_subscription{key={UId,GId},user_id=UId, group_id=GId, user_type=Type}),
  35. {ok, Group} = kvs:get(group, GId),
  36. GU = Group#group.users_count,
  37. kvs:put(Group#group{users_count = GU+1}).
  38. delete_group(GId) ->
  39. {_, Group} = get_group(GId),
  40. case Group of
  41. notfound -> ok;
  42. _ ->
  43. nsx_msg:notify([feed, delete, GId], empty),
  44. kvs:delete_by_index(group_subscription, <<"group_subs_group_id_bin">>, GId),
  45. kvs:delete(feed, Group#group.feed),
  46. kvs:delete(group, GId),
  47. % unbind exchange
  48. {ok, Channel} = mqs:open([]),
  49. Routes = users:rk_group_feed(GId),
  50. users:unbind_group_exchange(Channel, GId, Routes),
  51. mqs_channel:close(Channel)
  52. end.
  53. participate(UId) -> [GId || #group_subscription{group_id=GId} <- kvs:all_by_index(group_subs, <<"group_subs_user_id_bin">>, UId) ].
  54. members(GId) -> [UId || #group_subscription{user_id=UId, user_type=UT} <- kvs:all_by_index(group_subs, <<"group_subs_group_id_bin">>, GId), UT == member ].
  55. members_by_type(GId, Type) -> [UId || #group_subscription{user_id=UId, user_type=UT} <- kvs:all_by_index(group_subs, <<"group_subs_group_id_bin">>, GId), UT == Type ].
  56. members_with_types(GId) -> [{UId, UType} || #group_subscription{user_id=UId, user_type=UType} <- kvs:all_by_index(group_subs, <<"group_subs_group_id_bin">>, list_to_binary(GId)) ].
  57. get_group(GId) -> kvs:get(group, GId).
  58. user_is_owner(UId, GId) ->
  59. {R, Group} = kvs:get(group, GId),
  60. case R of
  61. ok -> case Group#group.owner of
  62. UId -> true;
  63. _ -> false
  64. end;
  65. _ -> false
  66. end.
  67. user_in_group(UId, GId) ->
  68. case kvs:get(group_subs, {UId, GId}) of
  69. {error, notfound} -> false;
  70. _ -> true
  71. end.
  72. group_user_type(UId, GId) ->
  73. case kvs:get(group_subs, {UId, GId}) of
  74. {error, notfound} -> not_in_group;
  75. {ok, #group_subscription{user_type=Type}} -> Type
  76. end.
  77. join_group(GId, User) ->
  78. {ok, Group} = get_group(GId),
  79. case Group of
  80. #group{username = GId, publicity = public} ->
  81. % Join to this group
  82. add_to_group(User, GId, member, Group#group.owner),
  83. {ok, joined};
  84. #group{username = GId, publicity = _, feed=_Feed} ->
  85. case group_user_type(User, GId) of
  86. member -> {ok, joined};
  87. req -> {error, already_sent};
  88. reqrejected -> {error, request_rejected};
  89. not_in_group -> add_to_group(User, GId, req, Group#group.owner), {ok, requested};
  90. _ -> {error, unknown_type}
  91. end;
  92. _ -> {error, notfound}
  93. end.
  94. approve_request(UId, GId, Owner) -> add_to_group(UId, GId, member, Owner).
  95. reject_request(UId, GId, Owner) -> add_to_group(UId, GId, reqrejected, Owner).
  96. change_group_user_type(UId, GId, Type) -> nsx_msg:notify(["subscription", "user", UId, "add_to_group"], {GId, UId, Type}).
  97. group_exists(GId) ->
  98. {R, _} = get_group(GId),
  99. case R of
  100. ok -> true;
  101. _ -> false
  102. end.
  103. group_publicity(GId) ->
  104. {_, Group} = get_group(GId),
  105. case Group of
  106. notfound ->
  107. no_such_group;
  108. _ ->
  109. Group#group.publicity
  110. end.
  111. group_members_count(GId) ->
  112. {_, Group} = get_group(GId),
  113. case Group of
  114. notfound ->
  115. no_such_group;
  116. _ ->
  117. Group#group.users_count
  118. end.
  119. user_has_access(UId, GId) ->
  120. UType = group_user_type(UId, GId),
  121. {_, Group} = get_group(GId),
  122. case Group of
  123. notfound ->
  124. false;
  125. _ ->
  126. GPublicity = Group#group.publicity,
  127. case {GPublicity, UType} of
  128. {public, _} -> true;
  129. {private, member} -> true;
  130. _ -> false
  131. end
  132. end.