1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-11-10 01:19:53 +01:00
unleash.unleash/src/migrations/20220603081324-add-archive-at-to-feature-toggle.js
Vignesh S ffb17d43ba
fix: features table migrations in 20220603081324-add-archive-at-to-fea… (#9518)
Changes to migration file -
20220603081324-add-archive-at-to-feature-toggle.js

1. Fixes the migration script where features table is updated with
archived_at column with the latest date instead of taking the date from
the events table.
2. Also it fails for the latest toggle which was archived and then
revived but after migration it updates the toggle as archived toggle.
3. Also because of the buggy reference to the outer join's events table
`e` its taking a huge time to run the migration.

This PR fixes all the above issues.

## About the changes

We have faced an issue during migration of unleash-server from 4.8.2 to
6.6.0 where one of our toggle which was archived and unarchived once
before migration and that was the latest toggle in terms of the archived
date, but after the migration was ran it was in archived status.

Upon further debugging and running the SQL command in the features table
migration file we noticed that we should not be referencing the outer
join's events table `e` for the feature_name check and additionally we
should add the features table's archived toggle check instead.

### Important files

The change in only in this file.


[20220603081324-add-archive-at-to-feature-toggle.js](https://github.com/Unleash/unleash/pull/9518/files#diff-b91c299b96edc46ca3a1963bf54966aa777c9fa107f3bd8b45f5fb54dc57460e)

## Discussion points

Let me know if any further details is required.
2025-03-12 10:28:04 +01:00

40 lines
1.2 KiB
JavaScript

'use strict';
exports.up = function (db, callback) {
db.runSql(
`
ALTER TABLE features ADD archived_at TIMESTAMP WITH TIME ZONE;
UPDATE features f
SET archived_at = res.archived_at
FROM (SELECT f.name, e.created_at AS archived_at
FROM features f
INNER JOIN events e
ON e.feature_name = f.NAME
AND e.created_at =
(SELECT Max(created_at) date
FROM events
WHERE type = 'feature-archived'
AND feature_name = f.NAME
AND f.archived = 't')) res
WHERE res.NAME = f.NAME;
UPDATE features
SET archived_at = Now()
WHERE archived = TRUE
AND archived_at IS NULL;
`,
callback,
);
};
exports.down = function (db, callback) {
db.runSql(
`
UPDATE features
SET archived = TRUE
WHERE archived_at IS NOT NULL;
ALTER TABLE features DROP COLUMN archived_at;
`,
callback,
);
};