/**
  * Get array of modified items since beginning or since datetime in past
  * @param $params
  * @return ApiResult
  * @throws ApiException
  */
 public function processGetModifiedItems($params)
 {
     $modelClassName = $this->getModelName();
     $stateMetadataAdapterClassName = $this->resolveStateMetadataAdapterClassName();
     if (!isset($params['sinceTimestamp'])) {
         $sinceTimestamp = 0;
     } else {
         $sinceTimestamp = (int) $params['sinceTimestamp'];
     }
     $pageSize = Yii::app()->pagination->getGlobalValueByType('apiListPageSize');
     if (isset($params['pagination']['pageSize'])) {
         $pageSize = (int) $params['pagination']['pageSize'];
     }
     // Get offset. Please note that API client provide page number, and we need to convert it into offset,
     // which is parameter of RedBeanModel::getSubset function
     if (isset($params['pagination']['page']) && (int) $params['pagination']['page'] > 0) {
         $currentPage = (int) $params['pagination']['page'];
     } else {
         $currentPage = 1;
     }
     $offset = $this->getOffsetFromCurrentPageAndPageSize($currentPage, $pageSize);
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels($modelClassName, $pageSize, $offset, $sinceTimestamp, $stateMetadataAdapterClassName, Yii::app()->user->userModel);
     $totalItems = ModelStateChangesSubscriptionUtil::getUpdatedModelsCount($modelClassName, $sinceTimestamp, $stateMetadataAdapterClassName, Yii::app()->user->userModel);
     $data = array('totalCount' => $totalItems, 'pageSize' => $pageSize, 'currentPage' => $currentPage);
     if (is_array($models) && !empty($models)) {
         foreach ($models as $model) {
             $data['items'][] = static::getModelToApiDataUtilData($model);
         }
         $result = new ApiResult(ApiResponse::STATUS_SUCCESS, $data, null, null);
     } else {
         $result = new ApiResult(ApiResponse::STATUS_SUCCESS, $data, null, null);
     }
     return $result;
 }
 public function testGetUpdatedModels()
 {
     ReadPermissionsSubscriptionUtil::recreateTable('account_read_subscription');
     ModelCreationApiSyncUtil::buildTable();
     $account1 = AccountTestHelper::createAccountByNameForOwner('First Test Update Account', Yii::app()->user->userModel);
     $timestamp = time();
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertTrue(empty($models));
     $account1->name = 'First Test Update Account Modified';
     $this->assertTrue($account1->save());
     // This should return true, because there should be 3 second gap between created and modified timestamps
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertTrue(empty($models));
     sleep(4);
     $account1->name = 'First Test Update Account Modified 2';
     $this->assertTrue($account1->save());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertEquals(1, count($models));
     $this->assertEquals($account1->id, $models[0]->id);
     $this->assertEquals($account1->name, $models[0]->name);
     // Check pagination
     sleep(2);
     $timestamp = time();
     $account2 = AccountTestHelper::createAccountByNameForOwner('Second Test Update Account', Yii::app()->user->userModel);
     $account3 = AccountTestHelper::createAccountByNameForOwner('Third Test Update Account', Yii::app()->user->userModel);
     $account4 = AccountTestHelper::createAccountByNameForOwner('Forth Test Update Account', Yii::app()->user->userModel);
     sleep(5);
     $account2->name = 'Second Test Update Account Modified';
     $account3->name = 'Third Test Update Account Modified';
     $account4->name = 'Forth Test Update Account Modified';
     $this->assertTrue($account2->save());
     $this->assertTrue($account3->save());
     $this->assertTrue($account4->save());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 3, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertEquals(3, count($models));
     $this->assertTrue($account2->id == $models[0]->id || $account2->id == $models[1]->id || $account2->id == $models[2]->id);
     $this->assertTrue($account2->name == $models[0]->name || $account2->name == $models[1]->name || $account2->name == $models[2]->name);
     $this->assertTrue($account3->id == $models[0]->id || $account3->id == $models[1]->id || $account3->id == $models[2]->id);
     $this->assertTrue($account3->name == $models[0]->name || $account3->name == $models[1]->name || $account3->name == $models[2]->name);
     $this->assertTrue($account4->id == $models[0]->id || $account4->id == $models[1]->id || $account4->id == $models[2]->id);
     $this->assertTrue($account4->name == $models[0]->name || $account4->name == $models[1]->name || $account4->name == $models[2]->name);
     // Not test for non super user
     $job = new ReadPermissionSubscriptionQuickUpdateJob();
     $mike = UserTestHelper::createBasicUser('Mike');
     $mikeAccount1 = AccountTestHelper::createAccountByNameForOwner('ABC Account', Yii::app()->user->userModel);
     $timestamp = time();
     $this->assertTrue($job->run());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertTrue(empty($models));
     $mikeAccount1->name = 'ABCD Account';
     $this->assertTrue($mikeAccount1->save());
     // This should return true, because there should be 3 second gap between created and modified timestamps
     $this->assertTrue($job->run());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertTrue(empty($models));
     sleep(4);
     $mikeAccount1->name = 'AB Account';
     $this->assertTrue($mikeAccount1->save());
     $this->assertTrue($job->run());
     $models = ModelStateChangesSubscriptionUtil::getUpdatedModels('Account', 2, 0, $timestamp);
     $this->assertTrue(is_array($models));
     $this->assertEquals(1, count($models));
     $this->assertEquals($mikeAccount1->id, $models[0]->id);
     $this->assertEquals($mikeAccount1->name, $models[0]->name);
 }