From 1d3ed4d293d740b2ce1416b6c77a742077ecd565 Mon Sep 17 00:00:00 2001
From: Nils G <nils.gondermann@ruhr-uni-bochum.de>
Date: Mon, 13 Apr 2020 13:53:45 +0200
Subject: [PATCH] Added first WebClient page

---
 controllers/default.py   |  2 +-
 controllers/player.py    | 26 ++++++++++++++++++++++++++
 modules/http_util.py     |  1 +
 modules/room_util.py     |  9 +++++++++
 static/css/base.css      | 18 ++++++++++++++++++
 static/css/client.css    |  4 ++++
 static/js/ajax.js        | 15 +++++++++++++++
 views/default/index.html | 31 +++++++++++++++++++++++--------
 views/layout.html        | 16 ++++++++++++++++
 9 files changed, 113 insertions(+), 9 deletions(-)
 create mode 100644 controllers/player.py
 create mode 100644 static/css/base.css
 create mode 100644 static/css/client.css
 create mode 100644 static/js/ajax.js

diff --git a/controllers/default.py b/controllers/default.py
index d971f34..3f780d0 100644
--- a/controllers/default.py
+++ b/controllers/default.py
@@ -1,4 +1,4 @@
 import random
 
 def index():
-    return dict(var=random.random(), meta=db(db.Meta).select().first())
+    return dict()
diff --git a/controllers/player.py b/controllers/player.py
new file mode 100644
index 0000000..12d9493
--- /dev/null
+++ b/controllers/player.py
@@ -0,0 +1,26 @@
+from parameter_util import JSON_BODY, JSON_CONTAINS
+from http_util import FAIL, CODE_JSON, CODE_MISSING, CODE_SEMANTIC, CODE_GONE, CODE_NOTFOUND
+from room_util import ROOM_GET_CODE
+
+def create():
+    parameters = JSON_BODY(request)
+
+    if parameters == None:
+        return(FAIL(CODE_JSON))
+
+    if not JSON_CONTAINS(parameters, [('room_code', str), ('user_name', str)]):
+        return(FAIL(CODE_MISSING))
+
+    room_code = parameters["room_code"]
+    user_name = parameters["user_name"]
+
+    if (len(room_code) != 4) or (len(user_name) == 0) or (len(user_name) > 15):
+        return(FAIL(CODE_SEMANTIC))
+
+    room_record = ROOM_GET_CODE(room_code)
+
+    if not room_record:
+        return(FAIL(CODE_NOTFOUND))
+
+    db.Player.insert(name=user_name, room_id=room_record.id)
+    return(200)
diff --git a/modules/http_util.py b/modules/http_util.py
index 3a9ca10..2a08f64 100644
--- a/modules/http_util.py
+++ b/modules/http_util.py
@@ -4,6 +4,7 @@ CODE_MISSING = 400
 CODE_JSON = 406
 CODE_GONE = 410
 CODE_SEMANTIC = 422
+CODE_NOTFOUND = 404
 
 def FAIL(_code):
     current.response.status = _code
diff --git a/modules/room_util.py b/modules/room_util.py
index 13290b8..a3c4731 100644
--- a/modules/room_util.py
+++ b/modules/room_util.py
@@ -12,6 +12,15 @@ def ROOM_GET(_id, _password):
     return(room_record)
 
 
+def ROOM_GET_CODE(_code):
+    room_record = current.db((current.db.Room.code == _code) & (current.db.Room.closed == False)).select().first()
+
+    if not room_record:
+        return(None)
+
+    return(room_record)
+
+
 def PLAYERS_GET(_room):
     rows = current.db(current.db.Player.room_id == _room.id).select(orderby=current.db.Player.id)
 
diff --git a/static/css/base.css b/static/css/base.css
new file mode 100644
index 0000000..1055cf2
--- /dev/null
+++ b/static/css/base.css
@@ -0,0 +1,18 @@
+#footer {
+    position: fixed;
+
+    left: 0px;
+    bottom: 0px;
+    width: 100%;
+
+    margin-top: 20px;
+    padding: 5px;
+
+    background-color: gray;
+    text-align: center;
+}
+
+#footer a {
+    color: white;
+    text-decoration: none;
+}
diff --git a/static/css/client.css b/static/css/client.css
new file mode 100644
index 0000000..d8f9aa6
--- /dev/null
+++ b/static/css/client.css
@@ -0,0 +1,4 @@
+body {
+    text-align: center;
+    background-color: lightgrey;
+}
diff --git a/static/js/ajax.js b/static/js/ajax.js
new file mode 100644
index 0000000..4268188
--- /dev/null
+++ b/static/js/ajax.js
@@ -0,0 +1,15 @@
+function AJAX_JSON(_url, _payload, _returnFunction) {
+    $.ajax({
+            type: 'POST',
+            url: _url,
+            dataType: 'json',
+            data: JSON.stringify(_payload),
+            contentType : 'application/json',
+            success: function(data) {
+                _returnFunction(200, data);
+            },
+            error: function(xhr, statusText, errorThrown){
+                _returnFunction(xhr.status, errorThrown);
+            }
+    });
+}
diff --git a/views/default/index.html b/views/default/index.html
index 7888001..0a2a625 100644
--- a/views/default/index.html
+++ b/views/default/index.html
@@ -1,8 +1,23 @@
-<html>
-	<body>
-		This is a test {{=var}}<br><br>
-        This is commit <b>{{=meta.git_commit[:10] if len(meta.git_commit) > 10 else meta.git_commit}}</b> from <b>{{=meta.git_date}}</b> show on
-        <a href="https://git.noc.ruhr-uni-bochum.de/studienprojekt-ss20/lynchburg-server/-/commit/{{=meta.git_commit}}">GitLab</a><br>
-        Database from: {{=meta.creation}}
-	</body>
-</html>
+{{extend 'layout.html'}}
+
+{{block head}}
+<link rel="stylesheet" type="text/css" href="{{=URL('static/css', 'client.css')}}">
+{{end}}
+
+<div id="current_content">
+    <form id="form_login">
+        <input type="text" id="room_code" placeholder="Room Code" maxlength="4"><br><br>
+        <input type="text" id="user_name" placeholder="User Name" maxlength="15"><br><br>
+        <input type="submit" value="Enter">
+    </form>
+</div>
+
+{{block page_js}}
+<script type="text/javascript">
+    $("#form_login").on("submit", function(){
+        var payload = {"room_code": $("#room_code").val(), "user_name": $("#user_name").val()}
+        AJAX_JSON("{{=URL('player', 'create')}}", payload, function(code, data){alert(code);});
+        return false;
+    });
+</script>
+{{end}}
diff --git a/views/layout.html b/views/layout.html
index ded03bf..ec20e88 100644
--- a/views/layout.html
+++ b/views/layout.html
@@ -2,9 +2,25 @@
     <head>
         <meta charset="utf-8">
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
+        <link rel="stylesheet" type="text/css" href="{{=URL('static/css', 'base.css')}}">
         <script src="{{=URL('static','js/jquery.js')}}" type="text/javascript"></script>
+        <script src="{{=URL('static','js/ajax.js')}}" type="text/javascript"></script>
+
+        {{block head}}{{end head}}
     </head>
     <body>
+
+        <!-- Page Content -->
         {{include}}
+        <!-- ======================== -->
+
+        <div id="footer">
+            [ <a href="{{=URL('default', 'index')}}">WebClient</a> ]
+            [ <a href="{{=URL('debug', 'index')}}">Debug</a> ]
+            [ <a href="https://git.noc.ruhr-uni-bochum.de/studienprojekt-ss20">GitLab</a> ]
+        <!-- Page specific JavaScript -->
+        {{block page_js}}{{end page_js}}
+        <!-- ======================== -->
+
     </body>
 </html>
-- 
GitLab