Skip to content

noluckjustskill/moleculer-db-adapter-prisma

Repository files navigation

Moleculer logo

moleculer-db-adapter-prisma NPM version Unit tests Integration tests

SQL adapter for Moleculer DB service with Prisma.

Features

Install

$ npm install moleculer-db-adapter-prisma prisma --save

Usage

Define schema in project root

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DB_CONNECTION_URL")
}

model Post {
  id        String   @id @default(uuid()) @db.VarChar(36)
  title     String   @db.VarChar(255)
  content   String?
  votes     Int
  status    Boolean
  createdAt DateTime @default(now())
}

Generate client

prisma generate

Do not forget sync DB structure: Schema prototyping

Write service

"use strict";

const { ServiceBroker } = require("moleculer");
const DbService = require("moleculer-db");
const PrismaAdapter = require("moleculer-db-adapter-prisma");

const broker = new ServiceBroker();

broker.createService({
  name: "posts",
  mixins: [DbService],
  adapter: new PrismaAdapter(),
  model: "post", // Model name in camelCase
});

broker.start()
// Create a new post
.then(() => broker.call("posts.create", {
  title: "My first post",
  votes: 0,
  status: true,
}))

// Get all posts
.then(() => broker.call("posts.find").then(console.log));

Raw queries

actions: {
  findHello2() {
    return this.adapter.db
      .query("SELECT * FROM posts WHERE title = 'Hello 2' LIMIT 1")
      .then(console.log);
  }
}

Soft delete

  1. Add deletedAt field to model
model Post {
  id        String   @id @default(uuid()) @db.VarChar(36)
  title     String   @db.VarChar(255)
  content   String?
  votes     Int
  status    Boolean
  createdAt DateTime @default(now())
  deletedAt DateTime? @db.DateTime()
}
  1. Define adapter with enableSoftDelete flag:
broker.createService({
  name: "posts",
  mixins: [DbService],
  adapter: new PrismaAdapter({ enableSoftDelete: true }),
  model: "post", // Model name in camelCase
});
  1. Next all 'deletion' methods will set deletedAt = now(). Get and find methods will filter by deletedAt IS NULL

Run example

  1. Up local DB instance in docker
docker run --name prisma_demo -e MYSQL_PASSWORD=password -e MYSQL_USER=user -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -e MYSQL_DATABASE=prisma -p 3306:3306 -d mysql:8.0.23 --default-authentication-plugin=mysql_native_password
  1. Sync DB structure and generate client
npm run prisma:push
npm run prisma:gen
  1. Run example script
npm run dev

Test

$ npm test

In development with watching

$ npm run ci

License

The project is available under the MIT license.

Contact

Copyright (c) 2016-2022 MoleculerJS

@moleculerjs @MoleculerJS

About

Prisma adapter for Moleculer.js

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published