Objekt-Wiederherstellung per API



  • Hallo,

    ich bin derzeit in der Programmierung einiger Skripte per API und musste feststellen, dass eine Wiederherstellung von archivierten Objekten in der API scheinbar nicht vorgesehen ist oder funktioniert.
    Auch die Benutzung des API-Clients von BHeisig brachte keinen Vorteil, da diese auf die API aufsetzt.
    Gibt es eine programmiertechnische Lösung, wie ich Objekte wiederherstellen kann (object.update mit neuem Status oder sowas wie object.restore)?

    Viele Grüße
    Michael



  • lch denke nicht, dass ein Undelete mit der jetzigen API zu realisieren ist. Ich meine mich zu erinnern, dass ich schon mal vergeblich versucht habe mit cmdb.object.update den Status zu setzten. Das war allerdings bei Version 1.8, als cmdb.object.delete eine Regression hatte. Vielleicht ist es einen neuen Versuch wert.

    Die Funktion delete in src/classes/modules/api/model/cmdb/isys_api_model_cmdb_object.class.php ließe sich ganz gut als Basis benutzten, um die API um eine Funktion 'restore' zu erweitern. Das kann man selber machen, oder ein bischen Lobbyarbeit betreiben. 🙂



  • Danke für die schnelle Rückmeldung.
    Ich könnte mir sowas als "quick and dirty"-Lösung erstmal vorstellen. Habe es aber noch nicht getestet. Die Funktion delete wird einfach mit dem Status Normal aufgerufen. Damit wird das Objekt im Logbuch als wiederhergestellt vermerkt und wieder in den Status Normal versetzt. Sollte man besser in eine eigene Funktion undelete auslagern.
    In Datei /var/www/html/otrs/i-doit/src/classes/modules/api/model/cmdb/isys_api_model_cmdb_object.class.php wird die delete-Funktion erweitert:

    [...]
    case C__RECORD_STATUS__NORMAL:
                                $l_messageText  = 'deleted';
                                $l_logbookEvent = 'C__LOGBOOK_EVENT__CATEGORY_RECYCLED';
                                $l_result       = $this->m_dao->set_object_status($l_id, $l_status);
                                break;
    [...]
    

    In der CMDBObject.php von BHeisig würde das dann so aussehen:

    
        public function restore($objectID) {
            $result = $this->api->request(
                'cmdb.category.delete',
                [
                    'id' => $objectID,
                    'status' => 'C__RECORD_STATUS__NORMAL'
                ]
            );
    
            if (!is_array($result) ||
                !array_key_exists('success', $result) ||
                $result['success'] === false) {
                throw new \Exception(sprintf(
                    'Unable to restore object %s',
                    $objectID
                ));
            }
        }
    
    


  • @msteuter:

    Danke für die schnelle Rückmeldung.
    Ich könnte mir sowas als "quick and dirty"-Lösung erstmal vorstellen. Habe es aber noch nicht getestet. Die Funktion delete wird einfach mit dem Status Normal aufgerufen. Damit wird das Objekt im Logbuch als wiederhergestellt vermerkt und wieder in den Status Normal versetzt. Sollte man besser in eine eigene Funktion undelete auslagern.
    In Datei /var/www/html/otrs/i-doit/src/classes/modules/api/model/cmdb/isys_api_model_cmdb_object.class.php wird die delete-Funktion erweitert:

    [...]
    case C__RECORD_STATUS__NORMAL:
                                $l_messageText  = 'deleted';
                                $l_logbookEvent = 'C__LOGBOOK_EVENT__CATEGORY_RECYCLED';
                                $l_result       = $this->m_dao->set_object_status($l_id, $l_status);
                                break;
    [...]
    

    Ein paar Zeilen darüber ist noch ein Konsistenzcheck von $p_params['status'], der müsste auch noch angepasst werden.



  • Hallo msteuter und franknagel,

    zur Zeit kann die API kein ranking (archivieren, löschen, etc.) von bestehenden Objekten leisten.
    Allerdings wäre dies hilfreich und wir sehen das hiermit vor für eine kommende Major Version des API Add-Ons.

    Viele Grüße,

    Kevin Mauel


 


Datenschutz / Privacy Policy