Skip to content

Commit cdfa2dd

Browse files
committed
add MembersInviteAction
1 parent b41e3d9 commit cdfa2dd

File tree

3 files changed

+91
-14
lines changed

3 files changed

+91
-14
lines changed

routers/web/org/members.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ package org
66

77
import (
88
"net/http"
9+
"net/url"
10+
"strings"
911

1012
"code.gitea.io/gitea/models"
1113
"code.gitea.io/gitea/models/organization"
14+
user_model "code.gitea.io/gitea/models/user"
1215
"code.gitea.io/gitea/modules/base"
1316
"code.gitea.io/gitea/modules/context"
1417
"code.gitea.io/gitea/modules/log"
1518
"code.gitea.io/gitea/modules/setting"
19+
"code.gitea.io/gitea/routers/utils"
1620
shared_user "code.gitea.io/gitea/routers/web/shared/user"
21+
org_service "code.gitea.io/gitea/services/org"
1722
)
1823

1924
const (
@@ -91,6 +96,75 @@ func MembersInvite(ctx *context.Context) {
9196
ctx.HTML(http.StatusOK, tplMembersInvite)
9297
}
9398

99+
// MembersInviteAction response for invite a member to organization
100+
func MembersInviteAction(ctx *context.Context) {
101+
var err error
102+
if !ctx.Org.IsOwner {
103+
ctx.Error(http.StatusNotFound)
104+
return
105+
}
106+
uname := utils.RemoveUsernameParameterSuffix(strings.ToLower(ctx.FormString("uname")))
107+
var team *organization.Team
108+
team, err = organization.GetTeam(ctx, ctx.Org.Organization.ID, ctx.FormString("team"))
109+
if err != nil {
110+
if organization.IsErrTeamNotExist(err) {
111+
ctx.Flash.Error(ctx.Tr("form.team_not_exist"))
112+
} else {
113+
ctx.ServerError("GetTeam", err)
114+
}
115+
return
116+
}
117+
var u *user_model.User
118+
u, err = user_model.GetUserByName(ctx, uname)
119+
if err != nil {
120+
if user_model.IsErrUserNotExist(err) {
121+
if setting.MailService != nil && user_model.ValidateEmail(uname) == nil {
122+
if err := org_service.CreateTeamInvite(ctx, ctx.Doer, team, uname); err != nil {
123+
if organization.IsErrTeamInviteAlreadyExist(err) {
124+
ctx.Flash.Error(ctx.Tr("form.duplicate_invite_to_team"))
125+
} else if organization.IsErrUserEmailAlreadyAdded(err) {
126+
ctx.Flash.Error(ctx.Tr("org.teams.add_duplicate_users"))
127+
} else {
128+
ctx.ServerError("CreateTeamInvite", err)
129+
return
130+
}
131+
}
132+
} else {
133+
ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
134+
}
135+
ctx.Redirect(ctx.Org.OrgLink + "/teams/" + url.PathEscape(team.LowerName))
136+
} else {
137+
ctx.ServerError("GetUserByName", err)
138+
}
139+
return
140+
}
141+
142+
if u.IsOrganization() {
143+
ctx.Flash.Error(ctx.Tr("form.cannot_add_org_to_team"))
144+
ctx.Redirect(ctx.Org.OrgLink + "/teams/" + url.PathEscape(team.LowerName))
145+
return
146+
}
147+
148+
if team.IsMember(ctx, u.ID) {
149+
ctx.Flash.Error(ctx.Tr("org.teams.add_duplicate_users"))
150+
} else {
151+
err = models.AddTeamMember(ctx, team, u.ID)
152+
}
153+
if err != nil {
154+
if organization.IsErrLastOrgOwner(err) {
155+
ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
156+
} else {
157+
log.Error("Action(%s): %v", ctx.Params(":action"), err)
158+
ctx.JSON(http.StatusOK, map[string]any{
159+
"ok": false,
160+
"err": err.Error(),
161+
})
162+
return
163+
}
164+
}
165+
ctx.Redirect(ctx.Org.OrgLink + "/teams/" + url.PathEscape(team.LowerName))
166+
}
167+
94168
// MembersAction response for operation to a member of organization
95169
func MembersAction(ctx *context.Context) {
96170
uid := ctx.FormInt64("uid")

routers/web/web.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,7 @@ func registerRoutes(m *web.Route) {
797797
m.Group("/{org}", func() {
798798
m.Get("/members", org.Members)
799799
m.Get("/members/invite", org.MembersInvite)
800+
m.Post("/members/invite", org.MembersInviteAction)
800801
}, context.OrgAssignment())
801802
}, ignSignIn)
802803

templates/org/member/invite.tmpl

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,23 @@
66

77
<div class="center">
88
<h1 class="ui header">{{ctx.Locale.Tr "org.members.invite_member"}}</h1>
9-
<form class="ui action input member-invite" data-org-link="{{.OrgLink}}" method="post">
10-
{{.CsrfTokenHtml}}
11-
<input type="hidden" name="uid" value="{{.SignedUser.ID}}">
12-
<div class="ui label">{{ctx.Locale.Tr "org.members.invite"}}</div>
13-
<div id="search-user-box" class="ui search input"{{if .IsEmailInviteEnabled}} data-allow-email="true" data-allow-email-description="{{ctx.Locale.Tr "org.teams.invite_team_member" $.Team.Name}}"{{end}}>
14-
<input class="prompt" name="uname" placeholder="{{ctx.Locale.Tr "repo.settings.search_user_placeholder"}}" autocomplete="off" autofocus required>
9+
<form class="ui form input member-invite" action="{{$.OrgLink}}/members/invite" method="post">
10+
<div class="inline field">
11+
{{.CsrfTokenHtml}}
12+
<input type="hidden" name="uid" value="{{.SignedUser.ID}}">
13+
<label>{{ctx.Locale.Tr "org.members.invite"}}</label>
14+
<div id="search-user-box" class="ui search input"{{if .IsEmailInviteEnabled}} data-allow-email="true" data-allow-email-description="{{ctx.Locale.Tr "org.teams.invite_team_member" $.Team.Name}}"{{end}}>
15+
<input class="prompt" name="uname" placeholder="{{ctx.Locale.Tr "repo.settings.search_user_placeholder"}}" autocomplete="off" autofocus required>
16+
</div>
17+
<label>{{ctx.Locale.Tr "org.members.to"}}</label>
18+
<select class="ui selection dropdown" name="team">
19+
{{range .Teams}}
20+
<option value="{{.LowerName | PathEscape}}">{{.Name}}</option>
21+
{{end}}
22+
</select>
23+
<label>{{ctx.Locale.Tr "org.members.team"}}</label>
24+
<button class="ui primary button">{{ctx.Locale.Tr "org.members.invite_now"}}</button>
1525
</div>
16-
<div class="ui label">{{ctx.Locale.Tr "org.members.to"}}</div>
17-
<select class="ui selection dropdown" name="team">
18-
{{range .Teams}}
19-
<option value="{{.LowerName | PathEscape}}">{{.Name}}</option>
20-
{{end}}
21-
</select>
22-
<div class="ui label">{{ctx.Locale.Tr "org.members.team"}}</div>
23-
<button class="ui primary button">{{ctx.Locale.Tr "org.members.invite_now"}}</button>
2426
</form>
2527
</div>
2628
</div>

0 commit comments

Comments
 (0)