dev/script/generate-config/service-config.js (198 lines of code) (raw):
function stripMargin(template, ...args) {
const result = template.reduce((acc, part, i) => acc + args[i - 1] + part);
return result.replace(/\r?(\n)\s*\|/g, '$1');
}
function getCorsAllowedOriginString(config) {
return config.security.corsAllowedOrigins
.map(origin => `${origin}.${config.DOMAIN}`)
.join(',');
}
function getCommonConfig(config) {
const isNoAuth = process.env.NO_AUTH === "true";
return `domain.root="${config.DOMAIN}"
|authentication.providers.machine.config.authKeyStoreBucket="${config.coreStackProps.KeyBucket}"
|aws.local.endpoint="https://localstack.media.${config.DOMAIN}"
|thrall.kinesis.stream.name="${config.coreStackProps.ThrallMessageStream}"
|thrall.kinesis.lowPriorityStream.name="${config.coreStackProps.ThrallLowPriorityMessageStream}"
|es.index.aliases.current="Images_Current"
|es.index.aliases.migration="Images_Migration"
|image.record.download=false
|defaultShouldBlurGraphicImages=true
|filters.shouldDisplayOrgOwnedCountAndFilterCheckbox=true
|dynamo.table.softDelete.metadata="SoftDeletedMetadataTable"
${isNoAuth ? '|authentication.providers.user="com.gu.mediaservice.lib.auth.provider.LocalAuthenticationProvider"' : ''}
${isNoAuth ? '|authorisation.provider="com.gu.mediaservice.lib.auth.provider.LocalAuthorisationProvider"' : ''}
|sqs.ingest.queue.url="${config.coreStackProps.IngestSqsQueue.replace("http://localhost:4576", `https://localstack.media.${config.DOMAIN}`)}"
|s3.ingest.bucket="${config.coreStackProps.IngestQueueBucket}"
|s3.fail.bucket="${config.coreStackProps.IngestQueueFailBucket}"
|`;
}
function getAuthConfig(config) {
return stripMargin`${getCommonConfig(config)}
|s3.config.bucket="${config.coreStackProps.ConfigBucket}"
|aws.region="${config.AWS_DEFAULT_REGION}"
|security.cors.allowedOrigins="${getCorsAllowedOriginString(config)}"
|metrics.request.enabled=false
|`;
}
function getCollectionsConfig(config) {
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|s3.collections.bucket="${config.coreStackProps.CollectionsBucket}"
|dynamo.table.collections="CollectionsTable"
|dynamo.table.imageCollections="ImageCollectionsTable"
|security.cors.allowedOrigins="${getCorsAllowedOriginString(config)}"
|metrics.request.enabled=false
|`;
}
function getCropperConfig(config) {
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|publishing.image.bucket="${config.coreStackProps.ImageOriginBucket}"
|publishing.image.host="public.media.${config.DOMAIN}"
|s3.config.bucket="${config.coreStackProps.ConfigBucket}"
|security.cors.allowedOrigins="${getCorsAllowedOriginString(config)}"
|metrics.request.enabled=false
|`;
}
function getImageLoaderConfig(config) {
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|s3.image.bucket="${config.coreStackProps.ImageBucket}"
|s3.thumb.bucket="${config.coreStackProps.ThumbBucket}"
|s3.quarantine.bucket="${config.coreStackProps.QuarantineBucket}"
|s3.config.bucket="${config.coreStackProps.ConfigBucket}"
|dynamo.table.upload.status="UploadStatusTable"
|aws.local.endpoint="https://localstack.media.${config.DOMAIN}"
|security.cors.allowedOrigins="${getCorsAllowedOriginString(config)}"
|metrics.request.enabled=false
|transcoded.mime.types="image/tiff"
|upload.quarantine.enabled=false
|`;
}
function getKahunaConfig(config){
// `BUILD_ORG` env variable should be set for non-Guardian orgs, e.g. bbc
const pinboardConfig = process.env.BUILD_ORG ? "" : stripMargin`
|security.connectSources = [
| "wss://*.iot.${config.AWS_DEFAULT_REGION}.amazonaws.com",
| "https://*.appsync-api.${config.AWS_DEFAULT_REGION}.amazonaws.com"
|]
|scriptsToLoad = [
| {
| host: "https://pinboard.${config.DOMAIN}",
| path: "pinboard.loader.js",
| async: true,
| permission: "pinboard"
| }
|]`;
const permissionsConfig = stripMargin`
|usePermissionsFilter=true
|permissionsDefault="allPermissions"
`;
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|origin.full="images.media.${config.DOMAIN}"
|origin.thumb="localstack.media.${config.DOMAIN}"
|origin.images="images.media.${config.DOMAIN}"
|origin.crops="public.media.${config.DOMAIN}"
|google.tracking.id="${config.google.tracking.id}"
|links.feedbackForm="${config.links.feedbackForm}"
|links.usageRightsHelp="${config.links.usageRightsHelp}"
|links.invalidSessionHelp="${config.links.invalidSessionHelp}"
|links.supportEmail="${config.links.supportEmail}"
|security.cors.allowedOrigins="${getCorsAllowedOriginString(config)}"
|security.frameAncestors="https://*.${config.DOMAIN}"
|security.imageSources=["https://*.newslabs.co/", ]
|metrics.request.enabled=false
|usageRightsSummary=true
|${permissionsConfig}
|${pinboardConfig}
|`;
}
function getLeasesConfig(config) {
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|dynamo.tablename.leasesTable="LeasesTable"
|security.cors.allowedOrigins="${getCorsAllowedOriginString(config)}"
|metrics.request.enabled=false
|`;
}
function getMediaApiConfig(config) {
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|s3.image.bucket="${config.coreStackProps.ImageBucket}"
|s3.thumb.bucket="${config.coreStackProps.ThumbBucket}"
|s3.config.bucket="${config.coreStackProps.ConfigBucket}"
|s3.usagemail.bucket="${config.coreStackProps.UsageMailBucket}"
|persistence.identifier="picdarUrn"
|es6.url="${config.es6.url}"
|es6.shards=${config.es6.shards}
|es6.replicas=${config.es6.replicas}
|quota.store.key="rcs-quota.json"
|security.cors.allowedOrigins="${getCorsAllowedOriginString(config)}"
|search.fuzziness={
| enabled=true
|}
|metrics.request.enabled=false
|syndication.review.useRuntimeFieldsFix=true
|`;
}
function getMetadataEditorConfig(config) {
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|s3.collections.bucket="${config.coreStackProps.CollectionsBucket}"
|dynamo.table.edits="EditsTable"
|dynamo.globalsecondaryindex.edits.photoshoots="Photoshoots"
|dynamo.table.syndication="SyndicationTable"
|indexed.images.sqs.queue.url="${config.coreStackProps.IndexedImageMetadataQueue.replace("http://localhost:4576", `https://localstack.media.${config.DOMAIN}`)}"
|security.cors.allowedOrigins="${getCorsAllowedOriginString(config)}"
|metrics.request.enabled=false
|`;
}
function getS3WatcherConfig(config) {
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|loader.uri="https://loader.media.${config.DOMAIN}"
|auth.key.s3watcher="${config.s3Watcher.key}"
|s3.ingest.bucket="${config.coreStackProps.S3WatcherIngestBucket}"
|s3.fail.bucket="${config.coreStackProps.S3WatcherFailBucket}"
|`;
}
function getThrallConfig(config) {
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|s3.image.bucket="${config.coreStackProps.ImageBucket}"
|s3.thumb.bucket="${config.coreStackProps.ThumbBucket}"
|s3.reaper.bucket="${config.coreStackProps.ReaperBucket}"
|persistence.identifier="picdarUrn"
|indexed.image.sns.topic.arn="${config.coreStackProps.IndexedImageTopic}"
|es6.url="${config.es6.url}"
|es6.shards=${config.es6.shards}
|es6.replicas=${config.es6.replicas}
|metrics.request.enabled=false
|`;
}
function getUsageConfig(config) {
return stripMargin`${getCommonConfig(config)}
|aws.region="${config.AWS_DEFAULT_REGION}"
|capi.live.url="${config.guardian.capi.live.url}"
|capi.preview.url="${config.guardian.capi.preview.url}"
|capi.apiKey="${config.guardian.capi.live.key}"
|dynamo.tablename.usageRecordTable="UsageRecordTable"
|composer.baseUrl="composer.${config.DOMAIN}"
|crier.live.arn="${config.guardian.crier.live.roleArn}"
|crier.preview.arn="${config.guardian.crier.preview.roleArn}"
|crier.preview.name="${config.guardian.crier.preview.streamName}"
|crier.live.name="${config.guardian.crier.live.streamName}"
|app.name="usage"
|security.cors.allowedOrigins="${getCorsAllowedOriginString(config)}"
|metrics.request.enabled=false
|`;
}
function getGridProdConfig(config) {
return stripMargin`
|auth.useLocal=true
|panda.userDomain="${config.EMAIL_DOMAIN}"
|authentication.providers.user.config.panda.bucketName="${config.authStackProps.PanDomainBucket}"
|permissions.bucket="${config.authStackProps.PermissionsBucket}"
|`;
}
module.exports = {
getCoreConfigs: (config) => {
return {
auth: getAuthConfig(config),
collections: getCollectionsConfig(config),
cropper: getCropperConfig(config),
'image-loader': getImageLoaderConfig(config),
kahuna: getKahunaConfig(config),
leases: getLeasesConfig(config),
'media-api': getMediaApiConfig(config),
'metadata-editor': getMetadataEditorConfig(config),
s3Watcher: getS3WatcherConfig(config),
thrall: getThrallConfig(config),
usage: getUsageConfig(config)
};
},
getUseLocalAuthConfig: (config) => getGridProdConfig(config)
};