4

Given a brand new project created with:

$ slc lb project myapp

How do I replace the 'user' model in models.json with a 'customer' model placed in the ./models directory? Customers should have the login/logout etc. methods and 'users' should not exist as an API. Also, the customer model should not be dynamic. Let's pretend customer should have a schema as follows:

  • name
  • email
  • password
  • question
  • answer
  • phone
  • verified
  • dataCreated

I've been playing with this for a couple of days and my google-fu is letting me down. Any help appreciated. Thanks.

Deduplicator
  • 44,692
  • 7
  • 66
  • 118
huxley
  • 295
  • 1
  • 3
  • 13

1 Answers1

4

This is the idiomatic way:

  1. In models.json, rename user to Customer.

  2. In models/customer.js, add custom methods to the model created via models.json:

    var app = require('../app');
    var Customer = app.models.Customer;
    
    Customer.myfn = function(cb) {
      // etc.
      cb();
    };
    

Also, the customer model should not be dynamic. Let's pretend customer should have a schema as follows

Use strict to lock down the properties:

{
  "Customer": {
    "options": {
      "base": "User",
      "strict": true
    },
    "properties": {
      // define properties (schema)
    }
  }
}

See Model definition reference for more details.

Update based on the comment below this answer

It is possible to create your models code-first, see customer.js in LoopBack's sample app that was built before models.json was introduced.

Here is what you should do in your code:

var app = require('../app');

var Customer = module.exports = loopback.createModel(
  'Customer',
  {
    name: 'string',
    // and all other more properties
  },
  {
    base: 'User',
    strict: true
  }
);

app.model(Customer);

That is basically the same code that is executed by app.boot for all entries in models.json. It should add the familiar REST routes to your application: GET /customers, POST /customers/login, POST /customers/logout, etc.

It is very difficult to help you without seeing your code that does not work and knowing what exactly do you mean by "not working".

Miroslav Bajtoš
  • 10,667
  • 1
  • 41
  • 99
  • Thanks for the answer. This works but ultimately this is not what I was looking for. I do not actually have anything against using models.json, however as a learning tool I wanted to try and divorce this Customer model completely from models.json. In my own initial attempts I placed customer.js & customer.json files in /models folder, which bought me nice CRUD rest endpoints, however they were lacking the /login sauce (I used a `base: user` property for customer). Maybe I'm just asking my question wrong, or maybe the answer is; don't do that, the above method IS the way to do it. – huxley Jul 10 '14 at 13:31
  • Sorry, I didn't get notified that this answer was updated. Yes, code-first was what I was after. I got there eventually and it basically matches exactly what you have above. Technically this is answered, but my Customer login doesn't work. When I post to `/customer/login` my result had id, ttl, and **userId**. Since the FK should be customerId I can't use the supplied accessToken. I think I'll mark complete and ask it as a new question. Thanks for your help. – huxley Jul 16 '14 at 22:46