2018-02-18 08:11:48 +00:00
|
|
|
|
// @flow
|
2020-12-20 19:39:09 +00:00
|
|
|
|
import { Attachment, Team, User, Collection, Document, Group } from "../models";
|
2020-06-20 20:59:15 +00:00
|
|
|
|
import policy from "./policy";
|
|
|
|
|
import "./apiKey";
|
2020-12-20 19:39:09 +00:00
|
|
|
|
import "./attachment";
|
2021-03-26 18:31:07 +00:00
|
|
|
|
import "./authenticationProvider";
|
2020-06-20 20:59:15 +00:00
|
|
|
|
import "./collection";
|
|
|
|
|
import "./document";
|
|
|
|
|
import "./integration";
|
|
|
|
|
import "./notificationSetting";
|
|
|
|
|
import "./share";
|
|
|
|
|
import "./user";
|
|
|
|
|
import "./team";
|
|
|
|
|
import "./group";
|
2018-02-18 08:11:48 +00:00
|
|
|
|
|
2019-08-22 04:41:37 +00:00
|
|
|
|
const { can, abilities } = policy;
|
|
|
|
|
|
|
|
|
|
type Policy = {
|
|
|
|
|
[key: string]: boolean,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
2020-08-09 01:53:11 +00:00
|
|
|
|
* 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.
|
|
|
|
|
*/
|
2019-08-22 04:41:37 +00:00
|
|
|
|
export function serialize(
|
|
|
|
|
model: User,
|
2020-12-20 19:39:09 +00:00
|
|
|
|
target: Attachment | Team | Collection | Document | Group
|
2019-08-22 04:41:37 +00:00
|
|
|
|
): Policy {
|
|
|
|
|
let output = {};
|
|
|
|
|
|
2020-08-09 01:53:11 +00:00
|
|
|
|
abilities.forEach((ability) => {
|
2019-08-22 04:41:37 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2018-02-18 08:11:48 +00:00
|
|
|
|
export default policy;
|