Support some webfinger API's and real profile and /api/user/<user>/
[mediagoblin.git] / mediagoblin / federation / views.py
CommitLineData
d7b3805f 1from mediagoblin.decorators import oauth_required
5a2056f7 2from mediagoblin.db.models import User, MediaEntry
a5682e89 3from mediagoblin.tools.response import redirect, json_response
d7b3805f 4
a5682e89 5#@oauth_required
6def profile(request, raw=False):
7 """ This is /api/user/<username>/profile - This will give profile info """
d7b3805f
JT
8 user = request.matchdict["username"]
9 requested_user = User.query.filter_by(username=user)
10
11 # check if the user exists
12 if requested_user is None:
13 error = "No such 'user' with id '{0}'".format(user)
14 return json_response({"error": error}, status=404)
15
16 user = requested_user[0]
17
a5682e89 18 if raw:
19 return (user, user.serialize(request))
20
d7b3805f
JT
21 # user profiles are public so return information
22 return json_response(user.serialize(request))
23
a5682e89 24def user(request):
25 """ This is /api/user/<username> - This will get the user """
26 user, user_profile = profile(request, raw=True)
27 data = {
28 "nickname": user.username,
29 "updated": user.created.isoformat(),
30 "published": user.created.isoformat(),
31 "profile": user_profile
32 }
33
34 return json_response(data)
35
d7b3805f
JT
36@oauth_required
37def feed(request):
38 """ Handles the user's outbox - /api/user/<username>/feed """
39 user = request.matchdict["username"]
40 requested_user = User.query.filter_by(username=user)
41
42 # check if the user exists
43 if requested_user is None:
44 error = "No such 'user' with id '{0}'".format(user)
45 return json_response({"error": error}, status=404)
46
47 user = request_user[0]
48
49 # Now lookup the user's feed.
50 raise NotImplemented("Yet to implement looking up user's feed")
51
52@oauth_required
53def inbox(request):
54 """ Handles the user's inbox - /api/user/<username>/inbox """
d7b3805f 55 raise NotImplemented("Yet to implement looking up user's inbox")
5a2056f7 56
98596dd0 57#@oauth_required
58def object(request, raw_obj=False):
5a2056f7
JT
59 """ Lookup for a object type """
60 objectType = request.matchdict["objectType"]
61 uuid = request.matchdict["uuid"]
62 if objectType not in ["image"]:
63 error = "Unknown type: {0}".format(objectType)
64 # not sure why this is 404, maybe ask evan. Maybe 400?
65 return json_response({"error": error}, status=404)
66
d461fbe5 67 media = MediaEntry.query.filter_by(slug=uuid).first()
5a2056f7
JT
68 if media is None:
69 # no media found with that uuid
70 error = "Can't find a {0} with ID = {1}".format(objectType, uuid)
71 return json_response({"error": error}, status=404)
72
98596dd0 73 if raw_obj:
74 return media
75
bdde87a4 76 return json_response(media.serialize(request))
98596dd0 77
78def object_comments(request):
79 """ Looks up for the comments on a object """
80 media = object(request, raw_obj=True)
81 response = media
82 if isinstance(response, MediaEntry):
83 comments = response.serialize(request)
84 comments = comments.get("replies", {
85 "totalItems": 0,
86 "items": [],
87 "url": request.urlgen(
88 "mediagoblin.federation.object.comments",
89 objectType=media.objectType,
90 uuid=media.slug,
91 qualified=True)
92 })
93 response = json_response(comments)
94
95 return response
a5682e89 96
97
98##
99# Well known
100##
101def host_meta(request):
102 """ This is /.well-known/host-meta - provides URL's to resources on server """
103 links = []
104
105 # Client registration links
106 links.append({
107 "ref": "registration_endpoint",
108 "href": request.urlgen("mediagoblin.oauth.client_register", qualified=True),
109 })
110 links.append({
111 "ref": "http://apinamespace.org/oauth/request_token",
112 "href": request.urlgen("mediagoblin.oauth.request_token", qualified=True),
113 })
114 links.append({
115 "ref": "http://apinamespace.org/oauth/authorize",
116 "href": request.urlgen("mediagoblin.oauth.authorize", qualified=True),
117 })
118 links.append({
119 "ref": "http://apinamespace.org/oauth/access_token",
120 "href": request.urlgen("mediagoblin.oauth.access_token", qualified=True),
121 })
122
123 return json_response(links)
124
125def whoami(request):
126 """ This is /api/whoami - This is a HTTP redirect to api profile """
127 profile = request.urlgen(
128 "mediagoblin.federation.user.profile",
129 username=request.user.username,
130 qualified=True
131 )
132
133 return redirect(request, location=profile)