gamnit: fix nitunit
[nit.git] / contrib / tnitter / src / action.nit
index d95cfe3..f567294 100644 (file)
 module action
 
 import nitcorn
+import json
 
 import model
+import database
+
+# Path to the Sqlite3 database
+fun tnitter_db_path: String do return "tnitter.db"
 
 redef class Session
        # User logged in
@@ -27,12 +32,9 @@ redef class Session
 end
 
 # Main Tnitter Action
-class Tnitter
+class TnitterWeb
        super Action
 
-       var db_path = "tnitter.db"
-       var db = new DB.open(db_path)
-
        # Header on pages served by this `Action`
        #
        # Keywords to `Text::replace`:
@@ -80,6 +82,9 @@ class Tnitter
        <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
        <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
+       <script>
+               {{{javascript_header or else ""}}}
+       </script>
 </head>
 <body>
 
@@ -91,6 +96,9 @@ class Tnitter
 </body>
 </html>"""
 
+       # Custom JavaScript code added within a `<script>` block to each page
+       var javascript_header: nullable Writable = null is writable
+
        redef fun answer(request, turi)
        do
                # Get existing session
@@ -99,6 +107,8 @@ class Tnitter
                # Error to display on page as a dismissable panel
                var error = null
 
+               var db = new DB.open(tnitter_db_path)
+
                # Login/logout
                if turi == "/login" and request.post_args.keys.has("user") and
                   request.post_args.keys.has("pass") then
@@ -132,14 +142,16 @@ class Tnitter
                        session = null
                else if turi == "/post" and request.post_args.keys.has("text") and session != null then
                        var user = session.user
-                       if user != null then
+                       var text = request.post_args["text"].trim
+                       if user != null and not text.is_empty then
                                # Post a Tnit!
-                               var text = request.post_args["text"]
                                db.post(user, text)
+                               db.close
 
                                # Redirect the user to avoid double posting
                                var response = new HttpResponse(303)
                                response.header["Location"] = request.uri
+                               response.session = session
                                return response
                        end
                end
@@ -203,7 +215,8 @@ class Tnitter
                else error_html = ""
 
                # Load the last 16 Tnits
-               var posts = db.latest_posts(16)
+               var posts = db.list_posts(0, 16)
+               db.close
 
                var html_posts = new Array[String]
                for post in posts do
@@ -235,3 +248,32 @@ class Tnitter
                return response
        end
 end
+
+# Tnitter RESTful interface
+class TnitterREST
+       super Action
+
+       redef fun answer(request, turi)
+       do
+               if turi == "/list" then
+                       # list?from=1&count=2 -> Error | Array[Post]
+
+                       var from = request.int_arg("from") or else 0
+                       var count = request.int_arg("count") or else 8
+
+                       var db = new DB.open(tnitter_db_path)
+                       var posts = db.list_posts(from, count)
+                       db.close
+
+                       var response = new HttpResponse(200)
+                       response.body = posts.serialize_to_json
+                       return response
+               end
+
+               # Format not recognized
+               var error = new Error("Bad Request")
+               var response = new HttpResponse(400)
+               response.body = error.serialize_to_json
+               return response
+       end
+end