import User, { IUser } from '../types/user';
import { AccessService } from './access-service';
import { IUnleashStores, IUnleashConfig } from '../types';
import { FeatureToggle, IProject, IProjectOverview, IProjectWithCount, IUserWithRole } from '../types/model';
import { IProjectQuery } from '../types/stores/project-store';
import { IProjectAccessModel, IRoleDescriptor } from '../types/stores/access-store';
import FeatureToggleService from './feature-toggle-service';
import { GroupService } from './group-service';
import { IGroupModelWithProjectRole, IGroupRole } from 'lib/types/group';
export interface AccessWithRoles {
    users: IUserWithRole[];
    roles: IRoleDescriptor[];
    groups: IGroupModelWithProjectRole[];
}
export default class ProjectService {
    private store;
    private accessService;
    private eventStore;
    private featureToggleStore;
    private featureTypeStore;
    private featureEnvironmentStore;
    private environmentStore;
    private groupService;
    private logger;
    private featureToggleService;
    private tagStore;
    private userStore;
    constructor({ projectStore, eventStore, featureToggleStore, featureTypeStore, environmentStore, featureEnvironmentStore, featureTagStore, userStore, }: Pick<IUnleashStores, 'projectStore' | 'eventStore' | 'featureToggleStore' | 'featureTypeStore' | 'environmentStore' | 'featureEnvironmentStore' | 'featureTagStore' | 'userStore'>, config: IUnleashConfig, accessService: AccessService, featureToggleService: FeatureToggleService, groupService: GroupService);
    getProjects(query?: IProjectQuery, userId?: number): Promise<IProjectWithCount[]>;
    getProject(id: string): Promise<IProject>;
    createProject(newProject: Pick<IProject, 'id' | 'name'>, user: IUser): Promise<IProject>;
    updateProject(updatedProject: IProject, user: User): Promise<void>;
    checkProjectsCompatibility(feature: FeatureToggle, newProjectId: string): Promise<boolean>;
    addEnvironmentToProject(project: string, environment: string): Promise<void>;
    changeProject(newProjectId: string, featureName: string, user: User, currentProjectId: string): Promise<any>;
    deleteProject(id: string, user: User): Promise<void>;
    validateId(id: string): Promise<boolean>;
    validateUniqueId(id: string): Promise<void>;
    getAccessToProject(projectId: string): Promise<AccessWithRoles>;
    addUser(projectId: string, roleId: number, userId: number, createdBy: string): Promise<void>;
    removeUser(projectId: string, roleId: number, userId: number, createdBy: string): Promise<void>;
    addGroup(projectId: string, roleId: number, groupId: number, modifiedBy: string): Promise<void>;
    removeGroup(projectId: string, roleId: number, groupId: number, modifiedBy: string): Promise<void>;
    addAccess(projectId: string, roleId: number, usersAndGroups: IProjectAccessModel, createdBy: string): Promise<void>;
    findProjectGroupRole(projectId: string, roleId: number): Promise<IGroupRole>;
    findProjectRole(projectId: string, roleId: number): Promise<IRoleDescriptor>;
    validateAtLeastOneOwner(projectId: string, currentRole: IRoleDescriptor): Promise<void>;
    changeRole(projectId: string, roleId: number, userId: number, createdBy: string): Promise<void>;
    changeGroupRole(projectId: string, roleId: number, userId: number, createdBy: string): Promise<void>;
    getMembers(projectId: string): Promise<number>;
    getProjectsByUser(userId: number): Promise<string[]>;
    getProjectOverview(projectId: string, archived?: boolean): Promise<IProjectOverview>;
}
