Featbit Versions Save

A feature flags service written in .NET

3.3.2

2 weeks ago

What's Changed

Breaking changes

The API used to retrieve client-side feature flags has a new response format due to changes in pull request #635. This may affect existing integrations that rely on the previous format.

Old Format

[
    {
       "id":"hello-world",
       "variation":"true",
       "variationType":"boolean",
       "variationId":"fafb6319-9270-4a4b-b2c3-12d2be29e69a",
       "sendToExperiment":false
    }
]

New Format

{
   "messageType":"data-sync",
   "data":{
      "eventType":"full",
      "userKeyId":"bot-id",
      "featureFlags":[
         {
            "id":"hello-world",
            "variation":"true",
            "variationType":"boolean",
            "variationId":"fafb6319-9270-4a4b-b2c3-12d2be29e69a",
            "matchReason":"flag disabled",
            "variationOptions":[
               {
                  "id":"fafb6319-9270-4a4b-b2c3-12d2be29e69a",
                  "value":"true"
               },
               {
                  "id":"3f02a597-a150-4c3f-83b9-27a2de80c7dc",
                  "value":"false"
               }
            ],
            "sendToExperiment":false,
            "timestamp":1712755780494
         }
      ]
   }
}

Full Changelog: https://github.com/featbit/featbit/compare/3.3.1...3.3.2

3.3.1

3 weeks ago

What's Changed

Breaking Change in API Service

  • Background: In PR #623 we upgraded some packages to address vulnerabilities. However the new version of System.IdentityModel.Tokens.Jwt package introduces a breaking change.
  • Impact: JWT key (environment variable: Jwt__Key) in the API service now must be longer than 32 characters.

Full Changelog: https://github.com/featbit/featbit/compare/3.3.0...3.3.1

3.3.0

1 month ago

What's Changed

Breaking Changes

We normalize redis cache keys in PR #603, So after upgrading to v3.3.0, you will need to

  • restart the Api service to automatically repopulate the new Redis cache

As for cleaning up the old Redis cache, check out this comment. If you have any questions, feel free to contact us for assistance.

New Contributors

Full Changelog: https://github.com/featbit/featbit/compare/3.2.1...3.3.0

3.2.1

2 months ago

What's Changed

New Contributors

Full Changelog: https://github.com/featbit/featbit/compare/3.2.0...3.2.1

3.2.0

3 months ago

What's Changed

πŸŽ‰πŸŽ‰ Big thanks to @wss-rbrennan for his contribution to the backend services otel integration in PR #584

New Contributors

  • Thanks for @qixiaojian310 made his contribution in #575 #578 ❀️

Full Changelog: https://github.com/featbit/featbit/compare/3.1.0...3.2.0

3.1.0

4 months ago

What's Changed

Full Changelog: https://github.com/featbit/featbit/compare/3.0.1...3.1.0

3.0.1

5 months ago

What's Changed

Full Changelog: https://github.com/featbit/featbit/compare/3.0.0...3.0.1

2.5.3

5 months ago

Breaking Changes

Full Changelog: https://github.com/featbit/featbit/compare/2.5.2...2.5.3

3.0.0

5 months ago

What's Changed

Breaking Changes

  • Introduce Workspace in PR #534, which is a higher level of organization
  • Rename account to organization to avoid misconception in PR #530

If you're upgrading from version 2.5.x, please run the following script against your MongoDB:


// PR #534
const workspaceId = UUID()
db.Workspaces.deleteMany({})
db.Workspaces.insertOne(
    {
        _id: workspaceId,
        name: "Default Workspace",
        key: "default-workspace",
        sso: null,
        license: null,
        createdAt: new Date(),
        updatedAt: new Date()
    }
);

const orgCursor = db.Organizations.find({});
orgCursor.forEach(doc => {
    db.Organizations.updateOne({ _id: doc._id }, { $set: { workspaceId: workspaceId } });
});

const userCursor = db.Users.find({});
userCursor.forEach(doc => {
    db.Users.updateOne({ _id: doc._id }, { $set: { workspaceId: workspaceId } });
});

// PR #530
const policyCursor = db.Policies.find({ "statements.resourceType": "account" });
policyCursor.forEach(doc => {
    doc.statements.forEach(statement => {
        if (statement.resourceType === "account") {
            statement.resourceType = "organization";
            statement.resources = statement.resources.map(resource => resource.replace(/^account\//, "organization/"));
        }
    });

    db.Policies.updateOne({ _id: doc._id }, { $set: { statements: doc.statements } });
});

Full Changelog: https://github.com/featbit/featbit/compare/2.5.2...3.0.0

2.5.2

5 months ago

What's Changed

New Contributors

Full Changelog: https://github.com/featbit/featbit/compare/2.5.1...2.5.2