@@ -13,6 +13,7 @@ import type {
13
13
BeforeOperationHook ,
14
14
BeforeValidateHook ,
15
15
Collection ,
16
+ DataFromCollectionSlug ,
16
17
RequiredDataFromCollectionSlug ,
17
18
SelectFromCollectionSlug ,
18
19
} from '../config/types.js'
@@ -21,6 +22,7 @@ import { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js'
21
22
import executeAccess from '../../auth/executeAccess.js'
22
23
import { sendVerificationEmail } from '../../auth/sendVerificationEmail.js'
23
24
import { registerLocalStrategy } from '../../auth/strategies/local/register.js'
25
+ import { getDuplicateDocumentData } from '../../duplicateDocument/index.js'
24
26
import { afterChange } from '../../fields/hooks/afterChange/index.js'
25
27
import { afterRead } from '../../fields/hooks/afterRead/index.js'
26
28
import { beforeChange } from '../../fields/hooks/beforeChange/index.js'
@@ -43,6 +45,7 @@ export type Arguments<TSlug extends CollectionSlug> = {
43
45
disableTransaction ?: boolean
44
46
disableVerificationEmail ?: boolean
45
47
draft ?: boolean
48
+ duplicateFromID ?: DataFromCollectionSlug < TSlug > [ 'id' ]
46
49
overrideAccess ?: boolean
47
50
overwriteExistingFiles ?: boolean
48
51
populate ?: PopulateType
@@ -97,6 +100,7 @@ export const createOperation = async <
97
100
depth,
98
101
disableVerificationEmail,
99
102
draft = false ,
103
+ duplicateFromID,
100
104
overrideAccess,
101
105
overwriteExistingFiles = false ,
102
106
populate,
@@ -115,6 +119,23 @@ export const createOperation = async <
115
119
116
120
const shouldSaveDraft = Boolean ( draft && collectionConfig . versions . drafts )
117
121
122
+ let duplicatedFromDocWithLocales : JsonObject = { }
123
+ let duplicatedFromDoc : JsonObject = { }
124
+
125
+ if ( duplicateFromID ) {
126
+ const duplicateResult = await getDuplicateDocumentData ( {
127
+ id : duplicateFromID ,
128
+ collectionConfig,
129
+ draftArg : shouldSaveDraft ,
130
+ overrideAccess,
131
+ req,
132
+ shouldSaveDraft,
133
+ } )
134
+
135
+ duplicatedFromDoc = duplicateResult . duplicatedFromDoc
136
+ duplicatedFromDocWithLocales = duplicateResult . duplicatedFromDocWithLocales
137
+ }
138
+
118
139
// /////////////////////////////////////
119
140
// Access
120
141
// /////////////////////////////////////
@@ -131,7 +152,9 @@ export const createOperation = async <
131
152
collection,
132
153
config,
133
154
data,
155
+ isDuplicating : Boolean ( duplicateFromID ) ,
134
156
operation : 'create' ,
157
+ originalDoc : duplicatedFromDoc ,
135
158
overwriteExistingFiles,
136
159
req,
137
160
throwOnMissingFile :
@@ -148,7 +171,7 @@ export const createOperation = async <
148
171
collection : collectionConfig ,
149
172
context : req . context ,
150
173
data,
151
- doc : { } ,
174
+ doc : duplicatedFromDoc ,
152
175
global : null ,
153
176
operation : 'create' ,
154
177
overrideAccess,
@@ -169,6 +192,7 @@ export const createOperation = async <
169
192
context : req . context ,
170
193
data,
171
194
operation : 'create' ,
195
+ originalDoc : duplicatedFromDoc ,
172
196
req,
173
197
} ) ) || data
174
198
} ,
@@ -188,6 +212,7 @@ export const createOperation = async <
188
212
context : req . context ,
189
213
data,
190
214
operation : 'create' ,
215
+ originalDoc : duplicatedFromDoc ,
191
216
req,
192
217
} ) ) || data
193
218
} , Promise . resolve ( ) )
@@ -200,8 +225,8 @@ export const createOperation = async <
200
225
collection : collectionConfig ,
201
226
context : req . context ,
202
227
data,
203
- doc : { } ,
204
- docWithLocales : { } ,
228
+ doc : duplicatedFromDoc ,
229
+ docWithLocales : duplicatedFromDocWithLocales ,
205
230
global : null ,
206
231
operation : 'create' ,
207
232
req,
0 commit comments