Lucas Wilms
Lucas Wilms

Reputation: 21

"The model user-permissions can't be found."

System Information

Strapi Version: 3.6.5
Operating System: MacOS 11.4
Database: SQL
Node Version: 14.17.0
NPM Version: 6.14.13

Hey there,

I wanted to have a function to change the password by passing the old password and a new one. For that, I found this solution from yohanes (https://stackoverflow.com/a/65237275/9476651). Unfortunately, if I want to execute the POST request, I get the error "Error: The model users-permissions can’t be found. It’s coming from this piece of code:
const user = await strapi.query('user', 'users-permissions').findOne({ email: params.identifier });
This is the first out of maximum three times I need to use the users-permissions plugin and I am pretty sure this error will occur at the other usages as well.

Is there anyone who is able to help me? Have a great day!

Lucas

My full code:

"use strict";

/**
 * api/password/controllers/password.js
 */

const { sanitizeEntity } = require("strapi-utils");
const formatError = (error) => [
  { messages: [{ id: error.id, message: error.message, field: error.field }] },
];

module.exports = {
  index: async (ctx) => {
    // const params = JSON.parse(ctx.request.body);
    const params = ctx.request.body;

    // The identifier is required
    if (!params.identifier) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.email.provide",
          message: "Please provide your username or your e-mail.",
        })
      );
    }

    // The password is required
    if (!params.password) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your password.",
        })
      );
    }

    // The new password is required
    if (!params.newPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your new password.",
        })
      );
    }

    if (!params.confirmPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your new password confirmation.",
        })
      );
    }

    if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword !== params.confirmPassword
    ) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.matching",
          message: "New passwords do not match.",
        })
      );
    } else if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword === params.confirmPassword
    ) {
      // Get user based on identifier
      const user = await strapi
        .query("user", "users-permissions")
        .findOne({ email: params.identifier });

      // Validate given password against user query result password
      const validPassword = await strapi.plugins[
        "users-permissions"
      ].services.user.validatePassword(params.password, user.password);

      if (!validPassword) {
        return ctx.badRequest(
          null,
          formatError({
            id: "Auth.form.error.invalid",
            message: "Identifier or password invalid.",
          })
        );
      } else {
        // Generate new hash password
        const password = await strapi.plugins[
          "users-permissions"
        ].services.user.hashPassword({
          password: params.newPassword,
        });

        // Update user password
        await strapi
          .query("users-permissions")
          .update({ id: user.id }, { resetPasswordToken: null, password });

        // Return new jwt token
        ctx.send({
          jwt: strapi.plugins["users-permissions"].services.jwt.issue({
            id: user.id,
          }),
          user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
            model: strapi.query("user", "users-permissions").model,
          }),
        });
      }
    }
  },
};```

Upvotes: 0

Views: 2880

Answers (1)

vinay sandesh
vinay sandesh

Reputation: 978

This part of the code works perfectly fine. const user = await strapi.query('user', 'users-permissions').findOne({ email: params.identifier }); The issue is with the other places where users-permissions is used. You need to use "user", "users-permissions" instead of only "users-permissions". I modified the code below so it works now.

"use strict";

/**
 * api/password/controllers/password.js
 */

const { sanitizeEntity } = require("strapi-utils");
const formatError = (error) => [
  { messages: [{ id: error.id, message: error.message, field: error.field }] },
];

module.exports = {
  index: async (ctx) => {
    // const params = JSON.parse(ctx.request.body);
    const params = ctx.request.body;
    console.log("params is ", params);
    // The identifier is required
    if (!params.identifier) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.email.provide",
          message: "Please provide your username or your e-mail.",
        })
      );
    }

    // The password is required
    if (!params.password) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your password.",
        })
      );
    }

    // The new password is required
    if (!params.newPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your new password.",
        })
      );
    }

    if (!params.confirmPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your new password confirmation.",
        })
      );
    }

    if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword !== params.confirmPassword
    ) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.matching",
          message: "New passwords do not match.",
        })
      );
    } else if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword === params.confirmPassword
    ) {
      // Get user based on identifier
      const user = await strapi
        .query("user", "users-permissions")
        .findOne({ email: params.identifier });

      // Validate given password against user query result password
      const validPassword = await strapi.plugins[
        ("user", "users-permissions")
      ].services.user.validatePassword(params.password, user.password);

      if (!validPassword) {
        return ctx.badRequest(
          null,
          formatError({
            id: "Auth.form.error.invalid",
            message: "Identifier or password invalid.",
          })
        );
      } else {
        // Generate new hash password
        const password = await strapi.plugins[
          ("user", "users-permissions")
        ].services.user.hashPassword({
          password: params.newPassword,
        });

        // Update user password
        await strapi
          .query("user", "users-permissions")
          .update({ id: user.id }, { resetPasswordToken: null, password });

        // Return new jwt token
        ctx.send({
          jwt: strapi.plugins[("user", "users-permissions")].services.jwt.issue(
            {
              id: user.id,
            }
          ),
          user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
            model: strapi.query("user", "users-permissions").model,
          }),
        });
      }
    }
  },
};

Upvotes: 1

Related Questions