Add basic comment support and flesh out some other endpoints
This commit is contained in:
parent
c434fc31c9
commit
c894b4246a
@ -445,15 +445,8 @@ class MediaEntry(Base, MediaEntryMixin):
|
|||||||
qualified=True
|
qualified=True
|
||||||
)
|
)
|
||||||
|
|
||||||
id = request.urlgen(
|
|
||||||
"mediagoblin.federation.object",
|
|
||||||
objectType=self.objectType,
|
|
||||||
uuid=self.slug,
|
|
||||||
qualified=True
|
|
||||||
)
|
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"id": id,
|
"id": self.id,
|
||||||
"author": author.serialize(request),
|
"author": author.serialize(request),
|
||||||
"displayName": self.title,
|
"displayName": self.title,
|
||||||
"objectType": self.objectType,
|
"objectType": self.objectType,
|
||||||
|
@ -22,7 +22,7 @@ from oauthlib.oauth1 import ResourceEndpoint
|
|||||||
|
|
||||||
from mediagoblin import mg_globals as mgg
|
from mediagoblin import mg_globals as mgg
|
||||||
from mediagoblin import messages
|
from mediagoblin import messages
|
||||||
from mediagoblin.db.models import MediaEntry, User, MediaComment
|
from mediagoblin.db.models import MediaEntry, User, MediaComment, AccessToken
|
||||||
from mediagoblin.tools.response import (
|
from mediagoblin.tools.response import (
|
||||||
redirect, render_404,
|
redirect, render_404,
|
||||||
render_user_banned, json_response)
|
render_user_banned, json_response)
|
||||||
@ -412,6 +412,13 @@ def oauth_required(controller):
|
|||||||
error = "Invalid oauth prarameter."
|
error = "Invalid oauth prarameter."
|
||||||
return json_response({"error": error}, status=400)
|
return json_response({"error": error}, status=400)
|
||||||
|
|
||||||
|
# Fill user if not already
|
||||||
|
token = authorization[u"oauth_token"]
|
||||||
|
access_token = AccessToken.query.filter_by(token=token).first()
|
||||||
|
if access_token is not None and request.user is None:
|
||||||
|
user_id = access_token.user
|
||||||
|
request.user = User.query.filter_by(id=user_id).first()
|
||||||
|
|
||||||
return controller(request, *args, **kwargs)
|
return controller(request, *args, **kwargs)
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
|
@ -39,7 +39,7 @@ add_route(
|
|||||||
add_route(
|
add_route(
|
||||||
"mediagoblin.federation.inbox",
|
"mediagoblin.federation.inbox",
|
||||||
"/api/user/<string:username>/inbox",
|
"/api/user/<string:username>/inbox",
|
||||||
"mediagoblin.federation.views:inbox"
|
"mediagoblin.federation.views:feed"
|
||||||
)
|
)
|
||||||
|
|
||||||
# object endpoints
|
# object endpoints
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
import json
|
||||||
|
|
||||||
from mediagoblin.decorators import oauth_required
|
from mediagoblin.decorators import oauth_required
|
||||||
from mediagoblin.db.models import User, MediaEntry
|
from mediagoblin.db.models import User, MediaEntry, MediaComment
|
||||||
from mediagoblin.tools.response import redirect, json_response
|
from mediagoblin.tools.response import redirect, json_response
|
||||||
|
from mediagoblin.meddleware.csrf import csrf_exempt
|
||||||
|
|
||||||
#@oauth_required
|
#@oauth_required
|
||||||
def profile(request, raw=False):
|
def profile(request, raw=False):
|
||||||
@ -34,8 +37,10 @@ def user(request):
|
|||||||
return json_response(data)
|
return json_response(data)
|
||||||
|
|
||||||
@oauth_required
|
@oauth_required
|
||||||
|
@csrf_exempt
|
||||||
def feed(request):
|
def feed(request):
|
||||||
""" Handles the user's outbox - /api/user/<username>/feed """
|
""" Handles the user's outbox - /api/user/<username>/feed """
|
||||||
|
print request.user
|
||||||
user = request.matchdict["username"]
|
user = request.matchdict["username"]
|
||||||
requested_user = User.query.filter_by(username=user)
|
requested_user = User.query.filter_by(username=user)
|
||||||
|
|
||||||
@ -44,10 +49,76 @@ def feed(request):
|
|||||||
error = "No such 'user' with id '{0}'".format(user)
|
error = "No such 'user' with id '{0}'".format(user)
|
||||||
return json_response({"error": error}, status=404)
|
return json_response({"error": error}, status=404)
|
||||||
|
|
||||||
user = request_user[0]
|
user = requested_user[0]
|
||||||
|
|
||||||
|
if request.method == "POST":
|
||||||
|
data = json.loads(request.data)
|
||||||
|
obj = data.get("object", None)
|
||||||
|
if obj is None:
|
||||||
|
error = {"error": "Could not find 'object' element."}
|
||||||
|
return json_response(error, status=400)
|
||||||
|
|
||||||
|
if obj.get("objectType", None) == "comment":
|
||||||
|
# post a comment
|
||||||
|
media = int(data["object"]["inReplyTo"]["id"])
|
||||||
|
author = request.user
|
||||||
|
comment = MediaComment(
|
||||||
|
media_entry=media,
|
||||||
|
author=request.user.id,
|
||||||
|
content=data["object"]["content"]
|
||||||
|
)
|
||||||
|
comment.save()
|
||||||
|
elif obj.get("objectType", None) is None:
|
||||||
|
error = {"error": "No objectType specified."}
|
||||||
|
return json_response(error, status=400)
|
||||||
|
else:
|
||||||
|
error = {"error": "Unknown object type '{0}'.".format(obj.get("objectType", None))}
|
||||||
|
return json_response(error, status=400)
|
||||||
|
|
||||||
|
feed_url = request.urlgen(
|
||||||
|
"mediagoblin.federation.feed",
|
||||||
|
username=user.username,
|
||||||
|
qualified=True
|
||||||
|
)
|
||||||
|
|
||||||
|
feed = {
|
||||||
|
"displayName": "Activities by {0}@{1}".format(user.username, request.host),
|
||||||
|
"objectTypes": ["activity"],
|
||||||
|
"url": feed_url,
|
||||||
|
"links": {
|
||||||
|
"first": {
|
||||||
|
"href": feed_url,
|
||||||
|
},
|
||||||
|
"self": {
|
||||||
|
"href": request.url,
|
||||||
|
},
|
||||||
|
"prev": {
|
||||||
|
"href": feed_url,
|
||||||
|
},
|
||||||
|
"next": {
|
||||||
|
"href": feed_url,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"author": user.serialize(request),
|
||||||
|
"items": [],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Now lookup the user's feed.
|
# Now lookup the user's feed.
|
||||||
raise NotImplemented("Yet to implement looking up user's feed")
|
for media in MediaEntry.query.all():
|
||||||
|
feed["items"].append({
|
||||||
|
"verb": "post",
|
||||||
|
"object": media.serialize(request),
|
||||||
|
"actor": user.serialize(request),
|
||||||
|
"content": "{0} posted a picture".format(user.username),
|
||||||
|
"id": 1,
|
||||||
|
})
|
||||||
|
feed["items"][-1]["updated"] = feed["items"][-1]["object"]["updated"]
|
||||||
|
feed["items"][-1]["published"] = feed["items"][-1]["object"]["published"]
|
||||||
|
feed["items"][-1]["url"] = feed["items"][-1]["object"]["url"]
|
||||||
|
feed["totalItems"] = len(feed["items"])
|
||||||
|
|
||||||
|
return json_response(feed)
|
||||||
|
|
||||||
@oauth_required
|
@oauth_required
|
||||||
def inbox(request):
|
def inbox(request):
|
||||||
@ -90,6 +161,11 @@ def object_comments(request):
|
|||||||
uuid=media.slug,
|
uuid=media.slug,
|
||||||
qualified=True)
|
qualified=True)
|
||||||
})
|
})
|
||||||
|
comments["displayName"] = "Replies to {0}".format(comments["url"])
|
||||||
|
comments["links"] = {
|
||||||
|
"first": comments["url"],
|
||||||
|
"self": comments["url"],
|
||||||
|
}
|
||||||
response = json_response(comments)
|
response = json_response(comments)
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
Loading…
x
Reference in New Issue
Block a user