Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

updateAttributes on model calls validation for other fields #759

Closed
kussberg opened this issue Nov 11, 2015 · 18 comments
Closed

updateAttributes on model calls validation for other fields #759

kussberg opened this issue Nov 11, 2015 · 18 comments

Comments

@kussberg
Copy link

Hello,

we have noticed a problem, that when we use the update of specific fields and before that we queried data with "fields:{...}" it is throwing validation errors for other fields, that are out of the update scope. For example:

Required: title, description
Query: fields{title:true}
Update: title: "aaa"
Error: description is required

This should be fixed to validate only the attributes, that are the part of update scope?

@florianheinze
Copy link

I experience the same. I had to create (or better extend) a dirty workaround:

// in common/models/my-model.js
MyModel.observe('before save', function(ctx, next) {

  // TODO this is another ugly workaround to trigger validation also for updates
  // i expect this is a bug: https://github.com/strongloop/loopback-datasource-juggler/issues/771
  if (ctx.data) {
    var d = new MyModel(ctx.data);
    d.isValid(function (valid) {
      if (valid) {
        next();
      } else {
        // TODO dirty workaround to detect if an unmodified field is claimed as invalid
        // https://github.com/strongloop/loopback-datasource-juggler/issues/759
        for (var k in ctx.data) {
          if (d.errors[k]) {
            next(d.errors);
            return;
          }
        }
        next();
      }
    }); // is valid function
  } else {
    next();
  }

});

Note that there are actually two workarounds. There seems to be another scary bug that the validation isn't triggered at all for (some?) updates (#771). I am not sure if that workaround is necessary for this bug.

Maybe it helps someone.

@Amir-61
Copy link
Contributor

Amir-61 commented May 31, 2016

Yes this is a bug; closing in favour of #771

@soyacz
Copy link

soyacz commented Sep 9, 2016

Hello,
I understand that bug #771 is regarding ignoring validation for updateAll method. But still issue with validation of fields out of scope in updateAttribute method occurs. I suggest to reopen this bug.

@dehypnosis
Copy link

I thinks certainly a bug too

@vkruoso
Copy link

vkruoso commented Mar 1, 2017

I think this is a separate but related issue considering #771. Here we are concerned that we always need to send a valid object to the API even if we want to update a single field. Over there, the validation not being triggered is the problem.

There is any updates related to this? I'm trying to update an user record, but it is asking me to send its password because it is a required field when creating the user.

@thijsvanbuuren
Copy link

This is still an issue in my opinion, partial updates cause all kinds of validation errors on fields we aren't even changing.

I've tested it with the latest versions of loopback v3 but i'm still running into this problem.

@barocsi
Copy link

barocsi commented Feb 13, 2018

@bajtos Still an issue. Repopen suggested. Why is this being ignored? Seems a design problem.

@kjdelisle
Copy link
Contributor

Is this still happening in 3.x, or is it 2.x that's having the issue?
Please respond here with the versions that are running into this validation issue and @bajtos and I will take a look.

@kjdelisle kjdelisle reopened this Feb 13, 2018
@barocsi
Copy link

barocsi commented Feb 14, 2018

yes, 3.3.0.

@michaelfreund
Copy link

const user = await userModel.findById(<id>);
user.updateAttributes({ status: 1 });

This operation triggers the following error

The 'user' instance is not valid. Details: 'email' Email already exists.

Is this behavior really intended or is it a bug?

@huitre
Copy link

huitre commented Mar 20, 2018

Same problem here with version 3.x, any update on this problem?

@rafaelgom3s
Copy link

rafaelgom3s commented Mar 20, 2018

running into the same problem as @michaelfreund in version 3.15.5, but I can pinpoint that the problem in my case was that indeed there was a duplicate user with the same email, once I've removed the duplicated user the problem was gone.

@dhmlau
Copy link
Member

dhmlau commented Mar 21, 2018

@bajtos , any ideas?

@bajtos
Copy link
Member

bajtos commented Mar 23, 2018

I have two comments:

  • For long term, we need to implement partial validations. user.updateAttributes({ status: 1 }); should validate only the status property and ignore everything else. Right now, we always validate all properties.

  • As for the error The 'user' instance is not valid. Details: 'email' Email already exists., this may be a bug in the unique validator and or the configuration of email validations. Since the user instance was fetched from the database, it should be considered as "not new" and therefore the email validation should allow a seemingly duplicate email value if the database record with the same email is actually the same record we are trying to update.

@stale
Copy link

stale bot commented May 22, 2018

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale bot added the stale label May 22, 2018
@stale
Copy link

stale bot commented Jun 5, 2018

This issue has been closed due to continued inactivity. Thank you for your understanding. If you believe this to be in error, please contact one of the code owners, listed in the CODEOWNERS file at the top-level of this repository.

@stale stale bot closed this as completed Jun 5, 2018
@0candy 0candy removed the triaging label Jun 5, 2018
@Allan1
Copy link

Allan1 commented Mar 30, 2019

+1

@bajtos
Copy link
Member

bajtos commented Apr 18, 2019

Essentially, we need to run a partial validation that will validate only properties affected by updateAttribtes or updateAll request. I am afraid this is way too difficult to achieve in the current LB 3.x code base. We are aware of this issue and would like to eventually address it in LoopBack 4.x (or later) - see the discussion in loopbackio/loopback-next#1872.

I am going to lock this issue down, in order to move the discussion to loopbackio/loopback-next#1872.

@loopbackio loopbackio locked as resolved and limited conversation to collaborators Apr 18, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests