aboutsummaryrefslogtreecommitdiff
path: root/src/guff/models/post.cr
diff options
context:
space:
mode:
Diffstat (limited to 'src/guff/models/post.cr')
-rw-r--r--src/guff/models/post.cr128
1 files changed, 87 insertions, 41 deletions
diff --git a/src/guff/models/post.cr b/src/guff/models/post.cr
index 7fd6ec1..7814d9f 100644
--- a/src/guff/models/post.cr
+++ b/src/guff/models/post.cr
@@ -57,7 +57,11 @@ module Guff
remove_posts: "
UPDATE posts
- SET is_active = 0
+
+ SET state = (SELECT state
+ FROM post_states
+ WHERE name = 'deleted')
+
WHERE site_id = :site_id
AND post_id IN (%{post_ids})
",
@@ -199,45 +203,65 @@ module Guff
)
end
- DATE_FILTERS = {
- :year => {
- :re => /^\d{4}$/,
- :fmt => "%Y",
+ FILTERS = {
+ year: {
+ type: :int,
+ re: /^\d{4}$/,
+ sql: "(strftime('%%Y', a.posted_at) + 0 = %d)",
},
- :month => {
- :re => /^\d{1,2}$/,
- :fmt => "%m",
+ month: {
+ type: :int,
+ re: /^\d{1,2}$/,
+ sql: "(strftime('%%m', a.posted_at) + 0 = %d)",
},
- :day => {
- :re => /^\d{1,2}$/,
- :fmt => "%d",
+ day: {
+ type: :int,
+ re: /^\d{1,2}$/,
+ sql: "(strftime('%%d', a.posted_at) + 0 = %d)",
},
- }
- DATE_FILTER_CLAUSE = "(
- strftime('%s', a.posted_at) + 0 = %d
- )"
+ slug: {
+ type: :string,
+ sql: "a.slug = '%s'"
+ },
- SLUG_FILTER_CLAUSE = "(
- a.slug = '%s'
- )"
+ state: {
+ type: :string,
+ sql: "(
+ a.state = (
+ SELECT state
+ FROM post_states
+ WHERE name = '%s'
+ )
+ )",
+ },
+ }
private def get_filter_clause(
filters : Hash(Symbol, String)
) : String
- r = [
- "1 = 1" # true
- ]
+ # define results
+ r = ["1 = 1"] # true
- DATE_FILTERS.each do |key, f|
+ FILTERS.each do |key, f|
if val = filters[key]?
# check value format
- raise "invalid #{key} filter" unless val =~ (f[:re] as Regex)
+ if f[:re]? && val !~ (f[:re] as Regex)
+ raise "invalid #{key} filter"
+ end
- # add to filters
- r << DATE_FILTER_CLAUSE % [f[:fmt] as String, val.to_i]
+ # add to results
+ r << (f[:sql] as String) % [case f[:type]
+ when :int
+ val.to_i
+ when :string
+ @db.quote(val)
+ else
+ # never reached
+ raise "unknown format type: #{f[:type]}"
+ end]
end
end
@@ -245,17 +269,12 @@ module Guff
# TODO
end
- # add slug filter
- if filters.has_key?(:slug)
- r << SLUG_FILTER_CLAUSE % [@db.quote(filters[:slug])]
- end
-
- # return result
+ # return filter clause
r.join(" AND ")
end
private def get_sort_clause(
- sort : String
+ sort = "posted_at" : String
) : String
# verify sort column
raise "unknown sort column" unless COLUMNS.has_key?(sort)
@@ -307,6 +326,7 @@ module Guff
name = "" : String,
body = "" : String,
tags = [] of String : Array(String),
+ state = "draft" : String?,
) : Int64
post_id = -1_i64
@@ -327,11 +347,12 @@ module Guff
# get post id
post_id = last_insert_row_id
- # set post tags
- set_tags(
- site_id: site_id,
- post_id: post_id,
- tags: tags,
+ # update state and tags
+ update_post(
+ site_id: site_id,
+ post_id: post_id,
+ tags: tags,
+ state: state,
)
end
@@ -339,6 +360,10 @@ module Guff
post_id
end
+ #######################
+ # update_post methods #
+ #######################
+
def update_post(
site_id = nil : Int?,
post_id = nil : Int?,
@@ -346,10 +371,11 @@ module Guff
name = nil : String?,
body = nil : String?,
tags = nil : Array(String)?,
- posted = nil : Bool?
+ state = nil : String?
)
raise "null post_id" if post_id.nil?
+ # build initial query
sets = [] of String
args = {
"site_id": (site_id || @models.site.get_default).to_s,
@@ -371,9 +397,20 @@ module Guff
args["body"] = body
end
- unless posted.nil?
- val = posted ? "CURRENT_TIMESTAMP" : "NULL"
- sets << "posted_at = %s" % [val]
+ if state
+ # update state
+ sets << "state = (
+ SELECT state
+ FROM post_states
+ WHERE name = :state
+ )"
+ args["state"] = state
+
+ # update posted_at
+ # FIXME: there should be a better way to do this
+ sets << "posted_at = %s" % [
+ (state == "posted") ? "CURRENT_TIMESTAMP" : "NULL"
+ ]
end
if sets.size > 0 || tags
@@ -399,6 +436,10 @@ module Guff
end
end
+ ################
+ # remove_posts #
+ ################
+
def remove_posts(
site_id = nil : Int?,
post_ids = [] of Int : Array(Int)
@@ -415,6 +456,10 @@ module Guff
nil
end
+ ####################
+ # set_tags methods #
+ ####################
+
def set_tags(
site_id = nil : Int?,
post_id = nil : Int?,
@@ -444,6 +489,7 @@ module Guff
end
end
+ # no return value
nil
end
end