sk: createDelimitedAttribute()

in source/packages/services/events-processor/src/api/events/event.dao.ts [94:199]


                    sk: createDelimitedAttribute(PkType.Type, PkType.Event),
                    name: item.name,
                    gsi1Sort: createDelimitedAttribute(PkType.Event, item.enabled, item.id),
                },
            },
        };

        params.RequestItems[this.eventConfigTable] = [eventCreate, typeCreate];

        const result = await this.dynamoDbUtils.batchWriteAll(params);
        if (this.dynamoDbUtils.hasUnprocessedItems(result)) {
            throw new Error('CREATE_EVENT_FAILED');
        }

        logger.debug(`event.dao save: exit:`);
    }

    public async get(eventId: string): Promise<EventItem> {
        logger.debug(`event.dao get: in: eventId:${eventId}`);

        ow(eventId, ow.string.nonEmpty);

        const params: DocumentClient.QueryInput = {
            TableName: this.eventConfigTable,
            IndexName: this.eventConfigGSI1,
            KeyConditionExpression: `#sk = :sk AND begins_with( #gsi1Sort, :gsi1Sort )`,
            ExpressionAttributeNames: {
                '#sk': 'sk',
                '#gsi1Sort': 'gsi1Sort',
            },
            ExpressionAttributeValues: {
                ':sk': createDelimitedAttribute(PkType.Event, eventId),
                ':gsi1Sort': createDelimitedAttributePrefix(PkType.Event, eventId),
            },
        };

        const results = await this._cachedDc.query(params).promise();
        if (results.Items === undefined || results.Items.length === 0) {
            logger.debug('event.dao get: exit: undefined');
            return undefined;
        }

        const events = this.assemble(results.Items);

        logger.debug(`event.dao get: exit: response:${JSON.stringify(events[eventId])}`);
        return events[eventId];
    }

    private assemble(results: AWS.DynamoDB.DocumentClient.ItemList): EventItemMap {
        logger.debug(`event.dao assemble: items: ${JSON.stringify(results)}`);

        const events: EventItemMap = {};
        for (const i of results) {
            const eventId = expandDelimitedAttribute(i.sk)[1];

            const event: EventItem = {
                id: eventId,
                eventSourceId: expandDelimitedAttribute(i.pk)[1],
                name: i.name,
                principal: i.principal,
                conditions: i.conditions,
                ruleParameters: i.ruleParameters,
                enabled: i.enabled,
                templates: i.templates,
                supportedTargets: i.supportedTargets,
                templateProperties: i.templateProperties,
                disableAlertThreshold: i.disableAlertThreshold,
            };

            events[eventId] = event;
        }

        logger.debug(`event.dao assemble: exit: ${JSON.stringify(events)}`);
        return events;
    }

    public async delete(eventId: string): Promise<void> {
        logger.debug(`event.dao delete: in: eventId:${eventId}`);

        ow(eventId, ow.string.nonEmpty);

        // start to build up delete requests
        const deleteParams: DocumentClient.BatchWriteItemInput = {
            RequestItems: {},
        };
        deleteParams.RequestItems[this.eventConfigTable] = [];

        // find the event source record to be deleted
        const findByGSIParams: DocumentClient.QueryInput = {
            TableName: this.eventConfigTable,
            IndexName: this.eventConfigGSI1,
            KeyConditionExpression: `#sk=:sk`,
            ExpressionAttributeNames: {
                '#sk': 'sk',
            },
            ExpressionAttributeValues: {
                ':sk': createDelimitedAttribute(PkType.Event, eventId),
            },
        };

        const results = await this._cachedDc.query(findByGSIParams).promise();

        // if found, add to the list to be deleted
        if (results.Items !== undefined && results.Items.length > 0) {
            for (const item of results.Items) {
                deleteParams.RequestItems[this.eventConfigTable].push({