ggdgsdbsdbbb / repo / star.v
59 lines · 47 sloc · 1.2 KB · a449238961bbd5f9081831ef9db1ac936909a3e8
Raw
1module main
2
3struct Star {
4 id int @[primary; sql: serial]
5 user_id int @[unique: 'repo_star']
6 repo_id int @[unique: 'repo_star']
7}
8
9fn (mut app App) add_star(repo_id int, user_id int) ! {
10 star := Star{
11 repo_id: repo_id
12 user_id: user_id
13 }
14
15 sql app.db {
16 insert star into Star
17 }!
18}
19
20fn (mut app App) find_user_starred_repos(user_id int) []Repo {
21 stars := sql app.db {
22 select from Star where user_id == user_id
23 } or { [] }
24 mut repos := []Repo{}
25
26 for star in stars {
27 repo := app.find_repo_by_id(star.repo_id) or { continue }
28
29 repos << repo
30 }
31
32 return repos
33}
34
35fn (mut app App) toggle_repo_star(repo_id int, user_id int) ! {
36 is_starred := app.check_repo_starred(repo_id, user_id)
37
38 if is_starred {
39 app.remove_star(repo_id, user_id)!
40 app.decrement_repo_stars(repo_id)!
41 } else {
42 app.add_star(repo_id, user_id)!
43 app.increment_repo_stars(repo_id)!
44 }
45}
46
47fn (mut app App) check_repo_starred(repo_id int, user_id int) bool {
48 stars := sql app.db {
49 select from Star where repo_id == repo_id && user_id == user_id limit 1
50 } or { [] }
51
52 return stars.len != 0
53}
54
55fn (mut app App) remove_star(repo_id int, user_id int) ! {
56 sql app.db {
57 delete from Star where repo_id == repo_id && user_id == user_id
58 }!
59}
60