mirror of
https://github.com/Unleash/unleash.git
synced 2025-06-09 01:17:06 +02:00
remove feature flag: tokens last seen (#2673)
https://linear.app/unleash/issue/2-470/clean-up-flag
This commit is contained in:
parent
e8d0fdba1f
commit
5086ec7921
@ -30,7 +30,6 @@ import { TimeAgoCell } from 'component/common/Table/cells/TimeAgoCell/TimeAgoCel
|
|||||||
|
|
||||||
const hiddenColumnsSmall = ['Icon', 'createdAt'];
|
const hiddenColumnsSmall = ['Icon', 'createdAt'];
|
||||||
const hiddenColumnsFlagE = ['projects', 'environment'];
|
const hiddenColumnsFlagE = ['projects', 'environment'];
|
||||||
const hiddenColumnsFlagTokensLastSeen = ['seenAt'];
|
|
||||||
|
|
||||||
export const ApiTokenTable = () => {
|
export const ApiTokenTable = () => {
|
||||||
const { tokens, loading } = useApiTokens();
|
const { tokens, loading } = useApiTokens();
|
||||||
@ -61,11 +60,6 @@ export const ApiTokenTable = () => {
|
|||||||
|
|
||||||
useHiddenColumns(setHiddenColumns, hiddenColumnsSmall, isSmallScreen);
|
useHiddenColumns(setHiddenColumns, hiddenColumnsSmall, isSmallScreen);
|
||||||
useHiddenColumns(setHiddenColumns, hiddenColumnsFlagE, !uiConfig.flags.E);
|
useHiddenColumns(setHiddenColumns, hiddenColumnsFlagE, !uiConfig.flags.E);
|
||||||
useHiddenColumns(
|
|
||||||
setHiddenColumns,
|
|
||||||
hiddenColumnsFlagTokensLastSeen,
|
|
||||||
!uiConfig.flags.tokensLastSeen
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageContent
|
<PageContent
|
||||||
|
@ -26,7 +26,6 @@ import {
|
|||||||
INewPersonalAPIToken,
|
INewPersonalAPIToken,
|
||||||
IPersonalAPIToken,
|
IPersonalAPIToken,
|
||||||
} from 'interfaces/personalAPIToken';
|
} from 'interfaces/personalAPIToken';
|
||||||
import { IUser } from 'interfaces/user';
|
|
||||||
import { useEffect, useMemo, useState } from 'react';
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
import { useSearchParams } from 'react-router-dom';
|
||||||
import { useTable, SortingRule, useSortBy, useFlexLayout } from 'react-table';
|
import { useTable, SortingRule, useSortBy, useFlexLayout } from 'react-table';
|
||||||
@ -36,7 +35,6 @@ import { CreatePersonalAPIToken } from './CreatePersonalAPIToken/CreatePersonalA
|
|||||||
import { DeletePersonalAPIToken } from './DeletePersonalAPIToken/DeletePersonalAPIToken';
|
import { DeletePersonalAPIToken } from './DeletePersonalAPIToken/DeletePersonalAPIToken';
|
||||||
import { PersonalAPITokenDialog } from './PersonalAPITokenDialog/PersonalAPITokenDialog';
|
import { PersonalAPITokenDialog } from './PersonalAPITokenDialog/PersonalAPITokenDialog';
|
||||||
import { TimeAgoCell } from 'component/common/Table/cells/TimeAgoCell/TimeAgoCell';
|
import { TimeAgoCell } from 'component/common/Table/cells/TimeAgoCell/TimeAgoCell';
|
||||||
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
|
|
||||||
|
|
||||||
const StyledAlert = styled(Alert)(({ theme }) => ({
|
const StyledAlert = styled(Alert)(({ theme }) => ({
|
||||||
marginBottom: theme.spacing(3),
|
marginBottom: theme.spacing(3),
|
||||||
@ -77,12 +75,7 @@ const { value: storedParams, setValue: setStoredParams } = createLocalStorage(
|
|||||||
defaultSort
|
defaultSort
|
||||||
);
|
);
|
||||||
|
|
||||||
interface IPersonalAPITokensTabProps {
|
export const PersonalAPITokensTab = () => {
|
||||||
user: IUser;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const PersonalAPITokensTab = ({ user }: IPersonalAPITokensTabProps) => {
|
|
||||||
const { uiConfig } = useUiConfig();
|
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const isSmallScreen = useMediaQuery(theme.breakpoints.down('md'));
|
const isSmallScreen = useMediaQuery(theme.breakpoints.down('md'));
|
||||||
const isExtraSmallScreen = useMediaQuery(theme.breakpoints.down('sm'));
|
const isExtraSmallScreen = useMediaQuery(theme.breakpoints.down('sm'));
|
||||||
@ -208,9 +201,6 @@ export const PersonalAPITokensTab = ({ user }: IPersonalAPITokensTabProps) => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const hiddenColumns = [];
|
const hiddenColumns = [];
|
||||||
if (!uiConfig.flags.tokensLastSeen) {
|
|
||||||
hiddenColumns.push('seenAt');
|
|
||||||
}
|
|
||||||
if (isSmallScreen) {
|
if (isSmallScreen) {
|
||||||
hiddenColumns.push('createdAt');
|
hiddenColumns.push('createdAt');
|
||||||
}
|
}
|
||||||
@ -218,12 +208,7 @@ export const PersonalAPITokensTab = ({ user }: IPersonalAPITokensTabProps) => {
|
|||||||
hiddenColumns.push('expiresAt');
|
hiddenColumns.push('expiresAt');
|
||||||
}
|
}
|
||||||
setHiddenColumns(hiddenColumns);
|
setHiddenColumns(hiddenColumns);
|
||||||
}, [
|
}, [setHiddenColumns, isSmallScreen, isExtraSmallScreen]);
|
||||||
setHiddenColumns,
|
|
||||||
isSmallScreen,
|
|
||||||
isExtraSmallScreen,
|
|
||||||
uiConfig.flags.tokensLastSeen,
|
|
||||||
]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const tableState: PageQueryType = {};
|
const tableState: PageQueryType = {};
|
||||||
|
@ -53,7 +53,7 @@ export const Profile = () => {
|
|||||||
/>
|
/>
|
||||||
<ConditionallyRender
|
<ConditionallyRender
|
||||||
condition={tab === 'pat'}
|
condition={tab === 'pat'}
|
||||||
show={<PersonalAPITokensTab user={user!} />}
|
show={<PersonalAPITokensTab />}
|
||||||
/>
|
/>
|
||||||
</VerticalTabs>
|
</VerticalTabs>
|
||||||
);
|
);
|
||||||
|
@ -42,7 +42,6 @@ export interface IFlags {
|
|||||||
embedProxyFrontend?: boolean;
|
embedProxyFrontend?: boolean;
|
||||||
changeRequests?: boolean;
|
changeRequests?: boolean;
|
||||||
variantsPerEnvironment?: boolean;
|
variantsPerEnvironment?: boolean;
|
||||||
tokensLastSeen?: boolean;
|
|
||||||
favorites?: boolean;
|
favorites?: boolean;
|
||||||
networkView?: boolean;
|
networkView?: boolean;
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,6 @@ exports[`should create default config 1`] = `
|
|||||||
"networkView": false,
|
"networkView": false,
|
||||||
"proxyReturnAllToggles": false,
|
"proxyReturnAllToggles": false,
|
||||||
"responseTimeWithAppName": false,
|
"responseTimeWithAppName": false,
|
||||||
"tokensLastSeen": false,
|
|
||||||
"variantsPerEnvironment": false,
|
"variantsPerEnvironment": false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -93,7 +92,6 @@ exports[`should create default config 1`] = `
|
|||||||
"networkView": false,
|
"networkView": false,
|
||||||
"proxyReturnAllToggles": false,
|
"proxyReturnAllToggles": false,
|
||||||
"responseTimeWithAppName": false,
|
"responseTimeWithAppName": false,
|
||||||
"tokensLastSeen": false,
|
|
||||||
"variantsPerEnvironment": false,
|
"variantsPerEnvironment": false,
|
||||||
},
|
},
|
||||||
"externalResolver": {
|
"externalResolver": {
|
||||||
|
@ -26,7 +26,6 @@ import {
|
|||||||
ApiTokenUpdatedEvent,
|
ApiTokenUpdatedEvent,
|
||||||
} from '../types';
|
} from '../types';
|
||||||
import { omitKeys } from '../util';
|
import { omitKeys } from '../util';
|
||||||
import { IFlagResolver } from 'lib/types/experimental';
|
|
||||||
|
|
||||||
const resolveTokenPermissions = (tokenType: string) => {
|
const resolveTokenPermissions = (tokenType: string) => {
|
||||||
if (tokenType === ApiTokenType.ADMIN) {
|
if (tokenType === ApiTokenType.ADMIN) {
|
||||||
@ -61,8 +60,6 @@ export class ApiTokenService {
|
|||||||
|
|
||||||
private lastSeenSecrets: Set<string> = new Set<string>();
|
private lastSeenSecrets: Set<string> = new Set<string>();
|
||||||
|
|
||||||
private flagResolver: IFlagResolver;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
{
|
{
|
||||||
apiTokenStore,
|
apiTokenStore,
|
||||||
@ -72,12 +69,8 @@ export class ApiTokenService {
|
|||||||
IUnleashStores,
|
IUnleashStores,
|
||||||
'apiTokenStore' | 'environmentStore' | 'eventStore'
|
'apiTokenStore' | 'environmentStore' | 'eventStore'
|
||||||
>,
|
>,
|
||||||
config: Pick<
|
config: Pick<IUnleashConfig, 'getLogger' | 'authentication'>,
|
||||||
IUnleashConfig,
|
|
||||||
'getLogger' | 'authentication' | 'flagResolver'
|
|
||||||
>,
|
|
||||||
) {
|
) {
|
||||||
this.flagResolver = config.flagResolver;
|
|
||||||
this.store = apiTokenStore;
|
this.store = apiTokenStore;
|
||||||
this.eventStore = eventStore;
|
this.eventStore = eventStore;
|
||||||
this.environmentStore = environmentStore;
|
this.environmentStore = environmentStore;
|
||||||
@ -87,9 +80,7 @@ export class ApiTokenService {
|
|||||||
() => this.fetchActiveTokens(),
|
() => this.fetchActiveTokens(),
|
||||||
minutesToMilliseconds(1),
|
minutesToMilliseconds(1),
|
||||||
).unref();
|
).unref();
|
||||||
if (this.flagResolver.isEnabled('tokensLastSeen')) {
|
|
||||||
this.updateLastSeen();
|
this.updateLastSeen();
|
||||||
}
|
|
||||||
if (config.authentication.initApiTokens.length > 0) {
|
if (config.authentication.initApiTokens.length > 0) {
|
||||||
process.nextTick(async () =>
|
process.nextTick(async () =>
|
||||||
this.initApiTokens(config.authentication.initApiTokens),
|
this.initApiTokens(config.authentication.initApiTokens),
|
||||||
@ -164,9 +155,7 @@ export class ApiTokenService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (token) {
|
if (token) {
|
||||||
if (this.flagResolver.isEnabled('tokensLastSeen')) {
|
|
||||||
this.lastSeenSecrets.add(token.secret);
|
this.lastSeenSecrets.add(token.secret);
|
||||||
}
|
|
||||||
|
|
||||||
return new ApiUser({
|
return new ApiUser({
|
||||||
username: token.username,
|
username: token.username,
|
||||||
|
@ -28,7 +28,6 @@ import PasswordMismatch from '../error/password-mismatch';
|
|||||||
import BadDataError from '../error/bad-data-error';
|
import BadDataError from '../error/bad-data-error';
|
||||||
import { isDefined } from '../util/isDefined';
|
import { isDefined } from '../util/isDefined';
|
||||||
import { TokenUserSchema } from '../openapi/spec/token-user-schema';
|
import { TokenUserSchema } from '../openapi/spec/token-user-schema';
|
||||||
import { IFlagResolver } from 'lib/types/experimental';
|
|
||||||
import { minutesToMilliseconds } from 'date-fns';
|
import { minutesToMilliseconds } from 'date-fns';
|
||||||
|
|
||||||
const systemUser = new User({ id: -1, username: 'system' });
|
const systemUser = new User({ id: -1, username: 'system' });
|
||||||
@ -84,18 +83,12 @@ class UserService {
|
|||||||
|
|
||||||
private lastSeenSecrets: Set<string> = new Set<string>();
|
private lastSeenSecrets: Set<string> = new Set<string>();
|
||||||
|
|
||||||
private flagResolver: IFlagResolver;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
stores: Pick<IUnleashStores, 'userStore' | 'eventStore'>,
|
stores: Pick<IUnleashStores, 'userStore' | 'eventStore'>,
|
||||||
{
|
{
|
||||||
getLogger,
|
getLogger,
|
||||||
authentication,
|
authentication,
|
||||||
flagResolver,
|
}: Pick<IUnleashConfig, 'getLogger' | 'authentication'>,
|
||||||
}: Pick<
|
|
||||||
IUnleashConfig,
|
|
||||||
'getLogger' | 'authentication' | 'flagResolver'
|
|
||||||
>,
|
|
||||||
services: {
|
services: {
|
||||||
accessService: AccessService;
|
accessService: AccessService;
|
||||||
resetTokenService: ResetTokenService;
|
resetTokenService: ResetTokenService;
|
||||||
@ -104,7 +97,6 @@ class UserService {
|
|||||||
settingService: SettingService;
|
settingService: SettingService;
|
||||||
},
|
},
|
||||||
) {
|
) {
|
||||||
this.flagResolver = flagResolver;
|
|
||||||
this.logger = getLogger('service/user-service.js');
|
this.logger = getLogger('service/user-service.js');
|
||||||
this.store = stores.userStore;
|
this.store = stores.userStore;
|
||||||
this.eventStore = stores.eventStore;
|
this.eventStore = stores.eventStore;
|
||||||
@ -116,10 +108,8 @@ class UserService {
|
|||||||
if (authentication && authentication.createAdminUser) {
|
if (authentication && authentication.createAdminUser) {
|
||||||
process.nextTick(() => this.initAdminUser());
|
process.nextTick(() => this.initAdminUser());
|
||||||
}
|
}
|
||||||
if (this.flagResolver.isEnabled('tokensLastSeen')) {
|
|
||||||
this.updateLastSeen();
|
this.updateLastSeen();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
validatePassword(password: string): boolean {
|
validatePassword(password: string): boolean {
|
||||||
if (password) {
|
if (password) {
|
||||||
@ -457,10 +447,8 @@ class UserService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addPATSeen(secret: string): void {
|
addPATSeen(secret: string): void {
|
||||||
if (this.flagResolver.isEnabled('tokensLastSeen')) {
|
|
||||||
this.lastSeenSecrets.add(secret);
|
this.lastSeenSecrets.add(secret);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
destroy(): void {
|
destroy(): void {
|
||||||
clearTimeout(this.seenTimer);
|
clearTimeout(this.seenTimer);
|
||||||
|
@ -34,10 +34,6 @@ export const defaultExperimentalOptions = {
|
|||||||
process.env.UNLEASH_EXPERIMENTAL_VARIANTS_PER_ENVIRONMENT,
|
process.env.UNLEASH_EXPERIMENTAL_VARIANTS_PER_ENVIRONMENT,
|
||||||
false,
|
false,
|
||||||
),
|
),
|
||||||
tokensLastSeen: parseEnvVarBoolean(
|
|
||||||
process.env.UNLEASH_EXPERIMENTAL_TOKENS_LAST_SEEN,
|
|
||||||
false,
|
|
||||||
),
|
|
||||||
favorites: parseEnvVarBoolean(
|
favorites: parseEnvVarBoolean(
|
||||||
process.env.UNLEASH_EXPERIMENTAL_FAVORITES,
|
process.env.UNLEASH_EXPERIMENTAL_FAVORITES,
|
||||||
false,
|
false,
|
||||||
@ -61,7 +57,6 @@ export interface IExperimentalOptions {
|
|||||||
changeRequests?: boolean;
|
changeRequests?: boolean;
|
||||||
proxyReturnAllToggles?: boolean;
|
proxyReturnAllToggles?: boolean;
|
||||||
variantsPerEnvironment?: boolean;
|
variantsPerEnvironment?: boolean;
|
||||||
tokensLastSeen?: boolean;
|
|
||||||
favorites?: boolean;
|
favorites?: boolean;
|
||||||
networkView?: boolean;
|
networkView?: boolean;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user