@godspeedsystems/prisma-deterministic-search-field-encryption
Version:
Transparent and customizable field-level encryption at rest for Prisma based on prisma-field-encryption package
80 lines (74 loc) • 2.39 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateModel = void 0;
const promises_1 = __importDefault(require("node:fs/promises"));
const node_path_1 = __importDefault(require("node:path"));
async function generateModel({ modelName, model, prismaClientModule, outputDir }) {
const fields = Object.keys(model.fields);
const interfaceName = modelName.slice(0, 1).toLowerCase() + modelName.slice(1);
const content = `// This file was generated by prisma-field-encryption.
import type { PrismaClient, ${modelName} } from '${prismaClientModule}'
import {
ProgressReportCallback,
defaultProgressReport,
visitRecords
} from 'prisma-field-encryption/dist/generator/runtime'
type Cursor = ${modelName}['${model.cursor}']
export async function migrate(
client: PrismaClient,
reportProgress: ProgressReportCallback = defaultProgressReport
): Promise<number> {
return visitRecords<Cursor>({
modelName: '${modelName}',
client,
getTotalCount: client.${interfaceName}.count,
migrateRecord,
reportProgress,
})
}
async function migrateRecord(client: PrismaClient, cursor: Cursor | undefined) {
return await client.$transaction(async tx => {
const record = await tx.${interfaceName}.findFirst({
take: 1,
skip: cursor === undefined ? undefined : 1,
...(cursor === undefined
? {}
: {
cursor: {
${model.cursor}: cursor
}
}),
orderBy: {
${model.cursor}: 'asc'
},
select: {
${model.cursor}: true,
${fields.map(field => `${field}: true`).join(',\n ')}
}
})
if (!record) {
return cursor
}
await tx.${interfaceName}.update({
where: {
${model.cursor}: record.${model.cursor}
},
data: {
${fields.map(field => `${field}: record.${field}`).join(',\n ')}
}
})
return record.${model.cursor}
})
}
/**
* Internal model:
* ${JSON.stringify(model, null, 2).split('\n').join('\n * ')}
*/
`;
const outputPath = node_path_1.default.join(outputDir, `${modelName}.ts`);
return promises_1.default.writeFile(outputPath, content);
}
exports.generateModel = generateModel;
;