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 / spec.js
Created June 25, 2018 18:16
How people write tests
describe('Invoice', function() {
var invoice, user;
beforeEach(function() {
user = User.create({ role: 'member' });
invoice = user.invoices.create({ price: 10, currency: 'USD' });
});
it('has status "fraud" if amount does not equal to invoice amount', function() {
invoice.paid(1, 'USD');
@stalniy
stalniy / casl-vuex.js
Created May 11, 2018 13:09
Vuex CASL plugin
import { Ability } from '@casl/ability'
export const ability = new Ability()
export const abilityPlugin = (store) => {
ability.update(store.state.rules)
return store.subscribe((mutation) => {
switch (mutation.type) {
case 'createSession':
@stalniy
stalniy / button.html
Created May 11, 2018 12:21
Vue and CASL
<template>
<div v-if="$can('create', 'Post')">
<a @click="createPost">Add Post</a>
</div>
</template>
@stalniy
stalniy / ability.rb
Created May 11, 2018 12:09
Cancan Ability. Method to create CASL compatible rules
class Ability
include CanCan::Ability
# ....
def to_list
rules.map do |rule|
object = { actions: rule.actions, subject: rule.subjects.map{ |s| s.is_a?(Symbol) ? s : s.name } }
object[:conditions] = rule.conditions unless rule.conditions.blank?
object[:inverted] = true unless rule.base_behavior
@stalniy
stalniy / response.json
Created May 11, 2018 11:45
Rails session response with CASL compatible format
{
"token": "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoyfQ.3MA5pz-JXuSs3YHdIEJcokTpharBLjUmfzXGp1dyYY8",
"rules": [
{
"actions": ["read"],
"subject": ["all"]
},
{
"actions": ["manage"],
"subject": ["Article"],
@stalniy
stalniy / product-routes.js
Created March 26, 2018 14:36
CASL abilities per field Express.js
const { permittedFieldsOf } = require('@casl/ability/extra')
const pick = require('lodash.pick')
const ability = require('./ability')
const app = require('./app')
const Product = require('./models/Product')
// See https://stalniy.github.io/casl/abilities/2017/07/21/check-abilities.html#checking-fields for details
app.patch('/products/:id', (req, res, next) => {
Product.findById(req.params.id)
@stalniy
stalniy / edit-product-form.html
Created March 26, 2018 14:25
CASL Abilities per field in form
<template>
<form novalidate>
<input v-model="product.title" :readonly="!$can('update', product, 'title')">
<textarea v-model="product.description" :readonly="!$can('update', product, 'description')"></textarea>
<input v-model="product.price" :readonly="!$can('update', product, 'description')">
</form>
</template>
<script>
....
@stalniy
stalniy / abilities.js
Last active April 11, 2018 14:15
CASL Abilities per field
import { AbilityBuilder } from '@casl/ability'
const user = ....
const ability = AbilityBuidler.define(can => {
can('read', 'all')
if (user.isAdmin) {
can('update', 'Product')
} else if (user.isEditor) {
can('update', 'Product', ['title', 'description'])
@stalniy
stalniy / create_debian-sys-maint_for_mysqladmin.sh
Created February 25, 2018 07:10 — forked from waja/create_debian-sys-maint_for_mysqladmin.sh
Create 'debian-sys-maint' MariaDB user for use of mysqladmin. Just in case you can't use 'root' via 'unix_socket' plugin.
#!/bin/sh
MYSQLADMIN_CFG="/etc/mysql/mariadb.conf.d/90-mysqladmin.cnf"
# generate password
PASS=$(perl -e 'print map{("a".."z","A".."Z",0..9)[int(rand(62))]}(1..16)');
# adjust /etc/mysql/debian.cnf (used as defaults file by system scripts)
sed -i "s/^password =.*$/password = ${PASS}/" /etc/mysql/debian.cnf
sed -i "s/^user =.*$/user = debian-sys-maint/" /etc/mysql/debian.cnf
# create config file for mysqladmin itself (maybe not needed)
umask 066
cat > ${MYSQLADMIN_CFG} <<EOF
@stalniy
stalniy / Can.js
Created February 2, 2018 10:27
CASL React component
class Can extends PureComponent {
//...
componentWillMount() {
this.unsubscribeFromAbility = ability.on('update', () => {
setTimeout(() => this.recheck(), 0)
});
this.recheck();
}