Skip to content

Instantly share code, notes, and snippets.

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

Sergii Stotskyi stalniy

🏠
Working from home
View GitHub Profile
@stalniy
stalniy / AppAbility.ts
Last active April 10, 2020 11:06
CASL 4.0 CASL typescript claim based authorization
import { Ability } from '@casl/ability';
type Actions = 'create' | 'read' | 'update' | 'delete';
type AppAbility = Ability<Actions>;
const ability: AppAbility = new Ability<Actions>();
console.log(ability.can('create'));
console.log(ability.can('update'));
@stalniy
stalniy / AppAbility.ts
Created April 10, 2020 10:51
CASL 4.0 strict Ability
import { Ability } from '@casl/ability';
type AppAbilities =
['create' | 'read' | 'update' | 'delete', 'Article'] |
['create' | 'read' | 'update', 'Comment'] |
['read', 'User']
;
export type AppAbility = Ability<AppAbilities>;
@stalniy
stalniy / AppAbility.ts
Created April 10, 2020 10:48
CASL 4.0 simple Ability
import { Ability } from '@casl/ability';
type AppAbilities = [
'read' | 'update' | 'delete' | 'create',
'Article' | 'Comment' | 'User'
];
export type AppAbility = Ability<AppAbilities>;
@stalniy
stalniy / Task.md
Last active October 7, 2019 19:10
Task for Senior .NET developer

Завдання

У систему приходить структурована інформація, але її типи не можуть бути визначені на етапі розробки. Типи об'єктів, як і самі дані додаються через API.

Необхідно

  1. Створити API-сервіс, який дозволяє працювати з сутностями будь-яких типів.
  2. Реалізувати CRUD для типів сутностей. Наприклад, створимо тип Person, з атрибутами name, age та workIn (workIn - це посилання на інший тип, Organization - має 1 атрибут name): POST /api/types/person
@stalniy
stalniy / task.md
Last active July 15, 2019 10:33
Junior .NET test task

Завдання

У систему приходить структурована інформація, але її типи не можуть бути визначені на етапі розробки. Типи об'єктів, як і самі дані додаються через API.

Необхідно

  1. Створити API-сервіс, який дозволяє працювати з сутностями будь-яких типів.
  2. Реалізувати CRUD для типів сутностей. Наприклад, створимо тип Person, з атрибутами name та age: POST /api/types/person
@stalniy
stalniy / app.template.html
Created April 29, 2019 16:18
CASL Angular: Todo app header HTML
<header class="header">
<h1>{{ title }}</h1>
<todo-form (newTodo)="addTodo($event)" *ngIf="'Todo' | can: 'create'"></todo-form>
</header>
@stalniy
stalniy / footer.component.ts
Created April 29, 2019 16:17
Todo app switch user roles
@stalniy
stalniy / app.module.js
Created April 28, 2019 14:56
CASL in Angular app
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AbilityModule } from '@casl/angular';
import { Ability } from '@casl/ability';
import { defineAbilitiesFor, createAbility } from '../services/ability';
import { AppRoutingModule } from './routing.module';
@NgModule({
declarations: [
@stalniy
stalniy / casl.js
Last active April 28, 2019 13:58
CASL subject example
class Todo {
constructor({ title, assignee }) {
this.title = title;
this.assignee = assignee;
}
}
const myTodo = new Todo({
title: "buy food",
assignee: "me"
@stalniy
stalniy / permissions.js
Created April 27, 2019 17:20
CASL permissions for member and admin
export function defineAbilitiesFor(role) {
const { can, rules } = AbilityBuilder.extract()
if (role === 'admin') {
can('manage', 'all')
} else {
can('read', 'all')
can('manage', 'Todo', { assignee: 'me' })
}