Skip to main content

Is there a way to replace built-in Models Endpoint method in loopbackjs?

I am trying to replace the User model's built-in Create method to add some extra custom logic and reformat the response data according to my need. Is there any way to do it?

Thanks in advance

Solved

You need to declare a new model. Then, afterwards, manually add a base property for it to inherit from the built-in User model.

/common/models/custom-user.json

{
  "name": "customUser",
  "base": "User",
  "options": {
    "idInjection": false,
    "postgresql": {
      "schema": "public",
      "table": "user"
    }
  },
  "dataSource": "mypostgresDS",
  "properties": {
    "id": {
      "type": "number",
      "postgresql": {
        "columnName": "id",
        "dataType": "integer"
      }
    }
   ...
   ...
   }
}

Then you can override builtin routes on

/common/models/custom-user.js

module.exports = function (customUser) {

    // avoid looking for properties that your new model doesn't have
    var excludedProperties = [
        'realm',
        'emailVerified',
        'verificationToken',
        'credentials',
        'challenges',
        'lastUpdated',
        'created'
    ];

    // Remove the properties from base User model that doesn't have mapped columns
    excludedProperties.forEach(function (p) {
        delete customUser.definition.rawProperties[p];
        delete customUser.definition.properties[p];
        delete customUser.prototype[p];
    });

    customUser.prototype.createAccessToken = function (ttl, cb) {
        var user = this;
        if (ttl === undefined) ttl = 259200;
        var timenow = new Date().toISOString();
        console.log('ttl will be ', ttl, ' current time is ' + timenow);
        user.accessTokens.create({
            ttl: ttl
        }, cb);
    };


    customUser.prototype.checkPassword = function (password, stored_hash) {
        var user = this;
        console.log('I will overwrite this check to always return true');
        return true;
    };
});

Comments

Popular posts from this blog

Fade Inline-Block with CSS and Velocity JS

I'm using Velocity JS to fade a list object. The problem is that Velocity applies display: list-item; opacity: 1; to the element and overrides my display: inline-block; and my list is now vertical. How can I force it to always use inline-block? https://jsfiddle.net/01qvqmxa/ HTML test test test CSS li { opacity: 0; display: inline-block; padding: 1em; } JS $(".myList li").velocity("fadeIn", { delay: 300, duration: 2000 }); Solved Try using the !important notation: li { opacity: 0; display: inline-block !important; padding: 1em; } revised fiddle

Converting categorical variables into numbers

I have a categorical variable educa that needs to be converted into numbers for readability. educa can take on 6 values. I want to convert them into 1-6. How do I do this? This doesn't work: brfs2013educationsummarycleaned % mutate( educa_level = ifelse(educa == "Never attended school or only kindergarten", 1, educat == "Grades 1 through 8 (Elementary)", 2, "not a real category")) What am I doing wrong? The above is a portion of what I intend to do. Solved We can use match if the values in 'educa' have to be converted based on the order in which they appear in the data library(tidyverse) brfs2013educationsummary %>% mutate(educa_level = match(educa, unique(educa))) as.numeric(educa) will do what you want and if you want it as new column brfs2013educationsummarycleaned % mutate(educa_level = as.numeric(educa))