/**
  * Updates the given LexEntry in $projectId
  * @param string $projectId
  * @param array $params
  * @param string $userId
  * @param string $mergeQueuePath
  * @param string $pidFilePath
  * @param string $command
  * @return bool|array<encoded LexEntryModel> if the project is syncing (or on hold) return false (no save)FixSe
  */
 public static function updateEntry($projectId, $params, $userId, $mergeQueuePath = null, $pidFilePath = null, $command = null)
 {
     CodeGuard::checkTypeAndThrow($params, 'array');
     $project = new LexProjectModel($projectId);
     ProjectCommands::checkIfArchivedAndThrow($project);
     $now = UniversalTimestamp::now();
     if (array_key_exists('id', $params) && $params['id'] != '') {
         $entry = new LexEntryModel($project, $params['id']);
         $action = 'update';
     } else {
         $entry = new LexEntryModel($project);
         $entry->authorInfo->createdByUserRef->id = $userId;
         $entry->authorInfo->createdDate = $now;
         $entry->guid = Guid::create();
         $action = 'create';
         // TODO: Consider adding more specific activity entry: which fields were modified? 2014-09-03 RM
         // E.g., "User _____ updated entry _____ by adding a new sense with definition ______"
     }
     $entry->authorInfo->modifiedDate = $now;
     $entry->authorInfo->modifiedByUserRef->id = $userId;
     if ($project->hasSendReceive()) {
         //            $entry->dirtySR++;
         $entry->dirtySR = 0;
         $status = SendReceiveCommands::getProjectStatus($projectId);
         if ($status && $status['SRState'] != 'IDLE') {
             return false;
         }
     }
     LexEntryDecoder::decode($entry, $params);
     $entry->write();
     ActivityCommands::writeEntry($project, $userId, $entry, $action);
     //        SendReceiveCommands::queueProjectForUpdate($project, $mergeQueuePath);
     //        SendReceiveCommands::startLFMergeIfRequired($projectId, 'merge', $pidFilePath, $command);
     return JsonEncoder::encode($entry);
 }
 protected function createProperty($name)
 {
     switch ($name) {
         case 'authorInfo':
             return new LexAuthorInfo();
         case 'sentence':
         case 'translation':
         case 'reference':
             return new LexMultiText();
         case 'translationGuid':
             return Guid::create();
         case 'examplePublishIn':
             return new LexMultiValue();
         case 'customFields':
             return new MapOf('Api\\Model\\Languageforge\\Lexicon\\generateCustomField');
         default:
             return '';
     }
 }
 /**
  * Analyze a lexicon project and create Entry guids.
  * @param LexProjectModelForEntryGuidMigration $project
  * @param string $testMode
  * @internal param string $projectId
  */
 private static function analyzeProject($project, $testMode)
 {
     $entryModifiedCount = 0;
     $entryList = new LexAllEntryListModel($project);
     $entryList->read();
     foreach ($entryList->entries as $entryListItem) {
         $entry = new LexEntryModel($project, $entryListItem['id']);
         if (!isset($entry->guid) || !$entry->guid || !Guid::isValid($entry->guid)) {
             $entry->guid = Guid::create();
             $entryModifiedCount++;
             if (!$testMode) {
                 $entry->write();
             }
         }
     }
     if (!$testMode) {
         $project->hasHadEntryGuidMigrated = true;
         $project->write();
     }
     print "{$entryModifiedCount} of {$entryList->count} entries had guids created.\n";
 }
 public function testLiftDecoderGetGuid()
 {
     $guid = Guid::extract('');
     $this->assertEquals('', $guid);
     $guid = Guid::extract('does not contain guid');
     $this->assertEquals('', $guid);
     $liftGuid = Guid::create();
     $guid = Guid::extract('lexeme_' . $liftGuid);
     $this->assertEquals($liftGuid, $guid);
 }
 public function testUpdateEntry_DataPersists()
 {
     $project = self::$environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $projectId = $project->id->asString();
     $userId = self::$environ->createUser('john', 'john', 'john');
     $exampleGuid = Guid::create();
     $example = new LexExample($exampleGuid, $exampleGuid);
     $example->sentence->form('th', 'example1');
     $example->translation->form('en', 'trans1');
     $pictureGuid = Guid::create();
     $picture = new LexPicture('someFilename', $pictureGuid);
     $senseGuid = Guid::create();
     $sense = new LexSense($senseGuid, $senseGuid);
     $sense->definition->form('en', 'red fruit');
     $sense->gloss->form('en', 'rose fruit');
     $sense->partOfSpeech->value = 'noun';
     $sense->examples[] = $example;
     $sense->pictures[] = $picture;
     $entry = new LexEntryModel($project);
     $entry->lexeme->form('th', 'apple');
     $entry->senses[] = $sense;
     $entryId = $entry->write();
     $params = json_decode(json_encode(LexEntryCommands::readEntry($projectId, $entryId)), true);
     $params['lexeme']['th']['value'] = 'rose apple';
     LexEntryCommands::updateEntry($projectId, $params, $userId);
     $newEntry = LexEntryCommands::readEntry($projectId, $entryId);
     $this->assertEquals('rose apple', $newEntry['lexeme']['th']['value']);
     $this->assertEquals($senseGuid, $newEntry['senses'][0]['guid']);
     $this->assertArrayNotHasKey('liftId', $newEntry['senses'][0], 'sense liftId should be private');
     $this->assertEquals('red fruit', $newEntry['senses'][0]['definition']['en']['value']);
     $this->assertEquals('rose fruit', $newEntry['senses'][0]['gloss']['en']['value']);
     $this->assertEquals('noun', $newEntry['senses'][0]['partOfSpeech']['value']);
     $this->assertEquals($exampleGuid, $newEntry['senses'][0]['examples'][0]['guid']);
     $this->assertEquals($pictureGuid, $newEntry['senses'][0]['pictures'][0]['guid']);
     $this->assertArrayNotHasKey('scientificName', $newEntry['senses'][0], 'should be no empty fields');
     $this->assertArrayNotHasKey('liftId', $newEntry['senses'][0]['examples'][0], 'example liftId should be private');
     $this->assertEquals('example1', $newEntry['senses'][0]['examples'][0]['sentence']['th']['value']);
     $this->assertEquals('trans1', $newEntry['senses'][0]['examples'][0]['translation']['en']['value']);
 }
 /**
  * @param LexSense $sense
  * @param bool $entryModified
  * @param int $exampleModifiedCount
  * @param int $pictureModifiedCount
  */
 private static function createSenseGuids($sense, &$entryModified, &$exampleModifiedCount = 0, &$pictureModifiedCount = 0)
 {
     $senseModified = false;
     unset($sense->id);
     if (!$sense->guid || !Guid::isValid($sense->guid)) {
         $liftGuid = Guid::extract($sense->liftId);
         if (Guid::isValid($liftGuid)) {
             $sense->guid = $liftGuid;
         } else {
             $sense->guid = Guid::create();
         }
         $senseModified = true;
     }
     if (isset($sense->examples)) {
         /** @var LexExample $example */
         foreach ($sense->examples as $example) {
             unset($example->id);
             if (!$example->guid || !Guid::isValid($example->guid)) {
                 $liftGuid = Guid::extract($example->liftId);
                 if (Guid::isValid($liftGuid)) {
                     $example->guid = $liftGuid;
                 } else {
                     $example->guid = Guid::create();
                 }
                 $exampleModifiedCount++;
                 $senseModified = true;
             }
         }
     }
     if (isset($sense->pictures)) {
         /** @var LexPicture $picture */
         foreach ($sense->pictures as $picture) {
             if (!$picture->guid || !Guid::isValid($picture->guid)) {
                 $picture->guid = Guid::create();
                 $pictureModifiedCount++;
                 $senseModified = true;
             }
         }
     }
     if ($senseModified) {
         $entryModified = true;
     }
 }