@@ -13,12 +13,13 @@ import UniqueFieldError, {
13
13
} from "../../errors/UniqueFieldError" ;
14
14
import setPosition from "../../../model/setPosition" ;
15
15
import getAlwaysUniqueFields from "../../../model/getAlwaysUniqueFields" ;
16
- import getPositionFields from "../../../model/getPositionFields" ;
16
+ import { getPositionFieldsWithValue } from "../../../model/getPositionFields" ;
17
17
import getInverseReferenceFields from "../../../model/getInverseReferenceFields" ;
18
18
import log from "../../../log" ;
19
19
import visitModel from "../../../model/visitModel" ;
20
20
import { Migration } from "../../ContentPersistence" ;
21
21
import { Model } from "../../../../typings" ;
22
+ import visit from "../../../model/visit" ;
22
23
23
24
const ops : any = {
24
25
eq : "=" ,
@@ -199,47 +200,67 @@ export default class KnexContent implements ContentAdapter {
199
200
data : any ,
200
201
id : string
201
202
) : Promise < any > {
202
- const positionFields = getPositionFields ( model ) ;
203
- if ( positionFields ) {
203
+ const positionFields = getPositionFieldsWithValue ( data , model ) ;
204
+ if ( positionFields . length > 0 ) {
204
205
await Promise . all (
205
- positionFields . map ( async f => {
206
- const criteria : any = { } ;
207
-
208
- const value = ( f . split ( "." ) . reduce ( ( obj , key ) => {
209
- if ( obj && obj [ key ] !== "undefined" ) {
210
- return obj [ key ] ;
211
- } else {
212
- obj [ key ] = "" ;
213
- return obj [ key ] ;
214
- }
215
- } , data ) as unknown ) as string ;
216
- if ( value !== undefined ) {
217
- criteria [ `data.${ f } ` ] = { gte : value } ;
218
- }
219
-
220
- const opts = { offset : 0 , limit : 3 , orderBy : f , order : "asc" } ;
221
- const items = await this . list ( model , models , opts , criteria ) ;
222
- items . items = items . items . filter ( item => item . id === id ) ;
223
- let nextPos ;
206
+ positionFields . map ( async ( { fieldPath, value } ) => {
207
+ const criteria : any = value
208
+ ? {
209
+ [ `data.${ fieldPath } ` ] : { gte : value }
210
+ }
211
+ : { } ;
212
+ const opts = {
213
+ offset : 0 ,
214
+ limit : 3 ,
215
+ orderBy : fieldPath ,
216
+ order : value ? "asc" : "desc"
217
+ } ;
218
+ const items = await this . list ( model , models , opts , criteria , {
219
+ ignoreSchedule : true
220
+ } ) ;
224
221
if ( items . items [ 0 ] ) {
225
- nextPos = ( f
226
- . split ( "." )
227
- . reduce (
228
- ( obj : any , key ) =>
229
- obj && obj [ key ] !== "undefined" ? obj [ key ] : undefined ,
230
- items . items [ 0 ] . data
231
- ) as unknown ) as string ;
232
- if ( value === nextPos && items . items [ 1 ] ) {
233
- nextPos = ( f
234
- . split ( "." )
235
- . reduce (
236
- ( obj : any , key ) =>
237
- obj && obj [ key ] !== "undefined" ? obj [ key ] : undefined ,
238
- items . items [ 1 ] . data
239
- ) as unknown ) as string ;
240
- }
222
+ visit ( items . items [ 0 ] . data , model , {
223
+ position ( s : string , f , d , stringPath ) {
224
+ if ( stringPath === fieldPath ) {
225
+ if ( ! value ) {
226
+ // No Position Value passed, use end of list
227
+ data = setPosition ( data , model , s , "z" , true , fieldPath ) ;
228
+ } else if (
229
+ s === value &&
230
+ String ( items . items [ 0 ] . id ) !== String ( id ) // Value exists, and is not same document
231
+ ) {
232
+ if ( items . items [ 1 ] ) {
233
+ // get next one and middle it
234
+ visit ( items . items [ 0 ] . data , model , {
235
+ position ( nextPosition : string , g , h , nextStringPath ) {
236
+ if ( nextStringPath === fieldPath ) {
237
+ data = setPosition (
238
+ data ,
239
+ model ,
240
+ value ,
241
+ nextPosition ,
242
+ true ,
243
+ fieldPath
244
+ ) ;
245
+ }
246
+ }
247
+ } ) ;
248
+ } else {
249
+ // No next one, just middle to end
250
+ data = setPosition (
251
+ data ,
252
+ model ,
253
+ value ,
254
+ "z" ,
255
+ true ,
256
+ fieldPath
257
+ ) ;
258
+ }
259
+ }
260
+ }
261
+ }
262
+ } ) ;
241
263
}
242
- data = setPosition ( data , model , value , nextPos , true ) ;
243
264
} )
244
265
) ;
245
266
}
0 commit comments