Skip to content

Instantly share code, notes, and snippets.

View stalniy's full-sized avatar
🏠
Working from home

Serhii Stotskyi stalniy

🏠
Working from home
View GitHub Profile
@stalniy
stalniy / abilities.js
Last active July 24, 2017 20:02
CASL in expressjs app
const { AbilityBuilder, Ability } = require('casl')
function defineAbilitiesFor(user) {
const { rules, can } = AbilityBuilder.extract()
can('read', ['Post', 'Comment'])
can('create', 'User')
if (user) {
can('manage', ['Post', 'Comment'], { author: user._id })
@stalniy
stalniy / abilities.js
Created July 24, 2017 20:03
CASL expressjs changed
function defineAbilitiesFor(user) {
const { rules, can } = AbilityBuilder.extract()
if (user) {
can('manage', ['Post', 'Comment'], { author: user._id })
can(['read', 'update'], 'User', { _id: user.id })
} else {
can('read', ['Post', 'Comment'])
can('create', 'User')
}
@stalniy
stalniy / abilities.js
Created July 26, 2017 12:03
CASL blog app abilities ES6
import { AbilityBuilder } from 'casl'
const user = whateverLogicToGetUser()
const ability = AbilityBuidler.define(can => {
can('read', ['Post', 'Comment'])
if (user.isLoggedIn) {
can('create', 'Post')
can('manage', ['Post', 'Comment'], { authorId: user.id })
}
@stalniy
stalniy / mongo-query.js
Created July 26, 2017 13:09
CASL and mongoose
const { mongoosePlugin, AbilityBuilder } = require('casl')
const mongoose = require('mongoose')
mongoose.plugin(mongoosePlugin)
const Post = mongoose.model('Post', mongoose.Schema({
title: String,
author: String,
content: String,
createdAt: Date
@stalniy
stalniy / can.js
Created July 27, 2017 12:30
Aurelia CASL value converter
import { Ability } from 'casl'
export class CanValueConverter {
static inject = [Ability]
constructor(ability) {
this.ability = ability
}
toView(subject, action) {
@stalniy
stalniy / abilities-without-models.js
Last active July 27, 2017 12:54
CASL abilities without models in Aurelia
import { AbilityBuilder, Ability } from 'casl'
function defineRulesFor(user) {
const { can, rules } = AbilityBuilder.extract()
can('read', ['Post', 'Comment'])
if (user) {
can('create', 'Post')
can('manage', ['Post', 'Comment'], { authorId: user._id })
@stalniy
stalniy / abilities-ds.js
Last active July 27, 2017 13:18
CASL abilities js-data aurelia
import { DataStore } from '../services/ds'
function listenToSessionChanges(ds, onChange) {
ds.on('afterCreate', (name, session) => {
if (name === 'Session') {
onChange(session)
}
})
ds.on('afterFind', (name, id, mapper, session) => {
@stalniy
stalniy / abilities-subject-name.js
Last active July 27, 2017 13:18
CASL js-data subject name
function subjectName(subject) {
if (!subject || typeof subject === 'string') {
return subject
}
return subject.constructor.mapper.name
}
export function configureAbility({ container }) {
const ability = new Ability([], { subjectName })
@stalniy
stalniy / can-in-template.html
Created July 27, 2017 13:25
CASL Aurelia value converter
<nav class="menu">
<h3>Menu</h3>
<ul>
<li if.bind="'Post' | can: 'create'">
<a route-href="route: newPost">Add Post</a>
</li>
</ul>
</nav>
@stalniy
stalniy / can-signal.html
Created July 27, 2017 13:29
CASL can in template with signal behavior
<nav class="menu">
<h3>Menu</h3>
<ul>
<li if.bind="'Post' | can: 'create' & signal: 'ability-changed'">
<a route-href="route: newPost">Add Post</a>
</li>
</ul>
</nav>