aboutsummaryrefslogtreecommitdiff
path: root/site/service/request.py
blob: ae7d84383596df3dc21ae71977fc85f5c52395c4 (plain)
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
99
100
101
102
103
104
105
106
#!/usr/bin/python
import json
import os
import cgi
import sys
import db

class PostRequest(object):
    def run(self, data):
        pass

def GetRequest(object):
    def run(self, data):
        pass

class TextResponse(object):
    def __init__(self, text):
        self.text = text
    def respond(self):
        print "Content-Type: text/plain\r\n\r\n"
        print self.text

class Response(object):
    def __init__(self, data=None):
        if data is None or data is True:
            data = {"success": True}
        elif data is False:
            data = {"success": False}
        elif data.get("success") is None:
            data["success"] = True
        self.data = data
    def respond(self):
        print "Content-type: text/json\r\n\r\n"
        print json.dumps(self.data)

class LogError(PostRequest):
    def run(self, data):
        if not data.get("session_id"):
            session = db.Session.create()
        else:
            session = db.Session.select().where(db.Session.id == data["session_id"]).get()
        db.JData.create(
            session=session,
            category="error",
            data=data["error"]
        )
        return Response({"session_id": session.id})


class SaveData(PostRequest):
    def run(self, data):
        query = db.JData.create(
            session=data.get("session_id"),
            category=data["category"],
            data=data["data"]
        )
        return Response()

class GetData(PostRequest):
    def run(self, data):
        query = db.JData.select()
        query = query.where(db.JData.id == data.id)
        
        if not query.exists():
            return Response(False)
        resp = data.get()
        return Response({"data": resp})

class UploadAudio(PostRequest):
    def run(self, data):
        return Response(False)
        filename, ext = os.path.splitext(path)
        if ext.lower() != ".mp3":
            cmd = ["ffmpeg", "-i", path, "-acodec", "libmp3lame", "-q:a", "5", output]

def handle():
    try:
        method = os.environ["REQUEST_METHOD"]
        if method == "POST":
            data = json.loads(sys.stdin.read())
            request_type = data.get("request_type")
            base_class = PostRequest
        elif method == "GET":
            data = cgi.FieldStorage()
            request_type = data.getvalue("request_type")
            base_class = GetRequest
        else:
            raise Exception("No handler for this method")

        request_types = {}
        for item in base_class.__subclasses__():
            request_types[item.__name__] = item
        request_class = request_types.get(request_type)
        if not request_class:
            raise Exception("No handler for this request" + str(data))
        req = request_class()
        response = req.run(data)
        response.respond()
    except Exception, ex:
        import traceback
        print "Content-Type: text/json\r\n\r\n"
        resp = {"success": False, "error": str(ex), "traceback": traceback.format_exc()}
        print json.dumps(resp)

if __name__ == "__main__":
    handle()