ca98am79 / connect-dynamodb

DynamoDB session store for Connect
http://ca98am79.github.com/connect-dynamodb/
MIT License
144 stars 66 forks source link

feat: Support for nested values in SpecialKey #96

Open Hyuga-Tsukui opened 2 months ago

Hyuga-Tsukui commented 2 months ago

Description:

This pull request introduces the capability to use SpecialKey for specifying values in nested structures within sessions, enhancing the flexibility of our session management. The primary motivation for this change is to support complex querying scenarios, such as cross-querying session data by user IDs, which are stored in nested objects within session structures.

Key Changes:

  1. Nested Structure Support: Previously, accessing nested attributes like userId within a user object in the session data was not possible with SpecialKey. This update enables this functionality, allowing SpecialKey to target nested attributes.

  2. Compatibility and Testing:

    • The changes maintain backward compatibility and do not alter existing functionalities.
    • New tests have been added to ensure that SpecialKey can now handle nested attributes without breaking existing functionalities.

Use Case: Consider a session structured as follows:

{
  "sess": {
    "cookie": "...",
    "user": {
      "id": "uid-00001",
      "name": "..."
    }
  }
}

set special keys.

  const store = new DynamoDBStore({
    client: client,
    table: tableName,
    specialKeys: [
      {
        name: "user.id",
        type: "S",
      },
    ],
  });

dynamodb-client query output

Item: {
    id: { S: 'sess:0.45441392681127013' },
    userId: { S: 'uid-00001' }, // convert key path to camel case.
    expires: { N: '1713351239' },
    type: { S: 'connect-session' },
    sess: {
      S: '{"cookie":{"maxAge":2000},"name":"0.46261875390220175","user":{"id":"uid-00001'"}}'
    },
  }

With the current system, it is impossible to set userId as a SpecialKey for purposes like querying in DynamoDB's Global Secondary Indexes (GSI) for cross-session user data retrieval. This update addresses such limitations by allowing userId to be specified as a SpecialKey.

Impact: This enhancement will significantly improve our ability to perform more complex queries on session data, facilitating better data management and retrieval based on user-specific or other nested session attributes.