Просмотр исходного кода

chore(@growi/app): prisma client extension example

mizozobu 2 недель назад
Родитель
Сommit
2f34990204

+ 1 - 3
apps/app/prisma/index.ts

@@ -3,7 +3,7 @@ import { config } from 'dotenv-flow';
 import { MongoClient } from 'mongodb';
 import { MongoDBStorage, Umzug } from 'umzug';
 
-import { PrismaClient } from '~/generated/prisma/client';
+import { type PrismaClient, prisma } from '~/utils/prisma';
 
 config();
 
@@ -15,8 +15,6 @@ config();
   const client = new MongoClient(url);
   await client.connect();
 
-  const prisma = new PrismaClient();
-
   const umzug = new Umzug({
     migrations: { glob: resolve(__dirname, 'migrations/*.(ts|js)') },
     context: prisma,

+ 1 - 0
apps/app/src/features/page/index.ts

@@ -0,0 +1 @@
+export * from './models';

+ 1 - 0
apps/app/src/features/page/models/index.ts

@@ -0,0 +1 @@
+export * from './revision';

+ 40 - 0
apps/app/src/features/page/models/revision.ts

@@ -0,0 +1,40 @@
+import { Prisma } from '~/generated/prisma/client';
+
+export const extension = Prisma.defineExtension((client) =>
+  client.$extends({
+    model: {
+      revisions: {
+        findLatest(pageId: string) {
+          return Prisma.getExtensionContext(this).findFirst({
+            where: {
+              pageId,
+            },
+            orderBy: {
+              createdAt: 'desc',
+            },
+          });
+        },
+      },
+    },
+    result: {
+      revisions: {
+        isPlain: {
+          needs: {
+            format: true,
+          },
+          compute(revision) {
+            return !['markdown'].includes(revision.format);
+          },
+        },
+        isMarkdown: {
+          needs: {
+            format: true,
+          },
+          compute(revision) {
+            return () => revision.format === 'markdown';
+          },
+        },
+      },
+    },
+  }),
+);

+ 6 - 9
apps/app/src/server/routes/apiv3/revisions.js

@@ -3,7 +3,6 @@ import { ErrorV3 } from '@growi/core/dist/models';
 import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
 import express from 'express';
 
-import { PrismaClient } from '~/generated/prisma/client';
 import { accessTokenParser } from '~/server/middlewares/access-token-parser';
 import loginRequiredFactory from '~/server/middlewares/login-required';
 import { Revision } from '~/server/models/revision';
@@ -12,6 +11,7 @@ import {
   normalizeLatestRevisionIfBroken,
 } from '~/server/service/revision/normalize-latest-revision-if-broken';
 import loggerFactory from '~/utils/logger';
+import { prisma } from '~/utils/prisma';
 
 import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
 
@@ -21,8 +21,6 @@ const { query, param } = require('express-validator');
 
 const router = express.Router();
 
-const prisma = new PrismaClient();
-
 /**
  * @swagger
  * components:
@@ -134,12 +132,6 @@ module.exports = (crowi) => {
     validator.retrieveRevisions,
     apiV3FormValidator,
     async (req, res) => {
-      const revisions = await prisma.revisions.findMany({
-        where: {
-          pageId: req.query.pageId,
-        },
-      });
-      console.log(revisions);
       const pageId = req.query.pageId;
       const limit =
         req.query.limit ||
@@ -150,6 +142,11 @@ module.exports = (crowi) => {
       const { isSharedPage } = req;
       const offset = req.query.offset || 0;
 
+      const revision = await prisma.revisions.findLatest(pageId);
+      console.log(revision);
+      console.log(revision.isPlain);
+      console.log(revision.isMarkdown());
+
       // check whether accessible
       if (
         !isSharedPage &&

+ 5 - 0
apps/app/src/utils/prisma.ts

@@ -0,0 +1,5 @@
+import { extension as RevisionExtension } from '~/features/page';
+import { PrismaClient as OriginalPrismaClient } from '~/generated/prisma/client';
+
+export const prisma = new OriginalPrismaClient().$extends(RevisionExtension);
+export type PrismaClient = typeof prisma;