ps73/feathers-prisma

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# feathers-prisma

[![libraries.io](https://img.shields.io/librariesio/release/npm/feathers-prisma)](https://libraries.io/npm/feathers-prisma)
[![Code Climate](https://codeclimate.com/github/ps73/feathers-prisma/badges/gpa.svg)](https://codeclimate.com/github/ps73/feathers-prisma)
[![Test Coverage](https://codeclimate.com/github/ps73/feathers-prisma/badges/coverage.svg)](https://codeclimate.com/github/ps73/feathers-prisma/coverage)
[![npm](https://img.shields.io/npm/v/feathers-prisma.svg?maxAge=3600)](https://www.npmjs.com/package/feathers-prisma)

> A [Feathers](https://feathersjs.com) service adapter for [Prisma](prisma.io) ORM.

## Installation

```
npm install feathers-prisma --save
```

## Documentation

This adapter supports all methods (`create`, `delete`, `update`, `patch`, `find`, `get`) and the common way for querying (`equality`, `$limit`, `$skip`, `$sort`, `$select`, `$in`, `$nin`, `$lt`, `$lte`, `$gt`, `$gte`, `$ne`, `$or`, `$and`). Also supports eager loading (`$eager`), full-text search (`$search`) and prisma filtering (from 0.7.0 on with `$prisma`, previously with `$rawWhere` which is now deprecated).

## Prisma Version

- Prisma v3 use `feathers-prisma` v0.6.0
- Prisma v5 use `feathers-prisma` v0.7.0 or higher

### Setup

```js
import feathers from "@feathersjs/feathers";
import { service } from "feathers-prisma";
import { PrismaClient } from "@prisma/client";

// Initialize the application
const app = feathers();

// Initialize the plugin
const prismaClient = new PrismaClient();
prismaClient.$connect();
app.set("prisma", prismaClient);

const paginate = {
  default: 10,
  max: 50,
};

app.use(
  "/messages",
  service(
    {
      model: "messages",
      paginate,
      multi: ["create", "patch", "remove"],
      whitelist: ["$eager"],
    },
    prismaClient
  )
);
```

### Eager Loading / Relation Queries

Relations can be resolved via `$eager` property in your query. It supports also deep relations. The `$eager` property **has to be** set in the `whitelist` option parameter. Otherwise the service will throw an error.

```js
app.use(
  "/messages",
  service(
    {
      model: "message",
      whitelist: ["$eager"],
    },
    prismaClient
  )
);
// will load the recipients with the related user
// as well as all attachments  of the messages
app.service("messages").find({
  query: {
    $eager: [["recipients", ["user"]], "attachments"],
  },
});
// selecting specific fields is also supported since 0.4.0
app.service("messages").find({
  query: {
    $eager: {
      recipients: ["receivedAt", "user"],
    },
  },
});
```

### Filter with default prisma filters

Since 0.5.0 it is possible to use default prisma filters. This makes it possible to [filter JSON](https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields) fields or to [filter relations](https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries#relation-filters).

The `$prisma` property **has to be** set in the `whitelist` option parameter. Otherwise the service will throw an error.

Since 0.7.0 use the $prisma property to filter instead of using the $rawWhere property.

```js
app.use(
  "/messages",
  service(
    {
      model: "message",
      whitelist: ["$prisma"],
    },
    prismaClient
  )
);
// will load all messages where at least one of the recipients userIds is equal 1
app.service("messages").find({
  query: {
    recipients: {
      $prisma: {
        some: {
          userId: 1,
        },
      },
    },
  },
});
```

### Batch requests

This adapter supports batch requests. This is possible by allowing this in the `multi` property in the service options. Supported methods are `create`, `patch` and `delete`.

```js
app.use(
  "/messages",
  service(
    {
      model: "messages",
      multi: ["create", "patch", "delete"],
    },
    prismaClient
  )
);

app.service("messages").create([{ body: "Lorem" }, { body: "Ipsum" }]);
```

### Full-Text Search

Prisma supports a full-text search which is currently in preview mode. Find out more how to activate it [here](https://www.prisma.io/docs/concepts/components/prisma-client/full-text-search). If you activated it through your schema you have to allow it in the `whitelist` property:

```js
app.use(
  "/messages",
  service(
    {
      model: "messages",
      whitelist: ["$search"],
    },
    prismaClient
  )
);

app.service("messages").find({
  query: {
    body: {
      $search: "hello | hola",
    },
  },
});
```

## Complete Example

Here's an example of a Feathers server that uses `feathers-prisma`.

```js
import feathers from "@feathersjs/feathers";
import { service } from "feathers-prisma";

// Initialize the application
const app = feathers();

// Initialize the plugin
const prismaClient = new PrismaClient();
prismaClient.$connect();
app.set("prisma", prismaClient);

const paginate = {
  default: 10,
  max: 50,
};

app.use(
  "/messages",
  service(
    {
      model: "messages",
      paginate,
      multi: ["create", "patch", "remove"],
      whitelist: ["$eager"],
    },
    prismaClient
  )
);
```

```js
// Or if you want to extend the service class
import { PrismaService } from "feathers-prisma";
```

## License

Copyright (c) 2021.

Licensed under the [MIT license](LICENSE).