summaryrefslogtreecommitdiff
path: root/example/main.lua
blob: 98e3ea817deae03c2c4d878974bc236186405049 (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
-- a helper for handling API results: throws an error if the call
-- was unsuccessful, otherwise returns the result
function must(...)
  local ok, result = ...
  if not ok then
    error(result)
  end
  return result
end

-- open a database connection
local db = must(luna.db.open("file:db.sqlite?_journal=WAL&_sync=NORMAL"))
must(luna.db.exec(db, [[
  CREATE TABLE IF NOT EXISTS hits(creation_time DATETIME NOT NULL);
]], {}))

-- register a GET / route that displays a home page for the example site
luna.router.route("GET /", function (request)
  local response = "{\"method\": \"" .. request.method .. "\""
  response = response .. ", \"path\": \"" .. request.path .. "\"}"

  return 200, {["Content-Type"] = "text/html"}, [[
  <!DOCTYPE html>
  <html>
    <head>
      <title>A simple example of website made for luna</title>
      <link rel="stylesheet" href="/static/style.css">
    </head>
    <body>
      <main class="container">
        <h1>Wow! A simple website made for luna?</h1>
        <nav>
          <div class="menu-link">
            <a href="/json">JSON example</a> &mdash; print basic request data
            in JSON format
          </div>
          <div class="menu-link">
            <a href="/db">DB example</a> &mdash; write a hit into the database
            and return overall number of hits
          </div>
          <div class="menu-link">
            <a href="/request">HTTP request</a> &mdash; send an HTTP-request
            to ifconfig.me and return the result
          </div>
        </nav>
      </main>
    </body>
  </html>]]
end)

-- register a GET /json route and return some request data in response
luna.router.route("GET /json", function (request)
  local response = "{\"method\": \"" .. request.method .. "\""
  response = response .. ", \"path\": \"" .. request.path .. "\"}"

  return 200, {["Content-Type"] = "application/json"}, response
end)

-- register a GET /db route. visiting it writes a hit to the database and
-- displays visits count
luna.router.route("GET /db", function (request)
  local ok, err = luna.db.exec(
    db,
    "INSERT INTO hits VALUES (?)",
    {os.date("%Y-%m-%d %H:%M:%S")}
  )
  if not ok then
    return 500,
           {["Content-Type"] = "application/json"},
           "error while saving to db: " .. err
  end
  local ok, res = luna.db.query(db, "SELECT COUNT(*) FROM hits", {})
  if not ok then
    return 500,
           {["Content-Type"] = "application/json"},
           "error while querying db: " .. res
  end
  return 200, {["Content-Type"] = "text/html"}, "Hits: " .. tostring(res[1][1])
end)

-- register a GET /request route. when visited makes an HTTP-request to
-- https://ifconfig.me service and displays the result
luna.router.route("GET /request", function ()
  local ok, response = luna.http.request("GET", "https://ifconfig.me", {}, "")
  if not ok then
    return 500,
           {["Content-Type"] = "application/json"},
           "error while fetching data from ifconfig.me: " .. response
  end
  return 200, {}, "Your IP is: " .. response.body
end)

-- serve static files from static/ directory
luna.router.static("GET /static/", "static/")

-- register a custom eval handler that will evaluate whatever is passed into
-- luna stdio when it's run with -D flag. in this case we print the result of
-- evaluation. eval handler is evaluated once for each worker so the result
-- may be printed more than once
luna.evalfn(function (text)
  local res = loadstring(text)
  print(res)
end)