PageRenderTime 18ms CodeModel.GetById 0ms RepoModel.GetById 7ms app.codeStats 0ms

/ucengine/src/controllers/meeting_controller.erl

http://github.com/AF83/ucengine
Erlang | 144 lines | 109 code | 17 blank | 18 comment | 0 complexity | a1e949dad9dc793383aacaca04185e3e 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(meeting_controller).
  19. -export([init/0, add/4, list/4, get/4, update/4, leave/4, join/4, roster/4]).
  20. -include("uce.hrl").
  21. init() ->
  22. [#uce_route{method='POST',
  23. path=["meeting"],
  24. callback={?MODULE, add,
  25. [{"uid", required, string},
  26. {"sid", required, string},
  27. {"name", required, string},
  28. {"metadata", [], dictionary}]}},
  29. #uce_route{method='GET',
  30. path=["meeting"],
  31. callback={?MODULE, list,
  32. [{"uid", required, string},
  33. {"sid", required, string}]}},
  34. #uce_route{method='GET',
  35. path=["meeting", meeting],
  36. callback={?MODULE, get,
  37. [{"uid", required, string},
  38. {"sid", required, string}]}},
  39. #uce_route{method='PUT',
  40. path=["meeting", meeting],
  41. callback={?MODULE, update,
  42. [{"uid", required, string},
  43. {"sid", required, string},
  44. {"metadata", [], dictionary}]}},
  45. #uce_route{method='POST',
  46. path=["meeting", meeting, "roster"],
  47. callback={?MODULE, join,
  48. [{"uid", required, string},
  49. {"sid", required, string},
  50. {"metadata", [], dictionary}]}},
  51. #uce_route{method='DELETE',
  52. path=["meeting", meeting, "roster", uid],
  53. callback={?MODULE, leave,
  54. [{"uid", required, string},
  55. {"sid", required, string}]}},
  56. #uce_route{method='GET',
  57. path=["meeting", meeting, "roster"],
  58. callback={?MODULE, roster,
  59. [{"uid", required, string},
  60. {"sid", required, string}]}}].
  61. add(Domain, [], [Uid, Sid, Name, Metadata], _) ->
  62. {ok, true} = uce_presence:assert(Domain, Uid, Sid),
  63. {ok, true} = uce_access:assert(Domain, Uid, "", "meeting", "add"),
  64. {ok, created} = uce_meeting:add(Domain,
  65. #uce_meeting{id=Name,
  66. metadata=json_helpers:to_struct(Metadata)}),
  67. {ok, _} = uce_event:add(Domain, #uce_event{id=none,
  68. from=Uid,
  69. location=Name,
  70. type="internal.meeting.add"}),
  71. json_helpers:created(Domain).
  72. list(Domain, [], [Uid, Sid], _) ->
  73. {ok, true} = uce_presence:assert(Domain, Uid, Sid),
  74. {ok, true} = uce_access:assert(Domain, Uid, "", "meeting", "list"),
  75. {ok, Meetings} = uce_meeting:list(Domain),
  76. json_helpers:json(Domain, Meetings).
  77. get(Domain, [{meeting, Name}], [Uid, Sid], _) ->
  78. {ok, true} = uce_presence:assert(Domain, Uid, Sid),
  79. {ok, true} = uce_access:assert(Domain, Uid, "", "meeting", "get"),
  80. {ok, Meeting} = uce_meeting:get(Domain, Name),
  81. json_helpers:json(Domain, Meeting).
  82. update(Domain, [{meeting, Name}], [Uid, Sid, Metadata], _) ->
  83. {ok, true} = uce_presence:assert(Domain, Uid, Sid),
  84. {ok, true} = uce_access:assert(Domain, Uid, Name, "meeting", "update"),
  85. {ok, Meeting} = uce_meeting:get(Domain, Name),
  86. {ok, updated} = uce_meeting:update(Domain,
  87. #uce_meeting{id=Name,
  88. roster=Meeting#uce_meeting.roster,
  89. metadata=json_helpers:to_struct(Metadata)}),
  90. {ok, _} = uce_event:add(Domain, #uce_event{id=none,
  91. from=Uid,
  92. location=Name,
  93. type="internal.meeting.update"}),
  94. json_helpers:ok(Domain).
  95. join(Domain, [{meeting, Name}], [Uid, Sid, Metadata], _) ->
  96. {ok, true} = uce_presence:assert(Domain, Uid, Sid),
  97. {ok, true} = uce_access:assert(Domain, Uid, Name, "roster", "add"),
  98. {ok, updated} = uce_meeting:join(Domain, Name, Uid),
  99. uce_presence:join(Domain, Sid, Name),
  100. {ok, _} = uce_event:add(Domain,
  101. #uce_event{id=none,
  102. type="internal.roster.add",
  103. location=Name,
  104. from=Uid,
  105. metadata=json_helpers:to_struct(Metadata)}),
  106. json_helpers:ok(Domain).
  107. %% TODO : Incomplete Sid must be ToSid
  108. leave(Domain, [{meeting, Name}, {uid, User}], [Uid, Sid], _) ->
  109. {ok, true} = uce_presence:assert(Domain, Uid, Sid),
  110. {ok, true} = uce_access:assert(Domain, Uid, Name, "roster", "delete"),
  111. {ok, updated} = uce_meeting:leave(Domain, Name, User),
  112. uce_presence:leave(Domain, Sid, Name),
  113. {ok, _} = uce_event:add(Domain,
  114. #uce_event{id=none,
  115. type="internal.roster.delete",
  116. location=Name,
  117. from=User}),
  118. json_helpers:ok(Domain).
  119. roster(Domain, [{meeting, Name}], [Uid, Sid], _) ->
  120. {ok, true} = uce_presence:assert(Domain, Uid, Sid),
  121. {ok, true} = uce_access:assert(Domain, Uid, Name, "roster", "list"),
  122. {ok, Roster} = uce_meeting:roster(Domain, Name),
  123. json_helpers:json(Domain, lists:map(fun(Member) ->
  124. {ok, User} = uce_user:get(Domain, Member),
  125. User
  126. end,
  127. Roster)).