comparison src/lib/Post.luan @ 9:9674275019bb

reply and edit
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 30 Jun 2022 00:02:28 -0600
parents be36282b556a
children de0cbf515ef5
comparison
equal deleted inserted replaced
8:be36282b556a 9:9674275019bb
1 local Luan = require "luan:Luan.luan" 1 local Luan = require "luan:Luan.luan"
2 local error = Luan.error 2 local error = Luan.error
3 local ipairs = Luan.ipairs or error()
3 local set_metatable = Luan.set_metatable or error() 4 local set_metatable = Luan.set_metatable or error()
4 local Number = require "luan:Number.luan" 5 local Number = require "luan:Number.luan"
5 local long = Number.long or error() 6 local long = Number.long or error()
6 local Time = require "luan:Time.luan" 7 local Time = require "luan:Time.luan"
7 local time_now = Time.now or error() 8 local time_now = Time.now or error()
9 local Html = require "luan:Html.luan"
10 local html_encode = Html.encode or error()
8 local Db = require "site:/lib/Db.luan" 11 local Db = require "site:/lib/Db.luan"
9 12
10 13
11 local Post = {} 14 local Post = {}
12 15
13 local function from_doc(doc) 16 local function from_doc(doc)
14 doc.type == "post" or error "wrong type" 17 doc.type == "post" or error "wrong type"
15 return Post.new { 18 return Post.new {
16 id = doc.id 19 id = doc.id
17 subject = doc.subject
18 content = doc.content 20 content = doc.content
19 date = doc.date 21 date = doc.date
20 author_name = doc.post_author_name 22 author_name = doc.post_author_name
21 author_id = doc.post_author_id 23 author_id = doc.post_author_id
24 root_id = doc.post_root_id
25
26 -- root only
27 subject = doc.subject
22 is_root = doc.post_is_root == "true" 28 is_root = doc.post_is_root == "true"
23 root_id = doc.post_root_id 29
30 -- replies only
31 parent_id = doc.parent_id
24 } 32 }
25 end 33 end
26 34
27 local function to_doc(post) 35 local function to_doc(post)
28 return { 36 return {
29 type = "post" 37 type = "post"
30 id = post.id 38 id = post.id
31 subject = post.subject or error()
32 content = post.content or error() 39 content = post.content or error()
33 date = post.date or time_now() 40 date = post.date or time_now()
34 post_author_name = post.author_name or error() 41 post_author_name = post.author_name or error()
35 post_author_id = long(post.author_id) 42 post_author_id = long(post.author_id)
43 post_root_id = post.root_id and long(post.root_id)
44
45 -- root only
46 subject = post.subject
36 post_is_root = post.is_root and "true" or nil 47 post_is_root = post.is_root and "true" or nil
37 post_root_id = post.root_id and long(post.root_id) 48
49 -- replies only
50 parent_id = post.parent_id
38 } 51 }
39 end 52 end
40 53
41 local metatable = {} 54 local metatable = {}
42 function metatable.__index(post,key) 55 function metatable.__index(post,key)
43 if key == "author" then 56 if key == "author" then
44 local User = require "site:/lib/User.luan" 57 local User = require "site:/lib/User.luan"
45 return User.get_by_id(post.author_id) 58 return User.get_by_id(post.author_id)
59 end
60 if key == "subject_html" then
61 return post.subject and html_encode(post.subject)
62 end
63 if key == "root" then
64 return post.is_root and post or Post.get_by_id(post.root_id)
46 end 65 end
47 return nil 66 return nil
48 end 67 end
49 68
50 function Post.new(post) 69 function Post.new(post)
53 local doc = to_doc(post) 72 local doc = to_doc(post)
54 Db.save(doc) 73 Db.save(doc)
55 post.id = doc.id 74 post.id = doc.id
56 end 75 end
57 76
77 function post.reply(author,content)
78 return Db.run_in_transaction( function()
79 local post = Post.new{
80 root_id = post.root_id
81 parent_id = post.id
82 content = content
83 author_name = author.name
84 author_id = author.id
85 }
86 post.save()
87 return post
88 end )
89 end
90
58 set_metatable(post,metatable) 91 set_metatable(post,metatable)
59 return post 92 return post
60 end 93 end
61 94
62 function Post.get_by_id(id) 95 function Post.get_by_id(id)
63 local doc = Db.get_document("id:"..id) 96 local doc = Db.get_document("id:"..id)
64 return doc and Post.from_doc(doc) 97 return doc and from_doc(doc)
65 end 98 end
66 99
67 function Post.new_thread(author,subject,content) 100 function Post.new_thread(author,subject,content)
68 return Db.run_in_transaction( function() 101 return Db.run_in_transaction( function()
69 local post = Post.new{ 102 local post = Post.new{
70 subject = subject 103 subject = subject or error()
71 content = content 104 content = content
72 author_name = author.name 105 author_name = author.name
73 author_id = author.id 106 author_id = author.id
74 is_root = true 107 is_root = true
75 } 108 }
78 post.save() 111 post.save()
79 return post 112 return post
80 end ) 113 end )
81 end 114 end
82 115
116 function Post.from_docs(docs)
117 local posts = {}
118 for _, doc in ipairs(docs) do
119 local post = from_doc(doc)
120 posts[#posts+1] = post
121 end
122 return posts
123 end
124
83 return Post 125 return Post