Skip to content

Commit

Permalink
Add support for MongoDB
Browse files Browse the repository at this point in the history
  • Loading branch information
timleslie committed Aug 3, 2021
1 parent a92169d commit 9eaa594
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 7 deletions.
11 changes: 9 additions & 2 deletions .github/workflows/tests.yml
Expand Up @@ -108,11 +108,18 @@ jobs:
POSTGRES_DB: test_db
ports:
- 5432:5432
mongodb:
image: mongo
env:
MONGO_INITDB_ROOT_USERNAME: keystone5
MONGO_INITDB_ROOT_PASSWORD: k3yst0n3
ports:
- 27017:27017
strategy:
fail-fast: false
matrix:
index: [0, 1, 2, 3, 4, 5, 6, 7, 8]
adapter: ['postgresql', 'sqlite']
adapter: ['postgresql', 'sqlite', 'mongodb']
steps:
- name: Checkout Repo
uses: actions/checkout@v2
Expand Down Expand Up @@ -153,7 +160,7 @@ jobs:
CI_NODE_TOTAL: 9
CI_NODE_INDEX: ${{ matrix.index }}
TEST_ADAPTER: ${{ matrix.adapter }}
DATABASE_URL: ${{ matrix.adapter == 'sqlite' && 'file:./dev.db' || 'postgres://keystone5:k3yst0n3@localhost:5432/test_db' }}
DATABASE_URL: ${{ matrix.adapter == 'sqlite' && 'file:./dev.db' || matrix.adapter == 'postgresql' && 'postgres://keystone5:k3yst0n3@localhost:5432/test_db' || 'mongodb://keystone5:k3yst0n3@localhost:27017/test_db' }}

non-api-tests:
name: Package Unit Tests
Expand Down
16 changes: 14 additions & 2 deletions packages/keystone/src/lib/core/prisma-schema.ts
Expand Up @@ -198,13 +198,22 @@ export function printPrismaSchema(
let prismaSchema = `datasource ${provider} {
url = env("DATABASE_URL")
provider = "${provider}"
}
}\n\n`;

generator client {
if (provider === 'mongodb') {
prismaSchema += `generator client {
provider = "prisma-client-js"
previewFeatures = ["mongoDb"]
output = "${clientDir}"
}
\n`;
} else {
prismaSchema += `generator client {
provider = "prisma-client-js"
output = "${clientDir}"
}
\n`;
}
for (const [listKey, { resolvedDbFields }] of Object.entries(lists)) {
prismaSchema += `model ${listKey} {`;
for (const [fieldPath, field] of Object.entries(resolvedDbFields)) {
Expand All @@ -214,6 +223,9 @@ generator client {
if (fieldPath === 'id') {
assertDbFieldIsValidForIdField(listKey, field);
prismaSchema += ' @id';
if (provider === 'mongodb') {
prismaSchema += ' @map("_id")';
}
}
}
prismaSchema += `\n}\n`;
Expand Down
2 changes: 2 additions & 0 deletions packages/keystone/src/lib/createSystem.ts
Expand Up @@ -10,6 +10,8 @@ export function getDBProvider(db: KeystoneConfig['db']): DatabaseProvider {
return 'postgresql';
} else if (db.adapter === 'prisma_sqlite' || db.provider === 'sqlite') {
return 'sqlite';
} else if (db.provider === 'mongodb') {
return 'mongodb';
} else {
throw new Error(
'Invalid db configuration. Please specify db.provider as either "sqlite" or "postgresql"'
Expand Down
5 changes: 5 additions & 0 deletions packages/types/src/config/index.ts
Expand Up @@ -84,6 +84,11 @@ export type DatabaseConfig = {
provider: 'sqlite';
}
)
| {
/** @deprecated The `adapter` option is deprecated. Please use `{ provider: '...' }` */
adapter?: undefined;
provider: 'mongodb';
}
);

// config.ui
Expand Down
2 changes: 1 addition & 1 deletion packages/types/src/core.ts
Expand Up @@ -8,7 +8,7 @@ type FieldDefaultValueArgs<TGeneratedListTypes extends BaseGeneratedListTypes> =
originalInput: TGeneratedListTypes['inputs']['create'];
};

export type DatabaseProvider = 'sqlite' | 'postgresql';
export type DatabaseProvider = 'sqlite' | 'postgresql' | 'mongodb';

export type FieldDefaultValue<T, TGeneratedListTypes extends BaseGeneratedListTypes> =
| T
Expand Down
12 changes: 10 additions & 2 deletions tests/api-tests/access-control/utils.ts
Expand Up @@ -4,8 +4,16 @@ import { statelessSessions } from '@keystone-next/keystone/session';
import { createAuth } from '@keystone-next/auth';
import { apiTestConfig } from '../utils';

const FAKE_ID = { postgresql: 'cdsfasfafafadfasdf', sqlite: 'cdsfasfafafadfasdf' } as const;
const FAKE_ID_2 = { postgresql: 'csdfbstrsbaf', sqlite: 'csdfbstrsbaf' } as const;
const FAKE_ID = {
postgresql: 'cdsfasfafafadfasdf',
sqlite: 'cdsfasfafafadfasdf',
mongodb: 'cdsfasfafafadfasdf',
} as const;
const FAKE_ID_2 = {
postgresql: 'csdfbstrsbaf',
sqlite: 'csdfbstrsbaf',
mongodb: 'csdfbstrsbaf',
} as const;
const COOKIE_SECRET = 'qwertyuiopasdfghjlkzxcvbmnm1234567890';

const yesNo = (truthy: boolean | undefined) => (truthy ? 'Yes' : 'No');
Expand Down

0 comments on commit 9eaa594

Please sign in to comment.