2024-03-18 13:58:05 +01:00
|
|
|
import type { Db } from '../../db/db';
|
|
|
|
import type { Logger, LogProvider } from '../../logger';
|
|
|
|
import type { IPrivateProjectStore } from './privateProjectStoreType';
|
2024-01-30 10:03:15 +01:00
|
|
|
import { ADMIN_TOKEN_USER } from '../../types';
|
2023-09-15 14:52:54 +02:00
|
|
|
|
2023-09-22 10:54:33 +02:00
|
|
|
export type ProjectAccess =
|
|
|
|
| {
|
|
|
|
mode: 'all';
|
|
|
|
}
|
|
|
|
| {
|
|
|
|
mode: 'limited';
|
|
|
|
projects: string[];
|
|
|
|
};
|
|
|
|
|
|
|
|
export const ALL_PROJECT_ACCESS: ProjectAccess = {
|
|
|
|
mode: 'all',
|
|
|
|
};
|
2023-09-20 07:37:52 +02:00
|
|
|
|
2023-09-15 14:52:54 +02:00
|
|
|
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 {}
|
|
|
|
|
2023-09-22 10:54:33 +02:00
|
|
|
async getUserAccessibleProjects(userId: number): Promise<ProjectAccess> {
|
2024-01-30 10:03:15 +01:00
|
|
|
if (userId === ADMIN_TOKEN_USER.id) {
|
2023-09-22 10:54:33 +02:00
|
|
|
return ALL_PROJECT_ACCESS;
|
2023-09-20 07:37:52 +02:00
|
|
|
}
|
|
|
|
const isViewer = await this.db('role_user')
|
2023-09-18 10:06:26 +02:00
|
|
|
.join('roles', 'role_user.role_id', 'roles.id')
|
|
|
|
.where('role_user.user_id', userId)
|
2023-09-20 07:37:52 +02:00
|
|
|
.andWhere({
|
|
|
|
'roles.name': 'Viewer',
|
|
|
|
'roles.type': 'root',
|
2023-09-18 10:06:26 +02:00
|
|
|
})
|
|
|
|
.count('*')
|
2023-10-31 12:37:09 +01:00
|
|
|
.then((res) => Number(res[0].count));
|
2023-09-18 10:06:26 +02:00
|
|
|
|
2023-10-31 12:37:09 +01:00
|
|
|
if (isViewer === 0) {
|
2023-09-22 10:54:33 +02:00
|
|
|
return ALL_PROJECT_ACCESS;
|
2023-09-18 10:06:26 +02:00
|
|
|
}
|
|
|
|
|
2023-09-22 10:54:33 +02:00
|
|
|
const accessibleProjects: string[] = await this.db
|
2023-09-15 14:52:54 +02:00
|
|
|
.from((db) => {
|
2023-09-20 07:37:52 +02:00
|
|
|
db.distinct()
|
2023-09-18 10:06:26 +02:00
|
|
|
.select('projects.id as project_id')
|
|
|
|
.from('projects')
|
|
|
|
.leftJoin(
|
|
|
|
'project_settings',
|
|
|
|
'projects.id',
|
|
|
|
'project_settings.project',
|
|
|
|
)
|
2023-09-22 10:54:33 +02:00
|
|
|
.where((builder) => {
|
|
|
|
builder
|
|
|
|
.whereNull('project_settings.project')
|
|
|
|
.orWhere(
|
|
|
|
'project_settings.project_mode',
|
|
|
|
'!=',
|
|
|
|
'private',
|
|
|
|
);
|
|
|
|
})
|
2023-09-18 10:06:26 +02:00
|
|
|
.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-20 07:37:52 +02:00
|
|
|
.select('*')
|
|
|
|
.pluck('project_id');
|
2023-09-18 10:06:26 +02:00
|
|
|
|
2023-09-22 10:54:33 +02:00
|
|
|
return { mode: 'limited', projects: accessibleProjects };
|
2023-09-15 14:52:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default PrivateProjectStore;
|