mirror of
https://github.com/Unleash/unleash.git
synced 2025-02-23 00:22:19 +01:00
fix: add projects api for oss as well
This commit is contained in:
parent
737e00e1e2
commit
54a99460ce
@ -6,6 +6,7 @@ import { IProject } from '../types/model';
|
||||
import {
|
||||
IProjectHealthUpdate,
|
||||
IProjectInsert,
|
||||
IProjectQuery,
|
||||
IProjectStore,
|
||||
} from '../types/stores/project-store';
|
||||
import { DEFAULT_ENV } from '../util/constants';
|
||||
@ -43,10 +44,11 @@ class ProjectStore implements IProjectStore {
|
||||
return present;
|
||||
}
|
||||
|
||||
async getAll(): Promise<IProject[]> {
|
||||
async getAll(query: IProjectQuery = {}): Promise<IProject[]> {
|
||||
const rows = await this.db
|
||||
.select(COLUMNS)
|
||||
.from(TABLE)
|
||||
.where(query)
|
||||
.orderBy('name', 'asc');
|
||||
|
||||
return rows.map(this.mapRow);
|
||||
|
@ -1,15 +1,28 @@
|
||||
import { Request, Response } from 'express';
|
||||
import Controller from '../../controller';
|
||||
import { IUnleashConfig } from '../../../types/option';
|
||||
import { IUnleashServices } from '../../../types/services';
|
||||
import ProjectFeaturesController from './features';
|
||||
import EnvironmentsController from './environments';
|
||||
import ProjectHealthReport from './health-report';
|
||||
import ProjectService from '../../../services/project-service';
|
||||
|
||||
export default class ProjectApi extends Controller {
|
||||
private projectService: ProjectService;
|
||||
|
||||
constructor(config: IUnleashConfig, services: IUnleashServices) {
|
||||
super(config);
|
||||
this.projectService = services.projectService;
|
||||
this.get('/', this.getProjects);
|
||||
this.use('/', new ProjectFeaturesController(config, services).router);
|
||||
this.use('/', new EnvironmentsController(config, services).router);
|
||||
this.use('/', new ProjectHealthReport(config, services).router);
|
||||
}
|
||||
|
||||
async getProjects(req: Request, res: Response): Promise<void> {
|
||||
const projects = await this.projectService.getProjects({
|
||||
id: 'default',
|
||||
});
|
||||
res.json({ version: 1, projects }).end();
|
||||
}
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ import { IEnvironmentStore } from '../types/stores/environment-store';
|
||||
import { IFeatureTypeStore } from '../types/stores/feature-type-store';
|
||||
import { IFeatureToggleStore } from '../types/stores/feature-toggle-store';
|
||||
import { IFeatureEnvironmentStore } from '../types/stores/feature-environment-store';
|
||||
import { IProjectStore } from '../types/stores/project-store';
|
||||
import { IProjectQuery, IProjectStore } from '../types/stores/project-store';
|
||||
import { IRole } from '../types/stores/access-store';
|
||||
import { IEventStore } from '../types/stores/event-store';
|
||||
import FeatureToggleServiceV2 from './feature-toggle-service-v2';
|
||||
@ -91,8 +91,8 @@ export default class ProjectService {
|
||||
this.logger = config.getLogger('services/project-service.js');
|
||||
}
|
||||
|
||||
async getProjects(): Promise<IProjectWithCount[]> {
|
||||
const projects = await this.store.getAll();
|
||||
async getProjects(query?: IProjectQuery): Promise<IProjectWithCount[]> {
|
||||
const projects = await this.store.getAll(query);
|
||||
const projectsWithCount = await Promise.all(
|
||||
projects.map(async (p) => {
|
||||
let featureCount = 0;
|
||||
|
@ -17,6 +17,10 @@ export interface IProjectHealthUpdate {
|
||||
health: number;
|
||||
}
|
||||
|
||||
export interface IProjectQuery {
|
||||
id?: string;
|
||||
}
|
||||
|
||||
export interface IProjectStore extends Store<IProject, string> {
|
||||
hasProject(id: string): Promise<boolean>;
|
||||
updateHealth(healthUpdate: IProjectHealthUpdate): Promise<void>;
|
||||
@ -28,4 +32,5 @@ export interface IProjectStore extends Store<IProject, string> {
|
||||
getEnvironmentsForProject(id: string): Promise<string[]>;
|
||||
getMembers(projectId: string): Promise<number>;
|
||||
count(): Promise<number>;
|
||||
getAll(query?: IProjectQuery): Promise<IProject[]>;
|
||||
}
|
||||
|
32
src/test/e2e/api/admin/project/projects.e2e.test.ts
Normal file
32
src/test/e2e/api/admin/project/projects.e2e.test.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import dbInit from '../../../helpers/database-init';
|
||||
import { setupApp } from '../../../helpers/test-helper';
|
||||
import getLogger from '../../../../fixtures/no-logger';
|
||||
import ProjectStore from '../../../../../lib/db/project-store';
|
||||
|
||||
let app;
|
||||
let db;
|
||||
|
||||
let projectStore: ProjectStore;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = await dbInit('projects_api_serial', getLogger);
|
||||
app = await setupApp(db.stores);
|
||||
projectStore = db.stores.projectStore;
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await app.destroy();
|
||||
await db.destroy();
|
||||
});
|
||||
|
||||
test('Should ONLY return default project', async () => {
|
||||
projectStore.create({ id: 'test2', name: 'test', description: '' });
|
||||
|
||||
const { body } = await app.request
|
||||
.get('/api/admin/projects')
|
||||
.expect(200)
|
||||
.expect('Content-Type', /json/);
|
||||
|
||||
expect(body.projects).toHaveLength(1);
|
||||
expect(body.projects[0].id).toBe('default');
|
||||
});
|
Loading…
Reference in New Issue
Block a user