Beispiel #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());
        }
Beispiel #2
0
        public async Task <ResponseModel <UserComposite> > QueryUser(string email, IncludeOptions options = IncludeOptions.None)
        {
            TableQuery <EmailEntity> query = new TableQuery <EmailEntity>().Where(EmailEntity.QueryKey(email));
            var rs = await QueryEntities <EmailEntity>(query);

            if (rs.Code != ResponseCode.Ok)
            {
                return(ResponseModel <UserComposite> .Error(rs.Code, rs.Message));
            }
            if (rs.Data[0].Email.UserId == null || rs.Data[0].Email.UserId == Guid.Empty)
            {
                return(ResponseModel <UserComposite> .Error(ResponseCode.NotFound));
            }
            return(await QueryUser(rs.Data[0].Email.UserId, options));
        }
Beispiel #3
0
        public async Task <ResponseModel <EmailComposite> > QueryEmail(string email, IncludeOptions options = IncludeOptions.None)
        {
            EmailComposite           c     = new EmailComposite();
            TableQuery <EmailEntity> query = new TableQuery <EmailEntity>().Where(EmailEntity.QueryKey(email));
            var rs = await QueryEntities <EmailEntity>(query);

            if (rs.Code != ResponseCode.Ok)
            {
                return(ResponseModel <EmailComposite> .Error(rs.Code, rs.Message));
            }
            c.Email = rs.Data[0].Email;
            if ((options & IncludeOptions.Entities) == IncludeOptions.Entities)
            {
                c.EmailEntity = rs.Data[0];
            }
            return(ResponseModel <EmailComposite> .Success(c));
        }
Beispiel #4
0
        public async Task <ResponseModel> DeleteUserAsync(UserModel user)
        {
            ResponseModel rs = null;

            // delete everything about the user...
            rs = await this.DeletePartition(EntityTableType.user, user.UserId.Encode());

            if (rs.Code == ResponseCode.Ok)
            {
                //release the email
                var ee = await this.QueryEmail(user.Email, IncludeOptions.Entities);

                if (ee.Code == ResponseCode.Ok)
                {
                    EmailEntity e = ee.Data[0].EmailEntity;
                    e.Email.UserId = Guid.Empty;
                    rs             = await this.UpdateEntity <EmailEntity>(e);
                }
            }

            return(rs);
        }
Beispiel #5
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));
        }