mirror of
https://github.com/Unleash/unleash.git
synced 2025-09-05 17:53:12 +02:00
poc: just a small test
This commit is contained in:
parent
4754d203e4
commit
fe6236a3ec
@ -164,6 +164,11 @@ class EventStore extends EventEmitter implements IEventStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getLatestId(): Promise<number> {
|
||||||
|
const item = await this.db(TABLE).max('id').first();
|
||||||
|
return item.max;
|
||||||
|
}
|
||||||
|
|
||||||
rowToEvent(row: IEventTable): IEvent {
|
rowToEvent(row: IEventTable): IEvent {
|
||||||
return {
|
return {
|
||||||
id: row.id,
|
id: row.id,
|
||||||
|
@ -11,6 +11,7 @@ import NotFoundError from '../../error/notfound-error';
|
|||||||
import { IAuthRequest } from '../unleash-types';
|
import { IAuthRequest } from '../unleash-types';
|
||||||
import ApiUser from '../../types/api-user';
|
import ApiUser from '../../types/api-user';
|
||||||
import { ALL } from '../../types/models/api-token';
|
import { ALL } from '../../types/models/api-token';
|
||||||
|
import EventService from '../../services/event-service';
|
||||||
|
|
||||||
const version = 2;
|
const version = 2;
|
||||||
|
|
||||||
@ -24,19 +25,25 @@ export default class FeatureController extends Controller {
|
|||||||
|
|
||||||
private featureToggleServiceV2: FeatureToggleService;
|
private featureToggleServiceV2: FeatureToggleService;
|
||||||
|
|
||||||
|
private eventService: EventService;
|
||||||
|
|
||||||
private readonly cache: boolean;
|
private readonly cache: boolean;
|
||||||
|
|
||||||
private cachedFeatures: any;
|
private cachedFeatures: any;
|
||||||
|
|
||||||
|
private latestEventId: number;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
{
|
{
|
||||||
featureToggleServiceV2,
|
featureToggleServiceV2,
|
||||||
}: Pick<IUnleashServices, 'featureToggleServiceV2'>,
|
eventService,
|
||||||
|
}: Pick<IUnleashServices, 'featureToggleServiceV2' | 'eventService'>,
|
||||||
config: IUnleashConfig,
|
config: IUnleashConfig,
|
||||||
) {
|
) {
|
||||||
super(config);
|
super(config);
|
||||||
const { experimental } = config;
|
const { experimental } = config;
|
||||||
this.featureToggleServiceV2 = featureToggleServiceV2;
|
this.featureToggleServiceV2 = featureToggleServiceV2;
|
||||||
|
this.eventService = eventService;
|
||||||
this.logger = config.getLogger('client-api/feature.js');
|
this.logger = config.getLogger('client-api/feature.js');
|
||||||
this.get('/', this.getAll);
|
this.get('/', this.getAll);
|
||||||
this.get('/:featureName', this.getFeatureToggle);
|
this.get('/:featureName', this.getFeatureToggle);
|
||||||
@ -56,6 +63,20 @@ export default class FeatureController extends Controller {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (this.cache) {
|
||||||
|
process.nextTick(async () => {
|
||||||
|
this.latestEventId = await this.eventService.getLatestId();
|
||||||
|
setInterval(async () => {
|
||||||
|
const eventId = await this.eventService.getLatestId();
|
||||||
|
console.log(eventId);
|
||||||
|
if (this.latestEventId !== eventId) {
|
||||||
|
console.log('clear cache');
|
||||||
|
this.latestEventId = eventId;
|
||||||
|
await this.cachedFeatures.clear();
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async resolveQuery(
|
private async resolveQuery(
|
||||||
|
@ -28,6 +28,10 @@ export default class EventService {
|
|||||||
async getEventsForProject(project: string): Promise<IEvent[]> {
|
async getEventsForProject(project: string): Promise<IEvent[]> {
|
||||||
return this.eventStore.getEventsFilterByProject(project);
|
return this.eventStore.getEventsFilterByProject(project);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getLatestId(): Promise<number> {
|
||||||
|
return this.eventStore.getLatestId();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = EventService;
|
module.exports = EventService;
|
||||||
|
@ -420,6 +420,7 @@ class FeatureToggleService {
|
|||||||
async getClientFeatures(
|
async getClientFeatures(
|
||||||
query?: IFeatureToggleQuery,
|
query?: IFeatureToggleQuery,
|
||||||
): Promise<FeatureConfigurationClient[]> {
|
): Promise<FeatureConfigurationClient[]> {
|
||||||
|
console.log('fetch!');
|
||||||
return this.featureToggleClientStore.getClient(query);
|
return this.featureToggleClientStore.getClient(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,4 +9,5 @@ export interface IEventStore extends Store<IEvent, number>, EventEmitter {
|
|||||||
getEventsFilterByType(name: string): Promise<IEvent[]>;
|
getEventsFilterByType(name: string): Promise<IEvent[]>;
|
||||||
getEventsForFeature(featureName: string): Promise<IEvent[]>;
|
getEventsForFeature(featureName: string): Promise<IEvent[]>;
|
||||||
getEventsFilterByProject(project: string): Promise<IEvent[]>;
|
getEventsFilterByProject(project: string): Promise<IEvent[]>;
|
||||||
|
getLatestId(): Promise<number>;
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,10 @@ process.nextTick(async () => {
|
|||||||
metricsV2: {
|
metricsV2: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
},
|
},
|
||||||
|
clientFeatureMemoize: {
|
||||||
|
enabled: true,
|
||||||
|
maxAge: 120_000,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
authentication: {
|
authentication: {
|
||||||
initApiTokens: [
|
initApiTokens: [
|
||||||
|
4
src/test/fixtures/fake-event-store.ts
vendored
4
src/test/fixtures/fake-event-store.ts
vendored
@ -11,6 +11,10 @@ class FakeEventStore extends EventEmitter implements IEventStore {
|
|||||||
this.events = [];
|
this.events = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getLatestId(): Promise<number> {
|
||||||
|
return Promise.resolve(1);
|
||||||
|
}
|
||||||
|
|
||||||
async getEventsForFeature(featureName: string): Promise<IEvent[]> {
|
async getEventsForFeature(featureName: string): Promise<IEvent[]> {
|
||||||
return this.events.filter((e) => e.featureName === featureName);
|
return this.events.filter((e) => e.featureName === featureName);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user