1
0
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:
Nuno Góis 2022-12-12 14:32:35 +00:00 committed by GitHub
parent e8d0fdba1f
commit 5086ec7921
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 9 additions and 61 deletions

View File

@ -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

View File

@ -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 = {};

View File

@ -53,7 +53,7 @@ export const Profile = () => {
/> />
<ConditionallyRender <ConditionallyRender
condition={tab === 'pat'} condition={tab === 'pat'}
show={<PersonalAPITokensTab user={user!} />} show={<PersonalAPITokensTab />}
/> />
</VerticalTabs> </VerticalTabs>
); );

View File

@ -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;
} }

View File

@ -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": {

View File

@ -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,

View File

@ -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);

View File

@ -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;
}; };