pico
created pr with
97.1
added 97.2
1: fdc255e = 1: fdc255e refactor: remove unused db methods
2: 3f855f6 = 2: 3f855f6 chore: add tests for postgres db impl
3: 7cd29a6 = 3: 7cd29a6 refactor: use sqlx interface
4: acd449e = 4: acd449e chore: add db tags
5: f6ed0d7 = 5: f6ed0d7 refactor: use sqlx
6: 29035c6 = 6: 29035c6 refactor: replace custom sql functions with sqlx
7: d4ea6d9 = 7: d4ea6d9 refactor: inline all sql queries
-: ------- > 8: 4bd37ed refactor: use `select * from` where possible
cmds
checkout latest patchset:
ssh pr.pico.sh print 97 | git am -3checkout any patchset in a patch request:
ssh pr.pico.sh print 97.[rev] | git am -3add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 97
Patchset
97.2
refactor: remove unused db methods
Eric Bower
chore: add tests for postgres db impl
2025-12-18T03:03:10ZEric Bower
refactor: use sqlx interface
2025-12-18T03:17:57ZEric Bower
chore: add db tags
2025-12-18T03:27:57ZEric Bower
refactor: use sqlx
2025-12-18T03:31:25ZEric Bower
refactor: replace custom sql functions with sqlx
2025-12-18T03:43:01ZEric Bower
→ refactor: inline all sql queries
2025-12-18T03:57:00ZEric Bower
refactor: use `select * from` where possible
2025-12-18T04:02:50ZEric Bower
2025-12-18T04:33:58Z
refactor: inline all sql queries
Eric Bower
2025-12-18T04:02:50ZSemantic diff summary
0 added,
39 modified,
0 signature changed,
0 removed
across 1 analyzed file
pkg/db/postgres/storage.go
-
chunklines 23-28modified -
function_declarationRegisterUsermodified -
method_declarationfindPublicKeyForKeymodified -
method_declarationFindKeysForUsermodified -
method_declarationRemoveKeysmodified -
method_declarationFindUsermodified -
method_declarationFindUserByNamemodified -
function_declarationfindUserForNameAndKeymodified -
method_declarationFindUserForTokenmodified -
function_declarationFindUserForTokenmodified -
function_declarationFindPostWithFilenamemodified -
method_declarationFindPostmodified -
function_declarationpostPagermodified -
method_declarationFindPostsForFeedmodified -
function_declarationFindPostsForFeedmodified -
function_declarationInsertPostmodified -
method_declarationRemovePostsmodified -
function_declarationFindPostsForUsermodified -
method_declarationFindAllPostsForUsermodified -
method_declarationFindPostsmodified -
method_declarationFindExpiredPostsmodified -
method_declarationFindUsersmodified -
method_declarationremoveTagsForPostmodified -
function_declarationinsertTagsForPostmodified -
method_declarationremoveAliasesForPostmodified -
function_declarationinsertAliasesForPostmodified -
function_declarationReplaceAliasesForPostmodified -
function_declarationFindUserPostsByTagmodified -
method_declarationFindPopularTagsmodified -
method_declarationFindFeaturemodified -
function_declarationInsertFeedItemsmodified -
method_declarationFindFeedItemsByPostIDmodified -
function_declarationInsertProjectmodified -
method_declarationUpdateProjectmodified -
method_declarationFindProjectByNamemodified -
method_declarationInsertTokenmodified -
method_declarationfindTokenByNamemodified -
method_declarationRemoveTokenmodified -
method_declarationFindTokensForUsermodified
+181
-232
pkg/db/postgres/storage.go
#
| ... | ... | @@ -23,196 +23,6 @@ var SelectPost = ` | |
| 23 | 23 | posts.id, user_id, app_users.name, filename, slug, title, text, description, | |
| 24 | 24 | posts.created_at, publish_at, posts.updated_at, hidden, file_size, mime_type, shasum, data, expires_at, views` | |
| 25 | 25 | ||
| 26 | - | var ( | |
| 27 | - | sqlSelectPosts = fmt.Sprintf(` | |
| 28 | - | SELECT %s | |
| 29 | - | FROM posts | |
| 30 | - | LEFT JOIN app_users ON app_users.id = posts.user_id`, SelectPost) | |
| 31 | - | ||
| 32 | - | sqlSelectPostWithFilename = fmt.Sprintf(` | |
| 33 | - | SELECT %s, STRING_AGG(coalesce(post_tags.name, ''), ',') tags | |
| 34 | - | FROM posts | |
| 35 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 36 | - | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 37 | - | WHERE filename = $1 AND user_id = $2 AND cur_space = $3 | |
| 38 | - | GROUP BY %s`, SelectPost, SelectPost) | |
| 39 | - | ||
| 40 | - | sqlSelectPostWithSlug = fmt.Sprintf(` | |
| 41 | - | SELECT %s, STRING_AGG(coalesce(post_tags.name, ''), ',') tags | |
| 42 | - | FROM posts | |
| 43 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 44 | - | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 45 | - | WHERE slug = $1 AND user_id = $2 AND cur_space = $3 | |
| 46 | - | GROUP BY %s`, SelectPost, SelectPost) | |
| 47 | - | ||
| 48 | - | sqlSelectPost = fmt.Sprintf(` | |
| 49 | - | SELECT %s | |
| 50 | - | FROM posts | |
| 51 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 52 | - | WHERE posts.id = $1`, SelectPost) | |
| 53 | - | ||
| 54 | - | sqlSelectExpiredPosts = fmt.Sprintf(` | |
| 55 | - | SELECT %s | |
| 56 | - | FROM posts | |
| 57 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 58 | - | WHERE | |
| 59 | - | cur_space = $1 AND | |
| 60 | - | expires_at <= now(); | |
| 61 | - | `, SelectPost) | |
| 62 | - | ||
| 63 | - | sqlSelectPostsForUser = fmt.Sprintf(` | |
| 64 | - | SELECT %s, STRING_AGG(coalesce(post_tags.name, ''), ',') tags | |
| 65 | - | FROM posts | |
| 66 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 67 | - | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 68 | - | WHERE | |
| 69 | - | hidden = FALSE AND | |
| 70 | - | user_id = $1 AND | |
| 71 | - | publish_at::date <= CURRENT_DATE AND | |
| 72 | - | cur_space = $2 | |
| 73 | - | GROUP BY %s | |
| 74 | - | ORDER BY publish_at DESC, slug DESC | |
| 75 | - | LIMIT $3 OFFSET $4`, SelectPost, SelectPost) | |
| 76 | - | ||
| 77 | - | sqlSelectAllPostsForUser = fmt.Sprintf(` | |
| 78 | - | SELECT %s | |
| 79 | - | FROM posts | |
| 80 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 81 | - | WHERE | |
| 82 | - | user_id = $1 AND | |
| 83 | - | cur_space = $2 | |
| 84 | - | ORDER BY publish_at DESC`, SelectPost) | |
| 85 | - | ||
| 86 | - | sqlSelectPostsByTag = ` | |
| 87 | - | SELECT | |
| 88 | - | posts.id, | |
| 89 | - | user_id, | |
| 90 | - | filename, | |
| 91 | - | slug, | |
| 92 | - | title, | |
| 93 | - | text, | |
| 94 | - | description, | |
| 95 | - | publish_at, | |
| 96 | - | app_users.name as username, | |
| 97 | - | posts.updated_at, | |
| 98 | - | posts.mime_type | |
| 99 | - | FROM posts | |
| 100 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 101 | - | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 102 | - | WHERE | |
| 103 | - | post_tags.name = $3 AND | |
| 104 | - | publish_at::date <= CURRENT_DATE AND | |
| 105 | - | cur_space = $4 | |
| 106 | - | ORDER BY publish_at DESC | |
| 107 | - | LIMIT $1 OFFSET $2` | |
| 108 | - | ||
| 109 | - | sqlSelectUserPostsByTag = fmt.Sprintf(` | |
| 110 | - | SELECT %s | |
| 111 | - | FROM posts | |
| 112 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 113 | - | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 114 | - | WHERE | |
| 115 | - | hidden = FALSE AND | |
| 116 | - | user_id = $1 AND | |
| 117 | - | (post_tags.name = $2 OR hidden = true) AND | |
| 118 | - | publish_at::date <= CURRENT_DATE AND | |
| 119 | - | cur_space = $3 | |
| 120 | - | ORDER BY publish_at DESC | |
| 121 | - | LIMIT $4 OFFSET $5`, SelectPost) | |
| 122 | - | ) | |
| 123 | - | ||
| 124 | - | const ( | |
| 125 | - | sqlSelectPublicKey = `SELECT id, user_id, name, public_key, created_at FROM public_keys WHERE public_key = $1` | |
| 126 | - | sqlSelectPublicKeys = `SELECT id, user_id, name, public_key, created_at FROM public_keys WHERE user_id = $1 ORDER BY created_at ASC` | |
| 127 | - | sqlSelectUser = `SELECT id, COALESCE(name, '') as name, created_at FROM app_users WHERE id = $1` | |
| 128 | - | sqlSelectUserForName = `SELECT id, name, created_at FROM app_users WHERE name = $1` | |
| 129 | - | sqlSelectUserForNameAndKey = `SELECT app_users.id, app_users.name, app_users.created_at, public_keys.id as pk_id, public_keys.public_key, public_keys.created_at as pk_created_at FROM app_users LEFT JOIN public_keys ON public_keys.user_id = app_users.id WHERE app_users.name = $1 AND public_keys.public_key = $2` | |
| 130 | - | sqlSelectUsers = `SELECT id, COALESCE(name, '') as name, created_at FROM app_users ORDER BY name ASC` | |
| 131 | - | ||
| 132 | - | sqlSelectUserForToken = ` | |
| 133 | - | SELECT app_users.id, app_users.name, app_users.created_at | |
| 134 | - | FROM app_users | |
| 135 | - | LEFT JOIN tokens ON tokens.user_id = app_users.id | |
| 136 | - | WHERE tokens.token = $1 AND tokens.expires_at > NOW()` | |
| 137 | - | sqlInsertToken = `INSERT INTO tokens (user_id, name) VALUES($1, $2) RETURNING token;` | |
| 138 | - | sqlRemoveToken = `DELETE FROM tokens WHERE id = $1` | |
| 139 | - | sqlSelectTokensForUser = `SELECT id, user_id, name, created_at, expires_at FROM tokens WHERE user_id = $1` | |
| 140 | - | sqlSelectTokenByNameForUser = `SELECT token FROM tokens WHERE user_id = $1 AND name = $2` | |
| 141 | - | ||
| 142 | - | sqlSelectFeatureForUser = `SELECT id, user_id, payment_history_id, name, data, created_at, expires_at FROM feature_flags WHERE user_id = $1 AND name = $2 ORDER BY expires_at DESC LIMIT 1` | |
| 143 | - | ||
| 144 | - | sqlSelectPostIdByAliasSlug = `SELECT post_id FROM post_aliases WHERE slug = $1` | |
| 145 | - | sqlSelectTagPostCount = ` | |
| 146 | - | SELECT count(posts.id) | |
| 147 | - | FROM posts | |
| 148 | - | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 149 | - | WHERE hidden = FALSE AND cur_space=$1 and post_tags.name = $2` | |
| 150 | - | sqlSelectPostCount = `SELECT count(id) FROM posts WHERE hidden = FALSE AND cur_space=$1` | |
| 151 | - | // add some users to deny list since they are robogenerating a bunch of posts | |
| 152 | - | // per day and are creating a lot of noise. | |
| 153 | - | sqlSelectPostsByRank = ` | |
| 154 | - | SELECT * | |
| 155 | - | FROM ( | |
| 156 | - | SELECT DISTINCT ON (posts.user_id) | |
| 157 | - | posts.id, | |
| 158 | - | posts.user_id, | |
| 159 | - | posts.filename, | |
| 160 | - | posts.slug, | |
| 161 | - | posts.title, | |
| 162 | - | posts.text, | |
| 163 | - | posts.description, | |
| 164 | - | posts.publish_at, | |
| 165 | - | app_users.name AS username, | |
| 166 | - | posts.updated_at, | |
| 167 | - | posts.mime_type | |
| 168 | - | FROM posts | |
| 169 | - | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 170 | - | WHERE | |
| 171 | - | hidden = FALSE | |
| 172 | - | AND publish_at::date <= CURRENT_DATE | |
| 173 | - | AND cur_space = $3 | |
| 174 | - | ORDER BY posts.user_id, publish_at DESC | |
| 175 | - | ) AS latest_posts | |
| 176 | - | ORDER BY publish_at DESC | |
| 177 | - | LIMIT $1 OFFSET $2` | |
| 178 | - | ||
| 179 | - | sqlSelectPopularTags = ` | |
| 180 | - | SELECT name, count(post_id) as "tally" | |
| 181 | - | FROM post_tags | |
| 182 | - | LEFT JOIN posts ON posts.id = post_id | |
| 183 | - | WHERE posts.cur_space = $1 | |
| 184 | - | GROUP BY name | |
| 185 | - | ORDER BY tally DESC | |
| 186 | - | LIMIT 5` | |
| 187 | - | sqlSelectFeedItemsByPost = `SELECT id, post_id, guid, data, created_at FROM feed_items WHERE post_id=$1` | |
| 188 | - | ||
| 189 | - | sqlInsertPost = ` | |
| 190 | - | INSERT INTO posts | |
| 191 | - | (user_id, filename, slug, title, text, description, publish_at, hidden, cur_space, | |
| 192 | - | file_size, mime_type, shasum, data, expires_at, updated_at) | |
| 193 | - | VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) | |
| 194 | - | RETURNING id` | |
| 195 | - | sqlInsertUser = `INSERT INTO app_users (name) VALUES($1) returning id` | |
| 196 | - | sqlInsertTag = `INSERT INTO post_tags (post_id, name) VALUES($1, $2) RETURNING id;` | |
| 197 | - | sqlInsertAliases = `INSERT INTO post_aliases (post_id, slug) VALUES($1, $2) RETURNING id;` | |
| 198 | - | sqlInsertFeedItems = `INSERT INTO feed_items (post_id, guid, data) VALUES ($1, $2, $3) RETURNING id;` | |
| 199 | - | ||
| 200 | - | sqlUpdatePost = ` | |
| 201 | - | UPDATE posts | |
| 202 | - | SET slug = $1, title = $2, text = $3, description = $4, updated_at = $5, publish_at = $6, | |
| 203 | - | file_size = $7, shasum = $8, data = $9, hidden = $11, expires_at = $12 | |
| 204 | - | WHERE id = $10` | |
| 205 | - | ||
| 206 | - | sqlRemoveAliasesByPost = `DELETE FROM post_aliases WHERE post_id = $1` | |
| 207 | - | sqlRemoveTagsByPost = `DELETE FROM post_tags WHERE post_id = $1` | |
| 208 | - | sqlRemovePosts = `DELETE FROM posts WHERE id = ANY($1::uuid[])` | |
| 209 | - | sqlRemoveKeys = `DELETE FROM public_keys WHERE id = ANY($1::uuid[])` | |
| 210 | - | ||
| 211 | - | sqlInsertProject = `INSERT INTO projects (user_id, name, project_dir) VALUES ($1, $2, $3) RETURNING id;` | |
| 212 | - | sqlUpdateProject = `UPDATE projects SET updated_at = $3 WHERE user_id = $1 AND name = $2;` | |
| 213 | - | sqlFindProjectByName = `SELECT id, user_id, name, project_dir, acl, blocked, created_at, updated_at FROM projects WHERE user_id = $1 AND name = $2;` | |
| 214 | - | ) | |
| 215 | - | ||
| 216 | 26 | type PsqlDB struct { | |
| 217 | 27 | Logger *slog.Logger | |
| 218 | 28 | Db *sqlx.DB |
| ... | ... | @@ -293,7 +103,7 @@ func (me *PsqlDB) RegisterUser(username, pubkey, comment string) (*db.User, erro | |
| 293 | 103 | }() | |
| 294 | 104 | ||
| 295 | 105 | var id string | |
| 296 | - | err = tx.QueryRow(sqlInsertUser, lowerName).Scan(&id) | |
| 106 | + | err = tx.QueryRow(`INSERT INTO app_users (name) VALUES($1) returning id`, lowerName).Scan(&id) | |
| 297 | 107 | if err != nil { | |
| 298 | 108 | return nil, err | |
| 299 | 109 | } |
| ... | ... | @@ -352,7 +162,7 @@ func (me *PsqlDB) UpdatePublicKey(pubkeyID, name string) (*db.PublicKey, error) | |
| 352 | 162 | ||
| 353 | 163 | func (me *PsqlDB) findPublicKeyForKey(key string) (*db.PublicKey, error) { | |
| 354 | 164 | var keys []*db.PublicKey | |
| 355 | - | rs, err := me.Db.Queryx(sqlSelectPublicKey, key) | |
| 165 | + | rs, err := me.Db.Queryx(`SELECT id, user_id, name, public_key, created_at FROM public_keys WHERE public_key = $1`, key) | |
| 356 | 166 | if err != nil { | |
| 357 | 167 | return nil, err | |
| 358 | 168 | } |
| ... | ... | @@ -398,7 +208,7 @@ func (me *PsqlDB) findPublicKey(pubkeyID string) (*db.PublicKey, error) { | |
| 398 | 208 | ||
| 399 | 209 | func (me *PsqlDB) FindKeysForUser(user *db.User) ([]*db.PublicKey, error) { | |
| 400 | 210 | var keys []*db.PublicKey | |
| 401 | - | err := me.Db.Select(&keys, sqlSelectPublicKeys, user.ID) | |
| 211 | + | err := me.Db.Select(&keys, `SELECT id, user_id, name, public_key, created_at FROM public_keys WHERE user_id = $1 ORDER BY created_at ASC`, user.ID) | |
| 402 | 212 | if err != nil { | |
| 403 | 213 | return nil, err | |
| 404 | 214 | } |
| ... | ... | @@ -407,7 +217,7 @@ func (me *PsqlDB) FindKeysForUser(user *db.User) ([]*db.PublicKey, error) { | |
| 407 | 217 | ||
| 408 | 218 | func (me *PsqlDB) RemoveKeys(keyIDs []string) error { | |
| 409 | 219 | param := "{" + strings.Join(keyIDs, ",") + "}" | |
| 410 | - | _, err := me.Db.Exec(sqlRemoveKeys, param) | |
| 220 | + | _, err := me.Db.Exec(`DELETE FROM public_keys WHERE id = ANY($1::uuid[])`, param) | |
| 411 | 221 | return err | |
| 412 | 222 | } | |
| 413 | 223 |
| ... | ... | @@ -493,7 +303,7 @@ func (me *PsqlDB) FindUserByPubkey(key string) (*db.User, error) { | |
| 493 | 303 | ||
| 494 | 304 | func (me *PsqlDB) FindUser(userID string) (*db.User, error) { | |
| 495 | 305 | user := &db.User{} | |
| 496 | - | err := me.Db.Get(user, sqlSelectUser, userID) | |
| 306 | + | err := me.Db.Get(user, `SELECT id, COALESCE(name, '') as name, created_at FROM app_users WHERE id = $1`, userID) | |
| 497 | 307 | if err != nil { | |
| 498 | 308 | return nil, err | |
| 499 | 309 | } |
| ... | ... | @@ -518,7 +328,7 @@ func (me *PsqlDB) validateName(name string) (bool, error) { | |
| 518 | 328 | ||
| 519 | 329 | func (me *PsqlDB) FindUserByName(name string) (*db.User, error) { | |
| 520 | 330 | user := &db.User{} | |
| 521 | - | err := me.Db.Get(user, sqlSelectUserForName, strings.ToLower(name)) | |
| 331 | + | err := me.Db.Get(user, `SELECT id, name, created_at FROM app_users WHERE name = $1`, strings.ToLower(name)) | |
| 522 | 332 | if err != nil { | |
| 523 | 333 | return nil, err | |
| 524 | 334 | } |
| ... | ... | @@ -529,7 +339,7 @@ func (me *PsqlDB) findUserForNameAndKey(name string, key string) (*db.User, erro | |
| 529 | 339 | user := &db.User{} | |
| 530 | 340 | pk := &db.PublicKey{} | |
| 531 | 341 | ||
| 532 | - | r := me.Db.QueryRow(sqlSelectUserForNameAndKey, strings.ToLower(name), key) | |
| 342 | + | r := me.Db.QueryRow(`SELECT app_users.id, app_users.name, app_users.created_at, public_keys.id as pk_id, public_keys.public_key, public_keys.created_at as pk_created_at FROM app_users LEFT JOIN public_keys ON public_keys.user_id = app_users.id WHERE app_users.name = $1 AND public_keys.public_key = $2`, strings.ToLower(name), key) | |
| 533 | 343 | err := r.Scan(&user.ID, &user.Name, &user.CreatedAt, &pk.ID, &pk.Key, &pk.CreatedAt) | |
| 534 | 344 | if err != nil { | |
| 535 | 345 | return nil, err |
| ... | ... | @@ -541,7 +351,11 @@ func (me *PsqlDB) findUserForNameAndKey(name string, key string) (*db.User, erro | |
| 541 | 351 | ||
| 542 | 352 | func (me *PsqlDB) FindUserForToken(token string) (*db.User, error) { | |
| 543 | 353 | user := &db.User{} | |
| 544 | - | err := me.Db.Get(user, sqlSelectUserForToken, token) | |
| 354 | + | err := me.Db.Get(user, ` | |
| 355 | + | SELECT app_users.id, app_users.name, app_users.created_at | |
| 356 | + | FROM app_users | |
| 357 | + | LEFT JOIN tokens ON tokens.user_id = app_users.id | |
| 358 | + | WHERE tokens.token = $1 AND tokens.expires_at > NOW()`, token) | |
| 545 | 359 | if err != nil { | |
| 546 | 360 | return nil, err | |
| 547 | 361 | } |
| ... | ... | @@ -549,7 +363,14 @@ func (me *PsqlDB) FindUserForToken(token string) (*db.User, error) { | |
| 549 | 363 | } | |
| 550 | 364 | ||
| 551 | 365 | func (me *PsqlDB) FindPostWithFilename(filename string, persona_id string, space string) (*db.Post, error) { | |
| 552 | - | r := me.Db.QueryRow(sqlSelectPostWithFilename, filename, persona_id, space) | |
| 366 | + | query := fmt.Sprintf(` | |
| 367 | + | SELECT %s, STRING_AGG(coalesce(post_tags.name, ''), ',') tags | |
| 368 | + | FROM posts | |
| 369 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 370 | + | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 371 | + | WHERE filename = $1 AND user_id = $2 AND cur_space = $3 | |
| 372 | + | GROUP BY %s`, SelectPost, SelectPost) | |
| 373 | + | r := me.Db.QueryRow(query, filename, persona_id, space) | |
| 553 | 374 | post, err := CreatePostWithTagsFromRow(r) | |
| 554 | 375 | if err != nil { | |
| 555 | 376 | return nil, err |
| ... | ... | @@ -559,11 +380,18 @@ func (me *PsqlDB) FindPostWithFilename(filename string, persona_id string, space | |
| 559 | 380 | } | |
| 560 | 381 | ||
| 561 | 382 | func (me *PsqlDB) FindPostWithSlug(slug string, user_id string, space string) (*db.Post, error) { | |
| 562 | - | r := me.Db.QueryRow(sqlSelectPostWithSlug, slug, user_id, space) | |
| 383 | + | query := fmt.Sprintf(` | |
| 384 | + | SELECT %s, STRING_AGG(coalesce(post_tags.name, ''), ',') tags | |
| 385 | + | FROM posts | |
| 386 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 387 | + | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 388 | + | WHERE slug = $1 AND user_id = $2 AND cur_space = $3 | |
| 389 | + | GROUP BY %s`, SelectPost, SelectPost) | |
| 390 | + | r := me.Db.QueryRow(query, slug, user_id, space) | |
| 563 | 391 | post, err := CreatePostWithTagsFromRow(r) | |
| 564 | 392 | if err != nil { | |
| 565 | 393 | // attempt to find post inside post_aliases | |
| 566 | - | alias := me.Db.QueryRow(sqlSelectPostIdByAliasSlug, slug) | |
| 394 | + | alias := me.Db.QueryRow(`SELECT post_id FROM post_aliases WHERE slug = $1`, slug) | |
| 567 | 395 | postID := "" | |
| 568 | 396 | err := alias.Scan(&postID) | |
| 569 | 397 | if err != nil { |
| ... | ... | @@ -578,7 +406,12 @@ func (me *PsqlDB) FindPostWithSlug(slug string, user_id string, space string) (* | |
| 578 | 406 | ||
| 579 | 407 | func (me *PsqlDB) FindPost(postID string) (*db.Post, error) { | |
| 580 | 408 | post := &db.Post{} | |
| 581 | - | err := me.Db.Get(post, sqlSelectPost, postID) | |
| 409 | + | query := fmt.Sprintf(` | |
| 410 | + | SELECT %s | |
| 411 | + | FROM posts | |
| 412 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 413 | + | WHERE posts.id = $1`, SelectPost) | |
| 414 | + | err := me.Db.Get(post, query, postID) | |
| 582 | 415 | if err != nil { | |
| 583 | 416 | return nil, err | |
| 584 | 417 | } |
| ... | ... | @@ -615,9 +448,13 @@ func (me *PsqlDB) postPager(rs *sqlx.Rows, pageNum int, space string, tag string | |
| 615 | 448 | var count int | |
| 616 | 449 | var err error | |
| 617 | 450 | if tag == "" { | |
| 618 | - | err = me.Db.QueryRow(sqlSelectPostCount, space).Scan(&count) | |
| 451 | + | err = me.Db.QueryRow(`SELECT count(id) FROM posts WHERE hidden = FALSE AND cur_space=$1`, space).Scan(&count) | |
| 619 | 452 | } else { | |
| 620 | - | err = me.Db.QueryRow(sqlSelectTagPostCount, space, tag).Scan(&count) | |
| 453 | + | err = me.Db.QueryRow(` | |
| 454 | + | SELECT count(posts.id) | |
| 455 | + | FROM posts | |
| 456 | + | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 457 | + | WHERE hidden = FALSE AND cur_space=$1 and post_tags.name = $2`, space, tag).Scan(&count) | |
| 621 | 458 | } | |
| 622 | 459 | if err != nil { | |
| 623 | 460 | return nil, err |
| ... | ... | @@ -632,7 +469,32 @@ func (me *PsqlDB) postPager(rs *sqlx.Rows, pageNum int, space string, tag string | |
| 632 | 469 | } | |
| 633 | 470 | ||
| 634 | 471 | func (me *PsqlDB) FindPostsForFeed(page *db.Pager, space string) (*db.Paginate[*db.Post], error) { | |
| 635 | - | rs, err := me.Db.Queryx(sqlSelectPostsByRank, page.Num, page.Num*page.Page, space) | |
| 472 | + | query := ` | |
| 473 | + | SELECT * | |
| 474 | + | FROM ( | |
| 475 | + | SELECT DISTINCT ON (posts.user_id) | |
| 476 | + | posts.id, | |
| 477 | + | posts.user_id, | |
| 478 | + | posts.filename, | |
| 479 | + | posts.slug, | |
| 480 | + | posts.title, | |
| 481 | + | posts.text, | |
| 482 | + | posts.description, | |
| 483 | + | posts.publish_at, | |
| 484 | + | app_users.name AS username, | |
| 485 | + | posts.updated_at, | |
| 486 | + | posts.mime_type | |
| 487 | + | FROM posts | |
| 488 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 489 | + | WHERE | |
| 490 | + | hidden = FALSE | |
| 491 | + | AND publish_at::date <= CURRENT_DATE | |
| 492 | + | AND cur_space = $3 | |
| 493 | + | ORDER BY posts.user_id, publish_at DESC | |
| 494 | + | ) AS latest_posts | |
| 495 | + | ORDER BY publish_at DESC | |
| 496 | + | LIMIT $1 OFFSET $2` | |
| 497 | + | rs, err := me.Db.Queryx(query, page.Num, page.Num*page.Page, space) | |
| 636 | 498 | if err != nil { | |
| 637 | 499 | return nil, err | |
| 638 | 500 | } |
| ... | ... | @@ -642,8 +504,14 @@ func (me *PsqlDB) FindPostsForFeed(page *db.Pager, space string) (*db.Paginate[* | |
| 642 | 504 | ||
| 643 | 505 | func (me *PsqlDB) InsertPost(post *db.Post) (*db.Post, error) { | |
| 644 | 506 | var id string | |
| 507 | + | query := ` | |
| 508 | + | INSERT INTO posts | |
| 509 | + | (user_id, filename, slug, title, text, description, publish_at, hidden, cur_space, | |
| 510 | + | file_size, mime_type, shasum, data, expires_at, updated_at) | |
| 511 | + | VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) | |
| 512 | + | RETURNING id` | |
| 645 | 513 | err := me.Db.QueryRow( | |
| 646 | - | sqlInsertPost, | |
| 514 | + | query, | |
| 647 | 515 | post.UserID, | |
| 648 | 516 | post.Filename, | |
| 649 | 517 | post.Slug, |
| ... | ... | @@ -668,8 +536,13 @@ func (me *PsqlDB) InsertPost(post *db.Post) (*db.Post, error) { | |
| 668 | 536 | } | |
| 669 | 537 | ||
| 670 | 538 | func (me *PsqlDB) UpdatePost(post *db.Post) (*db.Post, error) { | |
| 539 | + | query := ` | |
| 540 | + | UPDATE posts | |
| 541 | + | SET slug = $1, title = $2, text = $3, description = $4, updated_at = $5, publish_at = $6, | |
| 542 | + | file_size = $7, shasum = $8, data = $9, hidden = $11, expires_at = $12 | |
| 543 | + | WHERE id = $10` | |
| 671 | 544 | _, err := me.Db.Exec( | |
| 672 | - | sqlUpdatePost, | |
| 545 | + | query, | |
| 673 | 546 | post.Slug, | |
| 674 | 547 | post.Title, | |
| 675 | 548 | post.Text, |
| ... | ... | @@ -692,14 +565,27 @@ func (me *PsqlDB) UpdatePost(post *db.Post) (*db.Post, error) { | |
| 692 | 565 | ||
| 693 | 566 | func (me *PsqlDB) RemovePosts(postIDs []string) error { | |
| 694 | 567 | param := "{" + strings.Join(postIDs, ",") + "}" | |
| 695 | - | _, err := me.Db.Exec(sqlRemovePosts, param) | |
| 568 | + | _, err := me.Db.Exec(`DELETE FROM posts WHERE id = ANY($1::uuid[])`, param) | |
| 696 | 569 | return err | |
| 697 | 570 | } | |
| 698 | 571 | ||
| 699 | 572 | func (me *PsqlDB) FindPostsForUser(page *db.Pager, userID string, space string) (*db.Paginate[*db.Post], error) { | |
| 700 | 573 | var posts []*db.Post | |
| 574 | + | query := fmt.Sprintf(` | |
| 575 | + | SELECT %s, STRING_AGG(coalesce(post_tags.name, ''), ',') tags | |
| 576 | + | FROM posts | |
| 577 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 578 | + | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 579 | + | WHERE | |
| 580 | + | hidden = FALSE AND | |
| 581 | + | user_id = $1 AND | |
| 582 | + | publish_at::date <= CURRENT_DATE AND | |
| 583 | + | cur_space = $2 | |
| 584 | + | GROUP BY %s | |
| 585 | + | ORDER BY publish_at DESC, slug DESC | |
| 586 | + | LIMIT $3 OFFSET $4`, SelectPost, SelectPost) | |
| 701 | 587 | rs, err := me.Db.Queryx( | |
| 702 | - | sqlSelectPostsForUser, | |
| 588 | + | query, | |
| 703 | 589 | userID, | |
| 704 | 590 | space, | |
| 705 | 591 | page.Num, |
| ... | ... | @@ -723,7 +609,7 @@ func (me *PsqlDB) FindPostsForUser(page *db.Pager, userID string, space string) | |
| 723 | 609 | } | |
| 724 | 610 | ||
| 725 | 611 | var count int | |
| 726 | - | err = me.Db.QueryRow(sqlSelectPostCount, space).Scan(&count) | |
| 612 | + | err = me.Db.QueryRow(`SELECT count(id) FROM posts WHERE hidden = FALSE AND cur_space=$1`, space).Scan(&count) | |
| 727 | 613 | if err != nil { | |
| 728 | 614 | return nil, err | |
| 729 | 615 | } |
| ... | ... | @@ -737,7 +623,15 @@ func (me *PsqlDB) FindPostsForUser(page *db.Pager, userID string, space string) | |
| 737 | 623 | ||
| 738 | 624 | func (me *PsqlDB) FindAllPostsForUser(userID string, space string) ([]*db.Post, error) { | |
| 739 | 625 | var posts []*db.Post | |
| 740 | - | err := me.Db.Select(&posts, sqlSelectAllPostsForUser, userID, space) | |
| 626 | + | query := fmt.Sprintf(` | |
| 627 | + | SELECT %s | |
| 628 | + | FROM posts | |
| 629 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 630 | + | WHERE | |
| 631 | + | user_id = $1 AND | |
| 632 | + | cur_space = $2 | |
| 633 | + | ORDER BY publish_at DESC`, SelectPost) | |
| 634 | + | err := me.Db.Select(&posts, query, userID, space) | |
| 741 | 635 | if err != nil { | |
| 742 | 636 | return nil, err | |
| 743 | 637 | } |
| ... | ... | @@ -746,7 +640,11 @@ func (me *PsqlDB) FindAllPostsForUser(userID string, space string) ([]*db.Post, | |
| 746 | 640 | ||
| 747 | 641 | func (me *PsqlDB) FindPosts() ([]*db.Post, error) { | |
| 748 | 642 | var posts []*db.Post | |
| 749 | - | err := me.Db.Select(&posts, sqlSelectPosts) | |
| 643 | + | query := fmt.Sprintf(` | |
| 644 | + | SELECT %s | |
| 645 | + | FROM posts | |
| 646 | + | LEFT JOIN app_users ON app_users.id = posts.user_id`, SelectPost) | |
| 647 | + | err := me.Db.Select(&posts, query) | |
| 750 | 648 | if err != nil { | |
| 751 | 649 | return nil, err | |
| 752 | 650 | } |
| ... | ... | @@ -755,7 +653,15 @@ func (me *PsqlDB) FindPosts() ([]*db.Post, error) { | |
| 755 | 653 | ||
| 756 | 654 | func (me *PsqlDB) FindExpiredPosts(space string) ([]*db.Post, error) { | |
| 757 | 655 | var posts []*db.Post | |
| 758 | - | err := me.Db.Select(&posts, sqlSelectExpiredPosts, space) | |
| 656 | + | query := fmt.Sprintf(` | |
| 657 | + | SELECT %s | |
| 658 | + | FROM posts | |
| 659 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 660 | + | WHERE | |
| 661 | + | cur_space = $1 AND | |
| 662 | + | expires_at <= now(); | |
| 663 | + | `, SelectPost) | |
| 664 | + | err := me.Db.Select(&posts, query, space) | |
| 759 | 665 | if err != nil { | |
| 760 | 666 | return nil, err | |
| 761 | 667 | } |
| ... | ... | @@ -1024,7 +930,7 @@ func (me *PsqlDB) FindVisitSiteList(opts *db.SummaryOpts) ([]*db.VisitUrl, error | |
| 1024 | 930 | ||
| 1025 | 931 | func (me *PsqlDB) FindUsers() ([]*db.User, error) { | |
| 1026 | 932 | var users []*db.User | |
| 1027 | - | err := me.Db.Select(&users, sqlSelectUsers) | |
| 933 | + | err := me.Db.Select(&users, `SELECT id, COALESCE(name, '') as name, created_at FROM app_users ORDER BY name ASC`) | |
| 1028 | 934 | if err != nil { | |
| 1029 | 935 | return nil, err | |
| 1030 | 936 | } |
| ... | ... | @@ -1032,7 +938,7 @@ func (me *PsqlDB) FindUsers() ([]*db.User, error) { | |
| 1032 | 938 | } | |
| 1033 | 939 | ||
| 1034 | 940 | func (me *PsqlDB) removeTagsForPost(tx *sqlx.Tx, postID string) error { | |
| 1035 | - | _, err := tx.Exec(sqlRemoveTagsByPost, postID) | |
| 941 | + | _, err := tx.Exec(`DELETE FROM post_tags WHERE post_id = $1`, postID) | |
| 1036 | 942 | return err | |
| 1037 | 943 | } | |
| 1038 | 944 |
| ... | ... | @@ -1040,7 +946,7 @@ func (me *PsqlDB) insertTagsForPost(tx *sqlx.Tx, tags []string, postID string) ( | |
| 1040 | 946 | ids := make([]string, 0) | |
| 1041 | 947 | for _, tag := range tags { | |
| 1042 | 948 | id := "" | |
| 1043 | - | err := tx.QueryRow(sqlInsertTag, postID, tag).Scan(&id) | |
| 949 | + | err := tx.QueryRow(`INSERT INTO post_tags (post_id, name) VALUES($1, $2) RETURNING id;`, postID, tag).Scan(&id) | |
| 1044 | 950 | if err != nil { | |
| 1045 | 951 | return nil, err | |
| 1046 | 952 | } |
| ... | ... | @@ -1074,7 +980,7 @@ func (me *PsqlDB) ReplaceTagsForPost(tags []string, postID string) error { | |
| 1074 | 980 | } | |
| 1075 | 981 | ||
| 1076 | 982 | func (me *PsqlDB) removeAliasesForPost(tx *sqlx.Tx, postID string) error { | |
| 1077 | - | _, err := tx.Exec(sqlRemoveAliasesByPost, postID) | |
| 983 | + | _, err := tx.Exec(`DELETE FROM post_aliases WHERE post_id = $1`, postID) | |
| 1078 | 984 | return err | |
| 1079 | 985 | } | |
| 1080 | 986 |
| ... | ... | @@ -1109,7 +1015,7 @@ func (me *PsqlDB) insertAliasesForPost(tx *sqlx.Tx, aliases []string, postID str | |
| 1109 | 1015 | continue | |
| 1110 | 1016 | } | |
| 1111 | 1017 | id := "" | |
| 1112 | - | err := tx.QueryRow(sqlInsertAliases, postID, alias).Scan(&id) | |
| 1018 | + | err := tx.QueryRow(`INSERT INTO post_aliases (post_id, slug) VALUES($1, $2) RETURNING id;`, postID, alias).Scan(&id) | |
| 1113 | 1019 | if err != nil { | |
| 1114 | 1020 | return nil, err | |
| 1115 | 1021 | } |
| ... | ... | @@ -1144,9 +1050,22 @@ func (me *PsqlDB) ReplaceAliasesForPost(aliases []string, postID string) error { | |
| 1144 | 1050 | ||
| 1145 | 1051 | func (me *PsqlDB) FindUserPostsByTag(page *db.Pager, tag, userID, space string) (*db.Paginate[*db.Post], error) { | |
| 1146 | 1052 | var posts []*db.Post | |
| 1053 | + | query := fmt.Sprintf(` | |
| 1054 | + | SELECT %s | |
| 1055 | + | FROM posts | |
| 1056 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 1057 | + | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 1058 | + | WHERE | |
| 1059 | + | hidden = FALSE AND | |
| 1060 | + | user_id = $1 AND | |
| 1061 | + | (post_tags.name = $2 OR hidden = true) AND | |
| 1062 | + | publish_at::date <= CURRENT_DATE AND | |
| 1063 | + | cur_space = $3 | |
| 1064 | + | ORDER BY publish_at DESC | |
| 1065 | + | LIMIT $4 OFFSET $5`, SelectPost) | |
| 1147 | 1066 | err := me.Db.Select( | |
| 1148 | 1067 | &posts, | |
| 1149 | - | sqlSelectUserPostsByTag, | |
| 1068 | + | query, | |
| 1150 | 1069 | userID, | |
| 1151 | 1070 | tag, | |
| 1152 | 1071 | space, |
| ... | ... | @@ -1158,7 +1077,7 @@ func (me *PsqlDB) FindUserPostsByTag(page *db.Pager, tag, userID, space string) | |
| 1158 | 1077 | } | |
| 1159 | 1078 | ||
| 1160 | 1079 | var count int | |
| 1161 | - | err = me.Db.QueryRow(sqlSelectPostCount, space).Scan(&count) | |
| 1080 | + | err = me.Db.QueryRow(`SELECT count(id) FROM posts WHERE hidden = FALSE AND cur_space=$1`, space).Scan(&count) | |
| 1162 | 1081 | if err != nil { | |
| 1163 | 1082 | return nil, err | |
| 1164 | 1083 | } |
| ... | ... | @@ -1171,8 +1090,30 @@ func (me *PsqlDB) FindUserPostsByTag(page *db.Pager, tag, userID, space string) | |
| 1171 | 1090 | } | |
| 1172 | 1091 | ||
| 1173 | 1092 | func (me *PsqlDB) FindPostsByTag(pager *db.Pager, tag, space string) (*db.Paginate[*db.Post], error) { | |
| 1093 | + | query := ` | |
| 1094 | + | SELECT | |
| 1095 | + | posts.id, | |
| 1096 | + | user_id, | |
| 1097 | + | filename, | |
| 1098 | + | slug, | |
| 1099 | + | title, | |
| 1100 | + | text, | |
| 1101 | + | description, | |
| 1102 | + | publish_at, | |
| 1103 | + | app_users.name as username, | |
| 1104 | + | posts.updated_at, | |
| 1105 | + | posts.mime_type | |
| 1106 | + | FROM posts | |
| 1107 | + | LEFT JOIN app_users ON app_users.id = posts.user_id | |
| 1108 | + | LEFT JOIN post_tags ON post_tags.post_id = posts.id | |
| 1109 | + | WHERE | |
| 1110 | + | post_tags.name = $3 AND | |
| 1111 | + | publish_at::date <= CURRENT_DATE AND | |
| 1112 | + | cur_space = $4 | |
| 1113 | + | ORDER BY publish_at DESC | |
| 1114 | + | LIMIT $1 OFFSET $2` | |
| 1174 | 1115 | rs, err := me.Db.Queryx( | |
| 1175 | - | sqlSelectPostsByTag, | |
| 1116 | + | query, | |
| 1176 | 1117 | pager.Num, | |
| 1177 | 1118 | pager.Num*pager.Page, | |
| 1178 | 1119 | tag, |
| ... | ... | @@ -1188,7 +1129,15 @@ func (me *PsqlDB) FindPostsByTag(pager *db.Pager, tag, space string) (*db.Pagina | |
| 1188 | 1129 | ||
| 1189 | 1130 | func (me *PsqlDB) FindPopularTags(space string) ([]string, error) { | |
| 1190 | 1131 | tags := make([]string, 0) | |
| 1191 | - | rs, err := me.Db.Queryx(sqlSelectPopularTags, space) | |
| 1132 | + | query := ` | |
| 1133 | + | SELECT name, count(post_id) as "tally" | |
| 1134 | + | FROM post_tags | |
| 1135 | + | LEFT JOIN posts ON posts.id = post_id | |
| 1136 | + | WHERE posts.cur_space = $1 | |
| 1137 | + | GROUP BY name | |
| 1138 | + | ORDER BY tally DESC | |
| 1139 | + | LIMIT 5` | |
| 1140 | + | rs, err := me.Db.Queryx(query, space) | |
| 1192 | 1141 | if err != nil { | |
| 1193 | 1142 | return tags, err | |
| 1194 | 1143 | } |
| ... | ... | @@ -1211,7 +1160,7 @@ func (me *PsqlDB) FindPopularTags(space string) ([]string, error) { | |
| 1211 | 1160 | ||
| 1212 | 1161 | func (me *PsqlDB) FindFeature(userID string, feature string) (*db.FeatureFlag, error) { | |
| 1213 | 1162 | ff := &db.FeatureFlag{} | |
| 1214 | - | err := me.Db.Get(ff, sqlSelectFeatureForUser, userID, feature) | |
| 1163 | + | err := me.Db.Get(ff, `SELECT id, user_id, payment_history_id, name, data, created_at, expires_at FROM feature_flags WHERE user_id = $1 AND name = $2 ORDER BY expires_at DESC LIMIT 1`, userID, feature) | |
| 1215 | 1164 | if err != nil { | |
| 1216 | 1165 | return nil, err | |
| 1217 | 1166 | } |
| ... | ... | @@ -1252,7 +1201,7 @@ func (me *PsqlDB) InsertFeedItems(postID string, items []*db.FeedItem) error { | |
| 1252 | 1201 | ||
| 1253 | 1202 | for _, item := range items { | |
| 1254 | 1203 | _, err := tx.Exec( | |
| 1255 | - | sqlInsertFeedItems, | |
| 1204 | + | `INSERT INTO feed_items (post_id, guid, data) VALUES ($1, $2, $3) RETURNING id;`, | |
| 1256 | 1205 | item.PostID, | |
| 1257 | 1206 | item.GUID, | |
| 1258 | 1207 | item.Data, |
| ... | ... | @@ -1271,7 +1220,7 @@ func (me *PsqlDB) InsertFeedItems(postID string, items []*db.FeedItem) error { | |
| 1271 | 1220 | ||
| 1272 | 1221 | func (me *PsqlDB) FindFeedItemsByPostID(postID string) ([]*db.FeedItem, error) { | |
| 1273 | 1222 | var items []*db.FeedItem | |
| 1274 | - | err := me.Db.Select(&items, sqlSelectFeedItemsByPost, postID) | |
| 1223 | + | err := me.Db.Select(&items, `SELECT id, post_id, guid, data, created_at FROM feed_items WHERE post_id=$1`, postID) | |
| 1275 | 1224 | if err != nil { | |
| 1276 | 1225 | return nil, err | |
| 1277 | 1226 | } |
| ... | ... | @@ -1284,7 +1233,7 @@ func (me *PsqlDB) InsertProject(userID, name, projectDir string) (string, error) | |
| 1284 | 1233 | } | |
| 1285 | 1234 | ||
| 1286 | 1235 | var id string | |
| 1287 | - | err := me.Db.QueryRow(sqlInsertProject, userID, name, projectDir).Scan(&id) | |
| 1236 | + | err := me.Db.QueryRow(`INSERT INTO projects (user_id, name, project_dir) VALUES ($1, $2, $3) RETURNING id;`, userID, name, projectDir).Scan(&id) | |
| 1288 | 1237 | if err != nil { | |
| 1289 | 1238 | return "", err | |
| 1290 | 1239 | } |
| ... | ... | @@ -1292,13 +1241,13 @@ func (me *PsqlDB) InsertProject(userID, name, projectDir string) (string, error) | |
| 1292 | 1241 | } | |
| 1293 | 1242 | ||
| 1294 | 1243 | func (me *PsqlDB) UpdateProject(userID, name string) error { | |
| 1295 | - | _, err := me.Db.Exec(sqlUpdateProject, userID, name, time.Now()) | |
| 1244 | + | _, err := me.Db.Exec(`UPDATE projects SET updated_at = $3 WHERE user_id = $1 AND name = $2;`, userID, name, time.Now()) | |
| 1296 | 1245 | return err | |
| 1297 | 1246 | } | |
| 1298 | 1247 | ||
| 1299 | 1248 | func (me *PsqlDB) FindProjectByName(userID, name string) (*db.Project, error) { | |
| 1300 | 1249 | project := &db.Project{} | |
| 1301 | - | err := me.Db.Get(project, sqlFindProjectByName, userID, name) | |
| 1250 | + | err := me.Db.Get(project, `SELECT id, user_id, name, project_dir, acl, blocked, created_at, updated_at FROM projects WHERE user_id = $1 AND name = $2;`, userID, name) | |
| 1302 | 1251 | if err != nil { | |
| 1303 | 1252 | return nil, err | |
| 1304 | 1253 | } |
| ... | ... | @@ -1307,7 +1256,7 @@ func (me *PsqlDB) FindProjectByName(userID, name string) (*db.Project, error) { | |
| 1307 | 1256 | ||
| 1308 | 1257 | func (me *PsqlDB) InsertToken(userID, name string) (string, error) { | |
| 1309 | 1258 | var token string | |
| 1310 | - | err := me.Db.QueryRow(sqlInsertToken, userID, name).Scan(&token) | |
| 1259 | + | err := me.Db.QueryRow(`INSERT INTO tokens (user_id, name) VALUES($1, $2) RETURNING token;`, userID, name).Scan(&token) | |
| 1311 | 1260 | if err != nil { | |
| 1312 | 1261 | return "", err | |
| 1313 | 1262 | } |
| ... | ... | @@ -1326,7 +1275,7 @@ func (me *PsqlDB) UpsertToken(userID, name string) (string, error) { | |
| 1326 | 1275 | ||
| 1327 | 1276 | func (me *PsqlDB) findTokenByName(userID, name string) (string, error) { | |
| 1328 | 1277 | var token string | |
| 1329 | - | err := me.Db.QueryRow(sqlSelectTokenByNameForUser, userID, name).Scan(&token) | |
| 1278 | + | err := me.Db.QueryRow(`SELECT token FROM tokens WHERE user_id = $1 AND name = $2`, userID, name).Scan(&token) | |
| 1330 | 1279 | if err != nil { | |
| 1331 | 1280 | return "", err | |
| 1332 | 1281 | } |
| ... | ... | @@ -1334,13 +1283,13 @@ func (me *PsqlDB) findTokenByName(userID, name string) (string, error) { | |
| 1334 | 1283 | } | |
| 1335 | 1284 | ||
| 1336 | 1285 | func (me *PsqlDB) RemoveToken(tokenID string) error { | |
| 1337 | - | _, err := me.Db.Exec(sqlRemoveToken, tokenID) | |
| 1286 | + | _, err := me.Db.Exec(`DELETE FROM tokens WHERE id = $1`, tokenID) | |
| 1338 | 1287 | return err | |
| 1339 | 1288 | } | |
| 1340 | 1289 | ||
| 1341 | 1290 | func (me *PsqlDB) FindTokensForUser(userID string) ([]*db.Token, error) { | |
| 1342 | 1291 | var tokens []*db.Token | |
| 1343 | - | err := me.Db.Select(&tokens, sqlSelectTokensForUser, userID) | |
| 1292 | + | err := me.Db.Select(&tokens, `SELECT id, user_id, name, created_at, expires_at FROM tokens WHERE user_id = $1`, userID) | |
| 1344 | 1293 | if err != nil { | |
| 1345 | 1294 | return nil, err | |
| 1346 | 1295 | } |