@@ -6,14 +6,19 @@ package org
6
6
7
7
import (
8
8
"net/http"
9
+ "net/url"
10
+ "strings"
9
11
10
12
"code.gitea.io/gitea/models"
11
13
"code.gitea.io/gitea/models/organization"
14
+ user_model "code.gitea.io/gitea/models/user"
12
15
"code.gitea.io/gitea/modules/base"
13
16
"code.gitea.io/gitea/modules/context"
14
17
"code.gitea.io/gitea/modules/log"
15
18
"code.gitea.io/gitea/modules/setting"
19
+ "code.gitea.io/gitea/routers/utils"
16
20
shared_user "code.gitea.io/gitea/routers/web/shared/user"
21
+ org_service "code.gitea.io/gitea/services/org"
17
22
)
18
23
19
24
const (
@@ -91,6 +96,75 @@ func MembersInvite(ctx *context.Context) {
91
96
ctx .HTML (http .StatusOK , tplMembersInvite )
92
97
}
93
98
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
+
94
168
// MembersAction response for operation to a member of organization
95
169
func MembersAction (ctx * context.Context ) {
96
170
uid := ctx .FormInt64 ("uid" )
0 commit comments