mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const NameExistsError = require('../error/name-exists-error');
 | |
| const InvalidOperationError = require('../error/invalid-operation-error');
 | |
| const eventType = require('../event-type');
 | |
| const { nameType } = require('../routes/admin-api/util');
 | |
| const schema = require('./project-schema');
 | |
| 
 | |
| class ProjectService {
 | |
|     constructor(
 | |
|         { projectStore, eventStore, featureToggleStore },
 | |
|         { getLogger },
 | |
|     ) {
 | |
|         this.projectStore = projectStore;
 | |
|         this.eventStore = eventStore;
 | |
|         this.featureToggleStore = featureToggleStore;
 | |
|         this.logger = getLogger('services/project-service.js');
 | |
|     }
 | |
| 
 | |
|     async getProjects() {
 | |
|         return this.projectStore.getAll();
 | |
|     }
 | |
| 
 | |
|     async getProject(id) {
 | |
|         return this.projectStore.get(id);
 | |
|     }
 | |
| 
 | |
|     async createProject(newProject, username) {
 | |
|         const data = await schema.validateAsync(newProject);
 | |
|         await this.validateUniqueId(data);
 | |
|         await this.eventStore.store({
 | |
|             type: eventType.PROJECT_CREATED,
 | |
|             createdBy: username,
 | |
|             data,
 | |
|         });
 | |
|         await this.projectStore.create(data);
 | |
|     }
 | |
| 
 | |
|     async updateProject(updatedProject, username) {
 | |
|         await this.projectStore.get(updatedProject.id);
 | |
|         const project = await schema.validateAsync(updatedProject);
 | |
|         await this.eventStore.store({
 | |
|             type: eventType.PROJECT_UPDATED,
 | |
|             createdBy: username,
 | |
|             data: project,
 | |
|         });
 | |
|         await this.projectStore.update(project);
 | |
|     }
 | |
| 
 | |
|     async deleteProject(id, username) {
 | |
|         if (id === 'default') {
 | |
|             throw new InvalidOperationError(
 | |
|                 'You can not delete the default project!',
 | |
|             );
 | |
|         }
 | |
| 
 | |
|         const toggles = await this.featureToggleStore.getFeaturesBy({
 | |
|             project: id,
 | |
|             archived: 0,
 | |
|         });
 | |
| 
 | |
|         if (toggles.length > 0) {
 | |
|             throw new InvalidOperationError(
 | |
|                 'You can not delete as project with active feature toggles',
 | |
|             );
 | |
|         }
 | |
| 
 | |
|         await this.eventStore.store({
 | |
|             type: eventType.PROJECT_DELETED,
 | |
|             createdBy: username,
 | |
|             data: { id },
 | |
|         });
 | |
|         await this.projectStore.delete(id);
 | |
|     }
 | |
| 
 | |
|     async validateId(id) {
 | |
|         await nameType.validateAsync(id);
 | |
|         await this.validateUniqueId(id);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     async validateUniqueId(id) {
 | |
|         try {
 | |
|             await this.projectStore.hasProject(id);
 | |
|         } catch (error) {
 | |
|             // No conflict, everything ok!
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         // Interntional throw here!
 | |
|         throw new NameExistsError('A project with this id already exists.');
 | |
|     }
 | |
| }
 | |
| 
 | |
| module.exports = ProjectService;
 |