mirror of
https://github.com/processone/ejabberd.git
synced 2024-07-06 23:22:36 +02:00
Added support for GET a single item
and GET an atom feed of a node
This commit is contained in:
parent
353d16b8ef
commit
a22ebd3c49
|
@ -46,7 +46,7 @@
|
||||||
|
|
||||||
-export([process/2]).
|
-export([process/2]).
|
||||||
|
|
||||||
process([Domain, _Node|_Rest]=LocalPath, #request{auth = Auth} = Request)->
|
process([_Domain, _Node|_Rest]=LocalPath, #request{auth = Auth} = Request)->
|
||||||
case get_auth(Auth) of
|
case get_auth(Auth) of
|
||||||
%%make sure user belongs to pubsub domain
|
%%make sure user belongs to pubsub domain
|
||||||
{User, Domain} ->
|
{User, Domain} ->
|
||||||
|
@ -76,6 +76,41 @@ get_auth(Auth) ->
|
||||||
unauthorized
|
unauthorized
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
out(Args, 'GET', [Domain,Node]=Uri, _User) ->
|
||||||
|
case mod_pubsub:tree_action(get_host(Uri), get_node, [get_host(Uri),get_collection(Uri)]) of
|
||||||
|
{error, _} -> error(404);
|
||||||
|
_ ->
|
||||||
|
Items = lists:sort(fun(X,Y)->
|
||||||
|
{DateX, _} = X#pubsub_item.modification,
|
||||||
|
{DateY, _} = Y#pubsub_item.modification,
|
||||||
|
DateX > DateY
|
||||||
|
end, mod_pubsub:get_items(
|
||||||
|
get_host(Uri),
|
||||||
|
get_collection(Uri))),
|
||||||
|
case Items of
|
||||||
|
[] -> ?DEBUG("Items : ~p ~n", [collection(get_collection(Uri),
|
||||||
|
collection_uri(Args,Domain,Node), calendar:now_to_universal_time(erlang:now()), "", [])]),
|
||||||
|
{200, [{"Content-Type", "application/atom+xml"}],
|
||||||
|
collection(get_collection(Uri),
|
||||||
|
collection_uri(Args,Domain,Node), calendar:now_to_universal_time(erlang:now()), "", [])};
|
||||||
|
_ ->
|
||||||
|
#pubsub_item{modification = {LastDate, _JID}} = LastItem = hd(Items),
|
||||||
|
Etag =generate_etag(LastItem),
|
||||||
|
IfNoneMatch=proplists:get_value('If-None-Match', Args#request.headers),
|
||||||
|
if IfNoneMatch==Etag
|
||||||
|
->
|
||||||
|
success(304);
|
||||||
|
true ->
|
||||||
|
XMLEntries= [item_to_entry(Args,Domain, Node,Entry)||Entry <- Items],
|
||||||
|
{200, [{"Content-Type", "application/atom+xml"},{"Etag", Etag}],
|
||||||
|
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
|
||||||
|
++ xml:element_to_string(
|
||||||
|
collection(get_collection(Uri), collection_uri(Args,Domain,Node),
|
||||||
|
calendar:now_to_universal_time(LastDate), "", XMLEntries))}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
out(Args, 'POST', [Domain, Node]=Uri, {User, _Domain}) ->
|
out(Args, 'POST', [Domain, Node]=Uri, {User, _Domain}) ->
|
||||||
Slug = uniqid(false),
|
Slug = uniqid(false),
|
||||||
Payload = xml_stream:parse_element(Args#request.data),
|
Payload = xml_stream:parse_element(Args#request.data),
|
||||||
|
@ -119,18 +154,19 @@ out(_,Method,Uri,undefined) ->
|
||||||
error(403).
|
error(403).
|
||||||
|
|
||||||
get_item(Uri, Failure, Success)->
|
get_item(Uri, Failure, Success)->
|
||||||
case mod_pubsub:get_item(get_host(Uri), get_collection(Uri), tl(get_member(Uri))) of
|
?DEBUG(" mod_pubsub:get_item(~p, ~p,~p)", [get_host(Uri), get_collection(Uri), get_member(Uri)]),
|
||||||
|
case mod_pubsub:get_item(get_host(Uri), get_collection(Uri), get_member(Uri)) of
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
Failure(Reason);
|
Failure(Reason);
|
||||||
{result, Item} ->
|
#pubsub_item{}=Item ->
|
||||||
Success(Item)
|
Success(Item)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
generate_etag(#pubsub_item{modification={_JID, {_, D2, D3}}})->integer_to_list(D3+D2).
|
generate_etag(#pubsub_item{modification={{_, D2, D3}, _JID}})->integer_to_list(D3+D2).
|
||||||
get_host([Domain|_Rest])-> "pubsub."++Domain.
|
get_host([Domain|_Rest])-> "pubsub."++Domain.
|
||||||
get_collection([_Domain, Node|_Rest])->list_to_binary(Node).
|
get_collection([_Domain, Node|_Rest])->list_to_binary(Node).
|
||||||
get_member([Domain, _Node, Member]=Uri)->
|
get_member([_Domain, _Node, Member])->
|
||||||
[get_host(Uri), get_collection(Uri), Member].
|
Member.
|
||||||
|
|
||||||
collection_uri(R, Domain, Node) ->
|
collection_uri(R, Domain, Node) ->
|
||||||
base_uri(R, Domain)++ "/" ++Node.
|
base_uri(R, Domain)++ "/" ++Node.
|
||||||
|
@ -146,7 +182,7 @@ item_to_entry(Args,Domain, Node,#pubsub_item{itemid={Id,_}, payload=Entry}=Item)
|
||||||
item_to_entry(Args, Domain, Node, Id, R, Item).
|
item_to_entry(Args, Domain, Node, Id, R, Item).
|
||||||
|
|
||||||
item_to_entry(Args,Domain, Node, Id,{xmlelement, "entry", Attrs, SubEl},
|
item_to_entry(Args,Domain, Node, Id,{xmlelement, "entry", Attrs, SubEl},
|
||||||
#pubsub_item{modification={JID, Secs} }) ->
|
#pubsub_item{modification={ Secs, JID} }) ->
|
||||||
Date = calendar:now_to_local_time(Secs),
|
Date = calendar:now_to_local_time(Secs),
|
||||||
{_User, Domain, _}=jlib:jid_tolower(JID),
|
{_User, Domain, _}=jlib:jid_tolower(JID),
|
||||||
SubEl2=[{xmlelement, "app:edited", [], [{xmlcdata, w3cdtf(Date)}]},
|
SubEl2=[{xmlelement, "app:edited", [], [{xmlcdata, w3cdtf(Date)}]},
|
||||||
|
@ -163,7 +199,16 @@ item_to_entry(_Args,_Domain, Node, _Id, {xmlelement, Name, Attrs, Subels}=Eleme
|
||||||
false -> {xmlelement, Name, [{"xmlns", Node}|Attrs], Subels}
|
false -> {xmlelement, Name, [{"xmlns", Node}|Attrs], Subels}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
collection(Title, Link, Updated, _Id, Entries)->
|
||||||
|
{xmlelement, "feed", [{"xmlns", "http://www.w3.org/2005/Atom"},
|
||||||
|
{"xmlns:app", "http://www.w3.org/2007/app"}], [
|
||||||
|
{xmlelement, "title", [],[{xmlcdata, Title}]},
|
||||||
|
{xmlelement, "updated", [],[{xmlcdata, w3cdtf(Updated)}]},
|
||||||
|
{xmlelement, "link", [{"href", Link}], []},
|
||||||
|
{xmlelement, "title", [],[{xmlcdata, Title}]} |
|
||||||
|
Entries
|
||||||
|
]}.
|
||||||
|
|
||||||
%% simple output functions
|
%% simple output functions
|
||||||
error(404)->
|
error(404)->
|
||||||
{404, [], "Not Found"};
|
{404, [], "Not Found"};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user