diff --git a/app.moon b/app.moon index 9cdea37..42fbe44 100644 --- a/app.moon +++ b/app.moon @@ -1,28 +1,58 @@ lapis = require "lapis" db = require "lapis.db" csrf = require "lapis.csrf" +encoding = require "lapis.util.encoding" +import capture_errors from require "lapis.application" +import assert_valid from require "lapis.validate" import respond_to from require "lapis.application" import Model from require "lapis.db.model" -class User extends Model - @primary_key: "login" +class Users extends Model class App extends lapis.Application "/": => render: "index" - [form: "/form"]: respond_to { + [register: "/register"]: capture_errors respond_to { GET: => - assert @ - csrf_token = csrf.generate_token @ - @html => - form method: "POST", action: "/form", -> - input type: "hidden", name: "csrf_token", value: csrf_token - input type: "submit" + @csrf_token = csrf.generate_token @ + render: true POST: => csrf.assert_token @ - "The form is valid!" + assert_valid @params, { + { "email", exists: true, min_length: 3 } + { "password", exists: true, min_length: 3 } + { "password_again", equals: @params.password } + { "name", exists: true, min_length: 3} + } + + @params.password = encoding.encode_base64 encoding.hmac_sha1("ninjas", @params.password) + @params.password_again = nil + @params.csrf_token = nil + @params.extension = "9001" + + if Users\find email: @params.email + return "User with that email already exists" + + user = Users\create @params + + "Hi " .. user.name + } + + [login: "/login"]: capture_errors respond_to { + GET: => + @csrf_token = csrf.generate_token @ + render: true + + POST: => + csrf.assert_token @ + assert_valid @params, { + { "email", exists: true, min_length: 3 } + { "password", exists: true, min_length: 3 } + } + + user = Users\find email: @params.email } diff --git a/migrations.moon b/migrations.moon index f77906c..fb7b5cd 100644 --- a/migrations.moon +++ b/migrations.moon @@ -13,4 +13,7 @@ import add_column, create_table, types from require "lapis.db.schema" [2]: => add_column "users", "admin", types.boolean + + [3]: => + add_column "users", "extension", types.text } diff --git a/views/login.moon b/views/login.moon new file mode 100644 index 0000000..5aa1ac8 --- /dev/null +++ b/views/login.moon @@ -0,0 +1,14 @@ +import Widget from require "lapis.html" + +class LoginForm extends Widget + content: => + form method: "POST", action: "/login", -> + p -> + text "email address" + input type: "hidden", name: "csrf_token", value: @csrf_token + input type: "text", name: "email" + p -> + text "password" + input type: "password", name: "password" + br! + input type: "submit" diff --git a/views/register.moon b/views/register.moon new file mode 100644 index 0000000..4915bec --- /dev/null +++ b/views/register.moon @@ -0,0 +1,26 @@ +import Widget from require "lapis.html" + +class LoginForm extends Widget + content: => + form method: "POST", action: "/register", -> + input type: "hidden", name: "csrf_token", value: @csrf_token + + p -> + text "email address" + input type: "text", name: "email" + + p -> + text "password" + input type: "password", name: "password" + + p -> + text "password" + input type: "password", name: "password_again" + + p -> + text "name" + input type: "text", name: "name" + + br! + + input type: "submit"