diff --git a/src/admin/components/elements/WhereBuilder/Condition/Relationship/index.tsx b/src/admin/components/elements/WhereBuilder/Condition/Relationship/index.tsx index 2a3f96d1d..8ad3fe256 100644 --- a/src/admin/components/elements/WhereBuilder/Condition/Relationship/index.tsx +++ b/src/admin/components/elements/WhereBuilder/Condition/Relationship/index.tsx @@ -6,7 +6,7 @@ import optionsReducer from './optionsReducer'; import useDebounce from '../../../../../hooks/useDebounce'; import ReactSelect from '../../../ReactSelect'; import { Option } from '../../../ReactSelect/types'; -import { PaginatedDocs } from '../../../../../../mongoose/types'; +import type { PaginatedDocs } from '../../../../../../database/types'; import './index.scss'; diff --git a/src/admin/components/elements/WhereBuilder/Condition/Relationship/types.ts b/src/admin/components/elements/WhereBuilder/Condition/Relationship/types.ts index d22172b8b..433352e07 100644 --- a/src/admin/components/elements/WhereBuilder/Condition/Relationship/types.ts +++ b/src/admin/components/elements/WhereBuilder/Condition/Relationship/types.ts @@ -1,7 +1,7 @@ import i18n from 'i18next'; import { RelationshipField } from '../../../../../../fields/config/types'; import { SanitizedCollectionConfig } from '../../../../../../collections/config/types'; -import { PaginatedDocs } from '../../../../../../mongoose/types'; +import type { PaginatedDocs } from '../../../../../../database/types'; export type Props = { onChange: (val: unknown) => void, diff --git a/src/admin/components/forms/field-types/Relationship/index.tsx b/src/admin/components/forms/field-types/Relationship/index.tsx index a70f3b9b8..a698fb0c6 100644 --- a/src/admin/components/forms/field-types/Relationship/index.tsx +++ b/src/admin/components/forms/field-types/Relationship/index.tsx @@ -11,7 +11,7 @@ import Error from '../../Error'; import FieldDescription from '../../FieldDescription'; import { relationship } from '../../../../../fields/validations'; import { Where } from '../../../../../types'; -import { PaginatedDocs } from '../../../../../mongoose/types'; +import type { PaginatedDocs } from '../../../../../database/types'; import { useFormProcessing } from '../../Form/context'; import optionsReducer from './optionsReducer'; import { FilterOptionsResult, GetResults, Props, Value } from './types'; diff --git a/src/admin/components/utilities/DocumentInfo/index.tsx b/src/admin/components/utilities/DocumentInfo/index.tsx index 3aa3ee965..b88f92a6d 100644 --- a/src/admin/components/utilities/DocumentInfo/index.tsx +++ b/src/admin/components/utilities/DocumentInfo/index.tsx @@ -5,7 +5,7 @@ import qs from 'qs'; import { useTranslation } from 'react-i18next'; import { useParams } from 'react-router-dom'; import { useConfig } from '../Config'; -import { PaginatedDocs } from '../../../../mongoose/types'; +import type { PaginatedDocs } from '../../../../database/types'; import { ContextType, DocumentPermissions, Props, Version } from './types'; import { TypeWithID } from '../../../../globals/config/types'; import { TypeWithTimestamps } from '../../../../collections/config/types'; diff --git a/src/admin/components/utilities/DocumentInfo/types.ts b/src/admin/components/utilities/DocumentInfo/types.ts index adb975612..63b8969e5 100644 --- a/src/admin/components/utilities/DocumentInfo/types.ts +++ b/src/admin/components/utilities/DocumentInfo/types.ts @@ -2,7 +2,7 @@ import React from 'react'; import { CollectionPermission, GlobalPermission } from '../../../../auth'; import { SanitizedCollectionConfig, TypeWithID, TypeWithTimestamps } from '../../../../collections/config/types'; import { SanitizedGlobalConfig } from '../../../../globals/config/types'; -import { PaginatedDocs } from '../../../../mongoose/types'; +import type { PaginatedDocs } from '../../../../database/types'; import { TypeWithVersion } from '../../../../versions/types'; export type Version = TypeWithVersion diff --git a/src/admin/components/views/Version/Compare/index.tsx b/src/admin/components/views/Version/Compare/index.tsx index 60cbca0b2..a39213a11 100644 --- a/src/admin/components/views/Version/Compare/index.tsx +++ b/src/admin/components/views/Version/Compare/index.tsx @@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next'; import { useConfig } from '../../../utilities/Config'; import { Props } from './types'; import ReactSelect from '../../../elements/ReactSelect'; -import { PaginatedDocs } from '../../../../../mongoose/types'; +import type { PaginatedDocs } from '../../../../../database/types'; import { Where } from '../../../../../types'; import { mostRecentVersionOption, publishedVersionOption } from '../shared'; import { formatDate } from '../../../../utilities/formatDate'; diff --git a/src/admin/components/views/Version/Compare/types.ts b/src/admin/components/views/Version/Compare/types.ts index d770ba691..798e7ed56 100644 --- a/src/admin/components/views/Version/Compare/types.ts +++ b/src/admin/components/views/Version/Compare/types.ts @@ -1,5 +1,5 @@ import { SanitizedCollectionConfig } from '../../../../../collections/config/types'; -import { PaginatedDocs } from '../../../../../mongoose/types'; +import type { PaginatedDocs } from '../../../../../database/types'; import { CompareOption } from '../types'; export type Props = { diff --git a/src/admin/components/views/collections/List/types.ts b/src/admin/components/views/collections/List/types.ts index bab7126d6..da99d20f4 100644 --- a/src/admin/components/views/collections/List/types.ts +++ b/src/admin/components/views/collections/List/types.ts @@ -1,6 +1,6 @@ import { Where } from '../../../../../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 PerPageProps } from '../../../elements/PerPage'; import { Props as PaginatorProps } from '../../../elements/Paginator/types'; diff --git a/src/auth/operations/local/forgotPassword.ts b/src/auth/operations/local/forgotPassword.ts index 6a6ff7455..b2349cf20 100644 --- a/src/auth/operations/local/forgotPassword.ts +++ b/src/auth/operations/local/forgotPassword.ts @@ -3,7 +3,7 @@ import { PayloadRequest } from '../../../express/types'; import forgotPassword, { Result } from '../forgotPassword'; import { Payload } from '../../../payload'; import { getDataLoader } from '../../../collections/dataloader'; -import i18n from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { @@ -36,7 +36,7 @@ async function localForgotPassword = { @@ -46,7 +46,7 @@ async function localLogin( req.payloadAPI = req.payloadAPI || 'local'; req.payload = payload; - req.i18n = i18n(payload.config.i18n); + req.i18n = i18nInit(payload.config.i18n); req.locale = undefined; req.fallbackLocale = undefined; diff --git a/src/auth/operations/local/resetPassword.ts b/src/auth/operations/local/resetPassword.ts index 7e061caa5..77be18c5c 100644 --- a/src/auth/operations/local/resetPassword.ts +++ b/src/auth/operations/local/resetPassword.ts @@ -3,7 +3,7 @@ import { Payload } from '../../../payload'; import resetPassword, { Result } from '../resetPassword'; import { PayloadRequest } from '../../../express/types'; import { getDataLoader } from '../../../collections/dataloader'; -import i18n from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { @@ -35,7 +35,7 @@ async function localResetPassword req.payload = payload; 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.payloadDataLoader) req.payloadDataLoader = getDataLoader(req); diff --git a/src/auth/operations/local/unlock.ts b/src/auth/operations/local/unlock.ts index 1080c546e..76a6f1a9c 100644 --- a/src/auth/operations/local/unlock.ts +++ b/src/auth/operations/local/unlock.ts @@ -3,7 +3,7 @@ import { PayloadRequest } from '../../../express/types'; import { Payload } from '../../../payload'; import unlock from '../unlock'; import { getDataLoader } from '../../../collections/dataloader'; -import i18n from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { @@ -34,7 +34,7 @@ async function localUnlock( req.payload = payload; 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.payloadDataLoader) req.payloadDataLoader = getDataLoader(req); diff --git a/src/auth/operations/resetPassword.ts b/src/auth/operations/resetPassword.ts index 5923d9c09..c3f5903e9 100644 --- a/src/auth/operations/resetPassword.ts +++ b/src/auth/operations/resetPassword.ts @@ -77,6 +77,7 @@ async function resetPassword(args: Arguments): Promise { collection: collectionConfig.slug, where: { id: { equals: user.id } }, data: user, + req: args.req, }); diff --git a/src/auth/operations/verifyEmail.ts b/src/auth/operations/verifyEmail.ts index 87704400c..8778532f0 100644 --- a/src/auth/operations/verifyEmail.ts +++ b/src/auth/operations/verifyEmail.ts @@ -36,6 +36,7 @@ async function verifyEmail(args: Args): Promise { _verified: true, _verificationToken: undefined, }, + req, }); return true; diff --git a/src/auth/strategies/local/register.ts b/src/auth/strategies/local/register.ts index b4faeaad0..36b89535d 100644 --- a/src/auth/strategies/local/register.ts +++ b/src/auth/strategies/local/register.ts @@ -2,12 +2,14 @@ import { ValidationError } from '../../../errors'; import { Payload } from '../../..'; import { SanitizedCollectionConfig } from '../../../collections/config/types'; import { generatePasswordSaltHash } from './generatePasswordSaltHash'; +import { PayloadRequest } from '../../../express/types'; type Args = { collection: SanitizedCollectionConfig doc: Record password: string payload: Payload + req: PayloadRequest } export const registerLocalStrategy = async ({ @@ -15,6 +17,7 @@ export const registerLocalStrategy = async ({ doc, password, payload, + req, }: Args): Promise> => { const existingUser = await payload.find({ collection: collection.slug, @@ -39,5 +42,6 @@ export const registerLocalStrategy = async ({ salt, hash, }, + req, }); }; diff --git a/src/collections/config/types.ts b/src/collections/config/types.ts index 85d81d1dd..30d906c80 100644 --- a/src/collections/config/types.ts +++ b/src/collections/config/types.ts @@ -1,9 +1,9 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { DeepRequired } from 'ts-essentials'; -import { AggregatePaginateModel, IndexDefinition, IndexOptions, Model, PaginateModel } from 'mongoose'; import { GraphQLInputObjectType, GraphQLNonNull, GraphQLObjectType } from 'graphql'; import { Response } from 'express'; import { Config as GeneratedTypes } from 'payload/generated-types'; +import type { IndexDefinition, IndexOptions } from 'mongoose'; import type { Where } from '../../types'; import { Access, Endpoint, EntityDescription, GeneratePreviewURL } from '../../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 { IncomingUploadType, Upload } from '../../uploads/types'; import { IncomingCollectionVersions, SanitizedCollectionVersions } from '../../versions/types'; -import { BuildQueryArgs } from '../../mongoose/queries/buildQuery'; import { CustomPreviewButtonProps, CustomPublishButtonProps, @@ -21,23 +20,6 @@ import { import type { Props as ListProps } from '../../admin/components/views/collections/List/types'; import type { Props as EditProps } from '../../admin/components/views/collections/Edit/types'; -type Register = (doc: T, password: string) => T; - -interface PassportLocalModel { - register: Register - authenticate: any -} - -export interface CollectionModel extends Model, PaginateModel, AggregatePaginateModel, 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> // TODO: Delete this -} - -export interface AuthCollectionModel extends CollectionModel { - resetPasswordToken: string; - resetPasswordExpiration: Date; -} - export type HookOperationType = | 'create' | 'autosave' @@ -361,7 +343,6 @@ export interface SanitizedCollectionConfig extends Omit( doc: resultWithLocales, payload: req.payload, password: data.password as string, + req, }); } else { try { doc = await payload.db.create({ collection: collectionConfig.slug, data: resultWithLocales, + req, }); } catch (error) { // Handle uniqueness error from MongoDB diff --git a/src/collections/operations/delete.ts b/src/collections/operations/delete.ts index 2ca4ffb1c..424fc85fd 100644 --- a/src/collections/operations/delete.ts +++ b/src/collections/operations/delete.ts @@ -139,6 +139,7 @@ async function deleteOperation id), + req, }); return { diff --git a/src/collections/operations/deleteByID.ts b/src/collections/operations/deleteByID.ts index 6e4318d9a..a0443c111 100644 --- a/src/collections/operations/deleteByID.ts +++ b/src/collections/operations/deleteByID.ts @@ -99,6 +99,7 @@ async function deleteByID(inc let result = await req.payload.db.deleteOne({ collection: collectionConfig.slug, where: { id: { equals: id } }, + req, }); @@ -110,6 +111,7 @@ async function deleteByID(inc payload, collectionConfig, ids: [id], + req, }); // ///////////////////////////////////// diff --git a/src/collections/operations/find.ts b/src/collections/operations/find.ts index bb80b98e2..d36caf7de 100644 --- a/src/collections/operations/find.ts +++ b/src/collections/operations/find.ts @@ -2,7 +2,7 @@ import { Where } from '../../types'; import { PayloadRequest } from '../../express/types'; import executeAccess from '../../auth/executeAccess'; import { Collection, TypeWithID } from '../config/types'; -import { PaginatedDocs } from '../../mongoose/types'; +import type { PaginatedDocs } from '../../database/types'; import { AccessResult } from '../../config/types'; import { afterRead } from '../../fields/hooks/afterRead'; import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths'; diff --git a/src/collections/operations/findVersions.ts b/src/collections/operations/findVersions.ts index 760a71365..df99dfaba 100644 --- a/src/collections/operations/findVersions.ts +++ b/src/collections/operations/findVersions.ts @@ -3,7 +3,7 @@ import { PayloadRequest } from '../../express/types'; import executeAccess from '../../auth/executeAccess'; import sanitizeInternalFields from '../../utilities/sanitizeInternalFields'; import { Collection } from '../config/types'; -import { PaginatedDocs } from '../../mongoose/types'; +import type { PaginatedDocs } from '../../database/types'; import { TypeWithVersion } from '../../versions/types'; import { afterRead } from '../../fields/hooks/afterRead'; import { buildVersionCollectionFields } from '../../versions/buildCollectionFields'; diff --git a/src/collections/operations/local/create.ts b/src/collections/operations/local/create.ts index e1fcd4abc..4d7822905 100644 --- a/src/collections/operations/local/create.ts +++ b/src/collections/operations/local/create.ts @@ -8,7 +8,7 @@ import getFileByPath from '../../../uploads/getFileByPath'; import create from '../create'; import { getDataLoader } from '../../dataloader'; import { File } from '../../../uploads/types'; -import i18n from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { @@ -60,7 +60,7 @@ export default async function createLocal(pa locale: locale ?? defaultLocale, fallbackLocale: fallbackLocale ?? defaultLocale, payload, - i18n: i18n(payload.config.i18n), + i18n: i18nInit(payload.config.i18n), } as PayloadRequest; if (!req.t) req.t = req.i18n.t; diff --git a/src/collections/operations/local/find.ts b/src/collections/operations/local/find.ts index 34203d3f4..eccd1efd3 100644 --- a/src/collections/operations/local/find.ts +++ b/src/collections/operations/local/find.ts @@ -1,11 +1,11 @@ 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 { Payload } from '../../../payload'; import { PayloadRequest } from '../../../express/types'; import find from '../find'; import { getDataLoader } from '../../dataloader'; -import i18n from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { @@ -60,7 +60,7 @@ export default async function findLocal = { @@ -51,7 +51,7 @@ export default async function findByIDLocal = { @@ -47,7 +47,7 @@ export default async function findVersionByIDLocal = { diff --git a/src/collections/operations/local/restoreVersion.ts b/src/collections/operations/local/restoreVersion.ts index c407953c1..63fe84a90 100644 --- a/src/collections/operations/local/restoreVersion.ts +++ b/src/collections/operations/local/restoreVersion.ts @@ -4,7 +4,7 @@ import { PayloadRequest } from '../../../express/types'; import { Document } from '../../../types'; import { getDataLoader } from '../../dataloader'; import restoreVersion from '../restoreVersion'; -import i18nInit from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { diff --git a/src/collections/operations/local/update.ts b/src/collections/operations/local/update.ts index 77ae974bc..45e9be731 100644 --- a/src/collections/operations/local/update.ts +++ b/src/collections/operations/local/update.ts @@ -7,7 +7,7 @@ import update from '../update'; import { PayloadRequest } from '../../../express/types'; import { getDataLoader } from '../../dataloader'; import { File } from '../../../uploads/types'; -import i18nInit from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; import updateByID from '../updateByID'; import { BulkOperationResult } from '../../config/types'; diff --git a/src/collections/operations/restoreVersion.ts b/src/collections/operations/restoreVersion.ts index fbd50b03c..c4526423f 100644 --- a/src/collections/operations/restoreVersion.ts +++ b/src/collections/operations/restoreVersion.ts @@ -104,7 +104,7 @@ async function restoreVersion(args: Arguments): Prom collection: collectionConfig.slug, where: { id: { equals: parentDocID } }, data: rawVersion.version, - + req, }); // ///////////////////////////////////// diff --git a/src/collections/operations/update.ts b/src/collections/operations/update.ts index d669f1d0c..baebe9b7e 100644 --- a/src/collections/operations/update.ts +++ b/src/collections/operations/update.ts @@ -248,6 +248,7 @@ async function update( locale, where: { id: { equals: id } }, data: result, + req, }); } diff --git a/src/collections/operations/updateByID.ts b/src/collections/operations/updateByID.ts index 1b6071c24..f74c9aebf 100644 --- a/src/collections/operations/updateByID.ts +++ b/src/collections/operations/updateByID.ts @@ -234,6 +234,7 @@ async function updateByID( locale, where: { id: { equals: id } }, data: dataToUpdate, + req, }); } diff --git a/src/collections/requestHandlers/find.ts b/src/collections/requestHandlers/find.ts index 9f94102a8..323540488 100644 --- a/src/collections/requestHandlers/find.ts +++ b/src/collections/requestHandlers/find.ts @@ -2,7 +2,7 @@ import { Response, NextFunction } from 'express'; import httpStatus from 'http-status'; import { PayloadRequest } from '../../express/types'; import { TypeWithID } from '../config/types'; -import { PaginatedDocs } from '../../mongoose/types'; +import type { PaginatedDocs } from '../../database/types'; import find from '../operations/find'; import { Where } from '../../types'; import { isNumber } from '../../utilities/isNumber'; diff --git a/src/collections/requestHandlers/findVersions.ts b/src/collections/requestHandlers/findVersions.ts index c3b8bdad2..196fe9503 100644 --- a/src/collections/requestHandlers/findVersions.ts +++ b/src/collections/requestHandlers/findVersions.ts @@ -3,7 +3,7 @@ import httpStatus from 'http-status'; import { Where } from '../../types'; import { PayloadRequest } from '../../express/types'; import { TypeWithID } from '../config/types'; -import { PaginatedDocs } from '../../mongoose/types'; +import type { PaginatedDocs } from '../../database/types'; import { isNumber } from '../../utilities/isNumber'; import findVersions from '../operations/findVersions'; diff --git a/src/database/types.ts b/src/database/types.ts index 4ff1d5b45..87a714d17 100644 --- a/src/database/types.ts +++ b/src/database/types.ts @@ -27,7 +27,7 @@ import type { import type { TypeWithID } from '../collections/config/types'; import type { TypeWithID as GlobalsTypeWithID } from '../globals/config/types'; import type { Payload } from '../payload'; -import type { Document, Where } from '../types'; +import type { Document, PayloadRequest, Where } from '../types'; import type { TypeWithVersion } from '../versions/types'; export interface DatabaseAdapter { @@ -126,6 +126,7 @@ export interface DatabaseAdapter { create: Create; updateOne: UpdateOne; deleteOne: DeleteOne; + deleteMany: DeleteMany; // operations - globals findGlobal: FindGlobal; @@ -274,6 +275,7 @@ export type CreateArgs = { data: Record draft?: boolean locale?: string + req: PayloadRequest } export type Create = (args: CreateArgs) => Promise @@ -284,6 +286,7 @@ export type UpdateArgs = { where: Where draft?: boolean locale?: string + req: PayloadRequest } export type Update = (args: UpdateArgs) => Promise @@ -294,6 +297,7 @@ export type UpdateOneArgs = { where: Where draft?: boolean locale?: string + req: PayloadRequest } export type UpdateOne = (args: UpdateOneArgs) => Promise @@ -301,6 +305,7 @@ export type UpdateOne = (args: UpdateOneArgs) => Promise export type DeleteOneArgs = { collection: string where: Where + req: PayloadRequest } export type DeleteOne = (args: DeleteOneArgs) => Promise @@ -308,8 +313,12 @@ export type DeleteOne = (args: DeleteOneArgs) => Promise export type DeleteManyArgs = { collection: string where: Where + req: PayloadRequest | null } +export type DeleteMany = (args: DeleteManyArgs) => Promise + + export type Migration = MigrationData & { up: ({ payload }: { payload }) => Promise down: ({ payload }: { payload }) => Promise diff --git a/src/globals/config/types.ts b/src/globals/config/types.ts index e6e2cf50d..e1f12f28d 100644 --- a/src/globals/config/types.ts +++ b/src/globals/config/types.ts @@ -1,5 +1,4 @@ import React from 'react'; -import { Document, Model } from 'mongoose'; import { DeepRequired } from 'ts-essentials'; import { GraphQLNonNull, GraphQLObjectType } from 'graphql'; import type { Where } from '../../types'; @@ -49,10 +48,6 @@ export type AfterReadHook = (args: { findMany?: boolean }) => any; -export interface GlobalModel extends Model { - buildQuery: (query: unknown, locale?: string) => Promise> -} - export type GlobalAdminOptions = { /** * Exclude the global from the admin nav and routes @@ -149,7 +144,6 @@ export interface SanitizedGlobalConfig extends Omit, } export type Globals = { - Model?: GlobalModel config: SanitizedGlobalConfig[] graphQL?: { [slug: string]: { diff --git a/src/globals/operations/findVersions.ts b/src/globals/operations/findVersions.ts index e4ea756da..981c2b4b7 100644 --- a/src/globals/operations/findVersions.ts +++ b/src/globals/operations/findVersions.ts @@ -2,7 +2,7 @@ import { Where } from '../../types'; import { PayloadRequest } from '../../express/types'; import executeAccess from '../../auth/executeAccess'; import sanitizeInternalFields from '../../utilities/sanitizeInternalFields'; -import { PaginatedDocs } from '../../mongoose/types'; +import type { PaginatedDocs } from '../../database/types'; import { SanitizedGlobalConfig } from '../config/types'; import { afterRead } from '../../fields/hooks/afterRead'; import { buildVersionGlobalFields } from '../../versions/buildGlobalFields'; diff --git a/src/globals/operations/local/findOne.ts b/src/globals/operations/local/findOne.ts index 1f9abd953..3b33c41f7 100644 --- a/src/globals/operations/local/findOne.ts +++ b/src/globals/operations/local/findOne.ts @@ -4,7 +4,7 @@ import { getDataLoader } from '../../../collections/dataloader'; import { PayloadRequest } from '../../../express/types'; import { Document } from '../../../types'; import findOne from '../findOne'; -import i18nInit from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { diff --git a/src/globals/operations/local/findVersionByID.ts b/src/globals/operations/local/findVersionByID.ts index 03ebfe436..60de8b754 100644 --- a/src/globals/operations/local/findVersionByID.ts +++ b/src/globals/operations/local/findVersionByID.ts @@ -5,7 +5,7 @@ import { PayloadRequest } from '../../../express/types'; import { Document } from '../../../types'; import { TypeWithVersion } from '../../../versions/types'; import findVersionByID from '../findVersionByID'; -import i18nInit from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { diff --git a/src/globals/operations/local/findVersions.ts b/src/globals/operations/local/findVersions.ts index f5bd62a43..b3c0afc6d 100644 --- a/src/globals/operations/local/findVersions.ts +++ b/src/globals/operations/local/findVersions.ts @@ -1,11 +1,11 @@ import { Config as GeneratedTypes } from 'payload/generated-types'; import { Document, Where } from '../../../types'; -import { PaginatedDocs } from '../../../mongoose/types'; +import type { PaginatedDocs } from '../../../database/types'; import { Payload } from '../../../payload'; import { PayloadRequest } from '../../../express/types'; import findVersions from '../findVersions'; import { getDataLoader } from '../../../collections/dataloader'; -import i18nInit from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; import { TypeWithVersion } from '../../../versions/types'; diff --git a/src/globals/operations/local/restoreVersion.ts b/src/globals/operations/local/restoreVersion.ts index be91cbbef..5af2b6a36 100644 --- a/src/globals/operations/local/restoreVersion.ts +++ b/src/globals/operations/local/restoreVersion.ts @@ -4,7 +4,7 @@ import { getDataLoader } from '../../../collections/dataloader'; import { PayloadRequest } from '../../../express/types'; import { Document } from '../../../types'; import restoreVersion from '../restoreVersion'; -import i18nInit from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { diff --git a/src/globals/operations/local/update.ts b/src/globals/operations/local/update.ts index 0ea786e0e..7cb42835b 100644 --- a/src/globals/operations/local/update.ts +++ b/src/globals/operations/local/update.ts @@ -5,7 +5,7 @@ import { Document } from '../../../types'; import { PayloadRequest } from '../../../express/types'; import update from '../update'; import { getDataLoader } from '../../../collections/dataloader'; -import i18nInit from '../../../translations/init'; +import { i18nInit } from '../../../translations/init'; import { APIError } from '../../../errors'; export type Options = { diff --git a/src/globals/requestHandlers/findVersions.ts b/src/globals/requestHandlers/findVersions.ts index 24d0d0b69..b673d5af5 100644 --- a/src/globals/requestHandlers/findVersions.ts +++ b/src/globals/requestHandlers/findVersions.ts @@ -2,7 +2,7 @@ import { Response, NextFunction } from 'express'; import httpStatus from 'http-status'; import { PayloadRequest } from '../../express/types'; import { TypeWithID } from '../../collections/config/types'; -import { PaginatedDocs } from '../../mongoose/types'; +import type { PaginatedDocs } from '../../database/types'; import { SanitizedGlobalConfig } from '../config/types'; import findVersions from '../operations/findVersions'; import { Where } from '../../types'; diff --git a/src/mongoose/create.ts b/src/mongoose/create.ts index 2f97e7613..b3cc33223 100644 --- a/src/mongoose/create.ts +++ b/src/mongoose/create.ts @@ -1,6 +1,6 @@ import type { MongooseAdapter } from '.'; import type { Create } from '../database/types'; -import { Document } from '../types'; +import type { Document } from '../types'; export const create: Create = async function create(this: MongooseAdapter, { collection, data }) { diff --git a/src/mongoose/deleteMany.ts b/src/mongoose/deleteMany.ts new file mode 100644 index 000000000..a9a2b0f5e --- /dev/null +++ b/src/mongoose/deleteMany.ts @@ -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(); +}; diff --git a/src/mongoose/index.ts b/src/mongoose/index.ts index 74a3af30a..e70e9489d 100644 --- a/src/mongoose/index.ts +++ b/src/mongoose/index.ts @@ -1,5 +1,4 @@ import type { ConnectOptions } from 'mongoose'; -import { CollectionModel } from '../collections/config/types'; import { createMigration } from '../database/migrations/createMigration'; import { migrate } from '../database/migrations/migrate'; import { migrateDown } from '../database/migrations/migrateDown'; @@ -7,8 +6,8 @@ import { migrateRefresh } from '../database/migrations/migrateRefresh'; import { migrateReset } from '../database/migrations/migrateReset'; import { migrateStatus } from '../database/migrations/migrateStatus'; import type { DatabaseAdapter } from '../database/types'; -import { GlobalModel } from '../globals/config/types'; -import type { Payload } from '../index'; +import { Payload } from '../index'; +import type { SanitizedConfig } from '../config/types'; import { connect } from './connect'; import { create } from './create'; import { find } from './find'; @@ -27,6 +26,8 @@ import { findOne } from './findOne'; import { updateGlobal } from './updateGlobal'; import { updateOne } from './updateOne'; import { updateVersion } from './updateVersion'; +import type { CollectionModel, GlobalModel } from './types'; +import { deleteMany } from './deleteMany'; export interface Args { payload: Payload; @@ -57,14 +58,14 @@ export function mongooseAdapter({ connectOptions, migrationDir = '.migrations', }: Args): MongooseAdapter { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore return { payload, url, connectOptions: connectOptions || {}, collections: {}, versions: {}, + globals: undefined, + mongoMemoryServer: undefined, connect, init, webpack, @@ -86,6 +87,7 @@ export function mongooseAdapter({ create, updateOne, deleteOne, + deleteMany, findGlobal, createGlobal, updateGlobal, diff --git a/src/mongoose/init.ts b/src/mongoose/init.ts index fd692f3c2..a84f647b8 100644 --- a/src/mongoose/init.ts +++ b/src/mongoose/init.ts @@ -6,12 +6,13 @@ import { buildVersionCollectionFields } from '../versions/buildCollectionFields' import getBuildQueryPlugin from './queries/buildQuery'; import buildCollectionSchema from './models/buildCollectionSchema'; import buildSchema from './models/buildSchema'; -import { CollectionModel, SanitizedCollectionConfig } from '../collections/config/types'; +import { SanitizedCollectionConfig } from '../collections/config/types'; import { getVersionsModelName } from '../versions/getVersionsModelName'; import type { MongooseAdapter } from '.'; import { buildGlobalModel } from './models/buildGlobalModel'; import { buildVersionGlobalFields } from '../versions/buildGlobalFields'; import type { Init } from '../database/types'; +import { CollectionModel } from './types'; export const init: Init = async function init(this: MongooseAdapter, { config }) { @@ -70,7 +71,6 @@ export const init: Init = async function init(this: MongooseAdapter, this.collections[collection.slug] = model; this.payload.collections[collection.slug] = { - Model: model, config: collection, }; }); @@ -78,8 +78,6 @@ export const init: Init = async function init(this: MongooseAdapter, const model = buildGlobalModel(this.payload.config); this.globals = model; - this.payload.globals.Model = model; - this.payload.config.globals.forEach((global) => { if (global.versions) { const versionModelName = getVersionsModelName(global); diff --git a/src/mongoose/models/buildGlobalModel.ts b/src/mongoose/models/buildGlobalModel.ts index 9f88d3e63..945dbf43d 100644 --- a/src/mongoose/models/buildGlobalModel.ts +++ b/src/mongoose/models/buildGlobalModel.ts @@ -2,7 +2,7 @@ import mongoose from 'mongoose'; import buildSchema from './buildSchema'; import { SanitizedConfig } from '../../config/types'; import getBuildQueryPlugin from '../queries/buildQuery'; -import { GlobalModel } from '../../globals/config/types'; +import type { GlobalModel } from '../types'; export const buildGlobalModel = (config: SanitizedConfig): GlobalModel | null => { if (config.globals && config.globals.length > 0) { diff --git a/src/mongoose/queries/buildSearchParams.ts b/src/mongoose/queries/buildSearchParams.ts index 15ef316e4..e55663bf7 100644 --- a/src/mongoose/queries/buildSearchParams.ts +++ b/src/mongoose/queries/buildSearchParams.ts @@ -6,6 +6,7 @@ import { getLocalizedPaths } from './getLocalizedPaths'; import { sanitizeQueryValue } from './sanitizeQueryValue'; import { PathToQuery, validOperators } from '../../database/queryValidation/types'; import { Payload } from '../..'; +import { MongooseAdapter } from '..'; type SearchParam = { path?: string, @@ -112,7 +113,7 @@ export async function buildSearchParam({ }, i) => { const priorQueryResult = await priorQuery; - const SubModel = payload.collections[slug].Model; + const SubModel = (payload.db as MongooseAdapter).collections[slug]; // On the "deepest" collection, // Search on the value passed through the query diff --git a/src/mongoose/types.ts b/src/mongoose/types.ts index cc61754c5..cb44c85b4 100644 --- a/src/mongoose/types.ts +++ b/src/mongoose/types.ts @@ -1,12 +1,30 @@ -export type PaginatedDocs = { - docs: T[] - totalDocs: number - limit: number - totalPages: number - page?: number - pagingCounter: number - hasPrevPage: boolean - hasNextPage: boolean - prevPage?: number | null | undefined - nextPage?: number | null | undefined +import type { AggregatePaginateModel, IndexDefinition, IndexOptions, Model, PaginateModel } from 'mongoose'; +import type { BuildQueryArgs } from './queries/buildQuery'; + + +export interface CollectionModel extends Model, PaginateModel, AggregatePaginateModel, 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> // TODO: Delete this +} +type Register = (doc: T, password: string) => T; + +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 { + buildQuery: (query: unknown, locale?: string) => Promise> } diff --git a/src/mongoose/updateOne.ts b/src/mongoose/updateOne.ts index 0411b915d..dc7ffed95 100644 --- a/src/mongoose/updateOne.ts +++ b/src/mongoose/updateOne.ts @@ -2,10 +2,10 @@ import type { MongooseAdapter } from '.'; import type { UpdateOne } from '../database/types'; import { ValidationError } from '../errors'; import sanitizeInternalFields from '../utilities/sanitizeInternalFields'; -import i18nInit from '../translations/init'; +import { i18nInit } from '../translations/init'; export const updateOne: UpdateOne = async function updateOne(this: MongooseAdapter, - { collection, data, where, locale }) { + { collection, data, where, locale, req }) { const Model = this.collections[collection]; const query = await Model.buildQuery({ @@ -27,7 +27,7 @@ export const updateOne: UpdateOne = async function updateOne(this: MongooseAdapt ? new ValidationError([{ message: 'Value must be unique', field: Object.keys(error.keyValue)[0], - }], i18nInit(this.payload.config.i18n).t) + }], req?.t ?? i18nInit(this.payload.config.i18n).t) : error; } diff --git a/src/payload.ts b/src/payload.ts index 4bafe9563..e8ae391c9 100644 --- a/src/payload.ts +++ b/src/payload.ts @@ -7,10 +7,9 @@ import mongoose from 'mongoose'; import { Config as GeneratedTypes } from 'payload/generated-types'; import { OperationArgs, Request as graphQLRequest } from 'graphql-http/lib/handler'; 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 { TypeWithVersion } from './versions/types'; -import { PaginatedDocs } from './mongoose/types'; import { PayloadAuthenticate } from './express/middleware/authenticate'; import { Globals } from './globals/config/types'; @@ -61,6 +60,7 @@ import findConfig from './config/find'; import { defaults as emailDefaults } from './email/defaults'; import type { DatabaseAdapter } from '.'; import { mongooseAdapter } from './mongoose'; +import type { PaginatedDocs } from './database/types'; /** * @description Payload @@ -75,7 +75,7 @@ export class BasePayload { } = {}; versions: { - [slug: string]: CollectionModel; + [slug: string]: any; // TODO: Type this } = {}; globals: Globals; diff --git a/src/preferences/deleteUserPreferences.ts b/src/preferences/deleteUserPreferences.ts index 5c35d9736..fa707c2cb 100644 --- a/src/preferences/deleteUserPreferences.ts +++ b/src/preferences/deleteUserPreferences.ts @@ -1,5 +1,6 @@ import type { Payload } from '../index'; import type { SanitizedCollectionConfig } from '../collections/config/types'; +import { PayloadRequest } from '../express/types'; type Args = { payload: Payload @@ -8,13 +9,26 @@ type Args = { */ ids: (string|number)[] collectionConfig: SanitizedCollectionConfig + req: PayloadRequest } -export const deleteUserPreferences = ({ payload, ids, collectionConfig }: Args) => { +export const deleteUserPreferences = ({ payload, ids, collectionConfig, req }: Args) => { if (collectionConfig.auth) { - payload.collections['payload-preferences'].Model.deleteMany({ - user: { in: ids }, - userCollection: collectionConfig.slug, + payload.db.deleteMany({ + collection: 'payload-preferences', + 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, + }); }; diff --git a/src/preferences/operations/update.ts b/src/preferences/operations/update.ts index d2ff49cf2..792653821 100644 --- a/src/preferences/operations/update.ts +++ b/src/preferences/operations/update.ts @@ -45,12 +45,14 @@ async function update(args: PreferenceUpdateRequest) { await payload.db.create({ collection, data: preference, + req, }); } catch (err: unknown) { await payload.db.updateOne({ collection, where: filter, data: preference, + req, }); } diff --git a/src/translations/init.ts b/src/translations/init.ts index d5b8cc1d9..3890af2eb 100644 --- a/src/translations/init.ts +++ b/src/translations/init.ts @@ -3,7 +3,7 @@ import type { i18n, InitOptions } from 'i18next'; import deepmerge from 'deepmerge'; import { defaultOptions } from './defaultOptions'; -export default (options: InitOptions): i18n => { +export function i18nInit(options: InitOptions): i18n { if (i18next.isInitialized) { return i18next; } @@ -11,4 +11,4 @@ export default (options: InitOptions): i18n => { ...deepmerge(defaultOptions, options || {}), }); return i18next; -}; +} diff --git a/test/fields/int.spec.ts b/test/fields/int.spec.ts index 761ee0016..310bea6ce 100644 --- a/test/fields/int.spec.ts +++ b/test/fields/int.spec.ts @@ -12,8 +12,9 @@ import { blocksFieldSeedData } from './collections/Blocks'; import { localizedTextValue, namedTabDefaultValue, namedTabText, tabsDoc, tabsSlug } from './collections/Tabs'; import { defaultNumber, numberDoc } from './collections/Number'; import { dateDoc } from './collections/Date'; -import type { PaginatedDocs } from '../../src/mongoose/types'; import type { RichTextField } from './payload-types'; +import type { PaginatedDocs } from '../../src/database/types'; +import type { MongooseAdapter } from '../../src/mongoose'; let client; let graphQLClient: GraphQLClient; @@ -228,7 +229,7 @@ describe('Fields', () => { const options: Record = {}; beforeAll(() => { - indexes = payload.collections['indexed-fields'].Model.schema.indexes() as [Record, IndexOptions]; + indexes = (payload.db as MongooseAdapter).collections['indexed-fields'].schema.indexes() as [Record, IndexOptions]; indexes.forEach((index) => { const field = Object.keys(index[0])[0]; diff --git a/test/helpers/rest.ts b/test/helpers/rest.ts index b8dfba326..547f13bcb 100644 --- a/test/helpers/rest.ts +++ b/test/helpers/rest.ts @@ -2,9 +2,9 @@ import qs from 'qs'; import fetch from 'node-fetch'; import type { Config } from '../../src/config/types'; -import type { PaginatedDocs } from '../../src/mongoose/types'; import type { Where } from '../../src/types'; import { devUser } from '../credentials'; +import type { PaginatedDocs } from '../../src/database/types'; type Args = { serverURL: string;