Skip to content

Commit

Permalink
added first things for lucky_can
Browse files Browse the repository at this point in the history
  • Loading branch information
confact committed Mar 24, 2020
0 parents commit 2004fe0
Show file tree
Hide file tree
Showing 11 changed files with 178 additions and 0 deletions.
9 changes: 9 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
root = true

[*.cr]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/docs/
/lib/
/bin/
/.shards/
*.dwarf

# Libraries don't need dependency lock
# Dependencies will be locked in applications that use them
/shard.lock
6 changes: 6 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
language: crystal

# Uncomment the following if you'd like Travis to run specs and check code formatting
# script:
# - crystal spec
# - crystal tool format --check
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
The MIT License (MIT)

Copyright (c) 2020 Håkan Nylén

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
54 changes: 54 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# lucky_can

An little nicer way to handle authorization rules for your lucky app

## Installation

1. Add the dependency to your `shard.yml`:

```yaml
dependencies:
lucky_can:
github: confact/lucky_can
```
2. Run `shards install`

## Usage

1. ```crystal
require "lucky_can"
```

2. create an `policies` directory where all your policies will be. Now you will Add an require for that directory to the app.cr file before `pages` require. Add this: `require "./policies/**"`

3. now you can create your policies in `policies` directory.


### Simple usage

```crystal
class TeamPolicy < LuckyCan::BasePolicy
can show, team, current_user do
return false if current_user.nil?
team.users.include?(current_user)
end
end
```

this generate following methods for you to use by an macro:
* `TeamPolicy.show?(team, current_user)` - for simple bool check if the user have access to the team.
* `TeamPolicy.show_not_found?(team, current_user, context)` - Return an Lucky::RouteNotFoundError if the code in the block return false.
* `TeamPolicy.show_forbidden?(team, current_user, context)` - Return an LuckyCan::ForbiddenError if the code in the block return false.

## Contributing

1. Fork it (<https://github.com/confact/lucky_can/fork>)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request

## Contributors

- [Håkan Nylén](https://github.com/confact) - creator and maintainer
9 changes: 9 additions & 0 deletions shard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name: lucky_can
version: 0.1.0

authors:
- Håkan Nylén <hakan@dun.se>

crystal: 0.33.0

license: MIT
9 changes: 9 additions & 0 deletions spec/lucky_can_spec.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
require "./spec_helper"

describe LuckyCan do
# TODO: Write tests

it "works" do
false.should eq(true)
end
end
2 changes: 2 additions & 0 deletions spec/spec_helper.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require "spec"
require "../src/lucky_can"
5 changes: 5 additions & 0 deletions src/lucky_can.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
require "./lucky_can/**"

module LuckyCan
VERSION = "0.1.0"
end
37 changes: 37 additions & 0 deletions src/lucky_can/base_policy.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
class LuckyCan::BasePolicy
def self.forbidden(context, &block)
unless yield
raise LuckyCan::ForbiddenError.new(context)
return false
end
true
end

def self.not_found(context, &block)
unless yield
raise Lucky::RouteNotFoundError.new(context)
return false
end
true
end

macro can(name, *methods)
def self.{{name}}?({% for method in methods %}{{method.id}},{% end %}) : Bool
{{yield}}
rescue Avram::RecordNotFoundError
false
end

def self.{{name}}_forbidden?({% for method in methods %}{{method.id}},{% end %} context) : Bool
forbidden(context) do
{{name}}?({% for method in methods %}{{method.id}},{% end %})
end
end

def self.{{name}}_not_found?({% for method in methods %}{{method.id}},{% end %} context) : Bool
not_found(context) do
{{name}}?({% for method in methods %}{{method.id}},{% end %})
end
end
end
end
17 changes: 17 additions & 0 deletions src/lucky_can/forbidden_error.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class LuckyCan::ForbiddenError < Lucky::Error
include Lucky::RenderableError

getter context

def initialize(@context : HTTP::Server::Context)
super "Forbidden"
end

def renderable_status : Int32
403
end

def renderable_message : String
"You have no access to this. Sorry!"
end
end

0 comments on commit 2004fe0

Please sign in to comment.