![Github CI](https://github.com/flamingo-run/rails-cloud-tasks/workflows/Github%20CI/badge.svg)
[![Maintainability](https://api.codeclimate.com/v1/badges/00d8532b0dd6a345474a/maintainability)](https://codeclimate.com/github/flamingo-run/rails-cloud-tasks/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/00d8532b0dd6a345474a/test_coverage)](https://codeclimate.com/github/flamingo-run/rails-cloud-tasks/test_coverage)
[![ruby](https://img.shields.io/badge/ruby-2.7-red.svg)]()

# Rails Cloud Tasks

## APIs

The following APIs must be enabled in your project(s):

- [Cloud Tasks API](https://console.cloud.google.com/marketplace/product/google/cloudtasks.googleapis.com)
- [Admin SDK API](https://console.cloud.google.com/marketplace/product/google/admin.googleapis.com)

## Setup

### As an application (when contributing)

- Install packages:

```
  bundle install
```

### As a package (when inside another application)

- Add the gem to application's Gemfile:
```
gem 'rails-cloud-tasks'
```

- Add an initializer:
```ruby
# ./config/initializers/rails_cloud_tasks.rb

require 'rails-cloud-tasks'

RailsCloudTasks.configure do |config|
  config.service_account_email = 'test-account@test-project.iam.gserviceaccount.com'
  config.project_id = 'my-gcp-project' # This is not needed if running on GCE
  config.location_id = 'us-central1'
  config.scheduler_file_path = './custom_path/scheduler_jobs.yml'
  config.scheduler_prefix_name = 'my-app-name'

  # Base url used by Cloud Tasks to reach your application and run the tasks
  config.host = 'https://myapplication.host.com'
  config.tasks_path = '/v2/tasks' # default: '/tasks'

  # Inject routes into application
  config.inject_routes
end
```

Check out the available configs and its usage description:

| attribute             	| description                                                                                                 	| env support         	| app engine fallback 	| default value            	|
|-----------------------	|-------------------------------------------------------------------------------------------------------------	|---------------------	|--------------------	|--------------------------	|
| service_account_email 	| The app service account email. It''s used to impersonate an user on schedule job                            	| GCP_SERVICE_ACCOUNT 	| ✓                  	|                          	|
| project_id            	| The Project ID                                                                                              	| GCP_PROJECT         	| ✓                  	|                          	|
| location_id           	| The region where you app is running (eg: us-central1, us-east1...)                                          	| GCP_LOCATION        	| ✓                  	|                          	|
| host                  	| The app endpoint which the app is running. *Do not use custom domain* Use the generated domain by Cloud Run 	| GCP_APP_ENDPOINT    	|                    	|                          	|
| scheduler_file_path   	| Path which the scheduler file is located                                                                    	| 𐄂                   	|                    	| './config/scheduler.yml' 	|
| scheduler_prefix_name 	| The prefix to be set into scheduler job name                                                                	| 𐄂                   	|                    	| 'rails-cloud'            	|
| tasks_path            	| The path to run tasks                                                                                       	| 𐄂                   	|                    	| '/tasks'                 	|


- Configure ActiveJob queue_adapter

```ruby
# ./config/application.rb

config.active_job.queue_adapter = RailsCloudTasks.queue_adapter
```

- Add a Job class:
```ruby
# ./app/jobs/application_job.rb

class ApplicationJob < ActiveJob::Base
  queue_as 'my-default-queue'
end


# ./app/jobs/my_first_job.rb

class MyFirstJob < ApplicationJob
  # Here you may override the queue, if needed
  queue_as 'some-other-queue'

  def perform(attrs)
    # Execute stuff
  end
end
```

- Enqueue a job:
```ruby
MyJob.perform_later(attrs)
```

### Scheduled Jobs

We have support to Google Cloud Schedule. It's based on Cloud tasks, the jobs are scheduled with HTTP Target. We do not support Pub/Sub or App Engine HTTP for now.

Check out the follow sample of config file:
```yaml
# config/scheduler.yml
- name: Users::SyncJob
  schedule: 0 8 * * *
  description: Sync user data
  time_zone: "America/Los_Angeles"
  args:
    arg1: 100
    arg2: 200
```

| attribute   	| description                                                    	| required 	|
|-------------	|----------------------------------------------------------------	|----------	|
| name        	| The Job class namespace                                        	| ✓        	|
| schedule    	| The frequency to run your job. It should be a unix-cron format 	| ✓        	|
| description 	| What this job does                                             	| ✓        	|
| time_zone   	| Choose which one timezone your job must run                    	| ✓        	|
| args        	| What are the job's arguments                                   	| ✓        	|




## Tests

To run tests:

```
bundle exec rspec
```


## Version

Use [Semantic versioning](https://semver.org/).