This repository was archived by the owner on Apr 2, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi.py
More file actions
99 lines (76 loc) · 3.61 KB
/
api.py
File metadata and controls
99 lines (76 loc) · 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import webapp2
from google.appengine.ext import ndb
from google.appengine.api import search
import json
class package(ndb.Model):
name = ndb.StringProperty(required=True);
description = ndb.StringProperty(required=True);
googleID = ndb.StringProperty(required=True);
class user(ndb.Model):
canonicalName = ndb.StringProperty(required=True);
googleID = ndb.StringProperty(required=True);
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.write('This is the search endpoint for the Protobuild index.')
class ReindexPackage(webapp2.RequestHandler):
def get(self, package_id):
self.response.headers['Content-Type'] = 'application/json'
package_key = ndb.Key("package", int(package_id))
package = package_key.get()
if package == None:
self.response.write(json.dumps({"error": True, "message": "No such package"}))
return
owner = user.gql("WHERE googleID = :id", id=package.googleID).get()
if owner == None:
self.response.write(json.dumps({"error": True, "message": "Package has no valid owner"}))
return
index = search.Index(name='names-and-descriptions')
fields = [
search.TextField(name='name', value=package.name),
search.TextField(name='description', value=package.description),
search.AtomField(name='ownerName', value=owner.canonicalName),
]
document = search.Document(doc_id=str(package_id), fields=fields)
try:
index.put(document)
self.response.write(json.dumps({"error": False, "message": "Package re-indexed successfully"}))
except search.Error:
self.response.write(json.dumps({"error": True, "message": "Package failed to be indexed"}))
class RemovePackage(webapp2.RequestHandler):
def get(self, package_id):
self.response.headers['Content-Type'] = 'application/json'
package_key = ndb.Key("package", int(package_id))
package = package_key.get()
if package != None:
self.response.write(json.dumps({"error": True, "message": "Package still exists"}))
return
index = search.Index(name='names-and-descriptions')
try:
index.delete([str(package_id)])
self.response.write(json.dumps({"error": False, "message": "Package removed from full text search successfully"}))
except search.Error:
self.response.write(json.dumps({"error": True, "message": "Package failed to be removed"}))
class SearchPackage(webapp2.RequestHandler):
def get(self, query):
self.response.headers['Content-Type'] = 'application/json'
self.response.headers['Access-Control-Allow-Origin'] = '*'
index = search.Index(name='names-and-descriptions')
try:
search_query = search.Query(query_string=query)
search_results = index.search(search_query)
formatted_results = list()
for doc in search_results:
info = {"id": int(doc.doc_id)}
for field in doc.fields:
info[field.name] = field.value
formatted_results.append(info)
self.response.write(json.dumps({"error": False, "results": formatted_results}))
except search.Error:
self.response.write(json.dumps({"error": True, "results": list()}))
application = webapp2.WSGIApplication([
('/', MainPage),
('/reindex/([0-9]+)', ReindexPackage),
('/remove/([0-9]+)', RemovePackage),
('/search/(.+)', SearchPackage),
])