async function syncResources()

in api/v1/src/admin/dataManager.js [51:142]


async function syncResources(projectId, type) {
    const bigqueryUtil = new BigQueryUtil(projectId);
    let bigQueryPermissions = false;
    let topicPermissions = false;
    let bucketPermissions = false;
    let views = false;
    let marketplace = false;
    try {
        if (type === 'BIGQUERY_PERMISSIONS') {
            console.log('Sync BigQuery permissions called');
            bigQueryPermissions = true;
        } else if (type === 'STORAGE_BUCKET_PERMISSIONS') {
            console.log('Sync storage bucket permissions called');
            bucketPermissions = true;
        } else if (type === 'TOPIC_PERMISSIONS') {
            console.log('Sync pubsub topic permissions called');
            topicPermissions = true;
        } else if (type === 'BIGQUERY_VIEWS') {
            console.log('Sync views called');
            views = true;
        } else if (type === 'MARKETPLACE') {
            console.log('Sync marketplace entitlements called');
            marketplace = await runtimeConfig.marketplaceIntegration(projectId);
        } else if (type === 'ALL') {
            console.log('Sync all called');
            bigQueryPermissions = true;
            topicPermissions = true;
            bucketPermissions = true;
            views = true;
            marketplace = await runtimeConfig.marketplaceIntegration(projectId);
        }

        const labelKey = cfg.cdsManagedLabelKey;
        if (marketplace) {
            await procurementManager.syncAllAccountEntitlements(projectId);
        }
        if (bigQueryPermissions) {
            await metaManager.performPolicyUpdates(projectId, null, true, metaManager.filters.BIG_QUERY);
        }
        if (topicPermissions) {
            await metaManager.performPolicyUpdates(projectId, null, true, metaManager.filters.PUB_SUB);
        }
        if (bucketPermissions) {
            await metaManager.performPolicyUpdates(projectId, null, true, metaManager.filters.CLOUD_STORAGE);
        }
        if (views) {
            // Get list of configured views
            const viewResult = await datasetManager.listDatasetViews(projectId, null, true);
            if (viewResult.success) {
                const viewList = viewResult.data;
                const role = await runtimeConfig.bigQueryDataViewerRole(projectId);
                const datasets = await bigqueryUtil.getDatasetsByLabel(labelKey, role);

                for (const dataset of datasets) {
                    const tables = await bigqueryUtil.getTablesByLabel(dataset.datasetId, labelKey);
                    if (tables.length > 0) {
                        const views = underscore.where(tables, { type: 'VIEW' });
                        if (views.length > 0) {
                            for (const view of views) {
                                // Only delete the view if it no longer is configured
                                const found = underscore.findWhere(viewResult.data, { datasetId: view.datasetId, name: view.tableId });
                                if (!found) {
                                    console.log(`Deleting view: ${view.datasetId}.${view.tableId}`);
                                    await bigqueryUtil.deleteTable(view.datasetId, view.tableId);
                                }
                            }
                        }
                    }
                }

                // Iterate all views and create/modify them.
                for (const view of viewList) {
                    let viewClone = JSON.parse(JSON.stringify(view));
                    const sql = viewClone.viewSql;
                    console.log(`Creating view ${viewClone.datasetId}.${viewClone.name}`);
                    viewClone.projectId = projectId;
                    if (view.expiration && view.expiration.time) {
                        // This logic should probably be re-factored to a shared place maybe in createView using a type check
                        // See datasets dataManager as the logic should be re-factored out of there from createOrUpdateDatasetView.
                        viewClone.expiration.time = new Date(view.expiration.time);
                    }
                    // console.log(viewClone);
                    await datasetManager.createView(viewClone, sql);
                }
            }
        }
        console.log('Sync completed');
    } catch (err) {
        return { success: false, code: 500, errors: [err.message] };
    }
    return { success: true, data: {} };
}