aboutsummaryrefslogtreecommitdiff
path: root/src/guff
diff options
context:
space:
mode:
Diffstat (limited to 'src/guff')
-rw-r--r--src/guff/handlers/blog.cr44
-rw-r--r--src/guff/models/post.cr17
-rw-r--r--src/guff/post.cr10
-rw-r--r--src/guff/results.cr4
-rw-r--r--src/guff/views/ecrs/post.ecr17
5 files changed, 87 insertions, 5 deletions
diff --git a/src/guff/handlers/blog.cr b/src/guff/handlers/blog.cr
index c95938c..2394354 100644
--- a/src/guff/handlers/blog.cr
+++ b/src/guff/handlers/blog.cr
@@ -1,4 +1,5 @@
require "../handler"
+require "../views/html/page"
class Guff::Handlers::BlogHandler < Guff::Handler
ROUTES = [{
@@ -88,17 +89,52 @@ class Guff::Handlers::BlogHandler < Guff::Handler
call_next(context) unless ROUTES.reduce(false) do |matched, route|
unless matched
if md = (route[:re] as Regex).match(path)
- # matched route
- matched = true
-
- context.response.puts "blog: route = %s, md = %s" % [
+ # log blog route match
+ puts "blog: route = %s, md = %s" % [
route.to_s,
md.to_s
]
+
+ # search for matching posts
+ posts = @models.post.get_posts(
+ filters: get_filters(md),
+ tags: [["foo"]],
+ )
+
+ if posts.size > 0
+ # mark as matched
+ matched = true
+
+ # draw result
+ draw(context, route, posts)
+ end
end
end
matched
end
end
+
+ FILTERS = {
+ year: "year",
+ month: "month",
+ day: "day",
+ slug: "slug",
+ }
+
+ private def get_filters(md) : Hash(Symbol, String)
+ FILTERS.reduce({} of Symbol => String) do |r, k, s|
+ r[k] = md[s] if md[s]?
+ r
+ end
+ end
+
+ private def draw(context, route, posts)
+ # create page
+ page = PageHTMLView.new("Posts", posts.rows.map { |post| post.to_s }.join)
+
+ # render page
+ context.response.content_type = page.content_type
+ context.response.puts page
+ end
end
diff --git a/src/guff/models/post.cr b/src/guff/models/post.cr
index 580a9b7..3c4212b 100644
--- a/src/guff/models/post.cr
+++ b/src/guff/models/post.cr
@@ -96,6 +96,12 @@ module Guff
clause: "a.post_id",
},
+ "slug": {
+ default: true,
+ sortable: true,
+ clause: "a.slug",
+ },
+
"name": {
default: true,
sortable: true,
@@ -103,7 +109,7 @@ module Guff
},
"body": {
- default: false,
+ default: true,
sortable: true,
clause: "a.body",
},
@@ -215,6 +221,10 @@ module Guff
strftime('%s', a.posted_at) + 0 = %d
)"
+ SLUG_FILTER_CLAUSE = "(
+ a.slug = '%s'
+ )"
+
private def get_filter_clause(
filters : Hash(Symbol, String)
) : String
@@ -236,6 +246,11 @@ module Guff
# TODO
end
+ # add slug filter
+ if filters.has_key?(:slug)
+ r << SLUG_FILTER_CLAUSE % [@db.quote(filters[:slug])]
+ end
+
# return result
r.join(" AND ")
end
diff --git a/src/guff/post.cr b/src/guff/post.cr
index 735682c..703ed55 100644
--- a/src/guff/post.cr
+++ b/src/guff/post.cr
@@ -1,3 +1,6 @@
+require "html"
+require "ecr/macros"
+
class Guff::Post
def initialize(@row : Hash(String, ::SQLite3::Value))
end
@@ -18,4 +21,11 @@ class Guff::Post
[] of String
end
end
+
+ private def h(s) : String
+ HTML.escape(s)
+ end
+
+ # FIXME: does this belong elsewhere?
+ ECR.def_to_s("./src/guff/views/ecrs/post.ecr")
end
diff --git a/src/guff/results.cr b/src/guff/results.cr
index 3fdc6e4..61d5ce5 100644
--- a/src/guff/results.cr
+++ b/src/guff/results.cr
@@ -25,5 +25,9 @@ module Guff
rows: @rows,
}.to_json
end
+
+ def size
+ @num_rows
+ end
end
end
diff --git a/src/guff/views/ecrs/post.ecr b/src/guff/views/ecrs/post.ecr
new file mode 100644
index 0000000..6a0f079
--- /dev/null
+++ b/src/guff/views/ecrs/post.ecr
@@ -0,0 +1,17 @@
+<div
+ id='p-<%=
+ # id
+ @row["post_id"]
+ %>'
+ class='post'
+>
+ <div class='title'>t: <%=
+ # title
+ @row["name"]
+ %></div>
+
+ <div class='body'>b: <%=
+ # body
+ @row["body"]
+ %>
+</div>