{"id":15468312,"url":"https://github.com/yhirano55/approval","last_synced_at":"2025-05-04T22:31:43.452Z","repository":{"id":48577861,"uuid":"97559440","full_name":"yhirano55/approval","owner":"yhirano55","description":":ok_man::no_good: Approval flow for Rails","archived":true,"fork":false,"pushed_at":"2023-12-07T21:43:43.000Z","size":94,"stargazers_count":110,"open_issues_count":6,"forks_count":25,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-26T06:43:38.720Z","etag":null,"topics":["approval-process","rails-engine","ruby"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yhirano55.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-07-18T06:12:15.000Z","updated_at":"2024-12-23T00:01:06.000Z","dependencies_parsed_at":"2024-06-21T17:38:59.896Z","dependency_job_id":"fa69a278-48d2-4809-926a-94ed3e729acb","html_url":"https://github.com/yhirano55/approval","commit_stats":{"total_commits":81,"total_committers":7,"mean_commits":"11.571428571428571","dds":0.2098765432098766,"last_synced_commit":"67485f16649adac21b482d6037f7678d61106665"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhirano55%2Fapproval","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhirano55%2Fapproval/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhirano55%2Fapproval/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhirano55%2Fapproval/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yhirano55","download_url":"https://codeload.github.com/yhirano55/approval/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252408310,"owners_count":21743093,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["approval-process","rails-engine","ruby"],"created_at":"2024-10-02T01:40:40.321Z","updated_at":"2025-05-04T22:31:42.744Z","avatar_url":"https://github.com/yhirano55.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Approval\n\n[![Build Status](https://travis-ci.org/yhirano55/approval.svg?branch=master)](https://travis-ci.org/yhirano55/approval)\n[![Gem Version](https://badge.fury.io/rb/approval.svg)](https://badge.fury.io/rb/approval)\n\n:ok_woman::no_good:Approval flow for Rails\n\n## Installation\n\n1. Add approval to your `Gemfile`:\n\n  ```ruby\n  gem 'approval'\n  ```\n\n2. Add approval_requests, approval_comments, approval_items tables to your database and an initializer file for configuration:\n\n  ```bash\n  $ bundle exec rails generate approval:install\n  ```\n\n3. Add `acts_as_approval_user` to your user model (`User`, `AdminUser`, `Member` ...etc)::\n\n  ```ruby\n  class User \u003c ApplicationRecord\n    acts_as_approval_user\n  end\n  ```\n\n4. Add `acts_as_approval_resource` to the models you want use approval flow:\n\n  ```ruby\n  class Book \u003c ApplicationRecord\n    acts_as_approval_resource\n  end\n  ```\n\n  Or if you want to use PORO:\n\n  ```ruby\n  class SomeProcess\n    def self.perform\n      # something\n    end\n  end\n  ```\n\n## Approval Flow\n\n### Make request\n\nYou send request, but resources aren't created/updated/destroyed.\n\n#### :pray: Create\n\n```ruby\nstaff = User.find_or_create_by(email: \"staff@example.com\")\n\nrecord  = Book.new(name: \"Ruby Way\", price: 2980)\nrequest = staff.request_for_create(record, reason: \"something\")\nrequest.save # Created Approval::Request record.\n\nrecords = 10.times.map {|n| Book.new(name: \"my_book_#{n}\", price: 300) }\nrequest = staff.request_for_create(records, reason: \"something\")\nrequest.save!\n```\n\n#### :pray: Update\n\n```ruby\nstaff = User.find_or_create_by(email: \"staff@example.com\")\n\nrecord  = Book.find(1).tap {|record| record.name = \"new book title\" }\nrequest = staff.request_for_update(record, reason: \"something\")\nrequest.save\n\nrecords = Book.where(id: [1, 2, 3]).each {|record| record.price *= 0.5 }\nrequest = staff.request_for_update(records, reason: \"something\")\nrequest.save!\n```\n\n#### :pray: Destroy\n\n```ruby\nstaff = User.find_or_create_by(email: \"staff@example.com\")\n\nrecord  = Book.find(1)\nrequest = staff.request_for_destroy(record, reason: \"something\")\nrequest.save\n\nrecords = Book.where(id: [1, 2, 3])\nrequest = staff.request_for_destroy(records, reason: \"something\")\nrequest.save!\n```\n\n#### :pray: Perform\n\n```ruby\nstaff = User.find_or_create_by(email: \"staff@example.com\")\n\nrecord  = MyProcess.new(recipient: \"somebody@example.com\")\nrequest = staff.request_for_perform(record, reason: \"something\")\nrequest.save\n```\n\n### Respond\n\n#### :ok_woman: Approve\n\nThen resources are created/updated/destroyed, if respond user have approved the request.\n\n```ruby\nadmin = User.find_or_create_by(email: \"admin@example.com\")\n\nrequest = Approval::Request.first\nrespond = admin.approve_request(request, reason: \"something\")\nrespond.save! # Create/Update/Destroy resources\n```\n\n##### :no_good: Reject\n\nThen resources are not created/updated/destroyed, if respond user have rejected the request.\n\n```ruby\nadmin = User.find_or_create_by(email: \"admin@example.com\")\n\nrequest = Approval::Request.first\nrespond = admin.reject_request(request, reason: \"something\")\nrespond.save!\n```\n\n##### :wastebasket: Cancel\n\n```ruby\nstaff = User.find_or_create_by(email: \"staff@example.com\")\n\nrequest = Approval::Request.first\nrespond = staff.cancel_request(request, reason: \"something\")\nrespond.save!\n```\n\n### Comment\n\n```ruby\nadmin = User.find_or_create_by(email: \"admin@example.com\")\n\nrequest = Approval::Request.first\nadmin.approval_comments.create(request: request, content: \"Hello\")\n```\n\n### Configuration\n\n```ruby\n# config/initializers/approval.rb\n\nApproval.configure do |config|\n  # User Class Name (e.g: User, AdminUser, Member)\n  config.user_class_name = \"User\"\n\n  # Maximum characters of comment for reason (default: 2000)\n  config.comment_maximum = 2000\n\n  # Permit to respond to own request? (default: false)\n  config.permit_to_respond_to_own_request = false\nend\n```\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyhirano55%2Fapproval","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyhirano55%2Fapproval","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyhirano55%2Fapproval/lists"}