-
Notifications
You must be signed in to change notification settings - Fork 0
/
query.go
162 lines (153 loc) · 3.7 KB
/
query.go
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package main
func GetAllPosts(offset int) ([]Post, error) {
var posts = []Post{}
rows, err := db.Query(`
SELECT id, title, slug, body, published
FROM posts
ORDER BY published DESC
LIMIT $1 OFFSET $2`, PageLimit, offset)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
post := Post{}
err = rows.Scan(&post.Id, &post.Title, &post.Slug, &post.Body, &post.Published)
if err == nil {
post.Tags, err = GetPostTags(post.Id)
if err == nil {
posts = append(posts, post)
} else {
return nil, err
}
} else {
return nil, err
}
}
return posts, nil
}
func GetSinglePost(id int, slug string) (Post, error) {
var post Post
var err error
row := db.QueryRow(`
SELECT id, title, slug, body, published
FROM posts
WHERE id = $1 AND slug = $2`, id, slug)
err = row.Scan(&post.Id, &post.Title, &post.Slug, &post.Body, &post.Published)
if err != nil {
return post, err
}
post.Tags, err = GetPostTags(post.Id)
if err != nil {
return post, err
}
return post, err
}
func CountPosts() (int, error) {
var count int
err := db.QueryRow("SELECT COUNT(*) FROM posts").Scan(&count)
if err == nil {
return count, nil
}
return count, err
}
func CountPostsByTag(tag string) (int, error) {
var count int
err := db.QueryRow(`
SELECT COUNT(*) FROM posts
WHERE id IN (SELECT postid FROM posts_tags WHERE tagid = (SELECT id FROM tags WHERE name = $1))`, tag).Scan(&count)
if err == nil {
return count, nil
}
return count, err
}
func GetPostById(id int) (*Post, error) {
var post Post
var err error
row := db.QueryRow(`
SELECT id, title, slug, body, published
FROM posts
WHERE id = $1`, id)
err = row.Scan(&post.Id, &post.Title, &post.Slug, &post.Body, &post.Published)
if err != nil {
return nil, err
}
post.Tags, err = GetPostTags(post.Id)
if err != nil {
return nil, err
}
return &post, err
}
func CreateComment(postid int, name, body string) error {
var err error
result, err := db.Exec(`INSERT INTO comments (post, name, body) VALUES ($1, $2, $3)`, postid, name, body)
if err == nil {
// LastInsertId not supported by this postgres driver
_, err = result.RowsAffected()
}
return err
}
func AllPostComments(postid int) ([]Comment, error) {
var comments []Comment
rows, err := db.Query(`SELECT id, name, body, created FROM comments WHERE post = $1`, postid)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
comment := Comment{}
err = rows.Scan(&comment.Id, &comment.Name, &comment.Body, &comment.Created)
if err != nil {
return nil, err
}
comments = append(comments, comment)
}
return comments, nil
}
func GetPostTags(postid int) ([]Tag, error) {
var err error
var tags = []Tag{}
rows, err := db.Query(`
SELECT tags.id, tags.name
FROM tags
WHERE id IN (SELECT tagid FROM posts_tags WHERE postid = $1)`, postid)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
tag := Tag{}
err = rows.Scan(&tag.Id, &tag.Name)
if err != nil {
return nil, err
}
tags = append(tags, tag)
}
return tags, nil
}
func GetPostsByTag(tag string, offset int) ([]Post, error) {
var err error
var posts []Post
rows, err := db.Query(`
SELECT id, title, slug, body, published FROM posts
WHERE id IN (SELECT postid FROM posts_tags WHERE tagid = (SELECT id FROM tags WHERE name = $1))
ORDER BY published DESC
LIMIT $2 OFFSET $3`, tag, PageLimit, offset)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
post := Post{}
err = rows.Scan(&post.Id, &post.Title, &post.Slug, &post.Body, &post.Published)
if err != nil {
return nil, err
}
post.Tags, err = GetPostTags(post.Id)
if err != nil {
return nil, err
}
posts = append(posts, post)
}
return posts, nil
}