UNPKG

@aws-cdk/aws-redshift-alpha

Version:

The CDK Construct Library for AWS::Redshift

68 lines 10.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UserTablePrivileges = void 0; const cdk = require("aws-cdk-lib/core"); const constructs_1 = require("constructs"); const table_1 = require("../table"); const database_query_1 = require("./database-query"); const handler_name_1 = require("./database-query-provider/handler-name"); /** * Privileges granted to a Redshift user on Redshift tables. * * This construct is located in the `private` directory to ensure that it is not exported for direct public use. This * means that user privileges must be managed through the `Table.grant` method or the `User.addTablePrivileges` * method. Thus, each `User` will have at most one `UserTablePrivileges` construct to manage its privileges. For details * on why this is a Good Thing, see the README, under "Granting Privileges". */ class UserTablePrivileges extends constructs_1.Construct { privileges; constructor(scope, id, props) { super(scope, id); this.privileges = props.privileges ?? []; new database_query_1.DatabaseQuery(this, 'Resource', { ...props, handler: handler_name_1.HandlerName.UserTablePrivileges, properties: { username: props.user.username, tablePrivileges: cdk.Lazy.any({ produce: () => Object.entries(groupPrivilegesByTable(this.privileges)) .map(([tableId, tablePrivileges]) => ({ tableId, // The first element always exists since the groupBy element is at least a singleton. tableName: tablePrivileges[0].table.tableName, actions: unifyTableActions(tablePrivileges).map(action => table_1.TableAction[action]), })), }), }, }); } /** * Grant this user additional privileges. */ addPrivileges(table, ...actions) { this.privileges.push({ table, actions }); } } exports.UserTablePrivileges = UserTablePrivileges; const unifyTableActions = (tablePrivileges) => { const set = new Set(tablePrivileges.flatMap(x => x.actions)); if (set.has(table_1.TableAction.ALL)) { return [table_1.TableAction.ALL]; } if (set.has(table_1.TableAction.UPDATE) || set.has(table_1.TableAction.DELETE)) { set.add(table_1.TableAction.SELECT); } return [...set]; }; const groupPrivilegesByTable = (privileges) => { return privileges.reduce((grouped, privilege) => { const { table } = privilege; const tableId = table.node.id; const tablePrivileges = grouped[tableId] ?? []; return { ...grouped, [tableId]: [...tablePrivileges, privilege], }; }, {}); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmlsZWdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByaXZpbGVnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0NBQXdDO0FBQ3hDLDJDQUF1QztBQUV2QyxvQ0FBK0M7QUFFL0MscURBQWlEO0FBQ2pELHlFQUFxRTtBQW1DckU7Ozs7Ozs7R0FPRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsc0JBQVM7SUFDeEMsVUFBVSxDQUFtQjtJQUVyQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUV6QyxJQUFJLDhCQUFhLENBQWtDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDbkUsR0FBRyxLQUFLO1lBQ1IsT0FBTyxFQUFFLDBCQUFXLENBQUMsbUJBQW1CO1lBQ3hDLFVBQVUsRUFBRTtnQkFDVixRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUM3QixlQUFlLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQzVCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDWixNQUFNLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt5QkFDcEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3BDLE9BQU87d0JBQ1AscUZBQXFGO3dCQUNyRixTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBRSxDQUFDLEtBQUssQ0FBQyxTQUFTO3dCQUM5QyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsbUJBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDL0UsQ0FBQyxDQUFDO2lCQUNSLENBQVE7YUFDVjtTQUNGLENBQUMsQ0FBQztLQUNKO0lBRUQ7O09BRUc7SUFDSCxhQUFhLENBQUMsS0FBYSxFQUFFLEdBQUcsT0FBc0I7UUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztLQUMxQztDQUNGO0FBakNELGtEQWlDQztBQUVELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxlQUFpQyxFQUFpQixFQUFFO0lBQzdFLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFjLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUUxRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsbUJBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxtQkFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsbUJBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMvRCxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxVQUE0QixFQUFvQyxFQUFFO0lBQ2hHLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRTtRQUM5QyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0MsT0FBTztZQUNMLEdBQUcsT0FBTztZQUNWLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsRUFBRSxTQUFTLENBQUM7U0FDM0MsQ0FBQztJQUNKLENBQUMsRUFBRSxFQUFzQyxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBEYXRhYmFzZU9wdGlvbnMgfSBmcm9tICcuLi9kYXRhYmFzZS1vcHRpb25zJztcbmltcG9ydCB7IElUYWJsZSwgVGFibGVBY3Rpb24gfSBmcm9tICcuLi90YWJsZSc7XG5pbXBvcnQgeyBJVXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHsgRGF0YWJhc2VRdWVyeSB9IGZyb20gJy4vZGF0YWJhc2UtcXVlcnknO1xuaW1wb3J0IHsgSGFuZGxlck5hbWUgfSBmcm9tICcuL2RhdGFiYXNlLXF1ZXJ5LXByb3ZpZGVyL2hhbmRsZXItbmFtZSc7XG5pbXBvcnQgeyBVc2VyVGFibGVQcml2aWxlZ2VzSGFuZGxlclByb3BzIH0gZnJvbSAnLi9oYW5kbGVyLXByb3BzJztcblxuLyoqXG4gKiBUaGUgUmVkc2hpZnQgdGFibGUgYW5kIGFjdGlvbiB0aGF0IG1ha2UgdXAgYSBwcml2aWxlZ2UgdGhhdCBjYW4gYmUgZ3JhbnRlZCB0byBhIFJlZHNoaWZ0IHVzZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVQcml2aWxlZ2Uge1xuICAvKipcbiAgICogVGhlIHRhYmxlIG9uIHdoaWNoIHByaXZpbGVnZXMgd2lsbCBiZSBncmFudGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGU6IElUYWJsZTtcblxuICAvKipcbiAgICogVGhlIGFjdGlvbnMgdGhhdCB3aWxsIGJlIGdyYW50ZWQuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25zOiBUYWJsZUFjdGlvbltdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHNwZWNpZnlpbmcgcHJpdmlsZWdlcyBncmFudGVkIHRvIGEgUmVkc2hpZnQgdXNlciBvbiBSZWRzaGlmdCB0YWJsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclRhYmxlUHJpdmlsZWdlc1Byb3BzIGV4dGVuZHMgRGF0YWJhc2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIHRvIHdoaWNoIHByaXZpbGVnZXMgd2lsbCBiZSBncmFudGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdXNlcjogSVVzZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwcml2aWxlZ2VzIHRvIGJlIGdyYW50ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdIC0gdXNlIGBhZGRQcml2aWxlZ2VzYCB0byBncmFudCBwcml2aWxlZ2VzIGFmdGVyIGNvbnN0cnVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcHJpdmlsZWdlcz86IFRhYmxlUHJpdmlsZWdlW107XG59XG5cbi8qKlxuICogUHJpdmlsZWdlcyBncmFudGVkIHRvIGEgUmVkc2hpZnQgdXNlciBvbiBSZWRzaGlmdCB0YWJsZXMuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3QgaXMgbG9jYXRlZCBpbiB0aGUgYHByaXZhdGVgIGRpcmVjdG9yeSB0byBlbnN1cmUgdGhhdCBpdCBpcyBub3QgZXhwb3J0ZWQgZm9yIGRpcmVjdCBwdWJsaWMgdXNlLiBUaGlzXG4gKiBtZWFucyB0aGF0IHVzZXIgcHJpdmlsZWdlcyBtdXN0IGJlIG1hbmFnZWQgdGhyb3VnaCB0aGUgYFRhYmxlLmdyYW50YCBtZXRob2Qgb3IgdGhlIGBVc2VyLmFkZFRhYmxlUHJpdmlsZWdlc2BcbiAqIG1ldGhvZC4gVGh1cywgZWFjaCBgVXNlcmAgd2lsbCBoYXZlIGF0IG1vc3Qgb25lIGBVc2VyVGFibGVQcml2aWxlZ2VzYCBjb25zdHJ1Y3QgdG8gbWFuYWdlIGl0cyBwcml2aWxlZ2VzLiBGb3IgZGV0YWlsc1xuICogb24gd2h5IHRoaXMgaXMgYSBHb29kIFRoaW5nLCBzZWUgdGhlIFJFQURNRSwgdW5kZXIgXCJHcmFudGluZyBQcml2aWxlZ2VzXCIuXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyVGFibGVQcml2aWxlZ2VzIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSBwcml2aWxlZ2VzOiBUYWJsZVByaXZpbGVnZVtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBVc2VyVGFibGVQcml2aWxlZ2VzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wcml2aWxlZ2VzID0gcHJvcHMucHJpdmlsZWdlcyA/PyBbXTtcblxuICAgIG5ldyBEYXRhYmFzZVF1ZXJ5PFVzZXJUYWJsZVByaXZpbGVnZXNIYW5kbGVyUHJvcHM+KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgaGFuZGxlcjogSGFuZGxlck5hbWUuVXNlclRhYmxlUHJpdmlsZWdlcyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdXNlcm5hbWU6IHByb3BzLnVzZXIudXNlcm5hbWUsXG4gICAgICAgIHRhYmxlUHJpdmlsZWdlczogY2RrLkxhenkuYW55KHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZ3JvdXBQcml2aWxlZ2VzQnlUYWJsZSh0aGlzLnByaXZpbGVnZXMpKVxuICAgICAgICAgICAgICAubWFwKChbdGFibGVJZCwgdGFibGVQcml2aWxlZ2VzXSkgPT4gKHtcbiAgICAgICAgICAgICAgICB0YWJsZUlkLFxuICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBlbGVtZW50IGFsd2F5cyBleGlzdHMgc2luY2UgdGhlIGdyb3VwQnkgZWxlbWVudCBpcyBhdCBsZWFzdCBhIHNpbmdsZXRvbi5cbiAgICAgICAgICAgICAgICB0YWJsZU5hbWU6IHRhYmxlUHJpdmlsZWdlc1swXSEudGFibGUudGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGFjdGlvbnM6IHVuaWZ5VGFibGVBY3Rpb25zKHRhYmxlUHJpdmlsZWdlcykubWFwKGFjdGlvbiA9PiBUYWJsZUFjdGlvblthY3Rpb25dKSxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICB9KSBhcyBhbnksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoaXMgdXNlciBhZGRpdGlvbmFsIHByaXZpbGVnZXMuXG4gICAqL1xuICBhZGRQcml2aWxlZ2VzKHRhYmxlOiBJVGFibGUsIC4uLmFjdGlvbnM6IFRhYmxlQWN0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLnByaXZpbGVnZXMucHVzaCh7IHRhYmxlLCBhY3Rpb25zIH0pO1xuICB9XG59XG5cbmNvbnN0IHVuaWZ5VGFibGVBY3Rpb25zID0gKHRhYmxlUHJpdmlsZWdlczogVGFibGVQcml2aWxlZ2VbXSk6IFRhYmxlQWN0aW9uW10gPT4ge1xuICBjb25zdCBzZXQgPSBuZXcgU2V0PFRhYmxlQWN0aW9uPih0YWJsZVByaXZpbGVnZXMuZmxhdE1hcCh4ID0+IHguYWN0aW9ucykpO1xuXG4gIGlmIChzZXQuaGFzKFRhYmxlQWN0aW9uLkFMTCkpIHtcbiAgICByZXR1cm4gW1RhYmxlQWN0aW9uLkFMTF07XG4gIH1cblxuICBpZiAoc2V0LmhhcyhUYWJsZUFjdGlvbi5VUERBVEUpIHx8IHNldC5oYXMoVGFibGVBY3Rpb24uREVMRVRFKSkge1xuICAgIHNldC5hZGQoVGFibGVBY3Rpb24uU0VMRUNUKTtcbiAgfVxuXG4gIHJldHVybiBbLi4uc2V0XTtcbn07XG5cbmNvbnN0IGdyb3VwUHJpdmlsZWdlc0J5VGFibGUgPSAocHJpdmlsZWdlczogVGFibGVQcml2aWxlZ2VbXSk6IFJlY29yZDxzdHJpbmcsIFRhYmxlUHJpdmlsZWdlW10+ID0+IHtcbiAgcmV0dXJuIHByaXZpbGVnZXMucmVkdWNlKChncm91cGVkLCBwcml2aWxlZ2UpID0+IHtcbiAgICBjb25zdCB7IHRhYmxlIH0gPSBwcml2aWxlZ2U7XG4gICAgY29uc3QgdGFibGVJZCA9IHRhYmxlLm5vZGUuaWQ7XG4gICAgY29uc3QgdGFibGVQcml2aWxlZ2VzID0gZ3JvdXBlZFt0YWJsZUlkXSA/PyBbXTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZ3JvdXBlZCxcbiAgICAgIFt0YWJsZUlkXTogWy4uLnRhYmxlUHJpdmlsZWdlcywgcHJpdmlsZWdlXSxcbiAgICB9O1xuICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBUYWJsZVByaXZpbGVnZVtdPik7XG59O1xuIl19