-
-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy pathstar.v
59 lines (47 loc) · 1.2 KB
/
star.v
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
module main
struct Star {
id int @[primary; sql: serial]
user_id int @[unique: 'repo_star']
repo_id int @[unique: 'repo_star']
}
fn (mut app App) add_star(repo_id int, user_id int) ! {
star := Star{
repo_id: repo_id
user_id: user_id
}
sql app.db {
insert star into Star
}!
}
fn (mut app App) find_user_starred_repos(user_id int) []Repo {
stars := sql app.db {
select from Star where user_id == user_id
} or { [] }
mut repos := []Repo{}
for star in stars {
repo := app.find_repo_by_id(star.repo_id) or { continue }
repos << repo
}
return repos
}
fn (mut app App) toggle_repo_star(repo_id int, user_id int) ! {
is_starred := app.check_repo_starred(repo_id, user_id)
if is_starred {
app.remove_star(repo_id, user_id)!
app.decrement_repo_stars(repo_id)!
} else {
app.add_star(repo_id, user_id)!
app.increment_repo_stars(repo_id)!
}
}
fn (mut app App) check_repo_starred(repo_id int, user_id int) bool {
stars := sql app.db {
select from Star where repo_id == repo_id && user_id == user_id limit 1
} or { [] }
return stars.len != 0
}
fn (mut app App) remove_star(repo_id int, user_id int) ! {
sql app.db {
delete from Star where repo_id == repo_id && user_id == user_id
}!
}