1
0
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:
Ivar Conradi Østhus 2021-10-01 10:59:43 +02:00
parent 737e00e1e2
commit 54a99460ce
No known key found for this signature in database
GPG Key ID: 31AC596886B0BD09
5 changed files with 56 additions and 4 deletions

View File

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

View File

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

View File

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

View File

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

View 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');
});