Explorar el Código

fix: Various fixes and tweaks

Owen Diffey hace 1 año
padre
commit
c6bf02c58b

+ 9 - 4
backend/src/JobContext.ts

@@ -92,9 +92,10 @@ export default class JobContext {
 	public async assertPermission(permission: string) {
 		let hasPermission = false;
 
-		const [, moduleName, modelOrJobName, jobName, modelId] =
-			/^([a-z]+)\.([a-z]+)\.([A-z]+)\.?([A-z0-9]+)?$/.exec(permission) ??
-			[];
+		const [, moduleName, modelOrJobName, jobName, modelId, extra] =
+			/^([a-z]+)\.([A-z]+)\.([A-z]+)(?:\.([A-z0-9]{24}))?(?:\.([A-z]+))?$/.exec(
+				permission
+			) ?? [];
 
 		if (moduleName === "data" && modelOrJobName && jobName) {
 			const GetModelPermissions = DataModule.getJob(
@@ -106,7 +107,11 @@ export default class JobContext {
 				modelId
 			})) as GetModelPermissionsResult;
 
-			hasPermission = permissions[`data.${modelOrJobName}.${jobName}`];
+			let modelPermission = `data.${modelOrJobName}.${jobName}`;
+
+			if (extra) modelPermission += `.${extra}`;
+
+			hasPermission = permissions[modelPermission];
 		} else {
 			const GetPermissions = DataModule.getJob("users.getPermissions");
 

+ 16 - 6
backend/src/modules/DataModule/models/users/jobs/GetModelPermissions.ts

@@ -57,7 +57,15 @@ export default class GetModelPermissions extends DataModuleJob {
 
 		if (modelId && !model) throw new Error("Model not found");
 
-		const jobs = (await forEachIn(
+		const modelPermissions = Object.fromEntries(
+			Object.entries(permissions).filter(
+				([permission]) =>
+					permission.startsWith(`data.${modelName}.`) ||
+					permission.startsWith(`event.data.${modelName}.`)
+			)
+		);
+
+		await forEachIn(
 			Object.entries(
 				ModuleManager.getModule("data")?.getJobs() ?? {}
 			).filter(
@@ -75,17 +83,19 @@ export default class GetModelPermissions extends DataModuleJob {
 						permissions[`${jobName}.*`] ||
 						permissions[`${jobName}.${modelId}`];
 
-				if (hasPermission) return [jobName, true];
+				if (hasPermission) {
+					modelPermissions[jobName] = true;
+
+					return;
+				}
 
 				if (typeof Job.hasPermission === "function") {
 					hasPermission = await Job.hasPermission(model, user);
 				}
 
-				return [jobName, !!hasPermission];
+				modelPermissions[jobName] = !!hasPermission;
 			}
-		)) as [string, boolean][];
-
-		const modelPermissions = Object.fromEntries(jobs);
+		);
 
 		await CacheModule.set(cacheKey, modelPermissions, 360);
 

+ 2 - 2
frontend/src/pages/Home.vue

@@ -159,7 +159,7 @@ const changeFavoriteOrder = ({ moved }) => {
 };
 
 watch(
-	() => hasPermission("stations.index.other"),
+	() => hasPermission("data.stations.index.adminFilter"),
 	value => {
 		if (!value && route.query.adminFilter === null)
 			router.push({
@@ -338,7 +338,7 @@ onMounted(async () => {
 		ctrl: true,
 		alt: true,
 		handler: () => {
-			if (hasPermission("stations.index.other"))
+			if (hasPermission("data.stations.index.adminFilter"))
 				if (route.query.adminFilter === undefined)
 					router.push({
 						query: {

+ 1 - 1
frontend/src/pages/News.vue

@@ -44,7 +44,7 @@ onMounted(async () => {
 	});
 
 	await onCreated("news", async ({ doc }) => {
-		const [newDoc] = await registerModels(doc);
+		const [newDoc] = await registerModels(doc, { news: "createdBy" });
 		news.value.unshift(newDoc);
 	});
 

+ 4 - 4
frontend/src/stores/model.ts

@@ -8,7 +8,7 @@ export const useModelStore = defineStore("model", () => {
 	const { runJob, subscribe, unsubscribe } = useWebsocketStore();
 
 	const models = ref([]);
-	const permissions = ref(null);
+	const permissions = ref({});
 	const createdSubcription = ref(null);
 	const subscriptions = ref({
 		created: {},
@@ -17,15 +17,15 @@ export const useModelStore = defineStore("model", () => {
 	});
 
 	const getUserModelPermissions = async (modelName: string) => {
-		if (permissions.value) return permissions.value;
+		if (permissions.value[modelName]) return permissions.value[modelName];
 
 		const data = await runJob("data.users.getModelPermissions", {
 			modelName
 		});
 
-		permissions.value = data;
+		permissions.value[modelName] = data;
 
-		return permissions.value;
+		return permissions.value[modelName];
 	};
 
 	const hasPermission = async (modelName: string, permission: string) => {

+ 7 - 2
frontend/src/stores/websocket.ts

@@ -44,7 +44,10 @@ export const useWebsocketStore = defineStore("websocket", () => {
 				callbacks: {}
 			};
 
-		if (!socketChannels.includes(channel)) {
+		if (
+			!socketChannels.includes(channel) &&
+			subscriptions.value[channel].status !== "subscribed"
+		) {
 			subscriptions.value[channel].status = "subscribing";
 			await runJob("events.subscribe", { channel });
 		}
@@ -62,7 +65,9 @@ export const useWebsocketStore = defineStore("websocket", () => {
 		channels: Record<string, (data?: any) => any>
 	) => {
 		const channelsToSubscribeTo = Object.keys(channels).filter(
-			channel => !socketChannels.includes(channel)
+			channel =>
+				!socketChannels.includes(channel) &&
+				subscriptions.value[channel]?.status !== "subscribed"
 		);
 
 		channelsToSubscribeTo.forEach(channel => {