feeds.erl 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. -module(feeds).
  2. -compile(export_all).
  3. -include_lib("kvs/include/feeds.hrl").
  4. -include_lib("kvs/include/users.hrl").
  5. -include_lib("kvs/include/groups.hrl").
  6. -include_lib("kvs/include/log.hrl").
  7. create() ->
  8. FId = kvs:next_id("feed", 1),
  9. ok = kvs:put(#feed{id = FId} ),
  10. FId.
  11. add_direct_message(FId, User, Desc) -> add_direct_message(FId, User, utils:uuid_ex(), Desc).
  12. add_direct_message(FId, User, EntryId, Desc) -> add_direct_message(FId, User, undefined, EntryId, Desc, []).
  13. add_direct_message(FId, User, To, EntryId, Desc, Medias) -> kvs:feed_add_direct_message(FId, User, To, EntryId, Desc, Medias).
  14. add_group_entry(FId, User, EntryId, Desc, Medias) -> kvs:feed_add_entry(FId, User, EntryId, Desc, Medias).
  15. add_group_entry(FId, User, To, EntryId, Desc, Medias, Type) -> kvs:feed_add_entry(FId, User, To, EntryId, Desc, Medias, Type, "").
  16. add_entry(FId, User, EntryId, Desc) -> add_entry(FId, User, EntryId, Desc, []).
  17. add_entry(FId, User, EntryId, Desc, Medias) -> kvs:feed_add_entry(FId, User, EntryId, Desc, Medias).
  18. add_entry(FId, User, To, EntryId, Desc, Medias, Type) -> kvs:feed_add_entry(FId, User, To, EntryId, Desc, Medias, Type, "").
  19. add_shared_entry(FId, User, To, EntryId, Desc, Medias, Type, SharedBy) -> kvs:feed_add_entry(FId, User, To, EntryId, Desc, Medias, Type, SharedBy).
  20. add_like(Fid, Eid, Uid) ->
  21. Write_one_like = fun(Next) ->
  22. Self_id = kvs:next_id("one_like", 1),
  23. kvs:put(#one_like{ % add one like
  24. id = Self_id,
  25. user_id = Uid,
  26. entry_id = Eid,
  27. feed_id = Fid,
  28. created_time = now(),
  29. next = Next
  30. }),
  31. Self_id
  32. end,
  33. % add entry - like
  34. case kvs:get(entry_likes, Eid) of
  35. {ok, ELikes} ->
  36. kvs:put(ELikes#entry_likes{
  37. one_like_head = Write_one_like(ELikes#entry_likes.one_like_head),
  38. total_count = ELikes#entry_likes.total_count + 1
  39. });
  40. {error, notfound} ->
  41. kvs:put(#entry_likes{
  42. entry_id = Eid,
  43. one_like_head = Write_one_like(undefined),
  44. total_count = 1
  45. })
  46. end,
  47. % add user - like
  48. case kvs:get(user_likes, Uid) of
  49. {ok, ULikes} ->
  50. kvs:put(ULikes#user_likes{
  51. one_like_head = Write_one_like(ULikes#user_likes.one_like_head),
  52. total_count = ULikes#user_likes.total_count + 1
  53. });
  54. {error, notfound} ->
  55. kvs:put(#user_likes{
  56. user_id = Uid,
  57. one_like_head = Write_one_like(undefined),
  58. total_count = 1
  59. })
  60. end.
  61. % statistics
  62. get_entries_count(Uid) ->
  63. case kvs:get(user_etries_count, Uid) of
  64. {ok, UEC} ->
  65. UEC#user_etries_count.entries;
  66. {error, notfound} ->
  67. 0
  68. end.
  69. get_comments_count(Uid) ->
  70. case kvs:get(user_etries_count, Uid) of
  71. {ok, UEC} ->
  72. UEC#user_etries_count.comments;
  73. {error, notfound} ->
  74. 0
  75. end.
  76. get_feed(FId) -> kvs:get(feed, FId).
  77. get_entries_in_feed(FId) -> kvs:entries_in_feed(FId).
  78. get_entries_in_feed(FId, Count) -> kvs:entries_in_feed(FId, Count).
  79. get_entries_in_feed(FId, StartFrom, Count) -> kvs:entries_in_feed(FId, StartFrom, Count).
  80. get_direct_messages(FId, Count) -> kvs:entries_in_feed(FId, undefined, Count).
  81. get_direct_messages(FId, StartFrom, Count) -> kvs:entries_in_feed(FId, StartFrom, Count).
  82. get_entries_in_feed(FId, StartFrom, Count, FromUserId)-> Entries = kvs:entries_in_feed(FId, StartFrom, Count),
  83. [E || #entry{from = From} = E <- Entries, From == FromUserId].
  84. create_message(Table) ->
  85. EId = kvs:next_id("entry", 1),
  86. #entry{id = {EId, system_info},
  87. entry_id = EId,
  88. from = system,
  89. type = {system, new_table},
  90. created_time = now(),
  91. description = Table}.
  92. remove_entry(FeedId, EId) ->
  93. {ok, #feed{top = TopId} = Feed} = get_feed(FeedId),
  94. case kvs:get(entry, {EId, FeedId}) of
  95. {ok, #entry{prev = Prev, next = Next}}->
  96. ?INFO("P: ~p, N: ~p", [Prev, Next]),
  97. case kvs:get(entry, Next) of
  98. {ok, NE} -> kvs:put(NE#entry{prev = Prev});
  99. _ -> ok
  100. end,
  101. case kvs:get(entry, Prev) of
  102. {ok, PE} -> kvs:put(PE#entry{next = Next});
  103. _ -> ok
  104. end,
  105. case TopId of
  106. {EId, FeedId} -> kvs:put(Feed#feed{top = Prev});
  107. _ -> ok
  108. end;
  109. {error, notfound} -> ?INFO("Not found"), ok
  110. end,
  111. kvs:delete(entry, {EId, FeedId}).
  112. edit_entry(FeedId, EId, NewDescription) ->
  113. case kvs:entry_by_id({EId, FeedId}) of
  114. {ok, OldEntry} ->
  115. NewEntryRaw = OldEntry#entry{description = NewDescription,
  116. raw_description = NewDescription},
  117. NewEntry = feedformat:format(NewEntryRaw),
  118. kvs:put(NewEntry);
  119. {error, notfound}->
  120. {error, notfound}
  121. end.
  122. remove_entry_comments(FId, EId) ->
  123. AllComments = kvs:comments_by_entry(FId, EId),
  124. [begin
  125. kvs:delete(comment, ID)
  126. end || #comment{id = ID, media = M} <- AllComments].
  127. entry_add_comment(FId, User, EntryId, ParentComment, CommentId, Content, Medias) ->
  128. case kvs:entry_by_id({EntryId, FId}) of
  129. {ok, _E} ->
  130. kvs:add_comment(FId, User, EntryId, ParentComment, CommentId, Content, Medias);
  131. _ ->
  132. ok
  133. end.
  134. get_one_like_list(undefined) -> [];
  135. get_one_like_list(Id) -> {ok, OneLike} = kvs:get(one_like, Id),
  136. [OneLike] ++ get_one_like_list(OneLike#one_like.next).
  137. get_entries_likes(Entry_id) ->
  138. case kvs:get(entry_likes, Entry_id) of
  139. {ok, Likes} -> get_one_like_list(Likes#entry_likes.one_like_head);
  140. {error, notfound} -> []
  141. end.
  142. get_entries_likes_count(Entry_id) ->
  143. case kvs:get(entry_likes, Entry_id) of
  144. {ok, Likes} ->
  145. Likes#entry_likes.total_count;
  146. {error, notfound} -> 0
  147. end.
  148. get_user_likes_count(UserId) ->
  149. case kvs:get(user_likes, UserId) of
  150. {ok, Likes} -> Likes#user_likes.total_count;
  151. {error, notfound} -> 0
  152. end.
  153. get_user_likes(UserId) ->
  154. case kvs:get(user_likes, UserId) of
  155. {ok, Likes} -> get_one_like_list(Likes#user_likes.one_like_head);
  156. {error, notfound} -> []
  157. end.
  158. get_one_like_list(undefined, _) -> [];
  159. get_one_like_list(_, 0) -> [];
  160. get_one_like_list(Id, N) -> {ok, OneLike} = kvs:get(one_like, Id),
  161. [OneLike] ++ get_one_like_list(OneLike#one_like.next, N-1).
  162. get_user_likes(UserId, {Page, PageAmount}) ->
  163. case kvs:get(user_likes, UserId) of
  164. {ok, Likes} -> lists:nthtail((Page-1)*PageAmount, get_one_like_list(Likes#user_likes.one_like_head, PageAmount*Page));
  165. {error, notfound} -> []
  166. end.
  167. % we have same in user? Why?
  168. is_subscribed_user(UserUidWho, UserUidWhom) -> kvs_users:is_user_subscr(UserUidWho, UserUidWhom).
  169. user_subscription_count(UserUid) -> length(kvs_users:list_subscr(UserUid)).
  170. user_friends_count(UserUid) -> length(kvs_users:list_subscr_me(UserUid)).
  171. get_comments_entries(UserUid, _, _Page, _PageAmount) ->
  172. Pids = [Eid || #comment{entry_id=Eid} <- kvs:select(comment,
  173. fun(#comment{author_id=Who}) when Who=:=UserUid ->true;(_)->false end)],
  174. %?PRINT({"GCE pids length: ", length(Pids)}),
  175. lists:flatten([kvs:select(entry,[{where, fun(#entry{entry_id=ID})-> ID=:=Pid end},
  176. {order, {1, descending}},{limit, {1,1}}]) || Pid <- Pids]).
  177. get_my_discussions(_FId, Page, PageAmount, UserUid) ->
  178. _Offset= case (Page-1)*PageAmount of
  179. 0 -> 1
  180. ;M-> M
  181. end,
  182. Pids = [Eid || #comment{entry_id=Eid} <- kvs:select(comment,
  183. fun(#comment{author_id=Who}) when Who=:=UserUid ->true;(_)->false end)],
  184. lists:flatten([kvs:select(entry,[{where, fun(#entry{entry_id=ID})-> ID=:=Pid end},
  185. {order, {1, descending}},{limit, {1,1}}]) || Pid <- Pids]).
  186. test_likes() ->
  187. add_like(1, "17a10803-f064-4718-ae46-4a6d3c88415c-0796e2bb", "derp"),
  188. add_like(1, "17a10803-f064-4718-ae46-4a6d3c88415c-0796e2bb", "derpina"),
  189. add_like(1, "17a10803-f064-4718-ae46-4a6d3c88415c-0796e2bb", "derpington"),
  190. add_like(1, "17a10803-f064-4718-ae46-4a6d3c88415c-0796e2bc", "derp"),
  191. add_like(1, "17a10803-f064-4718-ae46-4a6d3c88415c-0796e2bc", "lederpeaux"),
  192. add_like(2, "17a10803-f064-4718-ae46-4a6d3c88415c-0796e2bd", "derp"),
  193. add_like(2, "17a10803-f064-4718-ae46-4a6d3c88415c-0796e2be", "derp"),
  194. [
  195. get_entries_likes("17a10803-f064-4718-ae46-4a6d3c88415c-0796e2bb"),
  196. get_entries_likes_count("17a10803-f064-4718-ae46-4a6d3c88415c-0796e2bb") == 3,
  197. get_user_likes("derp"),
  198. get_user_likes("derp", {1, 2}),
  199. get_user_likes_count("derp") == 4
  200. ].