scripts/updatePermissions/updatePermissions.ts (67 lines of code) (raw):

import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; import { DynamoDBDocumentClient, UpdateCommand, PutCommand } from '@aws-sdk/lib-dynamodb'; const REGION = 'eu-west-1'; const client = new DynamoDBClient({ region: REGION }); const dynamoDB = DynamoDBDocumentClient.from(client); const { Stage, PermissionName, PermissionLevel, Emails } = process.env; if (!Stage || !PermissionLevel || !PermissionName || !Emails) { console.error('Missing parameter'); console.log('Example usage:\n' + 'Stage=DEV \\\n' + 'PermissionLevel=Write \\\n' + 'PermissionName=support-landing-page-tests \\\n' + 'Emails=test.user1@guardian.co.uk,test.user2@guardian.co.uk \\\n' + 'pnpm updatePermissions' ); process.exit(1); } const TABLE_NAME = `support-admin-console-permissions-${Stage}`; async function updatePermissions( permissionName: string, permissionLevel: string, emailAddresses: string[] ): Promise<void> { for (const email of emailAddresses) { try { await dynamoDB.send( new UpdateCommand({ TableName: TABLE_NAME, Key: { email }, UpdateExpression: 'SET #permissions = list_append(if_not_exists(#permissions, :emptyList), :newPermission)', ExpressionAttributeNames: { '#permissions': 'permissions', }, ExpressionAttributeValues: { ':newPermission': [{ name: permissionName, permission: permissionLevel }], ':emptyList': [], }, ConditionExpression: 'attribute_exists(email)', }) ); console.log(`Successfully updated permissions for ${email}`); } catch (error: any) { if (error.name === 'ConditionalCheckFailedException') { // Item does not exist, create it try { await dynamoDB.send( new PutCommand({ TableName: TABLE_NAME, Item: { email, permissions: [{ name: permissionName, permission: permissionLevel }], }, }) ); console.log(`Created new item and added permissions for ${email}`); } catch (putError) { console.error(`Failed to create item for ${email}:`, putError); } } else { console.error(`Failed to update permissions for ${email}:`, error); } } } } console.log({PermissionName, PermissionLevel, Emails}); // @ts-ignore updatePermissions(PermissionName, PermissionLevel, Emails.split(',')) .then(() => console.log('Permissions update completed')) .catch(error => console.error('Error updating permissions:', error));