Class: JiraCache::Sync
- Inherits:
-
Object
- Object
- JiraCache::Sync
- Defined in:
- lib/jira_cache/sync.rb
Overview
Performs the sync between JIRA and the local database where the issues are cached.
The issues are cached in the database through the Data::IssueRepository interface. It currently implements storage into a PostgreSQL database.
Instance Attribute Summary collapse
-
#client ⇒ Object
readonly
Returns the value of attribute client.
-
#logger ⇒ Object
readonly
Returns the value of attribute logger.
Instance Method Summary collapse
- #cached_keys(project_key: nil) ⇒ Object
-
#fetch_issue_keys(project_key: nil, updated_since: nil) ⇒ Array
Fetch issue keys from JIRA using the specified
JiraCache::Clientinstance, for the specified project, with an optionalupdated_sinceparameter. - #fetch_issues(issue_keys, sync_time) ⇒ Object
-
#initialize(client) ⇒ Sync
constructor
A new instance of Sync.
- #latest_sync_time(project_key) ⇒ Object
- #log(message) ⇒ Object
- #mark_deleted(issue_keys) ⇒ Object
-
#remote_keys(project_key: nil) ⇒ Object
IMPLEMENTATION FUNCTIONS.
- #sync_issue(key, sync_time: Time.now) ⇒ Object
-
#sync_issues(project_key: nil) ⇒ Object
Fetches new and updated raw issues, save them to the
issuescollection. - #updated_keys(project_key: nil) ⇒ Object
Constructor Details
#initialize(client) ⇒ Sync
Returns a new instance of Sync.
16 17 18 19 |
# File 'lib/jira_cache/sync.rb', line 16 def initialize(client) @client = client @logger = client.logger end |
Instance Attribute Details
#client ⇒ Object (readonly)
Returns the value of attribute client.
14 15 16 |
# File 'lib/jira_cache/sync.rb', line 14 def client @client end |
#logger ⇒ Object (readonly)
Returns the value of attribute logger.
14 15 16 |
# File 'lib/jira_cache/sync.rb', line 14 def logger @logger end |
Instance Method Details
#cached_keys(project_key: nil) ⇒ Object
64 65 66 |
# File 'lib/jira_cache/sync.rb', line 64 def cached_keys(project_key: nil) Data::IssueRepository.keys_in_project(project_key) end |
#fetch_issue_keys(project_key: nil, updated_since: nil) ⇒ Array
Fetch issue keys from JIRA using the specified JiraCache::Client instance, for the specified project, with an optional updated_since parameter.
82 83 84 85 86 87 88 |
# File 'lib/jira_cache/sync.rb', line 82 def fetch_issue_keys(project_key: nil, updated_since: nil) query_items = [] query_items << "project = \"#{project_key}\"" unless project_key.nil? query_items << "updatedDate > \"#{updated_since.strftime('%Y-%m-%d %H:%M')}\"" unless updated_since.nil? query = query_items.join(" AND ") client.issue_keys_for_query(query) end |
#fetch_issues(issue_keys, sync_time) ⇒ Object
91 92 93 94 95 |
# File 'lib/jira_cache/sync.rb', line 91 def fetch_issues(issue_keys, sync_time) issue_keys.each do |issue_key| sync_issue(issue_key, sync_time: sync_time) end end |
#latest_sync_time(project_key) ⇒ Object
101 102 103 |
# File 'lib/jira_cache/sync.rb', line 101 def latest_sync_time(project_key) Data::IssueRepository.latest_sync_time end |
#log(message) ⇒ Object
105 106 107 108 |
# File 'lib/jira_cache/sync.rb', line 105 def log() return if logger.nil? logger.info() end |
#mark_deleted(issue_keys) ⇒ Object
97 98 99 |
# File 'lib/jira_cache/sync.rb', line 97 def mark_deleted(issue_keys) Data::IssueRepository.update_where({ key: issue_keys }, deleted_from_jira_at: Time.now) end |
#remote_keys(project_key: nil) ⇒ Object
IMPLEMENTATION FUNCTIONS
60 61 62 |
# File 'lib/jira_cache/sync.rb', line 60 def remote_keys(project_key: nil) fetch_issue_keys(project_key: project_key) end |
#sync_issue(key, sync_time: Time.now) ⇒ Object
49 50 51 52 53 54 55 56 |
# File 'lib/jira_cache/sync.rb', line 49 def sync_issue(key, sync_time: Time.now) data = client.issue_data(key) Data::IssueRepository.insert( key: key, data: data, synced_at: sync_time ) end |
#sync_issues(project_key: nil) ⇒ Object
Fetches new and updated raw issues, save them to the issues collection. Also mark issues deleted from JIRA as such.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/jira_cache/sync.rb', line 26 def sync_issues(project_key: nil) sync_start = Time.now log "Determining which issues to fetch..." remote = remote_keys(project_key: project_key) log " - #{remote.count} remote issues" cached = cached_keys(project_key: project_key) log " - #{cached.count} cached issues" missing = remote - cached log " => #{missing.count} missing issues" updated = updated_keys(project_key: project_key) log " - #{updated.count} updated issues" log "Fetching #{missing.count + updated.count} issues" fetch_issues(missing + updated, sync_start) deleted = cached - remote mark_deleted(deleted) end |
#updated_keys(project_key: nil) ⇒ Object
68 69 70 71 |
# File 'lib/jira_cache/sync.rb', line 68 def updated_keys(project_key: nil) time = latest_sync_time(project_key: project_key) fetch_issue_keys(project_key: project_key, updated_since: time) end |