---
- name: Add a user for the postgresql DBs
  become: True
  become_user: postgres
  postgresql_user: user={{ item.user }} password={{ item.pwd }} role_attr_flags={{ item.roles }} port={{ psql_db_port }} state={{ item.userstate | default('present') }}
  with_items: '{{ psql_db_data | default([]) }}'
  when: item.roles is defined
  tags: [ 'postgresql', 'postgres', 'pg_db', 'pg_user' ]

- name: Add the databases with the correct owner. Or remove them, if not used anymore
  become: True
  become_user: postgres
  postgresql_db: db={{ item.name }} port={{ psql_db_port }} encoding={{ item.encoding }} owner={{ item.user }} template=template0 state={{ item.state | default('present') }}
  with_items: '{{ psql_db_data | default([]) }}'
  when: item.managedb | default(True)
  tags: [ 'postgresql', 'postgres', 'pg_db' ]

- name: Manage users privileges
  become: True
  become_user: postgres
  postgresql_privs:
    db: '{{ item.name }}'
    privs: '{{ item.privs }}'
    #type: database
    objs: "{{ item.objs | default('ALL_IN_SCHEMA') }}"
    roles: '{{ item.roles }}'
    port: '{{ psql_db_port }}'
    state: "{{ item.userstate | default('present') }}"
    grant_option: "{{ item.grant_option | default('yes') }}"
  with_items: '{{ psql_db_privs | default([]) }}'
  tags: [ 'postgresql', 'postgres', 'pg_db', 'pg_user', 'postgresql_privs' ]

- name: Add postgres extensions to the databases, if needed
  become: True
  become_user: postgres
  postgresql_ext: name={{ item.1 | default(omit) }} db={{ item.0.name }} port={{ psql_db_port }}
  with_subelements:
    - '{{ psql_db_extensions | default([]) }}'
    - extensions
  when: psql_db_extensions is defined
  tags: [ 'postgresql', 'postgres', 'pg_extensions', 'pg_db' ]

# - name: Add schemas to a database.
#   become: True
#   become_user: postgres
#   postgresql_schema: database={{ item.0.name }} port={{ psql_db_port }} name={{ item.1 }} owner={{ item.0.user }} state={{ item.0.schemastate | default('present') }}
#   with_subelements:
#     - '{{ psql_db_data | default([]) }}'
#     - schema
#   when:
#     - item.0.manageschema | default(False)
#     - item.1 is defined
#   ignore_errors: True
#   tags: [ 'postgresql', 'postgres', 'pg_db', 'pg_schema' ]

- name: Define a user with password, with no associated DBs
  become: True
  become_user: postgres
  postgresql_user: user={{ item.user }} password={{ item.pwd }} port={{ psql_db_port }}
  with_items: '{{ psql_db_data | default(omit) }}'
  when:
    - item.pwd is defined
    - item.roles is not defined
  tags: [ 'postgresql', 'postgres', 'pg_db' ]