--- - name: Create api url set_fact: _nextcloud_api_url_news: "{{ nextcloud_urls[0] }}/apps/news/api/v1-2" when: nextcloud_enable_pretty_urls - name: Create api url set_fact: # TODO find the url without pretty urls _nextcloud_api_url_news: "{{ _nextcloud_api_url_news }}" when: not nextcloud_enable_pretty_urls - name: Find users that have News enabled set_fact: _nextcloud_news_users: >- {{ nextcloud_users | selectattr('app_config.news', 'defined') | list }} - name: Merge feeds from opml files set_fact: _nextcloud_news_users: >- [ {%- for user in _nextcloud_news_users -%} {%- if 'opml_file' in user.app_config.news -%} {%- set ns = namespace(result=[]) -%} {%- for opml_feed in user['app_config']['news']['opml_file'] | opml -%} {%- set feed = user.app_config.news.feeds | selectattr('url', 'equalto', opml_feed.url) | list -%} {%- if feed | length == 0 -%} {%- set ns.result = ns.result | union([opml_feed]) -%} {%- endif -%} {%- endfor -%} {{ user | combine({ "app_config": { "news": { "feeds": ns.result | union(user.app_config.news.feeds) } } } ) }}, {%- else -%} {{ user }}, {%- endif -%} {%- endfor -%} ] - name: Read existing folders uri: method: GET url: "{{ _nextcloud_api_url_news }}/folders" headers: Authorization: Basic {{ (item.name + ':' + item.pass) | b64encode }} register: _nextcloud_existing_folders loop: "{{ _nextcloud_news_users }}" delegate_to: localhost - name: Read existing feeds uri: method: GET url: "{{ _nextcloud_api_url_news }}/feeds" headers: Authorization: Basic {{ (item.name + ':' + item.pass) | b64encode }} register: _nextcloud_existing_feeds loop: "{{ _nextcloud_news_users }}" delegate_to: localhost - name: Create feed folders uri: method: POST url: "{{ _nextcloud_api_url_news }}/folders" body_format: json body: name: "{{ item.1 }}" headers: Authorization: Basic {{ (item.0.name + ':' + item.0.pass) | b64encode }} when: >- _nextcloud_existing_folders.results[ ( _nextcloud_news_users | map(attribute='name') | flatten ).index(item.0.name) ]['json']['folders'] | selectattr('name', 'equalto', item.1) | list | length == 0 register: result changed_when: result is success loop: >- {{ _nextcloud_news_users | zip( _nextcloud_news_users | subelements('app_config.news.feeds') | map('last') | flatten | selectattr('folder', 'defined') | selectattr('folder', 'ne', []) | map(attribute='folder') | flatten | unique ) | list }} delegate_to: localhost - name: Read folders again uri: method: GET url: "{{ _nextcloud_api_url_news }}/folders" headers: Authorization: Basic {{ (item.name + ':' + item.pass) | b64encode }} when: result is changed register: _nextcloud_existing_folders_again changed_when: _nextcloud_existing_folders_again is success loop: "{{ _nextcloud_news_users }}" delegate_to: localhost - name: Update folders variable set_fact: _nextcloud_existing_folders: "{{ _nextcloud_existing_folders_again }}" when: _nextcloud_existing_folders_again is changed - name: Create feeds uri: method: POST url: "{{ _nextcloud_api_url_news }}/feeds" body_format: json body: url: "{{ item.1.url }}" folderId: >- {{ ( _nextcloud_existing_folders.results[ ( _nextcloud_news_users | map(attribute='name') | flatten ).index(item.0.name) ]['json']['folders'] | selectattr( 'name', 'equalto', item.1.folder | default([]) | first | default('') ) | list | last | default('__undefined__') )['id'] | default(omit) }} headers: Authorization: Basic {{ (item.0.name + ':' + item.0.pass) | b64encode }} when: >- _nextcloud_existing_feeds.results[ ( _nextcloud_news_users | map(attribute='name') | flatten ).index(item.0.name) ]['json']['feeds'] | selectattr('url', 'equalto', item.1.url) | list | length == 0 register: result changed_when: result is success loop: "{{ _nextcloud_news_users | subelements('app_config.news.feeds') }}" delegate_to: localhost # TODO this is a v2 api endpoint. I need to break it into `rename` and # move-to-folder api calls for v1-2 # - name: Update feeds # uri: # method: PATCH # url: >- # {{ _nextcloud_api_url_news }}/feeds/{{ # ( # _nextcloud_existing_feeds.results[ # ( # _nextcloud_news_users # | map(attribute='name') # | flatten # ).index(item.0.name) # ]['json']['feeds'] # | selectattr('url', 'equalto', item.1.url) # | list # | last # )['id'] # }} # body_format: json # body: # url: "{{ item.1.url }}" # folderId: >- # {{ # ( # _nextcloud_existing_folders.results[ # ( # _nextcloud_news_users # | map(attribute='name') # | flatten # ).index(item.0.name) # ]['json']['folders'] # | selectattr( # 'name', # 'equalto', # item.1.folder # | default([]) # | first # | default('') # ) # | list # | last # | default('__undefined__') # )['id'] # | default(omit) # }} # headers: # Authorization: Basic {{ (item.0.name + ':' + item.0.pass) | b64encode }} # when: >- # _nextcloud_existing_feeds.results[ # ( # _nextcloud_news_users # | map(attribute='name') # | flatten # ).index(item.0.name) # ]['json']['feeds'] # | selectattr('url', 'equalto', item.1.url) # | list # | length > 0 # register: result # changed_when: result is success # loop: "{{ _nextcloud_news_users | subelements('app_config.news.feeds') }}" # delegate_to: localhost