Compare commits

...

2 Commits

Author SHA1 Message Date
Tom Moor 6146843845 test: Load policies 2021-07-30 11:47:42 -04:00
Tom Moor 26c5d5e4fe perf: Remove inline require call 2021-07-30 11:31:38 -04:00
7 changed files with 44 additions and 39 deletions
+3 -1
View File
@@ -2,7 +2,9 @@
import { CollectionUser, Collection } from "../models";
import { buildUser, buildTeam, buildCollection } from "../test/factories";
import { flushdb } from "../test/support";
import { serialize } from "./index";
import "./";
import serialize from "./serializer";
beforeEach(() => flushdb());
+3 -1
View File
@@ -6,7 +6,9 @@ import {
buildCollection,
} from "../test/factories";
import { flushdb } from "../test/support";
import { serialize } from "./index";
import "./";
import serialize from "./serializer";
beforeEach(() => flushdb());
-33
View File
@@ -1,5 +1,4 @@
// @flow
import { Attachment, Team, User, Collection, Document, Group } from "../models";
import policy from "./policy";
import "./apiKey";
import "./attachment";
@@ -13,36 +12,4 @@ import "./user";
import "./team";
import "./group";
const { can, abilities } = policy;
type Policy = {
[key: string]: boolean,
};
/*
* Given a user and a model output an object which describes the actions the
* user may take against the model. This serialized policy is used for testing
* and sent in API responses to allow clients to adjust which UI is displayed.
*/
export function serialize(
model: User,
target: Attachment | Team | Collection | Document | Group
): Policy {
let output = {};
abilities.forEach((ability) => {
if (model instanceof ability.model && target instanceof ability.target) {
let response = true;
try {
response = can(model, ability.action, target);
} catch (err) {
response = false;
}
output[ability.action] = response;
}
});
return output;
}
export default policy;
+3 -1
View File
@@ -1,7 +1,9 @@
// @flow
import { buildUser, buildTeam } from "../test/factories";
import { flushdb } from "../test/support";
import { serialize } from "./index";
import "./";
import serialize from "./serializer";
beforeEach(() => flushdb());
+31
View File
@@ -0,0 +1,31 @@
// @flow
import policy from "./policy";
const { can, abilities } = policy;
type Policy = {
[key: string]: boolean,
};
/*
* Given a user and a model output an object which describes the actions the
* user may take against the model. This serialized policy is used for testing
* and sent in API responses to allow clients to adjust which UI is displayed.
*/
export default function serialize(model: Object, target: Object): Policy {
let output = {};
abilities.forEach((ability) => {
if (model instanceof ability.model && target instanceof ability.target) {
let response = true;
try {
response = can(model, ability.action, target);
} catch (err) {
response = false;
}
output[ability.action] = response;
}
});
return output;
}
+3 -1
View File
@@ -1,7 +1,9 @@
// @flow
import { buildUser, buildTeam, buildAdmin } from "../test/factories";
import { flushdb } from "../test/support";
import { serialize } from "./index";
import "./";
import serialize from "./serializer";
beforeEach(() => flushdb());
+1 -2
View File
@@ -1,11 +1,10 @@
// @flow
import { User } from "../models";
import serialize from "../policies/serializer";
type Policy = { id: string, abilities: { [key: string]: boolean } };
export default function present(user: User, objects: Object[]): Policy[] {
const { serialize } = require("../policies");
return objects.map((object) => ({
id: object.id,
abilities: serialize(user, object),