public async Task <ResponseModel> CreateUserAsync(UserModel user) { var rs = await this.QueryEmail(user.Email, IncludeOptions.Entities); if (rs.Code == ResponseCode.NoData) { EmailEntity e = new EmailEntity(new EmailModel(user.Email, user.UserId)); var rsE = await this.InsertEntity <EmailEntity>(e); if (rsE.Code != ResponseCode.Ok) { return(rsE); } } else if (rs.Code == ResponseCode.Ok) { //exists, see if the userid is set.. if not, update it if (rs.Data[0].HasUser) { return(ResponseModel.Error(ResponseCode.EmailUnavailable)); } rs.Data[0].EmailEntity.Email.UserId = user.UserId; var rsE = await this.UpdateEntity <EmailEntity>(rs.Data[0].EmailEntity); if (rsE.Code != ResponseCode.Ok) { return(rsE); } } else { return(rs.ToResponse()); } //we're here - email entity set - now create the user UserEntity ue = new UserEntity(user); var rsU = await this.InsertEntity(ue); //return an error and we'll also need to revert the userId on the email record if (rsU.Code != ResponseCode.Ok) { var dte = EmailEntity.SetUser(user.Email, Guid.Empty); var rsDTE = await this.UpdateEntityProperty(EntityTableType.email, dte); // fire and forget if (rsDTE.Code != ResponseCode.Ok) { // handle appropriately } return(rsU); } return(ResponseModel.Success()); }
public async Task <ResponseModel <UserModel> > ChangeUserEmailAsync(Guid userId, string newEmail) { var rsUser = await this.QueryUser(userId, IncludeOptions.Entities); if (rsUser.Code != ResponseCode.Ok) { return(ResponseModel <UserModel> .Error(rsUser.Code, rsUser.Message)); } var user = rsUser.Data[0].User; var rsOldEmail = await this.QueryEmail(user.Email); if (rsOldEmail.Code != ResponseCode.Ok) { return(ResponseModel <UserModel> .Error(rsOldEmail.Code, rsOldEmail.Message)); } var rsNewEmail = await this.QueryEmail(newEmail); if (rsNewEmail.Code != ResponseCode.Ok && rsNewEmail.Code != ResponseCode.NoData) { return(ResponseModel <UserModel> .Error(rsNewEmail.Code, rsNewEmail.Message)); } if (rsNewEmail.Code == ResponseCode.Ok && rsNewEmail.Data[0].HasUser) { return(ResponseModel <UserModel> .Error(ResponseCode.EmailUnavailable)); } //release the userId from the old email -> or maybe wait to do that once the email has been verified? var rsOld = await this.UpdateEntityProperty(EntityTableType.email, EmailEntity.SetUser(user.Email, Guid.Empty)); if (rsOld.Code != ResponseCode.Ok) { return(ResponseModel <UserModel> .Error(rsOld.Code, rsOld.Message)); } ResponseModel rsNew = null; if (rsNewEmail.Code == ResponseCode.NoData) { rsNew = await this.InsertEntity <EmailEntity>(new EmailEntity( new EmailModel(newEmail, userId))); } else if (rsNewEmail.Code == ResponseCode.Ok) { rsNew = await this.UpdateEntityProperty(EntityTableType.email, EmailEntity.SetUser(newEmail, userId)); } if (rsNew.Code != ResponseCode.Ok) { //revert the old email address update rsOld = await this.UpdateEntityProperty(EntityTableType.email, EmailEntity.SetUser(user.Email, user.UserId)); if (rsOld.Code != ResponseCode.Ok) { return(ResponseModel <UserModel> .Error(rsOld.Code, rsOld.Message)); } return(ResponseModel <UserModel> .Error(rsNew.Code, rsNew.Message)); } //we're here - email entity set - now update the user user.EmailOld = user.Email; user.Email = newEmail; user.EmailInvalid = false; user.EmailVerification = new UserContactVerificationModel(ContactMethodType.Email); var dte = UserEntity.UpdateEmail(userId, user.EmailOld, user.Email, user.EmailVerification); var rsU = await this.UpdateEntityProperty(EntityTableType.user, dte); //return an error and we'll also need to revert the userId on the email record if (rsU.Code != ResponseCode.Ok) { // handle appropriately } return(ResponseModel <UserModel> .Success(user)); }