2023-09-15 14:52:54 +02:00
|
|
|
import { Db } from '../../db/db';
|
|
|
|
import { Logger, LogProvider } from '../../logger';
|
|
|
|
import { IPrivateProjectStore } from './privateProjectStoreType';
|
|
|
|
|
|
|
|
class PrivateProjectStore implements IPrivateProjectStore {
|
|
|
|
private db: Db;
|
|
|
|
|
|
|
|
private logger: Logger;
|
|
|
|
|
|
|
|
constructor(db: Db, getLogger: LogProvider) {
|
|
|
|
this.db = db;
|
|
|
|
this.logger = getLogger('project-permission-store.ts');
|
|
|
|
}
|
|
|
|
|
|
|
|
destroy(): void {}
|
|
|
|
|
|
|
|
async getUserAccessibleProjects(userId: number): Promise<string[]> {
|
2023-09-18 10:06:26 +02:00
|
|
|
const isNotViewer = await this.db('role_user')
|
|
|
|
.join('roles', 'role_user.role_id', 'roles.id')
|
|
|
|
.where('role_user.user_id', userId)
|
|
|
|
.andWhere((db) => {
|
|
|
|
db.whereNot({
|
|
|
|
'roles.name': 'Viewer',
|
|
|
|
'roles.type': 'root',
|
|
|
|
});
|
|
|
|
})
|
|
|
|
.count('*')
|
|
|
|
.first();
|
|
|
|
|
|
|
|
if (isNotViewer && isNotViewer.count > 0) {
|
|
|
|
const allProjects = await this.db('projects').pluck('id');
|
|
|
|
return allProjects;
|
|
|
|
}
|
|
|
|
|
|
|
|
const accessibleProjects = await this.db
|
2023-09-15 14:52:54 +02:00
|
|
|
.from((db) => {
|
2023-09-18 10:06:26 +02:00
|
|
|
db.distinct('accessible_projects.project_id')
|
|
|
|
.select('projects.id as project_id')
|
|
|
|
.from('projects')
|
|
|
|
.leftJoin(
|
|
|
|
'project_settings',
|
|
|
|
'projects.id',
|
|
|
|
'project_settings.project',
|
|
|
|
)
|
|
|
|
.where('project_settings.project_mode', '!=', 'private')
|
|
|
|
.unionAll((queryBuilder) => {
|
2023-09-15 14:52:54 +02:00
|
|
|
queryBuilder
|
2023-09-18 10:06:26 +02:00
|
|
|
.select('projects.id as project_id')
|
|
|
|
.from('projects')
|
|
|
|
.join(
|
|
|
|
'project_settings',
|
|
|
|
'projects.id',
|
|
|
|
'project_settings.project',
|
2023-09-15 14:52:54 +02:00
|
|
|
)
|
2023-09-18 10:06:26 +02:00
|
|
|
.where(
|
|
|
|
'project_settings.project_mode',
|
|
|
|
'=',
|
|
|
|
'private',
|
|
|
|
)
|
|
|
|
.whereIn('projects.id', (whereBuilder) => {
|
|
|
|
whereBuilder
|
|
|
|
.select('role_user.project')
|
|
|
|
.from('role_user')
|
|
|
|
.leftJoin(
|
|
|
|
'roles',
|
|
|
|
'role_user.role_id',
|
|
|
|
'roles.id',
|
|
|
|
)
|
|
|
|
.where('role_user.user_id', userId);
|
|
|
|
})
|
|
|
|
.orWhereIn('projects.id', (whereBuilder) => {
|
|
|
|
whereBuilder
|
|
|
|
.select('group_role.project')
|
|
|
|
.from('group_role')
|
|
|
|
.leftJoin(
|
|
|
|
'group_user',
|
|
|
|
'group_user.group_id',
|
|
|
|
'group_role.group_id',
|
|
|
|
)
|
|
|
|
.where('group_user.user_id', userId);
|
|
|
|
});
|
2023-09-15 14:52:54 +02:00
|
|
|
})
|
2023-09-18 10:06:26 +02:00
|
|
|
.as('accessible_projects');
|
2023-09-15 14:52:54 +02:00
|
|
|
})
|
2023-09-18 10:06:26 +02:00
|
|
|
.select('*');
|
|
|
|
|
|
|
|
return accessibleProjects;
|
2023-09-15 14:52:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default PrivateProjectStore;
|