moleculer-db icon indicating copy to clipboard operation
moleculer-db copied to clipboard

[FEATURE REQUEST] - Inlcude multiple data entities for a single service

Open go4cas opened this issue 8 years ago • 10 comments

At present moleculer-db allows only for a single data model per service. There might be use cases where a service needs to manage multiple data entities (tables in a data schema).

Example: Service: Access Control Service - a service managing role based access control for the stack. Data Entities:

  • Roles: Access roles (e.g. administrator, user, super user, etc)
  • Role Groups: Grouping access roles together (e.g. finance, technical, marketing, etc)
  • Functions: System functions that users might have access to (e.g. edit Customer, delete account, etc)
  • Role Functions: Mapping Roles to Functions

Currently, I would have to create a service for each data entity, i.e. role-service, roleGroup-service, function-service, roleRunction-service.

Each of these services will then link to the underlying data table, using the model property of the service, e.g.:

model: {
    name: "roles",
    define: {
        _id: Sequelize.INTEGER,
        title: Sequelize.STRING,
        status: Sequelize.STRING
    }
}

Accessing the model methods:

this.model.findById(ctx.params.id)

It would be great if the model property could accept an array of model objects. Accessing these from the service, would look something like:

this.model.roles.findById(ctx.params.id)

go4cas avatar Jan 19 '18 05:01 go4cas

+1 Yeah, this is a key feature, that needs to be added.

mradkov avatar Dec 17 '18 15:12 mradkov

is it still open?

Hexenon avatar Mar 04 '19 09:03 Hexenon

Yes, but it won't be implemented in this version of moleculer-db.

icebob avatar Mar 04 '19 17:03 icebob

Im happy to take a look at implementing this. I don't think it's too difficult but we would need to decide how to change the api for update / find / delete etc.

@icebob do you have any ideas on how the interface should work?

bytesoverflow avatar May 28 '19 16:05 bytesoverflow

Any news on this?

b0bben avatar Mar 02 '20 16:03 b0bben

any workaround? do I need to create 1 service per table and communicate with each other?

d0whc3r avatar May 08 '20 18:05 d0whc3r

with modules moleculer-db moleculer-db-adapter-mongoose

u can make one service with multiple tables like this

const DbService = require("moleculer-db");
const MongooseAdapter = require("moleculer-db-adapter-mongoose");
const { MONGO_DB_URI } = process.env

const User = require("../model/user.model");
const Post = require("../model/post.model");

/*
...
*/


module.exports = {
  adapter: new MongooseAdapter(MONGO_DB_URI),
  mixins: [DbService],
  model: {
    User,
    Post,
  },
  
  
  // and handle in this service in customHandle action
  
  actions: {
    customHandle: {
      async handler(ctx) {
        const { User, Post } = this.adapter.model;
        const [users, posts] = await Promise.all([User.find(), Post.find()]
        return { users, posts };
    }
  }
}

JS-AK avatar May 20 '22 17:05 JS-AK

Can we have a sneak peek with what's inside: const User = require("../model/user.model");

I'm having the same problem. @JS-AK

cavinpabua avatar Aug 25 '22 09:08 cavinpabua

Is it possible with the sequelize adapter? Maybe show us what's inside the .model file?

truesteps avatar Mar 23 '23 10:03 truesteps

Can we have a sneak peek with what's inside: const User = require("../model/user.model");

I'm having the same problem. @JS-AK

const mongoose = require("mongoose");

const schema = new mongoose.Schema({
	email: {type: String},
	firstName: {type: String},
}, {timestamps: true});

module.exports = mongoose.model("User", schema);

JS-AK avatar Mar 25 '23 10:03 JS-AK