Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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));
        }