@@ -36,6 +36,7 @@ import (
3636
3737type UserService interface {
3838 CreateUser (userInfo * bean.UserInfo ) ([]* bean.UserInfo , error )
39+ SelfRegisterUserIfNotExists (userInfo * bean.UserInfo ) ([]* bean.UserInfo , error )
3940 UpdateUser (userInfo * bean.UserInfo ) (* bean.UserInfo , error )
4041 GetById (id int32 ) (* bean.UserInfo , error )
4142 GetAll () ([]bean.UserInfo , error )
@@ -101,6 +102,114 @@ func (impl UserServiceImpl) validateUserRequest(userInfo *bean.UserInfo) (bool,
101102 return true , nil
102103}
103104
105+ func (impl UserServiceImpl ) SelfRegisterUserIfNotExists (userInfo * bean.UserInfo ) ([]* bean.UserInfo , error ) {
106+ var pass []string
107+ var userResponse []* bean.UserInfo
108+ emailIds := strings .Split (userInfo .EmailId , "," )
109+ dbConnection := impl .userRepository .GetConnection ()
110+ tx , err := dbConnection .Begin ()
111+ if err != nil {
112+ return nil , err
113+ }
114+ // Rollback tx on error.
115+ defer tx .Rollback ()
116+
117+ var policies []casbin2.Policy
118+ for _ , emailId := range emailIds {
119+ dbUser , err := impl .userRepository .FetchActiveOrDeletedUserByEmail (emailId )
120+ if err != nil && err != pg .ErrNoRows {
121+ impl .logger .Errorw ("error while fetching user from db" , "error" , err )
122+ return nil , err
123+ }
124+
125+ //if found, update it with new roles
126+ if dbUser != nil && dbUser .Id > 0 {
127+ return nil , fmt .Errorf ("existing user, cant self register" )
128+ }
129+
130+ // if not found, create new user
131+ userInfo , err = impl .saveUser (userInfo , emailId )
132+ if err != nil {
133+ err = & util.ApiError {
134+ Code : constants .UserCreateDBFailed ,
135+ InternalMessage : "failed to create new user in db" ,
136+ UserMessage : fmt .Sprintf ("requested by %d" , userInfo .UserId ),
137+ }
138+ return nil , err
139+ }
140+
141+ roles , err := impl .userAuthRepository .GetRoleByRoles (userInfo .Roles )
142+ if err != nil {
143+ err = & util.ApiError {
144+ Code : constants .UserCreateDBFailed ,
145+ InternalMessage : "configured roles for selfregister are wrong" ,
146+ UserMessage : fmt .Sprintf ("requested by %d" , userInfo .UserId ),
147+ }
148+ return nil , err
149+ }
150+ for _ , roleModel := range roles {
151+ userRoleModel := & repository2.UserRoleModel {UserId : userInfo .Id , RoleId : roleModel .Id }
152+ userRoleModel , err = impl .userAuthRepository .CreateUserRoleMapping (userRoleModel , tx )
153+ if err != nil {
154+ return nil , err
155+ }
156+ policies = append (policies , casbin2.Policy {Type : "g" , Sub : casbin2 .Subject (userInfo .EmailId ), Obj : casbin2 .Object (roleModel .Role )})
157+ }
158+
159+ pass = append (pass , emailId )
160+ userInfo .EmailId = emailId
161+ userInfo .Exist = dbUser .Active
162+ userResponse = append (userResponse , & bean.UserInfo {Id : userInfo .Id , EmailId : emailId , Groups : userInfo .Groups , RoleFilters : userInfo .RoleFilters , SuperAdmin : userInfo .SuperAdmin })
163+ }
164+ if len (policies ) > 0 {
165+ pRes := casbin2 .AddPolicy (policies )
166+ println (pRes )
167+ }
168+ err = tx .Commit ()
169+ if err != nil {
170+ return nil , err
171+ }
172+ return userResponse , nil
173+ }
174+
175+ func (impl UserServiceImpl ) saveUser (userInfo * bean.UserInfo , emailId string ) (* bean.UserInfo , error ) {
176+ dbConnection := impl .userRepository .GetConnection ()
177+ tx , err := dbConnection .Begin ()
178+ if err != nil {
179+ return nil , err
180+ }
181+ // Rollback tx on error.
182+ defer tx .Rollback ()
183+
184+ _ , err = impl .validateUserRequest (userInfo )
185+ if err != nil {
186+ err = & util.ApiError {HttpStatusCode : http .StatusBadRequest , UserMessage : "Invalid request, please provide role filters" }
187+ return nil , err
188+ }
189+
190+ //create new user in our db on d basis of info got from google api or hex. assign a basic role
191+ model := & repository2.UserModel {
192+ EmailId : emailId ,
193+ AccessToken : userInfo .AccessToken ,
194+ }
195+ model .Active = true
196+ model .CreatedBy = userInfo .UserId
197+ model .UpdatedBy = userInfo .UserId
198+ model .CreatedOn = time .Now ()
199+ model .UpdatedOn = time .Now ()
200+ model , err = impl .userRepository .CreateUser (model , tx )
201+ if err != nil {
202+ impl .logger .Errorw ("error in creating new user" , "error" , err )
203+ return nil , err
204+ }
205+ err = tx .Commit ()
206+ if err != nil {
207+ return nil , err
208+ }
209+ userInfo .Id = model .Id
210+ return userInfo , nil
211+ }
212+
104213func (impl UserServiceImpl ) CreateUser (userInfo * bean.UserInfo ) ([]* bean.UserInfo , error ) {
105214 var pass []string
106215 var userResponse []* bean.UserInfo
0 commit comments