from twisted.web import http
from twisted.web.server import NOT_DONE_YET
from Tribler.Core.Modules.restapi import VOTE_SUBSCRIBE, VOTE_UNSUBSCRIBE
from Tribler.Core.Modules.restapi.channels.base_channels_endpoint import BaseChannelsEndpoint
from Tribler.Core.Modules.restapi.util import convert_db_channel_to_json
import Tribler.Core.Utilities.json_util as json
ALREADY_SUBSCRIBED_RESPONSE_MSG = "you are already subscribed to this channel"
NOT_SUBSCRIBED_RESPONSE_MSG = "you are not subscribed to this channel"
[docs]class ChannelsSubscribedEndpoint(BaseChannelsEndpoint):
"""
This class is responsible for requests regarding the subscriptions to channels.
"""
def getChild(self, path, request):
return ChannelsModifySubscriptionEndpoint(self.session, path)
[docs] def render_GET(self, _):
"""
.. http:get:: /channels/subscribed
Returns all the channels the user is subscribed to.
**Example request**:
.. sourcecode:: none
curl -X GET http://localhost:8085/channels/subscribed
**Example response**:
.. sourcecode:: javascript
{
"subscribed": [{
"id": 3,
"dispersy_cid": "da69aaad39ccf468aba2ab9177d5f8d8160135e6",
"name": "My fancy channel",
"description": "A description of this fancy channel",
"subscribed": True,
"votes": 23,
"torrents": 3,
"spam": 5,
"modified": 14598395,
"can_edit": True,
}, ...]
}
"""
subscribed_channels_db = self.channel_db_handler.getMySubscribedChannels(include_dispersy=True)
results_json = [convert_db_channel_to_json(channel) for channel in subscribed_channels_db]
return json.dumps({"subscribed": results_json})
[docs]class ChannelsModifySubscriptionEndpoint(BaseChannelsEndpoint):
"""
This class is responsible for methods that modify the list of RSS feed URLs (adding/removing feeds).
"""
def __init__(self, session, cid):
BaseChannelsEndpoint.__init__(self, session)
self.cid = bytes(cid.decode('hex'))
[docs] def render_GET(self, request):
"""
.. http:get:: /channels/subscribed/(string: channelid)
Shows the status of subscription to a specific channel along with number of existing votes in the channel
**Example request**:
.. sourcecode:: none
curl -X GET http://localhost:8085/channels/subscribed/da69aaad39ccf468aba2ab9177d5f8d8160135e6
**Example response**:
.. sourcecode:: javascript
{
"subscribed" : True, "votes": 111
}
"""
request.setHeader('Content-Type', 'text/json')
channel_info = self.get_channel_from_db(self.cid)
if channel_info is None:
return ChannelsModifySubscriptionEndpoint.return_404(request)
response = dict()
response[u'subscribed'] = channel_info[7] == VOTE_SUBSCRIBE
response[u'votes'] = channel_info[5]
return json.dumps(response)
[docs] def render_PUT(self, request):
"""
.. http:put:: /channels/subscribed/(string: channelid)
Subscribe to a specific channel. Returns error 409 if you are already subscribed to this channel.
**Example request**:
.. sourcecode:: none
curl -X PUT http://localhost:8085/channels/subscribed/da69aaad39ccf468aba2ab9177d5f8d8160135e6
**Example response**:
.. sourcecode:: javascript
{
"subscribed" : True
}
:statuscode 409: (conflict) if you are already subscribed to the specified channel.
"""
request.setHeader('Content-Type', 'text/json')
channel_info = self.get_channel_from_db(self.cid)
if channel_info is not None and channel_info[7] == VOTE_SUBSCRIBE:
request.setResponseCode(http.CONFLICT)
return json.dumps({"error": ALREADY_SUBSCRIBED_RESPONSE_MSG})
def on_vote_done(_):
request.write(json.dumps({"subscribed": True}))
request.finish()
def on_vote_error(failure):
request.processingFailed(failure)
self.vote_for_channel(self.cid, VOTE_SUBSCRIBE).addCallback(on_vote_done).addErrback(on_vote_error)
return NOT_DONE_YET
[docs] def render_DELETE(self, request):
"""
.. http:delete:: /channels/subscribed/(string: channelid)
Unsubscribe from a specific channel. Returns error 404 if you are not subscribed to this channel.
**Example request**:
.. sourcecode:: none
curl -X DELETE http://localhost:8085/channels/subscribed/da69aaad39ccf468aba2ab9177d5f8d8160135e6
**Example response**:
.. sourcecode:: javascript
{
"unsubscribed" : True
}
:statuscode 404: if you are not subscribed to the specified channel.
"""
request.setHeader('Content-Type', 'text/json')
channel_info = self.get_channel_from_db(self.cid)
if channel_info is None:
return ChannelsModifySubscriptionEndpoint.return_404(request)
if channel_info[7] != VOTE_SUBSCRIBE:
return ChannelsModifySubscriptionEndpoint.return_404(request, message=NOT_SUBSCRIBED_RESPONSE_MSG)
def on_vote_done(_):
request.write(json.dumps({"unsubscribed": True}))
request.finish()
self.vote_for_channel(self.cid, VOTE_UNSUBSCRIBE).addCallback(on_vote_done)
return NOT_DONE_YET