| Index: modules/discourse/manifests/postactiontype.pp |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/modules/discourse/manifests/postactiontype.pp |
| @@ -0,0 +1,51 @@ |
| +define discourse::postactiontype( |
| + $id, |
| + $key = $title, |
| + $is_flag = false, |
| + $icon = undef, |
| + $position = 0, |
| + $ensure = 'present' |
| +) { |
| + # Attempt some escaping |
| + $escaped_id = regsubst($id, '\D', '', 'G') |
| + $escaped_key = regsubst($key, '[\'\\]', '\\\1', 'G') |
| + if $is_flag { |
| + $escaped_flag = 'true' |
| + } |
| + else { |
| + $escaped_flag = 'false' |
| + } |
| + if $icon { |
| + $dummy = regsubst($icon, '[\'\\]', '\\\1', 'G') |
| + $escaped_icon = "'${dummy}'" |
| + } |
| + else { |
| + $escaped_icon = "null" |
| + } |
| + $escaped_position = regsubst($position, '\D', '', 'G') |
| + |
| + case $ensure { |
| + default: { |
| + err("unknown ensure value ${ensure}") |
| + } |
| + present: { |
| + # This is apparently how you do a conditional INSERT in PostgreSQL - sorry |
| + $update_sql = "UPDATE post_action_types SET name_key = '$escaped_key', is_flag = $escaped_flag, icon = $escaped_icon, position = $escaped_position WHERE id = $escaped_id RETURNING 1" |
| + $columns = "id, name_key, is_flag, icon, position, created_at, updated_at" |
| + $values = "SELECT $escaped_id, '$escaped_key', $escaped_flag, $escaped_icon, $escaped_position, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP" |
| + |
| + postgresql_psql {"WITH upd AS ($update_sql) INSERT INTO post_action_types ($columns) $values WHERE NOT EXISTS (SELECT * FROM upd)": |
| + db => 'discourse', |
| + psql_user => 'discourse', |
| + unless => 'SELECT false' |
| + } |
| + } |
| + absent: { |
| + postgresql_psql {"DELETE FROM post_action_types WHERE id = $escaped_id": |
| + db => 'discourse', |
| + psql_user => 'discourse', |
| + unless => 'SELECT false' |
| + } |
| + } |
| + } |
| +} |