@@ -6,14 +6,19 @@ package org
66
77import (
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
1924const (
@@ -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
95169func MembersAction (ctx * context.Context ) {
96170 uid := ctx .FormInt64 ("uid" )
0 commit comments