public async userSave()

in lambda/database.ts [112:186]


    public async userSave(user: any): Promise<string | boolean> {

        let isNewUser = false;

        if (!user.id) {
            user.id = uuid.v4();

            isNewUser = true;

            const exResp = await this.ddb.query({
                ExpressionAttributeValues: {
                    ':u': {
                        'S': user.username,
                    },
                },
                IndexName: 'username-index',
                KeyConditionExpression: 'username = :u',
                TableName: this.userTable,
            }).promise();

            if (exResp.Items?.length) {
                console.log(`User with username ${user.username} already exists`);
                return false;
            }
        }

        const expressionAttributeValues:any = {
            ':username': {
                'S': user.username,
            },
            ':emailAddress': {
                'S': user.emailAddress,
            },
            ':firstName': {
                'S': user.firstName,
            },
            ':lastName': {
                'S': user.lastName,
            }
        };

        let updateExpression = 'SET username = :username,' +
        ' email_address = :emailAddress,' +
        ' first_name = :firstName, ' +
        ' last_name = :lastName';

        const now = new Date().toISOString();

        if (isNewUser) {
            expressionAttributeValues[':createdOn'] = {
                'S': now
            };
            updateExpression += ', created_on = :createdOn';
        } else {
            expressionAttributeValues[':updatedOn'] = {
                'S': now
            };
            updateExpression += ', updated_on = :updatedOn';
        }

        // Upsert the record (creates a new item if it doesn't exist)
        await this.ddb.updateItem({
            ExpressionAttributeValues: expressionAttributeValues,
            Key: {
                'id': {
                    'S': user.id,
                }
            },
            TableName: this.userTable,
            UpdateExpression: updateExpression
        }).promise();

        return user.id;

    }