new permissions

This commit is contained in:
Sacha Greif 2016-07-21 09:40:05 +09:00
parent 84331e4c67
commit 9cc7840b85
12 changed files with 74 additions and 34 deletions

View file

@ -581,6 +581,7 @@ comments.remove.all
users.edit.all
users.remove.all
categories.view.all
categories.new
categories.edit.all
categories.remove.all
```

View file

@ -41,7 +41,7 @@ class PostsEditForm extends Component{
return (
<div className="posts-edit-form">
{Users.is.admin(this.context.currentUser) ? this.renderAdminArea() : null}
{Users.canDo(this.context.currentUser, "posts.edit.all") ? this.renderAdminArea() : null}
<DocumentContainer
collection={Posts}
publication="posts.single"

View file

@ -10,7 +10,7 @@ const PostsViews = (props, context) => {
let views = ["top", "new", "best"];
const adminViews = ["pending", "rejected", "scheduled"];
if (Users.is.admin(context.currentUser)) {
if (Users.canDo(context.currentUser, "posts.edit.all")) {
views = views.concat(adminViews);
}

View file

@ -20,7 +20,7 @@ const UsersProfile = ({user, currentUser}) => {
<ul>
{twitterName ? <li><a href={"http://twitter.com/" + twitterName}>@{twitterName}</a></li> : null }
{user.telescope.website ? <li><a href={user.telescope.website}>{user.telescope.website}</a></li> : null }
{Users.is.admin(currentUser) ? <li><Link to={Users.getEditUrl(user)}><FormattedMessage id="users.edit_account"/></Link></li> : null}
{Users.canDo(currentUser, "users.edit.all") ? <li><Link to={Users.getEditUrl(user)}><FormattedMessage id="users.edit_account"/></Link></li> : null}
</ul>
<h3><FormattedMessage id="users.posts"/></h3>
<ListContainer

View file

@ -1,6 +1,16 @@
import Comments from './collection.js';
import Users from 'meteor/nova:users';
// check if user can create a new comment
const canInsert = user => Users.canDo(user, "comments.new");
// check if user can edit a comment
const canEdit = Users.canEdit;
// check if user can edit *all* comments
const canEditAll = user => Users.canDo(user, "comments.edit.all");
/**
* @summary Comments schema
* @type {SimpleSchema}
@ -21,7 +31,7 @@ Comments.schema = new SimpleSchema({
type: String,
// regEx: SimpleSchema.RegEx.Id,
max: 500,
insertableIf: Users.is.memberOrAdmin,
insertableIf: canInsert,
optional: true,
publish: true,
control: "none" // never show this
@ -33,7 +43,7 @@ Comments.schema = new SimpleSchema({
type: String,
// regEx: SimpleSchema.RegEx.Id,
max: 500,
insertableIf: Users.is.memberOrAdmin,
insertableIf: canInsert,
optional: true,
publish: true,
control: "none" // never show this
@ -60,8 +70,8 @@ Comments.schema = new SimpleSchema({
body: {
type: String,
max: 3000,
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin,
insertableIf: canInsert,
editableIf: canEdit,
publish: true,
control: "textarea"
},

View file

@ -1,7 +1,9 @@
import PostsImport from "meteor/nova:posts";
import CommentsImport from "meteor/nova:posts";
import UsersImport from "meteor/nova:posts";
import CategoriesImport from "meteor/nova:categories";
Posts = PostsImport;
Comments = CommentsImport;
Users = UsersImport;
Categories = CategoriesImport;

View file

@ -39,7 +39,8 @@ Package.onUse(function (api) {
api.export([
'Posts',
'Comments',
'Users'
'Users',
'Categories'
], ['client', 'server']);
});

View file

@ -4,6 +4,11 @@ import ThumbnailURL from './components/ThumbnailURL.jsx';
import Posts from "meteor/nova:posts";
import Users from 'meteor/nova:users';
// check if user can create a new post
const canInsert = user => Users.canDo(user, "posts.new");
// check if user can edit a post
const canEdit = Users.canEdit;
Posts.addField([
{
fieldName: 'url',
@ -11,8 +16,8 @@ Posts.addField([
type: String,
optional: true,
max: 500,
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin,
insertableIf: canInsert,
editableIf: canEdit,
control: EmbedlyURL,
publish: true
}
@ -22,8 +27,8 @@ Posts.addField([
fieldSchema: {
type: String,
optional: true,
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin,
insertableIf: canInsert,
editableIf: canEdit,
publish: true,
control: ThumbnailURL
}

View file

@ -2,6 +2,11 @@ import NewsletterSubscribe from './components/NewsletterSubscribe.jsx';
import Posts from "meteor/nova:posts";
import Users from 'meteor/nova:users';
// check if user can create a new account
const canInsert = user => Users.canDo(user, "users.new");
// check if user can edit a user
const canEdit = Users.canEdit;
Posts.addField({
fieldName: 'scheduledAt',
fieldSchema: {
@ -18,8 +23,8 @@ Users.addField([
type: Boolean,
optional: true,
publish: true,
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin,
insertableIf: canInsert,
editableIf: canEdit,
control: NewsletterSubscribe,
group: {
name: "newsletter",

View file

@ -5,6 +5,11 @@ const notificationsGroup = {
order: 2
};
// check if user can create a new account
const canInsert = user => Users.canDo(user, "users.new");
// check if user can edit a user
const canEdit = Users.canEdit;
// Add notifications options to user profile settings
Users.addField([
{
@ -28,8 +33,8 @@ Users.addField([
optional: true,
defaultValue: false,
control: "checkbox",
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin,
insertableIf: canInsert,
editableIf: canEdit,
group: notificationsGroup
}
}
@ -45,8 +50,8 @@ if (typeof Comments !== "undefined") {
optional: true,
defaultValue: true,
control: "checkbox",
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin
insertableIf: canInsert,
editableIf: canEdit
}
},
{
@ -57,8 +62,8 @@ if (typeof Comments !== "undefined") {
optional: true,
defaultValue: true,
control: "checkbox",
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin
insertableIf: canInsert,
editableIf: canEdit
}
}
]);

View file

@ -46,6 +46,15 @@ Posts.formGroups = {
}
};
// check if user can create a new post
const canInsert = user => Users.canDo(user, "posts.new");
// check if user can edit a post
const canEdit = Users.canEdit;
// check if user can edit *all* posts
const canEditAll = user => Users.canDo(user, "posts.edit.all");
/**
* @summary Posts schema
* @type {SimpleSchema}
@ -73,8 +82,8 @@ Posts.schemaJSON = {
postedAt: {
type: Date,
optional: true,
insertableIf: Users.is.admin,
editableIf: Users.is.admin,
insertableIf: canEditAll,
editableIf: canEditAll,
publish: true,
control: "datetime",
group: Posts.formGroups.admin
@ -86,8 +95,8 @@ Posts.schemaJSON = {
type: String,
optional: true,
max: 500,
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin,
insertableIf: canInsert,
editableIf: canEdit,
control: "text",
publish: true,
order: 10
@ -99,8 +108,8 @@ Posts.schemaJSON = {
type: String,
optional: false,
max: 500,
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin,
insertableIf: canInsert,
editableIf: canEdit,
control: "text",
publish: true,
order: 20
@ -120,8 +129,8 @@ Posts.schemaJSON = {
type: String,
optional: true,
max: 3000,
insertableIf: Users.is.memberOrAdmin,
editableIf: Users.is.ownerOrAdmin,
insertableIf: canInsert,
editableIf: canEdit,
control: "textarea",
publish: true,
order: 30
@ -175,8 +184,8 @@ Posts.schemaJSON = {
status: {
type: Number,
optional: true,
insertableIf: Users.is.admin,
editableIf: Users.is.admin,
insertableIf: canEditAll,
editableIf: canEditAll,
control: "select",
publish: true,
autoValue: function () {
@ -209,8 +218,8 @@ Posts.schemaJSON = {
type: Boolean,
optional: true,
defaultValue: false,
insertableIf: Users.is.admin,
editableIf: Users.is.admin,
insertableIf: canEditAll,
editableIf: canEditAll,
control: "checkbox",
publish: true,
group: Posts.formGroups.admin
@ -257,8 +266,8 @@ Posts.schemaJSON = {
type: String,
optional: true,
// regEx: SimpleSchema.RegEx.Id,
// insertableIf: Users.is.admin,
// editableIf: Users.is.admin,
// insertableIf: canEditAll,
// editableIf: canEditAll,
control: "select",
publish: true,
autoform: {

View file

@ -1,12 +1,14 @@
import Users from './collection.js';
const defaultActions = [
"users.new",
"users.edit.own",
"users.remove.own"
];
Users.groups.default.can(defaultActions);
const adminActions = [
"users.new",
"users.edit.all",
"users.remove.all"
];