PageRenderTime 39ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/ucengine/src/models/uce_meeting.erl

http://github.com/AF83/ucengine
Erlang | 128 lines | 95 code | 16 blank | 17 comment | 0 complexity | c9da88dd239e31cd475df1ca73743566 MD5 | raw file
  1. %%
  2. %% U.C.Engine - Unified Collaboration Engine
  3. %% Copyright (C) 2011 af83
  4. %%
  5. %% This program is free software: you can redistribute it and/or modify
  6. %% it under the terms of the GNU Affero General Public License as published by
  7. %% the Free Software Foundation, either version 3 of the License, or
  8. %% (at your option) any later version.
  9. %%
  10. %% This program is distributed in the hope that it will be useful,
  11. %% but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. %% GNU Affero General Public License for more details.
  14. %%
  15. %% You should have received a copy of the GNU Affero General Public License
  16. %% along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. %%
  18. -module(uce_meeting).
  19. -export([add/2,
  20. delete/2,
  21. update/2,
  22. get/2,
  23. list/1,
  24. join/3,
  25. leave/3,
  26. roster/2,
  27. exists/2,
  28. publish/2,
  29. subscribe/7,
  30. unsubscribe/1]).
  31. -include("uce.hrl").
  32. -spec add(domain(), meeting()) -> {ok, created} | erlang:throw({error, conflict}).
  33. add(Domain, #uce_meeting{id=Id} = Meeting) ->
  34. case exists(Domain, Id) of
  35. true ->
  36. throw({error, conflict});
  37. false ->
  38. (db:get(?MODULE, Domain)):add(Domain, Meeting)
  39. end.
  40. -spec delete(domain(), meeting_id()) -> {ok, deleted} | erlang:throw({error, not_found}).
  41. delete(Domain, Id) ->
  42. case exists(Domain, Id) of
  43. false ->
  44. throw({error, not_found});
  45. true ->
  46. (db:get(?MODULE, Domain)):delete(Domain, Id)
  47. end.
  48. -spec get(domain(), meeting_id()) -> {ok, meeting()} | erlang:throw({error, not_found}).
  49. get(Domain, Id) ->
  50. (db:get(?MODULE, Domain)):get(Domain, Id).
  51. -spec update(domain(), meeting()) -> {ok, updated} | erlang:throw({error, not_found}).
  52. update(Domain, #uce_meeting{id=Id} = Meeting) ->
  53. case exists(Domain, Id) of
  54. false ->
  55. throw({error, not_found});
  56. true ->
  57. (db:get(?MODULE, Domain)):update(Domain, Meeting)
  58. end.
  59. -spec list(domain()) -> {ok, list(meeting)} | erlang:throw({error, bad_parameters}).
  60. list(Domain) ->
  61. (db:get(?MODULE, Domain)):list(Domain).
  62. -spec exists(domain(), meeting_id()) -> boolean().
  63. exists(_Domain, "") ->
  64. true; % root
  65. exists(Domain, Id) ->
  66. case catch get(Domain, Id) of
  67. {error, not_found} ->
  68. false;
  69. {error, Reason} ->
  70. throw({error, Reason});
  71. {ok, _} ->
  72. true
  73. end.
  74. -spec join(domain(), meeting_id(), user()) -> {ok, updated} | erlang:throw({error, not_found}).
  75. join(Domain, Id, User) ->
  76. case uce_user:exists(Domain, User) of
  77. false ->
  78. throw({error, not_found});
  79. true ->
  80. {ok, Meeting} = get(Domain, Id),
  81. case lists:member(User, Meeting#uce_meeting.roster) of
  82. false ->
  83. update(Domain, Meeting#uce_meeting{roster=Meeting#uce_meeting.roster ++ [User]});
  84. true ->
  85. {ok, updated}
  86. end
  87. end.
  88. -spec leave(domain(), meeting_id(), user()) -> {ok, updated} | erlang:throw({error, not_found}).
  89. leave(Domain, Id, User) ->
  90. case uce_user:exists(Domain, User) of
  91. false ->
  92. throw({error, not_found});
  93. true ->
  94. {ok, Meeting} = get(Domain, Id),
  95. case lists:member(User, Meeting#uce_meeting.roster) of
  96. false ->
  97. throw({error, not_found});
  98. true ->
  99. Roster = lists:subtract(Meeting#uce_meeting.roster, [User]),
  100. update(Domain, Meeting#uce_meeting{roster=Roster})
  101. end
  102. end.
  103. -spec roster(domain(), meeting_id()) -> list(user()) | erlang:throw({error, not_found}).
  104. roster(Domain, Id) ->
  105. {ok, Meeting} = get(Domain, Id),
  106. {ok, Meeting#uce_meeting.roster}.
  107. publish(Domain, Event) ->
  108. ?PUBSUB_MODULE:publish(Domain, Event).
  109. subscribe(Pid, Domain, Uid, Location, From, Types, Parent) ->
  110. ?PUBSUB_MODULE:subscribe(Pid, Domain, Uid, Location, From, Types, Parent).
  111. unsubscribe(Pid) ->
  112. ?PUBSUB_MODULE:unsubscribe(Pid).