feat: work on database adapter (#3000)

This commit is contained in:
Alessio Gravili
2023-07-17 19:22:51 +02:00
committed by GitHub
parent f1e23b1cd0
commit c8c22dad06
59 changed files with 160 additions and 113 deletions

View File

@@ -6,7 +6,7 @@ import optionsReducer from './optionsReducer';
import useDebounce from '../../../../../hooks/useDebounce'; import useDebounce from '../../../../../hooks/useDebounce';
import ReactSelect from '../../../ReactSelect'; import ReactSelect from '../../../ReactSelect';
import { Option } from '../../../ReactSelect/types'; import { Option } from '../../../ReactSelect/types';
import { PaginatedDocs } from '../../../../../../mongoose/types'; import type { PaginatedDocs } from '../../../../../../database/types';
import './index.scss'; import './index.scss';

View File

@@ -1,7 +1,7 @@
import i18n from 'i18next'; import i18n from 'i18next';
import { RelationshipField } from '../../../../../../fields/config/types'; import { RelationshipField } from '../../../../../../fields/config/types';
import { SanitizedCollectionConfig } from '../../../../../../collections/config/types'; import { SanitizedCollectionConfig } from '../../../../../../collections/config/types';
import { PaginatedDocs } from '../../../../../../mongoose/types'; import type { PaginatedDocs } from '../../../../../../database/types';
export type Props = { export type Props = {
onChange: (val: unknown) => void, onChange: (val: unknown) => void,

View File

@@ -11,7 +11,7 @@ import Error from '../../Error';
import FieldDescription from '../../FieldDescription'; import FieldDescription from '../../FieldDescription';
import { relationship } from '../../../../../fields/validations'; import { relationship } from '../../../../../fields/validations';
import { Where } from '../../../../../types'; import { Where } from '../../../../../types';
import { PaginatedDocs } from '../../../../../mongoose/types'; import type { PaginatedDocs } from '../../../../../database/types';
import { useFormProcessing } from '../../Form/context'; import { useFormProcessing } from '../../Form/context';
import optionsReducer from './optionsReducer'; import optionsReducer from './optionsReducer';
import { FilterOptionsResult, GetResults, Props, Value } from './types'; import { FilterOptionsResult, GetResults, Props, Value } from './types';

View File

@@ -5,7 +5,7 @@ import qs from 'qs';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import { useConfig } from '../Config'; import { useConfig } from '../Config';
import { PaginatedDocs } from '../../../../mongoose/types'; import type { PaginatedDocs } from '../../../../database/types';
import { ContextType, DocumentPermissions, Props, Version } from './types'; import { ContextType, DocumentPermissions, Props, Version } from './types';
import { TypeWithID } from '../../../../globals/config/types'; import { TypeWithID } from '../../../../globals/config/types';
import { TypeWithTimestamps } from '../../../../collections/config/types'; import { TypeWithTimestamps } from '../../../../collections/config/types';

View File

@@ -2,7 +2,7 @@ import React from 'react';
import { CollectionPermission, GlobalPermission } from '../../../../auth'; import { CollectionPermission, GlobalPermission } from '../../../../auth';
import { SanitizedCollectionConfig, TypeWithID, TypeWithTimestamps } from '../../../../collections/config/types'; import { SanitizedCollectionConfig, TypeWithID, TypeWithTimestamps } from '../../../../collections/config/types';
import { SanitizedGlobalConfig } from '../../../../globals/config/types'; import { SanitizedGlobalConfig } from '../../../../globals/config/types';
import { PaginatedDocs } from '../../../../mongoose/types'; import type { PaginatedDocs } from '../../../../database/types';
import { TypeWithVersion } from '../../../../versions/types'; import { TypeWithVersion } from '../../../../versions/types';
export type Version = TypeWithVersion<any> export type Version = TypeWithVersion<any>

View File

@@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next';
import { useConfig } from '../../../utilities/Config'; import { useConfig } from '../../../utilities/Config';
import { Props } from './types'; import { Props } from './types';
import ReactSelect from '../../../elements/ReactSelect'; import ReactSelect from '../../../elements/ReactSelect';
import { PaginatedDocs } from '../../../../../mongoose/types'; import type { PaginatedDocs } from '../../../../../database/types';
import { Where } from '../../../../../types'; import { Where } from '../../../../../types';
import { mostRecentVersionOption, publishedVersionOption } from '../shared'; import { mostRecentVersionOption, publishedVersionOption } from '../shared';
import { formatDate } from '../../../../utilities/formatDate'; import { formatDate } from '../../../../utilities/formatDate';

View File

@@ -1,5 +1,5 @@
import { SanitizedCollectionConfig } from '../../../../../collections/config/types'; import { SanitizedCollectionConfig } from '../../../../../collections/config/types';
import { PaginatedDocs } from '../../../../../mongoose/types'; import type { PaginatedDocs } from '../../../../../database/types';
import { CompareOption } from '../types'; import { CompareOption } from '../types';
export type Props = { export type Props = {

View File

@@ -1,6 +1,6 @@
import { Where } from '../../../../../types'; import { Where } from '../../../../../types';
import { SanitizedCollectionConfig } from '../../../../../collections/config/types'; import { SanitizedCollectionConfig } from '../../../../../collections/config/types';
import { PaginatedDocs } from '../../../../../mongoose/types'; import type { PaginatedDocs } from '../../../../../database/types';
import { Props as ListControlsProps } from '../../../elements/ListControls/types'; import { Props as ListControlsProps } from '../../../elements/ListControls/types';
import { Props as PerPageProps } from '../../../elements/PerPage'; import { Props as PerPageProps } from '../../../elements/PerPage';
import { Props as PaginatorProps } from '../../../elements/Paginator/types'; import { Props as PaginatorProps } from '../../../elements/Paginator/types';

View File

@@ -3,7 +3,7 @@ import { PayloadRequest } from '../../../express/types';
import forgotPassword, { Result } from '../forgotPassword'; import forgotPassword, { Result } from '../forgotPassword';
import { Payload } from '../../../payload'; import { Payload } from '../../../payload';
import { getDataLoader } from '../../../collections/dataloader'; import { getDataLoader } from '../../../collections/dataloader';
import i18n from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['collections']> = { export type Options<T extends keyof GeneratedTypes['collections']> = {
@@ -36,7 +36,7 @@ async function localForgotPassword<T extends keyof GeneratedTypes['collections']
req.payloadAPI = req.payloadAPI || 'local'; req.payloadAPI = req.payloadAPI || 'local';
req.payload = payload; req.payload = payload;
req.i18n = i18n(payload.config.i18n); req.i18n = i18nInit(payload.config.i18n);
if (!req.t) req.t = req.i18n.t; if (!req.t) req.t = req.i18n.t;
if (!req.payloadDataLoader) req.payloadDataLoader = getDataLoader(req); if (!req.payloadDataLoader) req.payloadDataLoader = getDataLoader(req);

View File

@@ -4,7 +4,7 @@ import login, { Result } from '../login';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import { Payload } from '../../../payload'; import { Payload } from '../../../payload';
import { getDataLoader } from '../../../collections/dataloader'; import { getDataLoader } from '../../../collections/dataloader';
import i18n from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<TSlug extends keyof GeneratedTypes['collections']> = { export type Options<TSlug extends keyof GeneratedTypes['collections']> = {
@@ -46,7 +46,7 @@ async function localLogin<TSlug extends keyof GeneratedTypes['collections']>(
req.payloadAPI = req.payloadAPI || 'local'; req.payloadAPI = req.payloadAPI || 'local';
req.payload = payload; req.payload = payload;
req.i18n = i18n(payload.config.i18n); req.i18n = i18nInit(payload.config.i18n);
req.locale = undefined; req.locale = undefined;
req.fallbackLocale = undefined; req.fallbackLocale = undefined;

View File

@@ -3,7 +3,7 @@ import { Payload } from '../../../payload';
import resetPassword, { Result } from '../resetPassword'; import resetPassword, { Result } from '../resetPassword';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import { getDataLoader } from '../../../collections/dataloader'; import { getDataLoader } from '../../../collections/dataloader';
import i18n from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['collections']> = { export type Options<T extends keyof GeneratedTypes['collections']> = {
@@ -35,7 +35,7 @@ async function localResetPassword<T extends keyof GeneratedTypes['collections']>
req.payload = payload; req.payload = payload;
req.payloadAPI = req.payloadAPI || 'local'; req.payloadAPI = req.payloadAPI || 'local';
req.i18n = i18n(payload.config.i18n); req.i18n = i18nInit(payload.config.i18n);
if (!req.t) req.t = req.i18n.t; if (!req.t) req.t = req.i18n.t;
if (!req.payloadDataLoader) req.payloadDataLoader = getDataLoader(req); if (!req.payloadDataLoader) req.payloadDataLoader = getDataLoader(req);

View File

@@ -3,7 +3,7 @@ import { PayloadRequest } from '../../../express/types';
import { Payload } from '../../../payload'; import { Payload } from '../../../payload';
import unlock from '../unlock'; import unlock from '../unlock';
import { getDataLoader } from '../../../collections/dataloader'; import { getDataLoader } from '../../../collections/dataloader';
import i18n from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['collections']> = { export type Options<T extends keyof GeneratedTypes['collections']> = {
@@ -34,7 +34,7 @@ async function localUnlock<T extends keyof GeneratedTypes['collections']>(
req.payload = payload; req.payload = payload;
req.payloadAPI = req.payloadAPI || 'local'; req.payloadAPI = req.payloadAPI || 'local';
req.i18n = i18n(payload.config.i18n); req.i18n = i18nInit(payload.config.i18n);
if (!req.t) req.t = req.i18n.t; if (!req.t) req.t = req.i18n.t;
if (!req.payloadDataLoader) req.payloadDataLoader = getDataLoader(req); if (!req.payloadDataLoader) req.payloadDataLoader = getDataLoader(req);

View File

@@ -77,6 +77,7 @@ async function resetPassword(args: Arguments): Promise<Result> {
collection: collectionConfig.slug, collection: collectionConfig.slug,
where: { id: { equals: user.id } }, where: { id: { equals: user.id } },
data: user, data: user,
req: args.req,
}); });

View File

@@ -36,6 +36,7 @@ async function verifyEmail(args: Args): Promise<boolean> {
_verified: true, _verified: true,
_verificationToken: undefined, _verificationToken: undefined,
}, },
req,
}); });
return true; return true;

View File

@@ -2,12 +2,14 @@ import { ValidationError } from '../../../errors';
import { Payload } from '../../..'; import { Payload } from '../../..';
import { SanitizedCollectionConfig } from '../../../collections/config/types'; import { SanitizedCollectionConfig } from '../../../collections/config/types';
import { generatePasswordSaltHash } from './generatePasswordSaltHash'; import { generatePasswordSaltHash } from './generatePasswordSaltHash';
import { PayloadRequest } from '../../../express/types';
type Args = { type Args = {
collection: SanitizedCollectionConfig collection: SanitizedCollectionConfig
doc: Record<string, unknown> doc: Record<string, unknown>
password: string password: string
payload: Payload payload: Payload
req: PayloadRequest
} }
export const registerLocalStrategy = async ({ export const registerLocalStrategy = async ({
@@ -15,6 +17,7 @@ export const registerLocalStrategy = async ({
doc, doc,
password, password,
payload, payload,
req,
}: Args): Promise<Record<string, unknown>> => { }: Args): Promise<Record<string, unknown>> => {
const existingUser = await payload.find({ const existingUser = await payload.find({
collection: collection.slug, collection: collection.slug,
@@ -39,5 +42,6 @@ export const registerLocalStrategy = async ({
salt, salt,
hash, hash,
}, },
req,
}); });
}; };

View File

@@ -1,9 +1,9 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { DeepRequired } from 'ts-essentials'; import { DeepRequired } from 'ts-essentials';
import { AggregatePaginateModel, IndexDefinition, IndexOptions, Model, PaginateModel } from 'mongoose';
import { GraphQLInputObjectType, GraphQLNonNull, GraphQLObjectType } from 'graphql'; import { GraphQLInputObjectType, GraphQLNonNull, GraphQLObjectType } from 'graphql';
import { Response } from 'express'; import { Response } from 'express';
import { Config as GeneratedTypes } from 'payload/generated-types'; import { Config as GeneratedTypes } from 'payload/generated-types';
import type { IndexDefinition, IndexOptions } from 'mongoose';
import type { Where } from '../../types'; import type { Where } from '../../types';
import { Access, Endpoint, EntityDescription, GeneratePreviewURL } from '../../config/types'; import { Access, Endpoint, EntityDescription, GeneratePreviewURL } from '../../config/types';
import { Field } from '../../fields/config/types'; import { Field } from '../../fields/config/types';
@@ -11,7 +11,6 @@ import { PayloadRequest } from '../../express/types';
import { Auth, IncomingAuthType, User } from '../../auth/types'; import { Auth, IncomingAuthType, User } from '../../auth/types';
import { IncomingUploadType, Upload } from '../../uploads/types'; import { IncomingUploadType, Upload } from '../../uploads/types';
import { IncomingCollectionVersions, SanitizedCollectionVersions } from '../../versions/types'; import { IncomingCollectionVersions, SanitizedCollectionVersions } from '../../versions/types';
import { BuildQueryArgs } from '../../mongoose/queries/buildQuery';
import { import {
CustomPreviewButtonProps, CustomPreviewButtonProps,
CustomPublishButtonProps, CustomPublishButtonProps,
@@ -21,23 +20,6 @@ import {
import type { Props as ListProps } from '../../admin/components/views/collections/List/types'; import type { Props as ListProps } from '../../admin/components/views/collections/List/types';
import type { Props as EditProps } from '../../admin/components/views/collections/Edit/types'; import type { Props as EditProps } from '../../admin/components/views/collections/Edit/types';
type Register<T = any> = (doc: T, password: string) => T;
interface PassportLocalModel {
register: Register
authenticate: any
}
export interface CollectionModel extends Model<any>, PaginateModel<any>, AggregatePaginateModel<any>, PassportLocalModel {
/** buildQuery is used to transform payload's where operator into what can be used by mongoose (e.g. id => _id) */
buildQuery: (args: BuildQueryArgs) => Promise<Record<string, unknown>> // TODO: Delete this
}
export interface AuthCollectionModel extends CollectionModel {
resetPasswordToken: string;
resetPasswordExpiration: Date;
}
export type HookOperationType = export type HookOperationType =
| 'create' | 'create'
| 'autosave' | 'autosave'
@@ -361,7 +343,6 @@ export interface SanitizedCollectionConfig extends Omit<DeepRequired<CollectionC
} }
export type Collection = { export type Collection = {
Model?: CollectionModel;
config: SanitizedCollectionConfig; config: SanitizedCollectionConfig;
graphQL?: { graphQL?: {
type: GraphQLObjectType type: GraphQLObjectType
@@ -383,7 +364,6 @@ export type BulkOperationResult<TSlug extends keyof GeneratedTypes['collections'
} }
export type AuthCollection = { export type AuthCollection = {
Model: AuthCollectionModel;
config: SanitizedCollectionConfig; config: SanitizedCollectionConfig;
} }

View File

@@ -1,6 +1,6 @@
/* eslint-disable no-param-reassign */ /* eslint-disable no-param-reassign */
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import type { PaginatedDocs } from '../../../mongoose/types'; import type { PaginatedDocs } from '../../../database/types';
import { Where } from '../../../types'; import { Where } from '../../../types';
import { Collection } from '../../config/types'; import { Collection } from '../../config/types';
import find from '../../operations/find'; import find from '../../operations/find';

View File

@@ -2,7 +2,7 @@
import { Response } from 'express'; import { Response } from 'express';
import { Where } from '../../../types'; import { Where } from '../../../types';
import type { PaginatedDocs } from '../../../mongoose/types'; import type { PaginatedDocs } from '../../../database/types';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import { Collection } from '../../config/types'; import { Collection } from '../../config/types';
import findVersions from '../../operations/findVersions'; import findVersions from '../../operations/findVersions';

View File

@@ -202,12 +202,14 @@ async function create<TSlug extends keyof GeneratedTypes['collections']>(
doc: resultWithLocales, doc: resultWithLocales,
payload: req.payload, payload: req.payload,
password: data.password as string, password: data.password as string,
req,
}); });
} else { } else {
try { try {
doc = await payload.db.create({ doc = await payload.db.create({
collection: collectionConfig.slug, collection: collectionConfig.slug,
data: resultWithLocales, data: resultWithLocales,
req,
}); });
} catch (error) { } catch (error) {
// Handle uniqueness error from MongoDB // Handle uniqueness error from MongoDB

View File

@@ -139,6 +139,7 @@ async function deleteOperation<TSlug extends keyof GeneratedTypes['collections']
equals: id, equals: id,
}, },
}, },
req,
}); });
// ///////////////////////////////////// // /////////////////////////////////////
@@ -217,6 +218,7 @@ async function deleteOperation<TSlug extends keyof GeneratedTypes['collections']
payload, payload,
collectionConfig, collectionConfig,
ids: docs.map(({ id }) => id), ids: docs.map(({ id }) => id),
req,
}); });
return { return {

View File

@@ -99,6 +99,7 @@ async function deleteByID<TSlug extends keyof GeneratedTypes['collections']>(inc
let result = await req.payload.db.deleteOne({ let result = await req.payload.db.deleteOne({
collection: collectionConfig.slug, collection: collectionConfig.slug,
where: { id: { equals: id } }, where: { id: { equals: id } },
req,
}); });
@@ -110,6 +111,7 @@ async function deleteByID<TSlug extends keyof GeneratedTypes['collections']>(inc
payload, payload,
collectionConfig, collectionConfig,
ids: [id], ids: [id],
req,
}); });
// ///////////////////////////////////// // /////////////////////////////////////

View File

@@ -2,7 +2,7 @@ import { Where } from '../../types';
import { PayloadRequest } from '../../express/types'; import { PayloadRequest } from '../../express/types';
import executeAccess from '../../auth/executeAccess'; import executeAccess from '../../auth/executeAccess';
import { Collection, TypeWithID } from '../config/types'; import { Collection, TypeWithID } from '../config/types';
import { PaginatedDocs } from '../../mongoose/types'; import type { PaginatedDocs } from '../../database/types';
import { AccessResult } from '../../config/types'; import { AccessResult } from '../../config/types';
import { afterRead } from '../../fields/hooks/afterRead'; import { afterRead } from '../../fields/hooks/afterRead';
import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths'; import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths';

View File

@@ -3,7 +3,7 @@ import { PayloadRequest } from '../../express/types';
import executeAccess from '../../auth/executeAccess'; import executeAccess from '../../auth/executeAccess';
import sanitizeInternalFields from '../../utilities/sanitizeInternalFields'; import sanitizeInternalFields from '../../utilities/sanitizeInternalFields';
import { Collection } from '../config/types'; import { Collection } from '../config/types';
import { PaginatedDocs } from '../../mongoose/types'; import type { PaginatedDocs } from '../../database/types';
import { TypeWithVersion } from '../../versions/types'; import { TypeWithVersion } from '../../versions/types';
import { afterRead } from '../../fields/hooks/afterRead'; import { afterRead } from '../../fields/hooks/afterRead';
import { buildVersionCollectionFields } from '../../versions/buildCollectionFields'; import { buildVersionCollectionFields } from '../../versions/buildCollectionFields';

View File

@@ -8,7 +8,7 @@ import getFileByPath from '../../../uploads/getFileByPath';
import create from '../create'; import create from '../create';
import { getDataLoader } from '../../dataloader'; import { getDataLoader } from '../../dataloader';
import { File } from '../../../uploads/types'; import { File } from '../../../uploads/types';
import i18n from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<TSlug extends keyof GeneratedTypes['collections']> = { export type Options<TSlug extends keyof GeneratedTypes['collections']> = {
@@ -60,7 +60,7 @@ export default async function createLocal<TSlug extends keyof GeneratedTypes['co
req.locale = locale ?? req?.locale ?? defaultLocale; req.locale = locale ?? req?.locale ?? defaultLocale;
req.fallbackLocale = fallbackLocale ?? req?.fallbackLocale ?? defaultLocale; req.fallbackLocale = fallbackLocale ?? req?.fallbackLocale ?? defaultLocale;
req.payload = payload; req.payload = payload;
req.i18n = i18n(payload.config.i18n); req.i18n = i18nInit(payload.config.i18n);
req.files = { req.files = {
file: (file ?? (await getFileByPath(filePath))) as UploadedFile, file: (file ?? (await getFileByPath(filePath))) as UploadedFile,
}; };

View File

@@ -5,7 +5,7 @@ import { Payload } from '../../../payload';
import deleteOperation from '../delete'; import deleteOperation from '../delete';
import deleteByID from '../deleteByID'; import deleteByID from '../deleteByID';
import { getDataLoader } from '../../dataloader'; import { getDataLoader } from '../../dataloader';
import i18n from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
import { BulkOperationResult } from '../../config/types'; import { BulkOperationResult } from '../../config/types';
@@ -61,7 +61,7 @@ async function deleteLocal<TSlug extends keyof GeneratedTypes['collections']>(pa
locale: locale ?? defaultLocale, locale: locale ?? defaultLocale,
fallbackLocale: fallbackLocale ?? defaultLocale, fallbackLocale: fallbackLocale ?? defaultLocale,
payload, payload,
i18n: i18n(payload.config.i18n), i18n: i18nInit(payload.config.i18n),
} as PayloadRequest; } as PayloadRequest;
if (!req.t) req.t = req.i18n.t; if (!req.t) req.t = req.i18n.t;

View File

@@ -1,11 +1,11 @@
import { Config as GeneratedTypes } from 'payload/generated-types'; import { Config as GeneratedTypes } from 'payload/generated-types';
import { PaginatedDocs } from '../../../mongoose/types'; import type { PaginatedDocs } from '../../../database/types';
import { Document, Where } from '../../../types'; import { Document, Where } from '../../../types';
import { Payload } from '../../../payload'; import { Payload } from '../../../payload';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import find from '../find'; import find from '../find';
import { getDataLoader } from '../../dataloader'; import { getDataLoader } from '../../dataloader';
import i18n from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['collections']> = { export type Options<T extends keyof GeneratedTypes['collections']> = {
@@ -60,7 +60,7 @@ export default async function findLocal<T extends keyof GeneratedTypes['collecti
req.payloadAPI = req.payloadAPI || 'local'; req.payloadAPI = req.payloadAPI || 'local';
req.locale = locale ?? req?.locale ?? defaultLocale; req.locale = locale ?? req?.locale ?? defaultLocale;
req.fallbackLocale = fallbackLocale ?? req?.fallbackLocale ?? defaultLocale; req.fallbackLocale = fallbackLocale ?? req?.fallbackLocale ?? defaultLocale;
req.i18n = i18n(payload.config.i18n); req.i18n = i18nInit(payload.config.i18n);
req.payload = payload; req.payload = payload;
if (!req.t) req.t = req.i18n.t; if (!req.t) req.t = req.i18n.t;

View File

@@ -4,7 +4,7 @@ import { Document } from '../../../types';
import findByID from '../findByID'; import findByID from '../findByID';
import { Payload } from '../../../payload'; import { Payload } from '../../../payload';
import { getDataLoader } from '../../dataloader'; import { getDataLoader } from '../../dataloader';
import i18n from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['collections']> = { export type Options<T extends keyof GeneratedTypes['collections']> = {
@@ -51,7 +51,7 @@ export default async function findByIDLocal<T extends keyof GeneratedTypes['coll
req.payloadAPI = req.payloadAPI || 'local'; req.payloadAPI = req.payloadAPI || 'local';
req.locale = locale ?? req?.locale ?? defaultLocale; req.locale = locale ?? req?.locale ?? defaultLocale;
req.fallbackLocale = fallbackLocale ?? req?.fallbackLocale ?? defaultLocale; req.fallbackLocale = fallbackLocale ?? req?.fallbackLocale ?? defaultLocale;
req.i18n = i18n(payload.config.i18n); req.i18n = i18nInit(payload.config.i18n);
req.payload = payload; req.payload = payload;
if (typeof user !== 'undefined') req.user = user; if (typeof user !== 'undefined') req.user = user;

View File

@@ -5,7 +5,7 @@ import { PayloadRequest } from '../../../express/types';
import { TypeWithVersion } from '../../../versions/types'; import { TypeWithVersion } from '../../../versions/types';
import findVersionByID from '../findVersionByID'; import findVersionByID from '../findVersionByID';
import { getDataLoader } from '../../dataloader'; import { getDataLoader } from '../../dataloader';
import i18n from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['collections']> = { export type Options<T extends keyof GeneratedTypes['collections']> = {
@@ -47,7 +47,7 @@ export default async function findVersionByIDLocal<T extends keyof GeneratedType
req.payloadAPI = req.payloadAPI || 'local'; req.payloadAPI = req.payloadAPI || 'local';
req.locale = locale ?? req?.locale ?? defaultLocale; req.locale = locale ?? req?.locale ?? defaultLocale;
req.fallbackLocale = fallbackLocale ?? req?.fallbackLocale ?? defaultLocale; req.fallbackLocale = fallbackLocale ?? req?.fallbackLocale ?? defaultLocale;
req.i18n = i18n(payload.config.i18n); req.i18n = i18nInit(payload.config.i18n);
req.payload = payload; req.payload = payload;
if (!req.t) req.t = req.i18n.t; if (!req.t) req.t = req.i18n.t;

View File

@@ -1,12 +1,12 @@
import { Config as GeneratedTypes } from 'payload/generated-types'; import { Config as GeneratedTypes } from 'payload/generated-types';
import { Payload } from '../../../payload'; import { Payload } from '../../../payload';
import { Document, Where } from '../../../types'; import { Document, Where } from '../../../types';
import { PaginatedDocs } from '../../../mongoose/types'; import type { PaginatedDocs } from '../../../database/types';
import { TypeWithVersion } from '../../../versions/types'; import { TypeWithVersion } from '../../../versions/types';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import findVersions from '../findVersions'; import findVersions from '../findVersions';
import { getDataLoader } from '../../dataloader'; import { getDataLoader } from '../../dataloader';
import i18nInit from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['collections']> = { export type Options<T extends keyof GeneratedTypes['collections']> = {

View File

@@ -4,7 +4,7 @@ import { PayloadRequest } from '../../../express/types';
import { Document } from '../../../types'; import { Document } from '../../../types';
import { getDataLoader } from '../../dataloader'; import { getDataLoader } from '../../dataloader';
import restoreVersion from '../restoreVersion'; import restoreVersion from '../restoreVersion';
import i18nInit from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['collections']> = { export type Options<T extends keyof GeneratedTypes['collections']> = {

View File

@@ -7,7 +7,7 @@ import update from '../update';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import { getDataLoader } from '../../dataloader'; import { getDataLoader } from '../../dataloader';
import { File } from '../../../uploads/types'; import { File } from '../../../uploads/types';
import i18nInit from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
import updateByID from '../updateByID'; import updateByID from '../updateByID';
import { BulkOperationResult } from '../../config/types'; import { BulkOperationResult } from '../../config/types';

View File

@@ -104,7 +104,7 @@ async function restoreVersion<T extends TypeWithID = any>(args: Arguments): Prom
collection: collectionConfig.slug, collection: collectionConfig.slug,
where: { id: { equals: parentDocID } }, where: { id: { equals: parentDocID } },
data: rawVersion.version, data: rawVersion.version,
req,
}); });
// ///////////////////////////////////// // /////////////////////////////////////

View File

@@ -248,6 +248,7 @@ async function update<TSlug extends keyof GeneratedTypes['collections']>(
locale, locale,
where: { id: { equals: id } }, where: { id: { equals: id } },
data: result, data: result,
req,
}); });
} }

View File

@@ -234,6 +234,7 @@ async function updateByID<TSlug extends keyof GeneratedTypes['collections']>(
locale, locale,
where: { id: { equals: id } }, where: { id: { equals: id } },
data: dataToUpdate, data: dataToUpdate,
req,
}); });
} }

View File

@@ -2,7 +2,7 @@ import { Response, NextFunction } from 'express';
import httpStatus from 'http-status'; import httpStatus from 'http-status';
import { PayloadRequest } from '../../express/types'; import { PayloadRequest } from '../../express/types';
import { TypeWithID } from '../config/types'; import { TypeWithID } from '../config/types';
import { PaginatedDocs } from '../../mongoose/types'; import type { PaginatedDocs } from '../../database/types';
import find from '../operations/find'; import find from '../operations/find';
import { Where } from '../../types'; import { Where } from '../../types';
import { isNumber } from '../../utilities/isNumber'; import { isNumber } from '../../utilities/isNumber';

View File

@@ -3,7 +3,7 @@ import httpStatus from 'http-status';
import { Where } from '../../types'; import { Where } from '../../types';
import { PayloadRequest } from '../../express/types'; import { PayloadRequest } from '../../express/types';
import { TypeWithID } from '../config/types'; import { TypeWithID } from '../config/types';
import { PaginatedDocs } from '../../mongoose/types'; import type { PaginatedDocs } from '../../database/types';
import { isNumber } from '../../utilities/isNumber'; import { isNumber } from '../../utilities/isNumber';
import findVersions from '../operations/findVersions'; import findVersions from '../operations/findVersions';

View File

@@ -27,7 +27,7 @@ import type {
import type { TypeWithID } from '../collections/config/types'; import type { TypeWithID } from '../collections/config/types';
import type { TypeWithID as GlobalsTypeWithID } from '../globals/config/types'; import type { TypeWithID as GlobalsTypeWithID } from '../globals/config/types';
import type { Payload } from '../payload'; import type { Payload } from '../payload';
import type { Document, Where } from '../types'; import type { Document, PayloadRequest, Where } from '../types';
import type { TypeWithVersion } from '../versions/types'; import type { TypeWithVersion } from '../versions/types';
export interface DatabaseAdapter { export interface DatabaseAdapter {
@@ -126,6 +126,7 @@ export interface DatabaseAdapter {
create: Create; create: Create;
updateOne: UpdateOne; updateOne: UpdateOne;
deleteOne: DeleteOne; deleteOne: DeleteOne;
deleteMany: DeleteMany;
// operations - globals // operations - globals
findGlobal: FindGlobal; findGlobal: FindGlobal;
@@ -274,6 +275,7 @@ export type CreateArgs = {
data: Record<string, unknown> data: Record<string, unknown>
draft?: boolean draft?: boolean
locale?: string locale?: string
req: PayloadRequest
} }
export type Create = (args: CreateArgs) => Promise<Document> export type Create = (args: CreateArgs) => Promise<Document>
@@ -284,6 +286,7 @@ export type UpdateArgs = {
where: Where where: Where
draft?: boolean draft?: boolean
locale?: string locale?: string
req: PayloadRequest
} }
export type Update = (args: UpdateArgs) => Promise<Document> export type Update = (args: UpdateArgs) => Promise<Document>
@@ -294,6 +297,7 @@ export type UpdateOneArgs = {
where: Where where: Where
draft?: boolean draft?: boolean
locale?: string locale?: string
req: PayloadRequest
} }
export type UpdateOne = (args: UpdateOneArgs) => Promise<Document> export type UpdateOne = (args: UpdateOneArgs) => Promise<Document>
@@ -301,6 +305,7 @@ export type UpdateOne = (args: UpdateOneArgs) => Promise<Document>
export type DeleteOneArgs = { export type DeleteOneArgs = {
collection: string collection: string
where: Where where: Where
req: PayloadRequest
} }
export type DeleteOne = (args: DeleteOneArgs) => Promise<Document> export type DeleteOne = (args: DeleteOneArgs) => Promise<Document>
@@ -308,8 +313,12 @@ export type DeleteOne = (args: DeleteOneArgs) => Promise<Document>
export type DeleteManyArgs = { export type DeleteManyArgs = {
collection: string collection: string
where: Where where: Where
req: PayloadRequest | null
} }
export type DeleteMany = (args: DeleteManyArgs) => Promise<void>
export type Migration = MigrationData & { export type Migration = MigrationData & {
up: ({ payload }: { payload }) => Promise<boolean> up: ({ payload }: { payload }) => Promise<boolean>
down: ({ payload }: { payload }) => Promise<boolean> down: ({ payload }: { payload }) => Promise<boolean>

View File

@@ -1,5 +1,4 @@
import React from 'react'; import React from 'react';
import { Document, Model } from 'mongoose';
import { DeepRequired } from 'ts-essentials'; import { DeepRequired } from 'ts-essentials';
import { GraphQLNonNull, GraphQLObjectType } from 'graphql'; import { GraphQLNonNull, GraphQLObjectType } from 'graphql';
import type { Where } from '../../types'; import type { Where } from '../../types';
@@ -49,10 +48,6 @@ export type AfterReadHook = (args: {
findMany?: boolean findMany?: boolean
}) => any; }) => any;
export interface GlobalModel extends Model<Document> {
buildQuery: (query: unknown, locale?: string) => Promise<Record<string, unknown>>
}
export type GlobalAdminOptions = { export type GlobalAdminOptions = {
/** /**
* Exclude the global from the admin nav and routes * Exclude the global from the admin nav and routes
@@ -149,7 +144,6 @@ export interface SanitizedGlobalConfig extends Omit<DeepRequired<GlobalConfig>,
} }
export type Globals = { export type Globals = {
Model?: GlobalModel
config: SanitizedGlobalConfig[] config: SanitizedGlobalConfig[]
graphQL?: { graphQL?: {
[slug: string]: { [slug: string]: {

View File

@@ -2,7 +2,7 @@ import { Where } from '../../types';
import { PayloadRequest } from '../../express/types'; import { PayloadRequest } from '../../express/types';
import executeAccess from '../../auth/executeAccess'; import executeAccess from '../../auth/executeAccess';
import sanitizeInternalFields from '../../utilities/sanitizeInternalFields'; import sanitizeInternalFields from '../../utilities/sanitizeInternalFields';
import { PaginatedDocs } from '../../mongoose/types'; import type { PaginatedDocs } from '../../database/types';
import { SanitizedGlobalConfig } from '../config/types'; import { SanitizedGlobalConfig } from '../config/types';
import { afterRead } from '../../fields/hooks/afterRead'; import { afterRead } from '../../fields/hooks/afterRead';
import { buildVersionGlobalFields } from '../../versions/buildGlobalFields'; import { buildVersionGlobalFields } from '../../versions/buildGlobalFields';

View File

@@ -4,7 +4,7 @@ import { getDataLoader } from '../../../collections/dataloader';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import { Document } from '../../../types'; import { Document } from '../../../types';
import findOne from '../findOne'; import findOne from '../findOne';
import i18nInit from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['globals']> = { export type Options<T extends keyof GeneratedTypes['globals']> = {

View File

@@ -5,7 +5,7 @@ import { PayloadRequest } from '../../../express/types';
import { Document } from '../../../types'; import { Document } from '../../../types';
import { TypeWithVersion } from '../../../versions/types'; import { TypeWithVersion } from '../../../versions/types';
import findVersionByID from '../findVersionByID'; import findVersionByID from '../findVersionByID';
import i18nInit from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['globals']> = { export type Options<T extends keyof GeneratedTypes['globals']> = {

View File

@@ -1,11 +1,11 @@
import { Config as GeneratedTypes } from 'payload/generated-types'; import { Config as GeneratedTypes } from 'payload/generated-types';
import { Document, Where } from '../../../types'; import { Document, Where } from '../../../types';
import { PaginatedDocs } from '../../../mongoose/types'; import type { PaginatedDocs } from '../../../database/types';
import { Payload } from '../../../payload'; import { Payload } from '../../../payload';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import findVersions from '../findVersions'; import findVersions from '../findVersions';
import { getDataLoader } from '../../../collections/dataloader'; import { getDataLoader } from '../../../collections/dataloader';
import i18nInit from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
import { TypeWithVersion } from '../../../versions/types'; import { TypeWithVersion } from '../../../versions/types';

View File

@@ -4,7 +4,7 @@ import { getDataLoader } from '../../../collections/dataloader';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import { Document } from '../../../types'; import { Document } from '../../../types';
import restoreVersion from '../restoreVersion'; import restoreVersion from '../restoreVersion';
import i18nInit from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<T extends keyof GeneratedTypes['globals']> = { export type Options<T extends keyof GeneratedTypes['globals']> = {

View File

@@ -5,7 +5,7 @@ import { Document } from '../../../types';
import { PayloadRequest } from '../../../express/types'; import { PayloadRequest } from '../../../express/types';
import update from '../update'; import update from '../update';
import { getDataLoader } from '../../../collections/dataloader'; import { getDataLoader } from '../../../collections/dataloader';
import i18nInit from '../../../translations/init'; import { i18nInit } from '../../../translations/init';
import { APIError } from '../../../errors'; import { APIError } from '../../../errors';
export type Options<TSlug extends keyof GeneratedTypes['globals']> = { export type Options<TSlug extends keyof GeneratedTypes['globals']> = {

View File

@@ -2,7 +2,7 @@ import { Response, NextFunction } from 'express';
import httpStatus from 'http-status'; import httpStatus from 'http-status';
import { PayloadRequest } from '../../express/types'; import { PayloadRequest } from '../../express/types';
import { TypeWithID } from '../../collections/config/types'; import { TypeWithID } from '../../collections/config/types';
import { PaginatedDocs } from '../../mongoose/types'; import type { PaginatedDocs } from '../../database/types';
import { SanitizedGlobalConfig } from '../config/types'; import { SanitizedGlobalConfig } from '../config/types';
import findVersions from '../operations/findVersions'; import findVersions from '../operations/findVersions';
import { Where } from '../../types'; import { Where } from '../../types';

View File

@@ -1,6 +1,6 @@
import type { MongooseAdapter } from '.'; import type { MongooseAdapter } from '.';
import type { Create } from '../database/types'; import type { Create } from '../database/types';
import { Document } from '../types'; import type { Document } from '../types';
export const create: Create = async function create(this: MongooseAdapter, export const create: Create = async function create(this: MongooseAdapter,
{ collection, data }) { { collection, data }) {

View File

@@ -0,0 +1,14 @@
import type { MongooseAdapter } from '.';
import type { DeleteMany } from '../database/types';
export const deleteMany: DeleteMany = async function deleteMany(this: MongooseAdapter,
{ collection, where }) {
const Model = this.collections[collection];
const query = await Model.buildQuery({
payload: this.payload,
where,
});
await Model.deleteMany(query).lean();
};

View File

@@ -1,5 +1,4 @@
import type { ConnectOptions } from 'mongoose'; import type { ConnectOptions } from 'mongoose';
import { CollectionModel } from '../collections/config/types';
import { createMigration } from '../database/migrations/createMigration'; import { createMigration } from '../database/migrations/createMigration';
import { migrate } from '../database/migrations/migrate'; import { migrate } from '../database/migrations/migrate';
import { migrateDown } from '../database/migrations/migrateDown'; import { migrateDown } from '../database/migrations/migrateDown';
@@ -7,8 +6,8 @@ import { migrateRefresh } from '../database/migrations/migrateRefresh';
import { migrateReset } from '../database/migrations/migrateReset'; import { migrateReset } from '../database/migrations/migrateReset';
import { migrateStatus } from '../database/migrations/migrateStatus'; import { migrateStatus } from '../database/migrations/migrateStatus';
import type { DatabaseAdapter } from '../database/types'; import type { DatabaseAdapter } from '../database/types';
import { GlobalModel } from '../globals/config/types'; import { Payload } from '../index';
import type { Payload } from '../index'; import type { SanitizedConfig } from '../config/types';
import { connect } from './connect'; import { connect } from './connect';
import { create } from './create'; import { create } from './create';
import { find } from './find'; import { find } from './find';
@@ -27,6 +26,8 @@ import { findOne } from './findOne';
import { updateGlobal } from './updateGlobal'; import { updateGlobal } from './updateGlobal';
import { updateOne } from './updateOne'; import { updateOne } from './updateOne';
import { updateVersion } from './updateVersion'; import { updateVersion } from './updateVersion';
import type { CollectionModel, GlobalModel } from './types';
import { deleteMany } from './deleteMany';
export interface Args { export interface Args {
payload: Payload; payload: Payload;
@@ -57,14 +58,14 @@ export function mongooseAdapter({
connectOptions, connectOptions,
migrationDir = '.migrations', migrationDir = '.migrations',
}: Args): MongooseAdapter { }: Args): MongooseAdapter {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return { return {
payload, payload,
url, url,
connectOptions: connectOptions || {}, connectOptions: connectOptions || {},
collections: {}, collections: {},
versions: {}, versions: {},
globals: undefined,
mongoMemoryServer: undefined,
connect, connect,
init, init,
webpack, webpack,
@@ -86,6 +87,7 @@ export function mongooseAdapter({
create, create,
updateOne, updateOne,
deleteOne, deleteOne,
deleteMany,
findGlobal, findGlobal,
createGlobal, createGlobal,
updateGlobal, updateGlobal,

View File

@@ -6,12 +6,13 @@ import { buildVersionCollectionFields } from '../versions/buildCollectionFields'
import getBuildQueryPlugin from './queries/buildQuery'; import getBuildQueryPlugin from './queries/buildQuery';
import buildCollectionSchema from './models/buildCollectionSchema'; import buildCollectionSchema from './models/buildCollectionSchema';
import buildSchema from './models/buildSchema'; import buildSchema from './models/buildSchema';
import { CollectionModel, SanitizedCollectionConfig } from '../collections/config/types'; import { SanitizedCollectionConfig } from '../collections/config/types';
import { getVersionsModelName } from '../versions/getVersionsModelName'; import { getVersionsModelName } from '../versions/getVersionsModelName';
import type { MongooseAdapter } from '.'; import type { MongooseAdapter } from '.';
import { buildGlobalModel } from './models/buildGlobalModel'; import { buildGlobalModel } from './models/buildGlobalModel';
import { buildVersionGlobalFields } from '../versions/buildGlobalFields'; import { buildVersionGlobalFields } from '../versions/buildGlobalFields';
import type { Init } from '../database/types'; import type { Init } from '../database/types';
import { CollectionModel } from './types';
export const init: Init = async function init(this: MongooseAdapter, export const init: Init = async function init(this: MongooseAdapter,
{ config }) { { config }) {
@@ -70,7 +71,6 @@ export const init: Init = async function init(this: MongooseAdapter,
this.collections[collection.slug] = model; this.collections[collection.slug] = model;
this.payload.collections[collection.slug] = { this.payload.collections[collection.slug] = {
Model: model,
config: collection, config: collection,
}; };
}); });
@@ -78,8 +78,6 @@ export const init: Init = async function init(this: MongooseAdapter,
const model = buildGlobalModel(this.payload.config); const model = buildGlobalModel(this.payload.config);
this.globals = model; this.globals = model;
this.payload.globals.Model = model;
this.payload.config.globals.forEach((global) => { this.payload.config.globals.forEach((global) => {
if (global.versions) { if (global.versions) {
const versionModelName = getVersionsModelName(global); const versionModelName = getVersionsModelName(global);

View File

@@ -2,7 +2,7 @@ import mongoose from 'mongoose';
import buildSchema from './buildSchema'; import buildSchema from './buildSchema';
import { SanitizedConfig } from '../../config/types'; import { SanitizedConfig } from '../../config/types';
import getBuildQueryPlugin from '../queries/buildQuery'; import getBuildQueryPlugin from '../queries/buildQuery';
import { GlobalModel } from '../../globals/config/types'; import type { GlobalModel } from '../types';
export const buildGlobalModel = (config: SanitizedConfig): GlobalModel | null => { export const buildGlobalModel = (config: SanitizedConfig): GlobalModel | null => {
if (config.globals && config.globals.length > 0) { if (config.globals && config.globals.length > 0) {

View File

@@ -6,6 +6,7 @@ import { getLocalizedPaths } from './getLocalizedPaths';
import { sanitizeQueryValue } from './sanitizeQueryValue'; import { sanitizeQueryValue } from './sanitizeQueryValue';
import { PathToQuery, validOperators } from '../../database/queryValidation/types'; import { PathToQuery, validOperators } from '../../database/queryValidation/types';
import { Payload } from '../..'; import { Payload } from '../..';
import { MongooseAdapter } from '..';
type SearchParam = { type SearchParam = {
path?: string, path?: string,
@@ -112,7 +113,7 @@ export async function buildSearchParam({
}, i) => { }, i) => {
const priorQueryResult = await priorQuery; const priorQueryResult = await priorQuery;
const SubModel = payload.collections[slug].Model; const SubModel = (payload.db as MongooseAdapter).collections[slug];
// On the "deepest" collection, // On the "deepest" collection,
// Search on the value passed through the query // Search on the value passed through the query

View File

@@ -1,12 +1,30 @@
export type PaginatedDocs<T = any> = { import type { AggregatePaginateModel, IndexDefinition, IndexOptions, Model, PaginateModel } from 'mongoose';
docs: T[] import type { BuildQueryArgs } from './queries/buildQuery';
totalDocs: number
limit: number
totalPages: number export interface CollectionModel extends Model<any>, PaginateModel<any>, AggregatePaginateModel<any>, PassportLocalModel {
page?: number /** buildQuery is used to transform payload's where operator into what can be used by mongoose (e.g. id => _id) */
pagingCounter: number buildQuery: (args: BuildQueryArgs) => Promise<Record<string, unknown>> // TODO: Delete this
hasPrevPage: boolean }
hasNextPage: boolean type Register<T = any> = (doc: T, password: string) => T;
prevPage?: number | null | undefined
nextPage?: number | null | undefined interface PassportLocalModel {
register: Register
authenticate: any
}
export interface AuthCollectionModel extends CollectionModel {
resetPasswordToken: string;
resetPasswordExpiration: Date;
}
export type TypeOfIndex = {
fields: IndexDefinition
options?: IndexOptions
}
export interface GlobalModel extends Model<Document> {
buildQuery: (query: unknown, locale?: string) => Promise<Record<string, unknown>>
} }

View File

@@ -2,10 +2,10 @@ import type { MongooseAdapter } from '.';
import type { UpdateOne } from '../database/types'; import type { UpdateOne } from '../database/types';
import { ValidationError } from '../errors'; import { ValidationError } from '../errors';
import sanitizeInternalFields from '../utilities/sanitizeInternalFields'; import sanitizeInternalFields from '../utilities/sanitizeInternalFields';
import i18nInit from '../translations/init'; import { i18nInit } from '../translations/init';
export const updateOne: UpdateOne = async function updateOne(this: MongooseAdapter, export const updateOne: UpdateOne = async function updateOne(this: MongooseAdapter,
{ collection, data, where, locale }) { { collection, data, where, locale, req }) {
const Model = this.collections[collection]; const Model = this.collections[collection];
const query = await Model.buildQuery({ const query = await Model.buildQuery({
@@ -27,7 +27,7 @@ export const updateOne: UpdateOne = async function updateOne(this: MongooseAdapt
? new ValidationError([{ ? new ValidationError([{
message: 'Value must be unique', message: 'Value must be unique',
field: Object.keys(error.keyValue)[0], field: Object.keys(error.keyValue)[0],
}], i18nInit(this.payload.config.i18n).t) }], req?.t ?? i18nInit(this.payload.config.i18n).t)
: error; : error;
} }

View File

@@ -7,10 +7,9 @@ import mongoose from 'mongoose';
import { Config as GeneratedTypes } from 'payload/generated-types'; import { Config as GeneratedTypes } from 'payload/generated-types';
import { OperationArgs, Request as graphQLRequest } from 'graphql-http/lib/handler'; import { OperationArgs, Request as graphQLRequest } from 'graphql-http/lib/handler';
import { SendMailOptions } from 'nodemailer'; import { SendMailOptions } from 'nodemailer';
import { BulkOperationResult, Collection, CollectionModel } from './collections/config/types'; import { BulkOperationResult, Collection } from './collections/config/types';
import { EmailOptions, InitOptions, SanitizedConfig } from './config/types'; import { EmailOptions, InitOptions, SanitizedConfig } from './config/types';
import { TypeWithVersion } from './versions/types'; import { TypeWithVersion } from './versions/types';
import { PaginatedDocs } from './mongoose/types';
import { PayloadAuthenticate } from './express/middleware/authenticate'; import { PayloadAuthenticate } from './express/middleware/authenticate';
import { Globals } from './globals/config/types'; import { Globals } from './globals/config/types';
@@ -61,6 +60,7 @@ import findConfig from './config/find';
import { defaults as emailDefaults } from './email/defaults'; import { defaults as emailDefaults } from './email/defaults';
import type { DatabaseAdapter } from '.'; import type { DatabaseAdapter } from '.';
import { mongooseAdapter } from './mongoose'; import { mongooseAdapter } from './mongoose';
import type { PaginatedDocs } from './database/types';
/** /**
* @description Payload * @description Payload
@@ -75,7 +75,7 @@ export class BasePayload<TGeneratedTypes extends GeneratedTypes> {
} = {}; } = {};
versions: { versions: {
[slug: string]: CollectionModel; [slug: string]: any; // TODO: Type this
} = {}; } = {};
globals: Globals; globals: Globals;

View File

@@ -1,5 +1,6 @@
import type { Payload } from '../index'; import type { Payload } from '../index';
import type { SanitizedCollectionConfig } from '../collections/config/types'; import type { SanitizedCollectionConfig } from '../collections/config/types';
import { PayloadRequest } from '../express/types';
type Args = { type Args = {
payload: Payload payload: Payload
@@ -8,13 +9,26 @@ type Args = {
*/ */
ids: (string|number)[] ids: (string|number)[]
collectionConfig: SanitizedCollectionConfig collectionConfig: SanitizedCollectionConfig
req: PayloadRequest
} }
export const deleteUserPreferences = ({ payload, ids, collectionConfig }: Args) => { export const deleteUserPreferences = ({ payload, ids, collectionConfig, req }: Args) => {
if (collectionConfig.auth) { if (collectionConfig.auth) {
payload.collections['payload-preferences'].Model.deleteMany({ payload.db.deleteMany({
user: { in: ids }, collection: 'payload-preferences',
userCollection: collectionConfig.slug, where: {
user: { in: ids },
userCollection: {
equals: 'collectionConfig.slug,',
},
},
req,
}); });
} }
payload.collections['payload-preferences'].Model.deleteMany({ key: { in: ids.map((id) => `collection-${collectionConfig.slug}-${id}`) } }); payload.db.deleteMany({
collection: 'payload-preferences',
where: {
key: { in: ids.map((id) => `collection-${collectionConfig.slug}-${id}`) },
},
req,
});
}; };

View File

@@ -45,12 +45,14 @@ async function update(args: PreferenceUpdateRequest) {
await payload.db.create({ await payload.db.create({
collection, collection,
data: preference, data: preference,
req,
}); });
} catch (err: unknown) { } catch (err: unknown) {
await payload.db.updateOne({ await payload.db.updateOne({
collection, collection,
where: filter, where: filter,
data: preference, data: preference,
req,
}); });
} }

View File

@@ -3,7 +3,7 @@ import type { i18n, InitOptions } from 'i18next';
import deepmerge from 'deepmerge'; import deepmerge from 'deepmerge';
import { defaultOptions } from './defaultOptions'; import { defaultOptions } from './defaultOptions';
export default (options: InitOptions): i18n => { export function i18nInit(options: InitOptions): i18n {
if (i18next.isInitialized) { if (i18next.isInitialized) {
return i18next; return i18next;
} }
@@ -11,4 +11,4 @@ export default (options: InitOptions): i18n => {
...deepmerge(defaultOptions, options || {}), ...deepmerge(defaultOptions, options || {}),
}); });
return i18next; return i18next;
}; }

View File

@@ -12,8 +12,9 @@ import { blocksFieldSeedData } from './collections/Blocks';
import { localizedTextValue, namedTabDefaultValue, namedTabText, tabsDoc, tabsSlug } from './collections/Tabs'; import { localizedTextValue, namedTabDefaultValue, namedTabText, tabsDoc, tabsSlug } from './collections/Tabs';
import { defaultNumber, numberDoc } from './collections/Number'; import { defaultNumber, numberDoc } from './collections/Number';
import { dateDoc } from './collections/Date'; import { dateDoc } from './collections/Date';
import type { PaginatedDocs } from '../../src/mongoose/types';
import type { RichTextField } from './payload-types'; import type { RichTextField } from './payload-types';
import type { PaginatedDocs } from '../../src/database/types';
import type { MongooseAdapter } from '../../src/mongoose';
let client; let client;
let graphQLClient: GraphQLClient; let graphQLClient: GraphQLClient;
@@ -228,7 +229,7 @@ describe('Fields', () => {
const options: Record<string, IndexOptions> = {}; const options: Record<string, IndexOptions> = {};
beforeAll(() => { beforeAll(() => {
indexes = payload.collections['indexed-fields'].Model.schema.indexes() as [Record<string, IndexDirection>, IndexOptions]; indexes = (payload.db as MongooseAdapter).collections['indexed-fields'].schema.indexes() as [Record<string, IndexDirection>, IndexOptions];
indexes.forEach((index) => { indexes.forEach((index) => {
const field = Object.keys(index[0])[0]; const field = Object.keys(index[0])[0];

View File

@@ -2,9 +2,9 @@
import qs from 'qs'; import qs from 'qs';
import fetch from 'node-fetch'; import fetch from 'node-fetch';
import type { Config } from '../../src/config/types'; import type { Config } from '../../src/config/types';
import type { PaginatedDocs } from '../../src/mongoose/types';
import type { Where } from '../../src/types'; import type { Where } from '../../src/types';
import { devUser } from '../credentials'; import { devUser } from '../credentials';
import type { PaginatedDocs } from '../../src/database/types';
type Args = { type Args = {
serverURL: string; serverURL: string;