← All changes
|
modules/global-classes/global-classes-rest-api.php
+55
-10
4.3.2
→
4.1.0-beta1
View file →
| @@ -19,8 +19,10 @@ | ||
| 19 | 19 | const API_BASE_USAGE = self::API_BASE . '/usage'; |
| 20 | 20 | const API_BASE_POST = self::API_BASE . '/post'; |
| 21 | 21 | const API_BASE_STYLES = self::API_BASE . '/styles'; |
| 22 | 22 | const MAX_ITEMS = 1000; |
| 23 | + const LABEL_PREFIX = 'DUP_'; | |
| 24 | + const MAX_LABEL_LENGTH = 50; | |
| 23 | 25 | private ?Global_Classes_Repository $repository = null; |
| 24 | 26 | private ?Global_Classes_Relations $relations = null; |
| 25 | 27 | private ?Kit $kit = null; |
| 26 | 28 | |
| @@ -255,9 +257,9 @@ | ||
| 255 | 257 | |
| 256 | 258 | $repository = $this->get_repository()->set_preview( $is_preview ); |
| 257 | 259 | $global_order = array_keys( $repository->all_labels() ); |
| 258 | 260 | $filtered_order = array_values( array_intersect( $global_order, $document_class_ids ) ); |
| 259 | - $items = $repository->get_by_ids( $filtered_order ); | |
| 261 | + $items = $repository->get_by_ids( $document_class_ids ); | |
| 260 | 262 | |
| 261 | 263 | $result = []; |
| 262 | 264 | |
| 263 | 265 | foreach ( $document_class_ids as $id ) { |
| @@ -283,9 +285,9 @@ | ||
| 283 | 285 | |
| 284 | 286 | $repository = $this->get_repository()->set_preview( $is_preview ); |
| 285 | 287 | $global_order = array_keys( $repository->all_labels() ); |
| 286 | 288 | $filtered_order = array_values( array_intersect( $global_order, $requested_ids ) ); |
| 287 | - $items = $repository->get_by_ids( $filtered_order ); | |
| 289 | + $items = $repository->get_by_ids( $requested_ids ); | |
| 288 | 290 | |
| 289 | 291 | $result = []; |
| 290 | 292 | |
| 291 | 293 | foreach ( $requested_ids as $id ) { |
| @@ -362,15 +364,8 @@ | ||
| 362 | 364 | } |
| 363 | 365 | |
| 364 | 366 | $final_item_ids = array_keys( $this->merge_touched_with_existing_labels( $all_label_by_id, $touched_items, $deleted_ids ) ); |
| 365 | 367 | |
| 366 | - $final_item_ids_set = array_flip( $final_item_ids ); | |
| 367 | - $order_set = array_flip( $order ); | |
| 368 | - | |
| 369 | - $order = array_values( array_filter( $order, fn( $id ) => isset( $final_item_ids_set[ $id ] ) ) ); | |
| 370 | - $missing_from_order = array_values( array_filter( $final_item_ids, fn( $id ) => ! isset( $order_set[ $id ] ) ) ); | |
| 371 | - $order = array_merge( $order, $missing_from_order ); | |
| 372 | - | |
| 373 | 368 | $order_result = $parser->parse_order( $order, $final_item_ids ); |
| 374 | 369 | |
| 375 | 370 | if ( ! $order_result->is_valid() ) { |
| 376 | 371 | return Error_Builder::make( 'invalid_order' ) |
| @@ -458,9 +453,9 @@ | ||
| 458 | 453 | foreach ( $duplicate_labels as $duplicate_label ) { |
| 459 | 454 | $item_id = $duplicate_label['item_id']; |
| 460 | 455 | $original_label = $duplicate_label['label']; |
| 461 | 456 | |
| 462 | - $modified_label = Global_Classes_Labels::generate_unique_label( $original_label, $existing_labels ); | |
| 457 | + $modified_label = $this->generate_unique_label( $original_label, $existing_labels ); | |
| 463 | 458 | |
| 464 | 459 | $modified_labels[ $item_id ] = [ |
| 465 | 460 | 'original' => $original_label, |
| 466 | 461 | 'modified' => $modified_label, |
| @@ -467,6 +462,56 @@ | ||
| 467 | 462 | ]; |
| 468 | 463 | } |
| 469 | 464 | |
| 470 | 465 | return $modified_labels; |
| 466 | + } | |
| 467 | + | |
| 468 | + | |
| 469 | + private function generate_unique_label( $original_label, $existing_labels ) { | |
| 470 | + $prefix = self::LABEL_PREFIX; | |
| 471 | + $max_length = self::MAX_LABEL_LENGTH; | |
| 472 | + | |
| 473 | + $has_prefix = strpos( $original_label, $prefix ) === 0; | |
| 474 | + | |
| 475 | + if ( $has_prefix ) { | |
| 476 | + $base_label = substr( $original_label, strlen( $prefix ) ); | |
| 477 | + | |
| 478 | + $counter = 1; | |
| 479 | + $new_label = $prefix . $base_label . $counter; | |
| 480 | + | |
| 481 | + while ( in_array( $new_label, $existing_labels, true ) ) { | |
| 482 | + ++$counter; | |
| 483 | + $new_label = $prefix . $base_label . $counter; | |
| 484 | + } | |
| 485 | + | |
| 486 | + if ( strlen( $new_label ) > $max_length ) { | |
| 487 | + $available_length = $max_length - strlen( $prefix . $counter ); | |
| 488 | + $base_label = substr( $base_label, 0, $available_length ); | |
| 489 | + $new_label = $prefix . $base_label . $counter; | |
| 490 | + } | |
| 491 | + } else { | |
| 492 | + $new_label = $prefix . $original_label; | |
| 493 | + | |
| 494 | + if ( strlen( $new_label ) > $max_length ) { | |
| 495 | + $available_length = $max_length - strlen( $prefix ); | |
| 496 | + $new_label = $prefix . substr( $original_label, 0, $available_length ); | |
| 497 | + } | |
| 498 | + | |
| 499 | + $counter = 1; | |
| 500 | + $base_label = substr( $original_label, 0, $available_length ?? strlen( $original_label ) ); | |
| 501 | + | |
| 502 | + while ( in_array( $new_label, $existing_labels, true ) ) { | |
| 503 | + $new_label = $prefix . $base_label . $counter; | |
| 504 | + | |
| 505 | + if ( strlen( $new_label ) > $max_length ) { | |
| 506 | + $available_length = $max_length - strlen( $prefix . $counter ); | |
| 507 | + $base_label = substr( $original_label, 0, $available_length ); | |
| 508 | + $new_label = $prefix . $base_label . $counter; | |
| 509 | + } | |
| 510 | + | |
| 511 | + ++$counter; | |
| 512 | + } | |
| 513 | + } | |
| 514 | + | |
| 515 | + return $new_label; | |
| 471 | 516 | } |
| 472 | 517 | } |