Repository navigation
Expand file tree
/
Copy pathproject_governance_routes.v
More file actions
136 lines (126 loc) · 5.83 KB
/
Copy pathproject_governance_routes.v
File metadata and controls
136 lines (126 loc) · 5.83 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
132
133
134
135
136
// 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 veb
@['/:username/:repo_name/settings/members']
pub fn (mut app App) repo_members(username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
}
members := app.find_project_members(repo.id)
return $veb.html('templates/repo/members.html')
}
@['/:username/:repo_name/settings/members'; post]
pub fn (mut app App) handle_add_repo_member(username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
}
target_name := ctx.form['member_username'].trim_space().to_lower()
role := ctx.form['role'].trim_space().to_lower()
target := app.get_user_by_username(target_name) or {
ctx.error('That registered user does not exist')
return app.repo_members(mut ctx, username, repo_name)
}
if !target.is_registered || target.is_blocked || !valid_project_member_role(role) {
ctx.error('The member or role is invalid')
return app.repo_members(mut ctx, username, repo_name)
}
if app.repo_access_level(target.id, repo) >= project_access_owner {
ctx.error('The repository owner already has full access')
return app.repo_members(mut ctx, username, repo_name)
}
app.add_project_member(repo.id, target.id, role) or {
ctx.error('That user is already a direct project member')
return app.repo_members(mut ctx, username, repo_name)
}
return ctx.redirect('/${username}/${repo_name}/settings/members')
}
@['/:username/:repo_name/settings/members/:member_id'; post]
pub fn (mut app App) handle_update_repo_member(username string, repo_name string, member_id string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
}
role := ctx.form['role'].trim_space().to_lower()
app.update_project_member_role(repo.id, member_id.int(), role) or {
ctx.error('Could not update the project member')
return app.repo_members(mut ctx, username, repo_name)
}
return ctx.redirect('/${username}/${repo_name}/settings/members')
}
@['/:username/:repo_name/settings/members/:member_id/delete'; post]
pub fn (mut app App) handle_delete_repo_member(username string, repo_name string, member_id string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
}
app.remove_project_member(repo.id, member_id.int()) or {
ctx.error('Could not remove the project member')
return app.repo_members(mut ctx, username, repo_name)
}
return ctx.redirect('/${username}/${repo_name}/settings/members')
}
@['/:username/:repo_name/settings/branches']
pub fn (mut app App) protected_branches(username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
}
rules := app.find_protected_branches(repo.id)
branches := app.get_all_repo_branches(repo.id)
return $veb.html('templates/repo/protected_branches.html')
}
@['/:username/:repo_name/settings/branches'; post]