-
-
Notifications
You must be signed in to change notification settings - Fork 80
Expand file tree
/
Copy pathdiscussion.v
More file actions
131 lines (115 loc) · 3.11 KB
/
discussion.v
File metadata and controls
131 lines (115 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copyright (c) 2019-2026 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by a GPL license that can be found in the LICENSE file.
module main
import time
import veb
struct Discussion {
id int @[primary; sql: serial]
mut:
repo_id int
author_id int
title string
body string
category string // general, qa, announcement, idea
is_locked bool
is_answered bool
answer_id int
comments_count int
created_at int
}
struct DiscussionComment {
id int @[primary; sql: serial]
mut:
discussion_id int
author_id int
text string
created_at int
}
fn (d &Discussion) relative_time() string {
return time.unix(d.created_at).relative()
}
fn (d &Discussion) formatted_title() veb.RawHtml {
return html_escape_text(d.title)
}
fn (d &Discussion) category_label() string {
return match d.category {
'qa' { 'Q&A' }
'announcement' { 'Announcement' }
'idea' { 'Idea' }
else { 'General' }
}
}
fn (c &DiscussionComment) relative() string {
return time.unix(c.created_at).relative()
}
fn (mut app App) add_discussion(repo_id int, author_id int, title string, body string, category string) !int {
d := Discussion{
repo_id: repo_id
author_id: author_id
title: title
body: body
category: category
created_at: int(time.now().unix())
}
sql app.db {
insert d into Discussion
}!
return db_last_insert_id(mut app.db)
}
fn (mut app App) find_discussion(id int) ?Discussion {
rows := sql app.db {
select from Discussion where id == id limit 1
} or { []Discussion{} }
if rows.len == 0 {
return none
}
return rows.first()
}
fn (mut app App) list_repo_discussions(repo_id int) []Discussion {
return sql app.db {
select from Discussion where repo_id == repo_id order by created_at desc
} or { []Discussion{} }
}
fn (mut app App) add_discussion_comment(discussion_id int, author_id int, text string) ! {
c := DiscussionComment{
discussion_id: discussion_id
author_id: author_id
text: text
created_at: int(time.now().unix())
}
sql app.db {
insert c into DiscussionComment
}!
sql app.db {
update Discussion set comments_count = comments_count + 1 where id == discussion_id
}!
}
fn (mut app App) get_discussion_comments(discussion_id int) []DiscussionComment {
return sql app.db {
select from DiscussionComment where discussion_id == discussion_id order by created_at
} or { []DiscussionComment{} }
}
fn (mut app App) set_discussion_lock(discussion_id int, locked bool) ! {
sql app.db {
update Discussion set is_locked = locked where id == discussion_id
}!
}
fn (mut app App) mark_discussion_answer(discussion_id int, comment_id int) ! {
sql app.db {
update Discussion set is_answered = true, answer_id = comment_id where id == discussion_id
}!
}
fn (mut app App) delete_discussion(id int) ! {
sql app.db {
delete from DiscussionComment where discussion_id == id
}!
sql app.db {
delete from Discussion where id == id
}!
}
fn (mut app App) delete_repo_discussions(repo_id int) ! {
ds := app.list_repo_discussions(repo_id)
for d in ds {
app.delete_discussion(d.id) or {}
}
}