85 lines
2.0 KiB
Ruby
85 lines
2.0 KiB
Ruby
module Adamantium
|
|
module Repos
|
|
class PostRepo < Adamantium::Repo[:posts]
|
|
commands :update
|
|
|
|
def create(post_attrs)
|
|
posts.transaction do
|
|
new_post = posts.changeset(:create, post_attrs).commit
|
|
|
|
post_attrs[:category].each do |tag_name|
|
|
next if tag_name == ""
|
|
|
|
tag = posts.tags.where(label: tag_name).one ||
|
|
posts
|
|
.tags
|
|
.changeset(:create, {label: tag_name, slug: tag_name.downcase.strip.tr(" ", "-").gsub(/[^\w-]/, "")})
|
|
.commit
|
|
|
|
posts.post_tags.changeset(:create, {
|
|
post_id: new_post.id,
|
|
tag_id: tag[:id]
|
|
})
|
|
.commit
|
|
end
|
|
|
|
new_post
|
|
end
|
|
end
|
|
|
|
def post_listing(limit: nil)
|
|
posts
|
|
.where(post_type: "post")
|
|
.published
|
|
.combine(:tags)
|
|
.order(Sequel.desc(:published_at))
|
|
.limit(limit)
|
|
.to_a
|
|
end
|
|
|
|
def bookmark_listing(query: nil)
|
|
base = posts
|
|
.where(post_type: "bookmark")
|
|
.published
|
|
.combine(:tags)
|
|
.order(Sequel.desc(:published_at))
|
|
|
|
query ? base.where(Sequel.ilike(:name, "%#{query}%")).to_a : base.to_a
|
|
end
|
|
|
|
def for_rss
|
|
posts
|
|
.where(post_type: "post")
|
|
.published
|
|
.combine(:tags)
|
|
.order(Sequel.desc(:published_at))
|
|
.to_a
|
|
end
|
|
|
|
def fetch!(slug)
|
|
posts
|
|
.published
|
|
.combine(:tags)
|
|
.where(slug: slug)
|
|
.one!
|
|
end
|
|
|
|
def slug_exists?(slug)
|
|
!!posts
|
|
.where(slug: slug)
|
|
.one
|
|
end
|
|
|
|
def delete!(slug)
|
|
delete_post = posts.where(slug: slug).command(:update)
|
|
delete_post.call(published_at: nil)
|
|
end
|
|
|
|
def restore!(slug)
|
|
delete_post = posts.where(slug: slug).command(:update)
|
|
delete_post.call(published_at: Time.now)
|
|
end
|
|
end
|
|
end
|
|
end
|