/** * 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); }