namespace App\Services;
+use App\Services\Webflow\Excel;
+use hollodotme\FastCGI\Requests\GetRequest;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
+use function Symfony\Component\String\b;
class Webflow
{
return $response->json()['access_token'];
}
+ public static function paginatedRequest($url, $key, $data = [], $method = 'get', $ttl = 86400, $force = false)
+ {
+ $res = [];
+
+ $page = 0;
+ $limit = 100;
+ while (true) {
+ $reqData = $data;
+ if ($page > 0) {
+ $reqData['offset'] = $page * $limit;
+ }
+
+ $response = self::request($url, $reqData, $method, $ttl, $force);
+ if (!isset($response['pagination'])) {
+ break;
+ }
+ $pagination = $response['pagination'];
+ $limit = $pagination['limit'];
+ $res = array_merge($res, $response[$key]);
+ if ($pagination['total'] <= $pagination['limit'] * ($page + 1)) {
+ break;
+ }
+
+ $page++;
+ }
+ return self::_arrayKey($res);
+ }
+
public static function request($url, $data = [], $method = 'get', $ttl = 86400, $force = false)
{
$cacheKey = 'webflow_' . static::getToken() . '_' . $method . '_' . $url . '_' . sha1(print_r($data, true));
public static function getAllData($shortname)
{
- return ['pages' => self::getAllPagesContents($shortname), 'cms' => self::getAllCMSContents($shortname)];
+ return ['pages' => self::getAllPagesContents($shortname), 'cms' => self::getAllCMSContents($shortname), 'assets' => self::listAssets($shortname)];
}
public static function getCMSCollectionDetails($collectionID)
public static function getCMSCollectionContents($collectionID)
{
- return self::request('collections/' . $collectionID . '/items')['items'];
+ return self::paginatedRequest('collections/' . $collectionID . '/items', 'items');
+ }
+
+ protected static function _arrayKey($array)
+ {
+ $res = [];
+ foreach ($array as $item) {
+ $res[$item['id']] = $item;
+ }
+ return $res;
}
public static function listCMSCollections($shortname)
{
- return self::request('sites/' . self::getSiteId($shortname) . '/collections')['collections'];
+ return self::paginatedRequest('sites/' . self::getSiteId($shortname) . '/collections', 'collections');
}
public static function getPageContents($pageID)
{
- return self::request('pages/' . $pageID . '/dom');
+ return self::paginatedRequest('pages/' . $pageID . '/dom', 'nodes');
}
public static function listPages($shortname)
{
- return self::request('sites/' . self::getSiteId($shortname) . '/pages')['pages'];
+ return self::paginatedRequest('sites/' . self::getSiteId($shortname) . '/pages', 'pages');
+ }
+
+ public static function listAssets($shortname)
+ {
+ return self::paginatedRequest('sites/' . self::getSiteId($shortname) . '/assets', 'assets');
+ }
+
+ public static function getEditableData($shortname)
+ {
+ $data = self::getAllData($shortname);
+
+ $res = ['texts' => [], 'images' => [], 'seo' => []];
+ foreach ($data['pages'] as $pageID => $page) {
+ $details = $page['details'];
+ if ($details['archived']) {
+ continue;
+ }
+ $seo = [
+ 'slug' => $details['slug'],
+ 'draft' => $details['draft'],
+ 'seo_title' => $details['seo']['title'],
+ 'seo_description' => $details['seo']['description'],
+ 'og_title' => $details['openGraph']['title'],
+ 'og_description' => $details['openGraph']['description'],
+ 'og_title_copied' => $details['openGraph']['titleCopied'],
+ 'og_description_copied' => $details['openGraph']['descriptionCopied'],
+ ];
+
+ $res['seo'][$pageID] = $seo;
+
+ $texts = [];
+ foreach ($page['contents'] as $node) {
+ if ($node['type'] === 'text') {
+ if (!$node['text']['text']) {
+ continue;
+ }
+ if (!isset($res['texts'][$node['text']['text']])) {
+ $res['texts'][$node['text']['text']] = [];
+ }
+ $res['texts'][$node['text']['text']][] = ['node' => $node['id'], 'page' => $pageID];
+ } else if ($node['type'] === 'image') {
+ if(!isset($node['image']['assetId'])){
+ continue;
+ }
+ $assetId = $node['image']['assetId'];
+ if (isset($res['images'][$assetId])) {
+ continue;
+ }
+ $res['images'][$assetId] = ['alt' => $node['image']['alt'], 'url' => $data['assets'][$assetId]['hostedUrl']];
+ }
+ }
+
+ }
+ return $res;
}
}