1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-01 13:47:27 +02:00
Commit Graph

2918 Commits

Author SHA1 Message Date
David Leek
ffe40cab59
chore: hide/disallow new instances of deprecated integrations (#10104) 2025-06-10 12:19:37 +02:00
Christopher Kolstad
7f14cc2c3d
task: bump minimum postgres version (#10096)
Co-authored-by: Gastón Fournier <gaston@getunleash.io>
2025-06-09 11:04:47 +02:00
Tymoteusz Czech
a5e5ea0436
feat: update backend to include technicalDebt field (#10088)
Deprecate `health` for a more descriptive `technicalDebt` in project-related services and schemas.
2025-06-06 16:27:41 +02:00
Thomas Heartman
c739ea71cf
Fix(1-3804)/store flag creation form state (#10089)
Adds caching via localstorage to the flag creation form, so that if you
(accidentally) close the form before submitting it, you'll retain (most)
of the same data when you reopen it.

Specifically, we'll store:
- name
- description
- type
- tags
- impression data

We can't store the project as it is now, because it gets overridden by
whatever is in the URL. However, this is probably a good thing. It means
that if you navigate to a different project and open the feature
creation form there, it'll retain everything from the last one, but
it'll use the current project.

The stored data is cleared when you successfully create a feature, so
that you don't get dangling data.

The data is also stored in a shared cache for all projects, so that you
don't have different caches per project.

The behavior of seeding the form is hidden behind a flag (that doesn't
exist yet). We'll still read and write to the cache if the flag is off,
but we won't use it to populate the feature form, so it has no
discernible impact on the user.

## Bug detected 🐛  ... and squashed

Working on this, I came to realize that there was a bug in how the
config button and use feature form hooks interacted. We (in this case
probably me) have assumed that it's fine to use a set for any option
checking in the config buttons. Also, we're using a set to store tags in
the feature form. But objects aren't compared by value in JS, so the set
will happily accept multiple instances of the same tag. Likewise, these
tags won't show up as selected in the dropdown because when the dropdown
checks if the set `has` the value, it's using reference equality.

To get around this, I have normalized the values of the Tags set to
strings (`<type>:<value>`), which are easily comparable.

We can iterate on this later if we need to.

## `useLocalStorageState`

In doing this, I have also made a change to the useLocalStorageState
hook:
the exposed "setState" function now writes to the localstorage
immediately. This is because the useEffect method might not have time to
save the data if the component unmounts (this was the case with the flag
dialog).

However, I have kept the useEffect because it gets run on component
mount and then only when it changes. This means that we will get double
saves to localstorage, but it'll be with the same data, so it's benign.


I've tried out two other uses of the hook (event timeline props and
environment columns in the project flags table) and see no discernible
difference in behavior.

## `useFeatureForm`

I have also made a change to the useFeatureForm hook and removed a
`useEffect` that would reset the name to whatever you passed in as the
initial name if you cleared it out. This essentially meant that you
couldn't clear the name completely, because it would just refill with
the initial name.

As far as I can tell, there is no need to have this sticking around
anymore. The hook is only used in two places: the flag creation dialog
and the flag edit page. The flag edit page doesn't allow you to change
the name anyway and it was causing issues in the dialog. It's likely a
holdover from the way something worked 3 years ago. Both the dialog and
the edit screen seem to work just fine with this change.

I have also changed the function parameters from ordered parameters to
an object. There's so many of them that even you don't think it's a good
idea to use objects when you have multiple params with the same type,
it's just nigh-impossible to remember the order by now.

## Minor changes

Additionally, I came across three issues that were causing react errors,
and have fixed them.
1. we'd forgotten to interpolate a variable and just used the variable
name in a string instead
2. an html attribute that doesn't exist (`aria-role` instead of `role`)
3. Providing a disabled button inside a tooltip. I've seen this one
around for ages and it prevented tooltips from working on disabled
buttons. The solution was wrapping it in a span.
2025-06-06 13:01:16 +02:00
Gastón Fournier
bdb763c9d5
chore!: remove deprecated default env from new installs (#10080)
**BREAKING CHANGE**: DEFAULT_ENV changed from `default` (should not be
used anymore) to `development`

## About the changes
- Only delete default env if the install is fresh new.
- Consider development the new default. The main consequence of this
change is that the default is no longer considered `type=production`
environment but also for frontend tokens due to this assumption:
724c4b78a2/src/lib/schema/api-token-schema.test.ts (L54-L59)
(I believe this is mostly due to the [support for admin
tokens](https://github.com/Unleash/unleash/pull/10080#discussion_r2126871567))
- `feature_toggle_update_total` metric reports `n/a` in environment and
environment type as it's not environment specific
2025-06-06 12:02:21 +02:00
Gastón Fournier
f1c2706db7
chore: prepare to remove default env (#10087)
Use DEFAULT_ENV instead of just 'default'
2025-06-06 09:20:16 +02:00
David Leek
ae47771290
chore: remove deprecation of instance stats endpoint (#10083) 2025-06-04 14:48:20 +02:00
David Leek
1aadbb3641
chore(apitoken)!: remove ILegacyApiTokenCreate (#10072) 2025-06-04 11:41:37 +02:00
Christopher Kolstad
8d7a0fdd7f
chore(adminapi)!: Remove deprecated project overview (#10069)
BREAKING CHANGE: As part of the preparation for a new major (7.0) this
removes /api/admin/projects/{projectId} endpoint. It has been deprecated
since 5.8, and we don't use it anymore in our frontend.
2025-06-04 09:59:36 +02:00
Jaanus Sellin
cf87f8cfe1
feat: make lifecycle trends more detailed (#10079)
##  PR Summary: Update `lifecycle_trends` Table Schema

###  What Changed

- **Updated `stage` column constraint**
- **Old values:** `'initial', 'develop', 'production', 'cleanup',
'archived'`
- **New values:** `'initial', 'pre-live', 'live', 'completed',
'archived'`

- **Replaced `flag_type` CHECK constraint with a foreign key**
  - Removed hardcoded values: `'experimental', 'release', 'permanent'`
  - Added foreign key:
    ```sql
FOREIGN KEY (flag_type) REFERENCES feature_types(id) ON DELETE CASCADE
    ```

- **Added down migration** to:
  - Restore original `stage` constraint
- Drop the foreign key on `flag_type` and re-add the original CHECK
constraint

### 💡 Why

- Align `stage` values with lifecycle model
- Use the `feature_types` table to ensure referential integrity
2025-06-04 10:32:32 +03:00
Gastón Fournier
5019f4fcbc
chore!: removing userId strategy for new installations of Unleash (#9800)
This removes a strategy that was already deprecated, but only for new
installations.

I tested starting with an installation with this strategy being used and
then updating, and I was still able to edit the strategy, so this should
not impact current users.

On a fresh install the strategy is no longer available.

---------

Co-authored-by: Nuno Góis <github@nunogois.com>
2025-06-04 09:30:13 +02:00
Christopher Kolstad
8050f25add
chore(adminapi)!: Remove feature variant endpoints (#10071)
BREAKING CHANGE: This removes the
GET /api/admin/projects/{project}/features/{featureName}/variants 
PATCH /api/admin/projects/{project}/features/{featureName}/variants 
PUT /api/admin/projects/{project}/features/{featureName}/variants
endpoints

Users should move to environment or strategy specific variant methods
rather than feature level variant methods.
2025-06-04 09:09:52 +02:00
Mateusz Kwasniewski
0819b2cf32
chore: remove link flags (#10076) 2025-06-03 13:47:24 +02:00
Mateusz Kwasniewski
68660e1e1f
chore: remove flag removeInactiveApplications (#10075) 2025-06-03 13:22:11 +02:00
Mateusz Kwasniewski
280c9c3f64
chore: remove flag cleanup reminder (#10074) 2025-06-03 13:13:51 +02:00
Nuno Góis
6d70265edd
chore: clean up project related tech debt (#10065)
https://linear.app/unleash/issue/2-3581/remove-project-related-legacy-code

Identified some clean up opportunities during deprecated endpoint
removal, mostly related to project insights.
2025-06-03 09:21:55 +01:00
Jaanus Sellin
e474abb946
feat: lifecycle trends migration (#10066)
Adding a single table to capture all lifecycle trends data.

One field presents a challenge: `median_time_in_stage_days`. This value
is calculated per `stage`, not per `flag_type`. As a result, we would
need to duplicate the total median time across each flag type. This
isn’t a major issue.

An alternative would be to create a separate table solely for the median
values, but that seems like overkill.
2025-06-03 08:55:28 +03:00
Tymoteusz Czech
5be0b37cb1
fix: add event listeners for release plan updates in metrics (#10070)
Milestone changes should be visible in metrics, in the same way as
strategy changes are.
2025-06-02 12:40:10 +02:00
Gastón Fournier
63bf01d211
chore: print out 10 unknown flag names (#10062)
- Move logs, and replace a debug log with just the info log while adding
appName to it
- Print out at most 10 invalid flag names
2025-05-30 12:24:41 +02:00
Gastón Fournier
898073878b
chore!: remove isAPI from userSchema response (#10060)
isAPI is not needed for responses, removing it from the system is much
more complex, so I had to cut it with a scalpel...
2025-05-30 11:37:50 +02:00
Jaanus Sellin
d8c83fb824
fix: do not allow creating cr for same environment (#10010)
If there are two concurrent requests to create or edit change requests,
two separate ones may be created in parallel. The UI does not currently
handle this scenario, and if additional changes are made, they might be
added to a random existing change request—resulting in a messy and
unpredictable state.

This PR adds a unique index to the `change_requests` table 
```
on (created_by, project, environment)
WHERE state NOT IN ('Applied', 'Cancelled', 'Rejected', 'Scheduled').
```

In the extremely rare case where such conflicting data already exists in
a database, the migration will automatically cancel one of the
conflicting change requests.
2025-05-30 08:20:11 +03:00
Nuno Góis
eef32b7cf5
chore!: remove deprecated put project groups roles endpoint (#10059)
https://linear.app/unleash/issue/2-3361/remove-put-apiadminprojectsprojectidgroupsgroupidrolesroleid

Removes PUT
`/api/admin/projects/{projectId}/groups/{groupId}/roles/{roleId}` which
was deprecated in v5.5.
Also cleans up related code.
2025-05-29 14:03:59 +01:00
Gastón Fournier
600ee7ee80
feat: fail in dev when usign deprecated endpoints (#10058) 2025-05-29 12:44:00 +02:00
Gastón Fournier
241b7e8165
chore: simplify serving of static openapi assets (#10046)
Use existing public folder from frontend to serve opeanapi static
assets. We also benefit from frontend image optimizations
2025-05-28 19:14:55 +02:00
Gastón Fournier
ff83f934d5
feat: clean up old OAS and ability to add badges to descriptions (#10038)
## About the changes
This removes some old and unused files from an initial test of setting
up openapi that's currently not working:

![image](https://github.com/user-attachments/assets/5ed9b1bf-a3b1-48ec-9232-6e534e6ceb96)


Also, adds the ability of marking endpoints as (note, the endpoints are
made up just for illustration purposes):
- Enterprise only 

![image](https://github.com/user-attachments/assets/0f8768b3-051f-4dc5-89d9-f09b38d5ca4c)

- Beta: 

![image](https://github.com/user-attachments/assets/45a29b16-6063-4718-bda6-e6ac28061be5)

- Both: 

![image](https://github.com/user-attachments/assets/2ed8bc95-868b-4577-8f84-67b74e739a51)

---------

Co-authored-by: Thomas Heartman <thomas@getunleash.io>
2025-05-28 13:14:00 +02:00
Nuno Góis
1f4aa0ed34
chore!: remove deprecated delete project groups roles endpoint (#10036)
https://linear.app/unleash/issue/2-3362/remove-delete-apiadminprojectsprojectidgroupsgroupidrolesroleid

Removes DELETE
`/api/admin/projects/{projectId}/groups/{groupId}/roles/{roleId}` which
was deprecated in v5.5.
Also cleans up related code.
2025-05-28 12:11:17 +01:00
Tymoteusz Czech
b111abc96f
feat: update sidebar navigation - refactors (#10037)
- added `sideMenuCleanup` flag
- extracted `SecondaryNavigation`, `SecondaryNavigationList` and
`MobileNavigationSidebar` into separate files
- hidden recent projects and flags
- renamed 'Insights' to 'Analytics'
2025-05-28 12:00:28 +02:00
Gastón Fournier
a302055bea
feat: add required cdn events (#10040)
## About the changes
Exposes configuration revision service UPDATE_EVENT constant so it can
be used, and we also add a new event for cdn token created
2025-05-28 09:39:59 +02:00
Nuno Góis
a419b8e098
chore: prefer searchEvents over deprecated methods (#10031)
https://linear.app/unleash/issue/2-3577/prefer-the-new-searchevents-method-over-deprecated-methods

We should favor our new `searchEvents` method over the other deprecated
methods. This PR removes these deprecated methods, replaces them with
the new `searchEvents` and `searchEventsCount` methods, and marks the
old endpoints as deprecated.

Follow-up to: https://github.com/Unleash/unleash/pull/10030
2025-05-27 16:19:10 +01:00
Jaanus Sellin
2879ce9dd6
fix: make revision id not be so reactive (#10032)
Unleash is being too reactive to events inside Unleash. We should not
update etag if feature is created or tag is added to feature.

This PR adds this condition and adds test for it.
2025-05-27 16:16:26 +03:00
Thomas Heartman
092c525531
chore: add lifecycleMetrics flag definition (#10033)
Adds the new lifecycleMetrics flag.
2025-05-27 11:53:22 +00:00
Nuno Góis
290ef6ca40
chore!: remove deprecated POST events search endpoint (#10030)
https://linear.app/unleash/issue/2-3368/remove-post-apiadmineventssearch-deprecated-in-610

Removes POST `/api/admin/events/search` which was deprecated in v6.1.
Also cleans up related code.
2025-05-27 09:12:36 +01:00
Nuno Góis
45434109a9
chore: don't include passwordLink if it's unleashUrl (#10029)
https://linear.app/unleash/issue/2-3572/fix-dont-include-passwordlink-if-its-the-same-as-unleashurl

In case we don't have password auth enabled (`passwordLink ===
unleashUrl`), we should see the alternative branch in our getting
started email:


e52fcd11e0/src/mailtemplates/getting-started-new/getting-started-new.html.mustache (L40-L45)

This change helps us validate this behavior within the
`newGettingStartedEmail`. If it works correctly for both cases (password
auth enabled/disabled) we can probably clean this up as part of our flag
removal.
2025-05-26 14:57:06 +01:00
Nuno Góis
e52fcd11e0
chore!: remove deprecated POST ui-config endpoint (#10027)
https://linear.app/unleash/issue/2-3472/remove-post-apiadminui-config-deprecated-in-690

Removes POST `/api/admin/ui-config` which was deprecated in v6.9.
Also cleans up related code.
2025-05-26 10:22:16 +01:00
Gastón Fournier
27781fea47
chore: remove console.log and reuse package scripts (#10025)
Make `start:dev` re-use `dev:backend`, the only difference is start:dev
runs a clean before running
2025-05-23 12:24:03 +02:00
Gastón Fournier
76b201e40e
feat: add migration for cdn_tokens (#10021) 2025-05-21 14:20:04 +00:00
Jaanus Sellin
5fb718efcd
feat: custom metrics poc (#10018)
Now we can receive custom metrics, return those for UI and have extra
prometheus endpoint for it.

---------

Co-authored-by: Christopher Kolstad <chriswk@getunleash.io>
2025-05-21 16:55:30 +03:00
Thomas Heartman
e118321bfb
chore: fix typo (#10016)
Fixes a typo error that snuck in
2025-05-19 11:10:16 +00:00
Thomas Heartman
9955267d39
Chore(1-3753)!: block deletion of context fields in use (#10005)
Blocks deletion of context fields that are in use and updates the
"active usage" count to exclude use in archived flags.

- Before allowing you to delete a context field, checks if it is in use
by any strategies. If so, returns a 409 error.
- Updates what we count as "in use" to exclude flags that have been
archived.

BREAKING CHANGE: Context fields can no longer be deleted if they are in
use by active (non-archived) flags.
2025-05-19 13:02:01 +02:00
Nuno Góis
8fae8fb8b3
chore: remove teams integration CR events flag (#10015)
https://linear.app/unleash/issue/2-3265/investigate-teams-integration-for-change-request-notifications

Removes the `teamsIntegrationChangeRequests` feature flag.

Follow-up to: https://github.com/Unleash/unleash/pull/9309
2025-05-16 15:06:53 +01:00
Tymoteusz Czech
b0954f213c
chore: remove flagsReleaseManagementUI and flagsOverviewSearch flags (#10011)
Removing the `flagsReleaseManagementUI` and `flagsOverviewSearch`
feature flags - we're keeping these enabled.
2025-05-16 15:13:32 +02:00
Gastón Fournier
e754212a39
docs: explain health API properly (#10009)
## About the changes
Our health implementation always returns GOOD if the server is up:
beb29f5b5b/src/lib/routes/health-check.ts (L46-L51)

Currently our documentation of the endpoint is misleading saying that it
will return BAD if unable to connect to PostgreSQL

Closes #9965
2025-05-16 12:38:27 +02:00
Gastón Fournier
beb29f5b5b
chore: stop using deprecated properties and lean on resourceLimits cfg (#9994)
This removes segmentValuesLimit and strategySegmentsLimit from
ui-config-schema, deprecated in 5.11.0
2025-05-16 09:41:04 +00:00
Christopher Kolstad
b681702b77
task: migrate tests to vitest
Vitest Pros:
* Automated failing test comments on github PRs
* A nice local UI with incremental testing when changing files (`yarn
test:ui`)
* Also nicely supported in all major IDEs, click to run test works (so
we won't miss what we had with jest).
* Works well with ESM

Vitest Cons:
* The ESBuild transformer vitest uses takes a little longer to transform
than our current SWC/jest setup, however, it is possible to setup SWC as
the transformer for vitest as well (though it only does one transform,
so we're paying ~7-10 seconds instead of ~ 2-3 seconds in transform
phase).
* Exposes how slow our tests are (tongue in cheek here)
2025-05-16 11:19:10 +02:00
Nuno Góis
4d1b44818f
chore: remove filterExistingFlagNames feature flag (#9957)
https://linear.app/unleash/issue/2-3564/remove-filterexistingflagnames-feature-flag

We're removing the `filterExistingFlagNames` feature flag since we've
decided we want this to be the default behavior.

We don't need to rush to merge it, just in case we need to disable this
for any reason. However it should also be pretty easy to just revert if
needed.

Changes in tests are a bit tricky since they assumed the previous
behavior where we always registered metrics, even for non existing flag
names. `cachedFeatureNames` is also memoized with a TTL of 10s, so the
easiest way to overcome this was to override `cachedFeatureNames` to
return what we expected. As long as they return the same flag names that
we expect, we're able to register their metrics.

Let me know if you can think of a better approach.
2025-05-16 08:52:27 +01:00
Thomas Heartman
082a03afd7
Fix(1-3485)/handle deleted constraints (#9999)
Improves handling of constraints in use that have been deleted.

This change implments a few small changes on both the front and the back
end on how we deal with constraints that have been deleted.

The most important change is on the back end, in the
`/constraints/validate` endpoint. We used to throw here if the
constraint couldn't be found, but the only reason we wanted to look for
the constraint in the db was to check for legal values. Now, instead,
we'll allow you to pass a constraint field that doesn't exist in the
database. We'll still check the values against the operator for
validity, we just don't control legal values anymore (because there
aren't any).

On the front end, we improve the handling by showing the deleted context
filed in the dropdown, both when the selector dropdown is closed and
when it is open. However, if you change the context field, we remove the
deleted field from the list. This seems like a sensible tradeoff. Means
you can't select it if you've deselected it.
2025-05-15 13:08:54 +02:00
Tymoteusz Czech
4d92d54f9a
feat: track last seen clients using bulk update (#9981)
Let's not update `lastSeen` in the db on each client call
2025-05-15 13:06:54 +02:00
Nuno Góis
45c2a0b939
chore: small visual improvements to the new invite mail template (#9998)
https://linear.app/unleash/issue/2-3567/improve-the-look-of-the-unleash-instance-getting-started-email

Some small visual improvements to the email template after the latest
changes.

Follow-up to: https://github.com/Unleash/unleash/pull/9997
2025-05-15 08:52:01 +01:00
Nuno Góis
e9768f7363
chore: new invite email template improvements (#9997)
https://linear.app/unleash/issue/2-3567/improve-the-look-of-the-unleash-instance-getting-started-email

Follow-up to: https://github.com/Unleash/unleash/pull/9980

Refactored the new email template to use a table-based layout with
inline styles for maximum compatibility across email clients, while
preserving the original design.
2025-05-14 17:26:56 +01:00
Nuno Góis
0e8f187948
chore: new getting started email template (#9980)
https://linear.app/unleash/issue/2-3567/improve-the-look-of-the-unleash-instance-getting-started-email

Adds a new getting started email template, hidden behind a
`newGettingStartedEmail` flag.

If it works nicely, we may follow up with PRs to update and align the
remaining email templates.

### Old


![image](https://github.com/user-attachments/assets/a1bf1ccd-7adb-4a41-b101-653c648c24f3)

### New


![image](https://github.com/user-attachments/assets/ebe600df-254f-4ebb-8976-69aa6b200d8a)
2025-05-14 15:55:38 +01:00
Gastón Fournier
abe160eb7d
feat: Unleash v7 ESM migration (#9877)
We're migrating to ESM, which will allow us to import the latest
versions of our dependencies.

Co-Authored-By: Christopher Kolstad <chriswk@getunleash.io>
2025-05-14 09:47:12 +02:00
Nuno Góis
e7da79d974
refactor: clean up dead code after removing deprecated project role access endpoint (#9949)
https://linear.app/unleash/issue/2-3363/remove-post-apiadminprojectsprojectidroleroleidaccess-deprecated-in

Cleans up dead code after removing POST
`/api/admin/projects/{projectId}/role/{roleId}/access` which was
deprecated in v5.5.

Should only be merged after the Enterprise PR.
2025-05-13 13:52:13 +01:00
David Leek
3a37386449
chore: undeprecate custom strategies (#9939) 2025-05-13 14:13:15 +02:00
Fredrik Strand Oseberg
94c73bbc5d
feat: event log environment filter (#9979)
Add Environment Filter to Event Log
2025-05-13 13:45:22 +02:00
Nuno Góis
c0c7005859
refactor: remove deprecated post project role access endpoint (#9948)
https://linear.app/unleash/issue/2-3363/remove-post-apiadminprojectsprojectidroleroleidaccess-deprecated-in

Removes POST `/api/admin/projects/{projectId}/role/{roleId}/access`
which was deprecated in v5.5.
Also cleans up related code.

Needs follow up PRs.
2025-05-13 12:28:44 +01:00
Tymoteusz Czech
57d11ae6b3
feat: link templates applied on flags (#9976) 2025-05-13 13:16:26 +02:00
Nuno Góis
0429c1985a
refactor: remove deprecated get archive featured by project endpoint (#9938)
https://linear.app/unleash/issue/2-3367/remove-get-apiadminarchivefeaturesprojectid-deprecated-in-4110

Removes GET `/api/admin/archive/features/{projectId}` which was
deprecated in v4.11.
Also cleans up related code.

I leveraged our search features endpoint where needed, since that's what
we're using now in our UI (to see archived features you filter by
archived=true).

Builds on top of https://github.com/Unleash/unleash/pull/9924 — Since
they're both related.
2025-05-13 12:09:52 +01:00
Nuno Góis
42b6fc810e
refactor: remove deprecated GET archive features endpoint (#9924)
https://linear.app/unleash/issue/2-3366/remove-get-apiadminarchivefeatures-deprecated-in-4100

Removes GET `/api/admin/archive/features` which was deprecated in v4.10.
Also cleans up related code.

May include some slight scouting.

**P.S.** Should we merge this into main, or is there a `v7` branch we
should be targeting instead?
2025-05-13 11:45:03 +01:00
Mateusz Kwasniewski
410142cb42
feat: make all feature toggle service write methods transactional (#9973) 2025-05-13 12:16:20 +02:00
Tymoteusz Czech
309816ca38
feat: add getProjectLinkTemplates method (#9971)
Add `getProjectLinkTemplates` method to ProjectStore and corresponding
test. Ideally this should be in a read-model, but let's finish link
templates end to end
2025-05-13 11:21:18 +02:00
Nuno Góis
333f1203dc
refactor: lax newUserInviteLink user arg (#9967)
Part of:
https://linear.app/unleash/issue/2-3560/payg-flow-sends-2-email-one-from-bluebird-and-one-from-unleash-we-want

This laxes our `user` argument in `newUserInviteLink` to just pick the
id, since that's the only property we're interested in. This allows us
to send `{ id }` when we don't have the full `IUserWithRootRole`
available while keeping compatibility intact.
2025-05-13 09:41:33 +01:00
Mateusz Kwasniewski
9c05e56c4a
refactor: simplify feature toggle service deps (#9964) 2025-05-13 09:42:37 +02:00
Mateusz Kwasniewski
d175a5705a
feat: Import feature links (#9958) 2025-05-12 13:59:18 +02:00
Fredrik Strand Oseberg
d4d6e658ff
Chore/cleanup tag color feature falg (#9959)
Removes the flag for tag type colors.
2025-05-12 13:54:38 +02:00
Tymoteusz Czech
520d708978
fix: ensure linkTemplates defaults to an empty array if not provided 2025-05-12 13:21:06 +02:00
Mateusz Kwasniewski
5708acb5b7
feat: export feature links (#9954) 2025-05-12 12:07:00 +02:00
Tymoteusz Czech
f55ea5f387
chore: remove embedProxy flag (#9874)
Clean up old flags
2025-05-12 10:28:31 +02:00
Jaanus Sellin
095d4d7074
chore: remove newStrategyDropdown flag (#9952) 2025-05-12 11:11:25 +03:00
Mateusz Kwasniewski
e414c4446d
feat: remove instances older than 1 day not 2 days (#9944) 2025-05-09 13:58:52 +02:00
Tymoteusz Czech
f02c883da5
feat: external link templates (#9927)
Adds support for link templates in projects, allowing reusable URL
patterns with placeholders. Includes validation, database changes,
updated API schemas, and tests.
2025-05-09 12:40:14 +02:00
Nuno Góis
bfc583b5b7
chore: prevent duplicate key errors in unknown flags (#9940)
https://linear.app/unleash/issue/2-3561/fix-duplicate-key-errors-in-unknown-flags

This should prevent `duplicate_key` errors in unknown flags.

Follow-up to: https://github.com/Unleash/unleash/pull/9837

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-09 10:02:38 +01:00
Mateusz Kwasniewski
43efaf7c47
feat: report feature links by domain (#9936) 2025-05-09 09:39:15 +02:00
Mateusz Kwasniewski
857ee7da5c
feat: prevent more than 10 links in the UI and backend (#9937) 2025-05-08 21:21:28 +02:00
Mateusz Kwasniewski
a3ac624deb
feat: report top used domains (#9934) 2025-05-08 14:06:10 +02:00
Tymoteusz Czech
499ee1e099
migration: project settings - external link templates (#9933) 2025-05-08 13:51:21 +02:00
Mateusz Kwasniewski
28e5f39548
feat: store domain for links (#9931) 2025-05-08 13:33:41 +02:00
Mateusz Kwasniewski
9ca44e6188
feat: add domain to links (#9930) 2025-05-08 13:20:47 +02:00
Mateusz Kwasniewski
3865fb41ae
fix: project environments have info about required approvals (#9929) 2025-05-08 11:37:15 +02:00
Mateusz Kwasniewski
c8ebaa49fc
feat: order links by insertion order (#9928) 2025-05-08 10:46:26 +02:00
Nuno Góis
eb238f502a
chore: unknown flags (#9837)
https://linear.app/unleash/issue/2-3406/hold-unknown-flags-in-memory-and-show-them-in-the-ui-somehow

This PR introduces a suggestion for a “unknown flags” feature.

When clients report metrics for flags that don’t exist in Unleash (e.g.
due to typos), we now track a limited set of these unknown flag names
along with the appnames that reported them. The goal is to help users
identify and clean up incorrect flag usage across their apps.

We store up to 10 unknown flag + appName combinations, keeping only the
most recent reports. Data is collected in-memory and flushed
periodically to the DB, with deduplication and merging to ensure we
don’t exceed the cap even across pods.

We were especially careful to make this implementation defensive, as
unknown flags could be reported in very high volumes. Writes are
batched, deduplicated, and hard-capped to avoid DB pressure.

No UI has been added yet — this is backend-only for now and intended as
a step toward better visibility into client misconfigurations.

I would suggest starting with a simple banner that opens a dialog
showing the list of unknown flags and which apps reported them.

<img width="497" alt="image"
src="https://github.com/user-attachments/assets/b7348e0d-0163-4be4-a7f8-c072e8464331"
/>
2025-05-07 11:48:36 +01:00
Mateusz Kwasniewski
2b73b17579
feat: feature links section (#9915) 2025-05-07 11:35:41 +02:00
Mateusz Kwasniewski
20a80142d3
feat: normalize urls in feature links (#9911) 2025-05-06 19:08:04 +02:00
David Leek
681079bd08
chore: clean up adminNavUI flag (#9907) 2025-05-06 14:59:07 +02:00
Mateusz Kwasniewski
b9f1d8414c
feat: add links to feature read model (#9905) 2025-05-06 14:57:52 +02:00
Mateusz Kwasniewski
c6ab2a1cf7
feat: sql feature link persistence (#9901) 2025-05-06 11:46:15 +02:00
Mateusz Kwasniewski
bb82b6920b
feat: feature link migration (#9900) 2025-05-06 11:21:20 +02:00
Tymoteusz Czech
af93f93836
refactor: remove flagOverviewRedesign flag (#9888)
Co-authored-by: Thomas Heartman <thomas@getunleash.io>
2025-05-06 10:25:57 +02:00
Mateusz Kwasniewski
4860d73bf7
chore: feature links flag (#9896) 2025-05-06 09:46:18 +02:00
Mateusz Kwasniewski
002233e7f6
feat: feature link backend stub (#9893) 2025-05-06 09:31:45 +02:00
David Leek
1166d00e6d
chore: flag cleanup simplifyDisableFeature (#9892) 2025-05-06 08:41:03 +02:00
Melinda Fekete
7ca79c1b84
docs: update self-hosting guide (#9855) 2025-05-05 15:57:17 +02:00
Mateusz Kwasniewski
1b9c0e5000
feat: bulk apps should respect multi projects and multi envs (#9879) 2025-05-02 10:12:41 +02:00
Mateusz Kwasniewski
b0223e38ef
refactor: stabilize frontend apps reporting (#9880) 2025-05-01 15:43:03 +02:00
Mateusz Kwasniewski
3ef32dca93
feat: handle nullable sdk type (#9872) 2025-04-30 12:36:18 +02:00
Mateusz Kwasniewski
9e4c3a388f
feat: allow nullable client ip for frontend apps (#9867) 2025-04-30 10:03:16 +02:00
Mateusz Kwasniewski
58a01d0c47
feat: separate frontend and backend applications from edge (#9863) 2025-04-29 15:42:47 +02:00
Mateusz Kwasniewski
3980cfa2a8
feat: show backend and frontend sdks separately (#9857) 2025-04-29 10:36:02 +02:00
Mateusz Kwasniewski
1ccc6cae19
feat: Spike frontend applications registration (#9846) 2025-04-28 09:01:07 +02:00
Mateusz Kwasniewski
bd78a75177
chore: remove flag for global change request config (#9840) 2025-04-25 12:47:18 +02:00
Mateusz Kwasniewski
085c62c99a
feat: client instances sdk type (#9844) 2025-04-25 12:20:48 +02:00