moleculerjs / moleculer-db

:battery: Database access service mixins for Moleculer
https://moleculer.services/
MIT License
152 stars 123 forks source link

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

Open go4cas opened 6 years ago

go4cas commented 6 years ago

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:

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)
mradkov commented 5 years ago

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

Hexenon commented 5 years ago

is it still open?

icebob commented 5 years ago

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

tobydeh commented 5 years ago

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?

b0bben commented 4 years ago

Any news on this?

d0whc3r commented 4 years ago

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

JS-AK commented 2 years ago

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 };
    }
  }
}
cavinpabua commented 2 years ago

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

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

truesteps commented 1 year ago

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

JS-AK commented 1 year ago

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);