aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/guff.cr249
1 files changed, 237 insertions, 12 deletions
diff --git a/src/guff.cr b/src/guff.cr
index 00d6daa..c340cfe 100644
--- a/src/guff.cr
+++ b/src/guff.cr
@@ -219,6 +219,136 @@ module Guff
end
end
+ class PostModel < Model
+ SQL = {
+ add: "
+ INSERT INTO posts(site_id, created_by, state_id) VALUES
+ (?, ?, (SELECT state_id FROM states WHERE state = 'draft'))
+ ",
+
+ set: "
+ UPDATE posts
+ SET %s
+ WHERE post_id = ?
+ ",
+
+ unused: "
+ post_id INTEGER PRIMARY KEY,
+
+ site_id INTEGER NOT NULL
+ REFERENCES sites(site_id),
+
+ created_at TIMESTAMP WITH TIME ZONE NOT NULL
+ DEFAULT CURRENT_TIMESTAMP,
+
+ created_by INTEGER NOT NULL
+ REFERENCES users(user_id),
+
+ state_id INTEGER NOT NULL
+ REFERENCES states(state_id),
+
+ posted_at TIMESTAMP WITH TIME ZONE,
+ expires_at TIMESTAMP WITH TIME ZONE,
+
+ name TEXT NOT NULL DEFAULT '',
+
+ slug TEXT NOT NULL DEFAULT '' CHECK (
+ slug NOT LIKE '% %' AND
+ slug = LOWER(slug)
+ ),
+
+ slug_lock BOOLEAN NOT NULL DEFAULT true,
+
+ body TEXT NOT NULL DEFAULT ''
+ ",
+ }
+
+ def add(
+ site_id : Int64,
+ user_id : Int64,
+ ) : Int64
+ @context.dbs.rw.query(SQL[:add], [site_id.to_s, user_id.to_s])
+ @context.dbs.rw.last_insert_row_id.to_i64
+ end
+
+ ISO8601_TIME = ::Time::Format.new("%Y-%m-%dT%H:%M:%SZ")
+
+ def set(
+ post_id : Int64,
+
+ site_id : Int64? = nil,
+ state : String? = nil,
+
+ have_posted_at : Bool = false,
+ posted_at : Time? = nil,
+
+ have_expires_at : Bool = false,
+ expires_at : Time? = nil,
+
+ slug : String? = nil,
+ slug_lock : Bool? = nil,
+
+ name : String? = nil,
+ body : String? = nil,
+ )
+ sets = [] of String
+ args = [] of String
+
+ if site_id
+ sets << "site_id = ?"
+ args << site_id.to_s
+ end
+
+ if state
+ sets << "state_id = (SELECT state_id FROM states WHERE state = ?)"
+ args << state
+ end
+
+ if have_posted_at
+ if posted_at
+ sets << "posted_at = ?"
+ args << ISO8601_TIME.format(posted_at)
+ else
+ sets << "posted_at = NULL"
+ end
+ end
+
+ if have_expires_at
+ if expires_at
+ sets << "expires_at = ?"
+ args << ISO8601_TIME.format(expires_at)
+ else
+ sets << "expires_at = NULL"
+ end
+ end
+
+ if slug
+ sets << "slug = ?"
+ args << slug
+ end
+
+ if slug_lock.not_nil?
+ sets << "slug_lock = ?"
+ args << (slug_lock ? "1" : "0")
+ end
+
+ if name
+ sets << "name = ?"
+ args << name
+ end
+
+ if body
+ sets << "body = ?"
+ args << body
+ end
+
+ if sets.size > 0
+ args << post_id.to_s
+ @context.dbs.rw.query(SQL[:set] % sets.join(","), args)
+ end
+ end
+ end
+
class PageModel < Model
SQL = {
get_id: "
@@ -239,6 +369,11 @@ module Guff
ORDER BY b.created_at DESC
LIMIT 1
",
+
+ add: "
+ INSERT INTO pages(post_id, layout_id)
+ VALUES (?, (SELECT layout_id FROM layouts WHERE layout = 'default'))
+ ",
}
def get_id(
@@ -248,6 +383,21 @@ module Guff
r = @context.dbs.ro.one(SQL[:get_id], [site_id.to_s, slug])
r ? r.to_i64 : nil
end
+
+ def add(
+ site_id : Int64,
+ user_id : Int64,
+ ) : Int64
+ db = @context.dbs.rw
+ post_id = -1_i64
+
+ db.transaction do
+ post_id = @context.models.post.add(site_id, user_id)
+ db.query(SQL[:add], [post_id.to_s])
+ end
+
+ post_id
+ end
end
class ProjectModel < Model
@@ -270,6 +420,10 @@ module Guff
ORDER BY b.created_at DESC
LIMIT 1
",
+
+ add: "
+ INSERT INTO projects(post_id) VALUES (?)
+ ",
}
def get_id(
@@ -279,6 +433,21 @@ module Guff
r = @context.dbs.ro.one(SQL[:get_id], [site_id.to_s, slug])
r ? r.to_i64 : nil
end
+
+ def add(
+ site_id : Int64,
+ user_id : Int64,
+ ) : Int64
+ db = @context.dbs.rw
+ post_id = -1_i64
+
+ db.transaction do
+ post_id = @context.models.post.add(site_id, user_id)
+ db.query(SQL[:add], [post_id.to_s])
+ end
+
+ post_id
+ end
end
class BlogModel < Model
@@ -301,6 +470,10 @@ module Guff
ORDER BY COALESCE(b.posted_at, b.created_at) DESC
",
+
+ add: "
+ INSERT INTO blogs(post_id) VALUES (?)
+ ",
}
def get_id(
@@ -362,6 +535,21 @@ module Guff
# return results
r
end
+
+ def add(
+ site_id : Int64,
+ user_id : Int64,
+ ) : Int64
+ db = @context.dbs.rw
+ post_id = -1_i64
+
+ db.transaction do
+ post_id = @context.models.post.add(site_id, user_id)
+ db.query(SQL[:add], [post_id.to_s])
+ end
+
+ post_id
+ end
end
class UserModel < Model
@@ -386,12 +574,12 @@ module Guff
AND role_id IN (SELECT role_id FROM roles WHERE role IN (%s))
",
- add_user: "
+ add: "
INSERT INTO users(role_id, name, email, password, is_active) VALUES
((SELECT role_id FROM roles where role = ?), ?, ?, ?, ?)
",
- set_user: "
+ set: "
UPDATE users
SET %s
WHERE user_id = ?
@@ -423,14 +611,14 @@ module Guff
], [user_id.to_s].concat(roles))
end
- def add_user(
+ def add(
name : String,
email : String,
password : String,
role : String,
active : Bool,
) : Int64
- @context.dbs.rw.query(SQL[:add_user], [
+ @context.dbs.rw.query(SQL[:add], [
role,
name,
email,
@@ -441,7 +629,7 @@ module Guff
@context.dbs.rw.last_insert_row_id.to_i64
end
- def set_user(
+ def set(
user_id : Int64,
name : String? = nil,
email : String? = nil,
@@ -479,7 +667,7 @@ module Guff
if sets.size > 0
args << user_id.to_s
- @context.dbs.rw.query(SQL[:set_user] % sets.join(", "), args)
+ @context.dbs.rw.query(SQL[:set] % sets.join(", "), args)
end
end
@@ -597,7 +785,7 @@ module Guff
class SiteModel < Model
SQL = {
- get_site_id: "
+ get_id: "
SELECT site_id
FROM (
@@ -625,7 +813,7 @@ module Guff
}
def get_id(host : String?) : Int64?
- r = @context.dbs.ro.one(SQL[:get_site_id], [host || ""])
+ r = @context.dbs.ro.one(SQL[:get_id], [host || ""])
r ? r.to_i64 : nil
end
end
@@ -639,6 +827,7 @@ module Guff
user: Models::UserModel,
session: Models::SessionModel,
csrf: Models::CSRFModel,
+ post: Models::PostModel,
page: Models::PageModel,
project: Models::ProjectModel,
blog: Models::BlogModel,
@@ -776,9 +965,42 @@ module Guff
end
end
+ module PageAPI
+ def do_page_add(params : HTTP::Params)
+ post_id = @context.models.page.add(
+ site_id: params["site_id"].to_i64,
+ user_id: @context.user_id.not_nil!,
+ )
+
+ { "post_id": post_id }
+ end
+ end
+
+ module ProjectAPI
+ def do_project_add(params : HTTP::Params)
+ post_id = @context.models.project.add(
+ site_id: params["site_id"].to_i64,
+ user_id: @context.user_id.not_nil!,
+ )
+
+ { "post_id": post_id }
+ end
+ end
+
+ module BlogAPI
+ def do_blog_add(params : HTTP::Params)
+ post_id = @context.models.blog.add(
+ site_id: params["site_id"].to_i64,
+ user_id: @context.user_id.not_nil!,
+ )
+
+ { "post_id": post_id }
+ end
+ end
+
module UserAPI
- def do_user_add_user(params : HTTP::Params)
- user_id = @context.models.user.add_user(
+ def do_user_add(params : HTTP::Params)
+ user_id = @context.models.user.add(
name: params["name"],
email: params["email"],
password: params["password"],
@@ -789,8 +1011,8 @@ module Guff
{ "user_id": user_id }
end
- def do_user_set_user(params : HTTP::Params)
- @context.models.user.set_user(
+ def do_user_set(params : HTTP::Params)
+ @context.models.user.set(
user_id: params["user_id"].to_i64,
name: params["name"]?,
email: params["email"]?,
@@ -987,6 +1209,9 @@ module Guff
API_MODULES = [
APIs::PostAPI,
APIs::UserAPI,
+ APIs::PageAPI,
+ APIs::ProjectAPI,
+ APIs::BlogAPI,
]
include_api_modules(API_MODULES)