usps-imis-api 0.15.2 → 1.0.0.pre.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +57 -0
  3. data/.gitignore +4 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +88 -0
  6. data/.ruby-version +1 -0
  7. data/.simplecov +8 -0
  8. data/Gemfile +12 -0
  9. data/Gemfile.lock +95 -0
  10. data/Rakefile +12 -0
  11. data/Readme.md +193 -25
  12. data/bin/console +21 -0
  13. data/bin/setup +8 -0
  14. data/lib/ext/hash.rb +10 -0
  15. data/lib/usps/imis/api.rb +135 -241
  16. data/lib/usps/imis/config.rb +10 -156
  17. data/lib/usps/imis/error/api.rb +26 -0
  18. data/lib/usps/imis/error/mapper.rb +9 -0
  19. data/lib/usps/imis/error/response.rb +75 -0
  20. data/lib/usps/imis/mapper.rb +21 -91
  21. data/lib/usps/imis/panel/base_panel.rb +42 -0
  22. data/lib/usps/imis/panel/education.rb +111 -0
  23. data/lib/usps/imis/panel/vsc.rb +109 -0
  24. data/lib/usps/imis/version.rb +1 -1
  25. data/lib/usps/imis.rb +23 -33
  26. data/spec/lib/usps/imis/api_spec.rb +143 -0
  27. data/spec/lib/usps/imis/config_spec.rb +33 -0
  28. data/spec/lib/usps/imis/error/api_spec.rb +17 -0
  29. data/spec/lib/usps/imis/error/response_spec.rb +107 -0
  30. data/spec/lib/usps/imis/mapper_spec.rb +31 -0
  31. data/spec/lib/usps/imis/panel/base_panel_spec.rb +32 -0
  32. data/spec/lib/usps/imis/panel/education_spec.rb +55 -0
  33. data/spec/lib/usps/imis/panel/vsc_spec.rb +38 -0
  34. data/spec/lib/usps/imis_spec.rb +11 -0
  35. data/spec/spec_helper.rb +35 -0
  36. data/usps-imis-api.gemspec +18 -0
  37. metadata +34 -595
  38. data/bin/imis +0 -8
  39. data/lib/usps/imis/base_data.rb +0 -87
  40. data/lib/usps/imis/blank_object.rb +0 -62
  41. data/lib/usps/imis/business_object.rb +0 -252
  42. data/lib/usps/imis/command_line/formatters.rb +0 -101
  43. data/lib/usps/imis/command_line/help.rb +0 -204
  44. data/lib/usps/imis/command_line/interface.rb +0 -186
  45. data/lib/usps/imis/command_line/options.yml +0 -167
  46. data/lib/usps/imis/command_line/options_parser.rb +0 -158
  47. data/lib/usps/imis/command_line/options_parser_config.rb +0 -82
  48. data/lib/usps/imis/command_line/performers.rb +0 -90
  49. data/lib/usps/imis/command_line.rb +0 -18
  50. data/lib/usps/imis/data.rb +0 -60
  51. data/lib/usps/imis/dependencies.rb +0 -33
  52. data/lib/usps/imis/error.rb +0 -53
  53. data/lib/usps/imis/errors/api_error.rb +0 -11
  54. data/lib/usps/imis/errors/command_line_error.rb +0 -11
  55. data/lib/usps/imis/errors/config_error.rb +0 -11
  56. data/lib/usps/imis/errors/embedded_model_find_error.rb +0 -20
  57. data/lib/usps/imis/errors/empty_payload_error.rb +0 -23
  58. data/lib/usps/imis/errors/locked_id_error.rb +0 -15
  59. data/lib/usps/imis/errors/mapper_error.rb +0 -29
  60. data/lib/usps/imis/errors/missing_id_error.rb +0 -15
  61. data/lib/usps/imis/errors/missing_party_field_error.rb +0 -24
  62. data/lib/usps/imis/errors/not_found_error.rb +0 -11
  63. data/lib/usps/imis/errors/panel_unimplemented_error.rb +0 -34
  64. data/lib/usps/imis/errors/pattern_matching_error.rb +0 -23
  65. data/lib/usps/imis/errors/response_error.rb +0 -104
  66. data/lib/usps/imis/errors/unexpected_property_type_error.rb +0 -31
  67. data/lib/usps/imis/helpers.rb +0 -23
  68. data/lib/usps/imis/logger.rb +0 -40
  69. data/lib/usps/imis/logger_formatter.rb +0 -39
  70. data/lib/usps/imis/logger_helpers.rb +0 -39
  71. data/lib/usps/imis/mocks/business_object.rb +0 -47
  72. data/lib/usps/imis/mocks.rb +0 -11
  73. data/lib/usps/imis/models/associations/individual_demog.rb +0 -11
  74. data/lib/usps/imis/models/base/finders.rb +0 -80
  75. data/lib/usps/imis/models/base/persistence.rb +0 -110
  76. data/lib/usps/imis/models/base.rb +0 -279
  77. data/lib/usps/imis/models/education.rb +0 -25
  78. data/lib/usps/imis/models/generated/abc_cs_contact.rb +0 -91
  79. data/lib/usps/imis/models/generated/abc_fed990.rb +0 -17
  80. data/lib/usps/imis/models/generated/abc_ps_volunteer_skills.rb +0 -16
  81. data/lib/usps/imis/models/generated/access_area.rb +0 -22
  82. data/lib/usps/imis/models/generated/access_item.rb +0 -18
  83. data/lib/usps/imis/models/generated/access_main.rb +0 -18
  84. data/lib/usps/imis/models/generated/action_plan.rb +0 -21
  85. data/lib/usps/imis/models/generated/activity.rb +0 -57
  86. data/lib/usps/imis/models/generated/activity_ldao.rb +0 -58
  87. data/lib/usps/imis/models/generated/activity_ldcdr.rb +0 -57
  88. data/lib/usps/imis/models/generated/activity_ldxo.rb +0 -57
  89. data/lib/usps/imis/models/generated/add_family.rb +0 -13
  90. data/lib/usps/imis/models/generated/advanced_email_twelve_months_delivered_by_date.rb +0 -16
  91. data/lib/usps/imis/models/generated/advanced_email_twelve_months_totals.rb +0 -16
  92. data/lib/usps/imis/models/generated/aec_chapter_events.rb +0 -28
  93. data/lib/usps/imis/models/generated/aec_chapter_link_all_events.rb +0 -18
  94. data/lib/usps/imis/models/generated/aec_district_administrators.rb +0 -19
  95. data/lib/usps/imis/models/generated/aec_district_squadron_admins.rb +0 -14
  96. data/lib/usps/imis/models/generated/aec_district_squadron_events.rb +0 -15
  97. data/lib/usps/imis/models/generated/aec_si_r_charge_fee_percentages.rb +0 -14
  98. data/lib/usps/imis/models/generated/aec_si_r_charge_params.rb +0 -16
  99. data/lib/usps/imis/models/generated/appeal.rb +0 -39
  100. data/lib/usps/imis/models/generated/appeal_status_ref.rb +0 -15
  101. data/lib/usps/imis/models/generated/asc_ps_abc_squadron_price.rb +0 -25
  102. data/lib/usps/imis/models/generated/atom_panel_purpose.rb +0 -15
  103. data/lib/usps/imis/models/generated/auto_pay_instruction_detail.rb +0 -22
  104. data/lib/usps/imis/models/generated/auto_pay_invoices.rb +0 -24
  105. data/lib/usps/imis/models/generated/auto_pay_invoices_dues.rb +0 -29
  106. data/lib/usps/imis/models/generated/auto_pay_member_instruction_detail.rb +0 -22
  107. data/lib/usps/imis/models/generated/auto_pay_membership_invoices_base.rb +0 -28
  108. data/lib/usps/imis/models/generated/bad_address_reason_ref.rb +0 -18
  109. data/lib/usps/imis/models/generated/batch_line_status_ref.rb +0 -14
  110. data/lib/usps/imis/models/generated/billing_cycles.rb +0 -50
  111. data/lib/usps/imis/models/generated/billing_fees.rb +0 -61
  112. data/lib/usps/imis/models/generated/billing_fees_by_bill_to_party.rb +0 -20
  113. data/lib/usps/imis/models/generated/billing_issue_notification_by_bill_run.rb +0 -20
  114. data/lib/usps/imis/models/generated/billing_issue_notification_by_party.rb +0 -30
  115. data/lib/usps/imis/models/generated/billing_log_by_bill_cycle_data.rb +0 -28
  116. data/lib/usps/imis/models/generated/billing_log_by_party.rb +0 -29
  117. data/lib/usps/imis/models/generated/billing_product.rb +0 -30
  118. data/lib/usps/imis/models/generated/bo_district_dues.rb +0 -26
  119. data/lib/usps/imis/models/generated/bo_dues_fees.rb +0 -21
  120. data/lib/usps/imis/models/generated/bo_dues_pricing.rb +0 -18
  121. data/lib/usps/imis/models/generated/bo_national_dues.rb +0 -84
  122. data/lib/usps/imis/models/generated/bo_no_natl_dist_dues.rb +0 -135
  123. data/lib/usps/imis/models/generated/bo_squadron_dues.rb +0 -26
  124. data/lib/usps/imis/models/generated/bo_total.rb +0 -17
  125. data/lib/usps/imis/models/generated/campaign.rb +0 -42
  126. data/lib/usps/imis/models/generated/campaign_status_ref.rb +0 -15
  127. data/lib/usps/imis/models/generated/campaign_type_ref.rb +0 -15
  128. data/lib/usps/imis/models/generated/certification_module_status.rb +0 -14
  129. data/lib/usps/imis/models/generated/change_log_report.rb +0 -25
  130. data/lib/usps/imis/models/generated/change_property.rb +0 -18
  131. data/lib/usps/imis/models/generated/chapt_subscriptions.rb +0 -14
  132. data/lib/usps/imis/models/generated/chapter.rb +0 -15
  133. data/lib/usps/imis/models/generated/chapter_events.rb +0 -30
  134. data/lib/usps/imis/models/generated/commerce_product.rb +0 -47
  135. data/lib/usps/imis/models/generated/commission_rate_type_ref.rb +0 -14
  136. data/lib/usps/imis/models/generated/committee.rb +0 -16
  137. data/lib/usps/imis/models/generated/committee_districts_org_id.rb +0 -16
  138. data/lib/usps/imis/models/generated/committee_i_ds_temp.rb +0 -13
  139. data/lib/usps/imis/models/generated/committee_squadrons_org_id.rb +0 -16
  140. data/lib/usps/imis/models/generated/communication_log_summary_for_charts.rb +0 -15
  141. data/lib/usps/imis/models/generated/communication_message_type_ref.rb +0 -14
  142. data/lib/usps/imis/models/generated/communication_reason_ref.rb +0 -22
  143. data/lib/usps/imis/models/generated/community_items.rb +0 -25
  144. data/lib/usps/imis/models/generated/community_subscriptions.rb +0 -25
  145. data/lib/usps/imis/models/generated/comparison_ref.rb +0 -14
  146. data/lib/usps/imis/models/generated/component_registry.rb +0 -28
  147. data/lib/usps/imis/models/generated/contact.rb +0 -32
  148. data/lib/usps/imis/models/generated/contact_birthday_info.rb +0 -20
  149. data/lib/usps/imis/models/generated/contact_communication_reason_preferences.rb +0 -25
  150. data/lib/usps/imis/models/generated/contact_detail_report.rb +0 -49
  151. data/lib/usps/imis/models/generated/contact_offering_ref.rb +0 -14
  152. data/lib/usps/imis/models/generated/contact_profile_image.rb +0 -22
  153. data/lib/usps/imis/models/generated/contact_report.rb +0 -23
  154. data/lib/usps/imis/models/generated/contact_salutation.rb +0 -18
  155. data/lib/usps/imis/models/generated/contact_skill_ref.rb +0 -14
  156. data/lib/usps/imis/models/generated/contact_social_network.rb +0 -19
  157. data/lib/usps/imis/models/generated/contact_status_ref.rb +0 -15
  158. data/lib/usps/imis/models/generated/contact_type_ref.rb +0 -16
  159. data/lib/usps/imis/models/generated/content_filter.rb +0 -18
  160. data/lib/usps/imis/models/generated/content_manager_authority_group.rb +0 -14
  161. data/lib/usps/imis/models/generated/cost_method_ref.rb +0 -15
  162. data/lib/usps/imis/models/generated/country_ref.rb +0 -27
  163. data/lib/usps/imis/models/generated/credit_type_ref.rb +0 -14
  164. data/lib/usps/imis/models/generated/cs_activity.rb +0 -50
  165. data/lib/usps/imis/models/generated/cs_activity_basic.rb +0 -51
  166. data/lib/usps/imis/models/generated/cs_activity_forms.rb +0 -38
  167. data/lib/usps/imis/models/generated/cs_activity_types.rb +0 -16
  168. data/lib/usps/imis/models/generated/cs_address.rb +0 -40
  169. data/lib/usps/imis/models/generated/cs_address_formats.rb +0 -15
  170. data/lib/usps/imis/models/generated/cs_appeal.rb +0 -23
  171. data/lib/usps/imis/models/generated/cs_calls.rb +0 -20
  172. data/lib/usps/imis/models/generated/cs_campaign.rb +0 -20
  173. data/lib/usps/imis/models/generated/cs_committee.rb +0 -23
  174. data/lib/usps/imis/models/generated/cs_committee_code.rb +0 -20
  175. data/lib/usps/imis/models/generated/cs_committee_member.rb +0 -38
  176. data/lib/usps/imis/models/generated/cs_committee_member_group.rb +0 -15
  177. data/lib/usps/imis/models/generated/cs_committee_position.rb +0 -16
  178. data/lib/usps/imis/models/generated/cs_contact.rb +0 -91
  179. data/lib/usps/imis/models/generated/cs_contact_basic.rb +0 -79
  180. data/lib/usps/imis/models/generated/cs_country_names.rb +0 -19
  181. data/lib/usps/imis/models/generated/cs_donations.rb +0 -31
  182. data/lib/usps/imis/models/generated/cs_donations_detail.rb +0 -33
  183. data/lib/usps/imis/models/generated/cs_donor_data.rb +0 -21
  184. data/lib/usps/imis/models/generated/cs_dues_history.rb +0 -22
  185. data/lib/usps/imis/models/generated/cs_event.rb +0 -92
  186. data/lib/usps/imis/models/generated/cs_event_history.rb +0 -20
  187. data/lib/usps/imis/models/generated/cs_exchange_rate.rb +0 -14
  188. data/lib/usps/imis/models/generated/cs_freight_dollar.rb +0 -14
  189. data/lib/usps/imis/models/generated/cs_function.rb +0 -57
  190. data/lib/usps/imis/models/generated/cs_function_fees.rb +0 -20
  191. data/lib/usps/imis/models/generated/cs_gen_tables_union.rb +0 -15
  192. data/lib/usps/imis/models/generated/cs_general_lookup_tables.rb +0 -17
  193. data/lib/usps/imis/models/generated/cs_inventory.rb +0 -37
  194. data/lib/usps/imis/models/generated/cs_invoice.rb +0 -51
  195. data/lib/usps/imis/models/generated/cs_iso_currency_codes.rb +0 -14
  196. data/lib/usps/imis/models/generated/cs_member_type.rb +0 -18
  197. data/lib/usps/imis/models/generated/cs_name_fin.rb +0 -27
  198. data/lib/usps/imis/models/generated/cs_name_fr.rb +0 -27
  199. data/lib/usps/imis/models/generated/cs_name_log.rb +0 -17
  200. data/lib/usps/imis/models/generated/cs_name_note.rb +0 -18
  201. data/lib/usps/imis/models/generated/cs_name_picture.rb +0 -19
  202. data/lib/usps/imis/models/generated/cs_name_user.rb +0 -18
  203. data/lib/usps/imis/models/generated/cs_order_history.rb +0 -22
  204. data/lib/usps/imis/models/generated/cs_order_lines.rb +0 -54
  205. data/lib/usps/imis/models/generated/cs_order_type.rb +0 -15
  206. data/lib/usps/imis/models/generated/cs_orders.rb +0 -85
  207. data/lib/usps/imis/models/generated/cs_org_control.rb +0 -47
  208. data/lib/usps/imis/models/generated/cs_product.rb +0 -49
  209. data/lib/usps/imis/models/generated/cs_product_category.rb +0 -18
  210. data/lib/usps/imis/models/generated/cs_product_fundraising.rb +0 -22
  211. data/lib/usps/imis/models/generated/cs_product_location.rb +0 -14
  212. data/lib/usps/imis/models/generated/cs_product_type.rb +0 -14
  213. data/lib/usps/imis/models/generated/cs_reg_functions.rb +0 -36
  214. data/lib/usps/imis/models/generated/cs_registrant_classes.rb +0 -15
  215. data/lib/usps/imis/models/generated/cs_registration.rb +0 -39
  216. data/lib/usps/imis/models/generated/cs_relationship.rb +0 -25
  217. data/lib/usps/imis/models/generated/cs_relationship_types.rb +0 -17
  218. data/lib/usps/imis/models/generated/cs_salutations.rb +0 -14
  219. data/lib/usps/imis/models/generated/cs_staff_user.rb +0 -34
  220. data/lib/usps/imis/models/generated/cs_state_province_codes.rb +0 -15
  221. data/lib/usps/imis/models/generated/cs_subscriptions.rb +0 -58
  222. data/lib/usps/imis/models/generated/cs_subscriptions_chapters.rb +0 -15
  223. data/lib/usps/imis/models/generated/cs_system_params.rb +0 -15
  224. data/lib/usps/imis/models/generated/cs_terms.rb +0 -17
  225. data/lib/usps/imis/models/generated/cs_trans_notify.rb +0 -16
  226. data/lib/usps/imis/models/generated/cs_web_security_group.rb +0 -14
  227. data/lib/usps/imis/models/generated/cs_web_user.rb +0 -18
  228. data/lib/usps/imis/models/generated/culture_ref.rb +0 -14
  229. data/lib/usps/imis/models/generated/customer_experience_status.rb +0 -14
  230. data/lib/usps/imis/models/generated/data_type.rb +0 -16
  231. data/lib/usps/imis/models/generated/data_vault_attempt_settlement_status_ref.rb +0 -15
  232. data/lib/usps/imis/models/generated/data_vault_attempt_status_ref.rb +0 -14
  233. data/lib/usps/imis/models/generated/data_vault_attempt_summary.rb +0 -39
  234. data/lib/usps/imis/models/generated/data_vault_batch_summary.rb +0 -21
  235. data/lib/usps/imis/models/generated/data_vault_log_attempt.rb +0 -25
  236. data/lib/usps/imis/models/generated/data_vault_status_ref.rb +0 -14
  237. data/lib/usps/imis/models/generated/data_vault_status_summary.rb +0 -15
  238. data/lib/usps/imis/models/generated/data_vault_status_summary_detail.rb +0 -19
  239. data/lib/usps/imis/models/generated/date_dimension.rb +0 -24
  240. data/lib/usps/imis/models/generated/day_of_the_week_ref.rb +0 -14
  241. data/lib/usps/imis/models/generated/discountable_item.rb +0 -20
  242. data/lib/usps/imis/models/generated/discountable_item_class.rb +0 -15
  243. data/lib/usps/imis/models/generated/distinct_user_defined_multi_select_properties.rb +0 -17
  244. data/lib/usps/imis/models/generated/districts_and_primary_members.rb +0 -15
  245. data/lib/usps/imis/models/generated/document_path.rb +0 -14
  246. data/lib/usps/imis/models/generated/document_storage.rb +0 -23
  247. data/lib/usps/imis/models/generated/document_system_size_info.rb +0 -36
  248. data/lib/usps/imis/models/generated/document_system_size_info_by_type.rb +0 -37
  249. data/lib/usps/imis/models/generated/document_system_status_count_info.rb +0 -14
  250. data/lib/usps/imis/models/generated/document_system_status_size_info.rb +0 -15
  251. data/lib/usps/imis/models/generated/document_system_type_count_info.rb +0 -14
  252. data/lib/usps/imis/models/generated/document_system_type_size_info.rb +0 -15
  253. data/lib/usps/imis/models/generated/document_type.rb +0 -34
  254. data/lib/usps/imis/models/generated/document_type_status_path_info.rb +0 -28
  255. data/lib/usps/imis/models/generated/donation.rb +0 -31
  256. data/lib/usps/imis/models/generated/donation_performance.rb +0 -19
  257. data/lib/usps/imis/models/generated/donation_summary.rb +0 -36
  258. data/lib/usps/imis/models/generated/dynamic_group.rb +0 -18
  259. data/lib/usps/imis/models/generated/educ_abc.rb +0 -21
  260. data/lib/usps/imis/models/generated/educ_boc.rb +0 -21
  261. data/lib/usps/imis/models/generated/educ_crs.rb +0 -21
  262. data/lib/usps/imis/models/generated/educ_id.rb +0 -21
  263. data/lib/usps/imis/models/generated/educ_ot.rb +0 -21
  264. data/lib/usps/imis/models/generated/educ_sem.rb +0 -21
  265. data/lib/usps/imis/models/generated/education_in_progress.rb +0 -16
  266. data/lib/usps/imis/models/generated/education_level_ref.rb +0 -15
  267. data/lib/usps/imis/models/generated/effective_contact_communication_preferences_data.rb +0 -23
  268. data/lib/usps/imis/models/generated/effective_fundraising_preferences_data.rb +0 -18
  269. data/lib/usps/imis/models/generated/engagement_category.rb +0 -23
  270. data/lib/usps/imis/models/generated/engagement_measure.rb +0 -24
  271. data/lib/usps/imis/models/generated/engagement_score_current_data.rb +0 -21
  272. data/lib/usps/imis/models/generated/engagement_score_formula.rb +0 -19
  273. data/lib/usps/imis/models/generated/engagement_score_monthly_data.rb +0 -22
  274. data/lib/usps/imis/models/generated/engagement_score_result.rb +0 -21
  275. data/lib/usps/imis/models/generated/engagement_score_yearly_data.rb +0 -21
  276. data/lib/usps/imis/models/generated/event_category_list.rb +0 -16
  277. data/lib/usps/imis/models/generated/event_function_resource_data.rb +0 -22
  278. data/lib/usps/imis/models/generated/event_question.rb +0 -24
  279. data/lib/usps/imis/models/generated/event_question_response.rb +0 -25
  280. data/lib/usps/imis/models/generated/event_registrants_report.rb +0 -45
  281. data/lib/usps/imis/models/generated/execution_mode_ref.rb +0 -15
  282. data/lib/usps/imis/models/generated/experience_definition_status.rb +0 -14
  283. data/lib/usps/imis/models/generated/expired_member_update_detail_log.rb +0 -19
  284. data/lib/usps/imis/models/generated/family_add_contact.rb +0 -91
  285. data/lib/usps/imis/models/generated/family_member_count.rb +0 -37
  286. data/lib/usps/imis/models/generated/file_type_ref.rb +0 -16
  287. data/lib/usps/imis/models/generated/first_notify_contact_per_gift.rb +0 -14
  288. data/lib/usps/imis/models/generated/first_payment_date_type_ref.rb +0 -15
  289. data/lib/usps/imis/models/generated/form_definition_field_data.rb +0 -19
  290. data/lib/usps/imis/models/generated/form_field_response_data.rb +0 -22
  291. data/lib/usps/imis/models/generated/fundraising_preference_ref.rb +0 -15
  292. data/lib/usps/imis/models/generated/fundraising_profile_donor_data.rb +0 -18
  293. data/lib/usps/imis/models/generated/gateway_result_ref.rb +0 -14
  294. data/lib/usps/imis/models/generated/gateway_transaction_data.rb +0 -35
  295. data/lib/usps/imis/models/generated/gateway_transaction_ref.rb +0 -15
  296. data/lib/usps/imis/models/generated/gateway_type_ref.rb +0 -17
  297. data/lib/usps/imis/models/generated/gift.rb +0 -41
  298. data/lib/usps/imis/models/generated/gift_adjustment_log_summary.rb +0 -25
  299. data/lib/usps/imis/models/generated/gift_aid_claim_status_ref.rb +0 -14
  300. data/lib/usps/imis/models/generated/gift_array.rb +0 -16
  301. data/lib/usps/imis/models/generated/gift_detail.rb +0 -29
  302. data/lib/usps/imis/models/generated/gift_history.rb +0 -45
  303. data/lib/usps/imis/models/generated/gift_history_summary.rb +0 -33
  304. data/lib/usps/imis/models/generated/gift_history_summary_basic.rb +0 -33
  305. data/lib/usps/imis/models/generated/gift_summary.rb +0 -16
  306. data/lib/usps/imis/models/generated/gift_totals_by_date.rb +0 -15
  307. data/lib/usps/imis/models/generated/gift_transaction.rb +0 -43
  308. data/lib/usps/imis/models/generated/gifts_received.rb +0 -32
  309. data/lib/usps/imis/models/generated/gifts_received_for_receipting.rb +0 -44
  310. data/lib/usps/imis/models/generated/gifts_received_summary.rb +0 -33
  311. data/lib/usps/imis/models/generated/gifts_with_void_and_replaced_receipts.rb +0 -43
  312. data/lib/usps/imis/models/generated/gl_batch_transaction_data.rb +0 -30
  313. data/lib/usps/imis/models/generated/gl_daily_transaction_data.rb +0 -30
  314. data/lib/usps/imis/models/generated/gl_detail_due_to_due_from_transaction_data.rb +0 -17
  315. data/lib/usps/imis/models/generated/gl_detail_transaction_data.rb +0 -36
  316. data/lib/usps/imis/models/generated/gl_detail_transaction_data_full.rb +0 -36
  317. data/lib/usps/imis/models/generated/gl_due_to_due_from_transaction_data.rb +0 -18
  318. data/lib/usps/imis/models/generated/gl_entry_type_ref.rb +0 -14
  319. data/lib/usps/imis/models/generated/gl_export_format_type_ref.rb +0 -14
  320. data/lib/usps/imis/models/generated/gl_export_log_detail.rb +0 -15
  321. data/lib/usps/imis/models/generated/gl_export_log_summary.rb +0 -26
  322. data/lib/usps/imis/models/generated/gl_export_multiple.rb +0 -15
  323. data/lib/usps/imis/models/generated/gl_export_summary_level_ref.rb +0 -15
  324. data/lib/usps/imis/models/generated/gl_monthly_due_to_due_from_transaction_data.rb +0 -18
  325. data/lib/usps/imis/models/generated/gl_monthly_transaction_data.rb +0 -29
  326. data/lib/usps/imis/models/generated/gl_source_item_type_ref.rb +0 -14
  327. data/lib/usps/imis/models/generated/gl_transaction_data.rb +0 -41
  328. data/lib/usps/imis/models/generated/grade.rb +0 -14
  329. data/lib/usps/imis/models/generated/group_info.rb +0 -28
  330. data/lib/usps/imis/models/generated/group_member_administrator_type_ref.rb +0 -15
  331. data/lib/usps/imis/models/generated/group_member_detail.rb +0 -29
  332. data/lib/usps/imis/models/generated/group_member_status_ref.rb +0 -15
  333. data/lib/usps/imis/models/generated/group_perspective.rb +0 -16
  334. data/lib/usps/imis/models/generated/group_price_sheet.rb +0 -17
  335. data/lib/usps/imis/models/generated/group_role_ref.rb +0 -17
  336. data/lib/usps/imis/models/generated/group_status_ref.rb +0 -16
  337. data/lib/usps/imis/models/generated/group_type_member_status.rb +0 -17
  338. data/lib/usps/imis/models/generated/group_type_ref.rb +0 -33
  339. data/lib/usps/imis/models/generated/group_type_role.rb +0 -22
  340. data/lib/usps/imis/models/generated/handling_price_ref.rb +0 -15
  341. data/lib/usps/imis/models/generated/hierarchy.rb +0 -21
  342. data/lib/usps/imis/models/generated/hierarchy_root.rb +0 -22
  343. data/lib/usps/imis/models/generated/i_series_data.rb +0 -15
  344. data/lib/usps/imis/models/generated/individual_demog.rb +0 -34
  345. data/lib/usps/imis/models/generated/institute_type_code_ref.rb +0 -16
  346. data/lib/usps/imis/models/generated/interaction_log.rb +0 -35
  347. data/lib/usps/imis/models/generated/interaction_log_event.rb +0 -24
  348. data/lib/usps/imis/models/generated/interaction_log_event_summary.rb +0 -30
  349. data/lib/usps/imis/models/generated/interval_type_ref.rb +0 -15
  350. data/lib/usps/imis/models/generated/invoice_line_data.rb +0 -39
  351. data/lib/usps/imis/models/generated/invoice_lines.rb +0 -42
  352. data/lib/usps/imis/models/generated/invoice_number.rb +0 -16
  353. data/lib/usps/imis/models/generated/invoice_payment_summary.rb +0 -14
  354. data/lib/usps/imis/models/generated/invoice_purpose.rb +0 -15
  355. data/lib/usps/imis/models/generated/invoice_source_system_ref.rb +0 -13
  356. data/lib/usps/imis/models/generated/invoice_type_ref.rb +0 -14
  357. data/lib/usps/imis/models/generated/journal_entry_type_ref.rb +0 -14
  358. data/lib/usps/imis/models/generated/license_ref.rb +0 -15
  359. data/lib/usps/imis/models/generated/line_pricing_ref.rb +0 -15
  360. data/lib/usps/imis/models/generated/list_entity.rb +0 -14
  361. data/lib/usps/imis/models/generated/locale_ref.rb +0 -14
  362. data/lib/usps/imis/models/generated/location_status.rb +0 -14
  363. data/lib/usps/imis/models/generated/mail_code_ref.rb +0 -16
  364. data/lib/usps/imis/models/generated/matching_gift_plan_type_ref.rb +0 -15
  365. data/lib/usps/imis/models/generated/matching_mode_ref.rb +0 -15
  366. data/lib/usps/imis/models/generated/matching_period_ref.rb +0 -15
  367. data/lib/usps/imis/models/generated/memorial_tribute_type_ref.rb +0 -14
  368. data/lib/usps/imis/models/generated/method_set_type_ref.rb +0 -14
  369. data/lib/usps/imis/models/generated/month_ref.rb +0 -18
  370. data/lib/usps/imis/models/generated/name_prefixes.rb +0 -15
  371. data/lib/usps/imis/models/generated/name_suffixes.rb +0 -13
  372. data/lib/usps/imis/models/generated/navigation_pane.rb +0 -18
  373. data/lib/usps/imis/models/generated/net_contact.rb +0 -99
  374. data/lib/usps/imis/models/generated/net_contact_basic.rb +0 -88
  375. data/lib/usps/imis/models/generated/net_contact_data.rb +0 -88
  376. data/lib/usps/imis/models/generated/note_purpose_ref.rb +0 -14
  377. data/lib/usps/imis/models/generated/offering_status.rb +0 -14
  378. data/lib/usps/imis/models/generated/opportunity_class_ref.rb +0 -15
  379. data/lib/usps/imis/models/generated/opportunity_default_status_ref.rb +0 -15
  380. data/lib/usps/imis/models/generated/opportunity_status_ref.rb +0 -15
  381. data/lib/usps/imis/models/generated/opportunity_task_user.rb +0 -20
  382. data/lib/usps/imis/models/generated/opportunity_type.rb +0 -29
  383. data/lib/usps/imis/models/generated/order_category.rb +0 -14
  384. data/lib/usps/imis/models/generated/order_fulfillment_status_ref.rb +0 -14
  385. data/lib/usps/imis/models/generated/order_invoice.rb +0 -14
  386. data/lib/usps/imis/models/generated/order_state_ref.rb +0 -14
  387. data/lib/usps/imis/models/generated/order_type_detail.rb +0 -17
  388. data/lib/usps/imis/models/generated/org_demog.rb +0 -28
  389. data/lib/usps/imis/models/generated/organization_demo.rb +0 -18
  390. data/lib/usps/imis/models/generated/organization_hierarchy.rb +0 -19
  391. data/lib/usps/imis/models/generated/package.rb +0 -25
  392. data/lib/usps/imis/models/generated/package_item.rb +0 -19
  393. data/lib/usps/imis/models/generated/package_status_ref.rb +0 -14
  394. data/lib/usps/imis/models/generated/payment_application.rb +0 -31
  395. data/lib/usps/imis/models/generated/payment_application_detail.rb +0 -35
  396. data/lib/usps/imis/models/generated/payment_application_restriction_ref.rb +0 -14
  397. data/lib/usps/imis/models/generated/payment_application_summary.rb +0 -18
  398. data/lib/usps/imis/models/generated/payment_application_type.rb +0 -14
  399. data/lib/usps/imis/models/generated/payment_category_ref.rb +0 -14
  400. data/lib/usps/imis/models/generated/payment_detail_status_ref.rb +0 -15
  401. data/lib/usps/imis/models/generated/payment_method_data.rb +0 -20
  402. data/lib/usps/imis/models/generated/payment_reconciliation.rb +0 -26
  403. data/lib/usps/imis/models/generated/payment_status_ref.rb +0 -14
  404. data/lib/usps/imis/models/generated/percentile_ranking.rb +0 -20
  405. data/lib/usps/imis/models/generated/picture_purpose_ref.rb +0 -14
  406. data/lib/usps/imis/models/generated/pin_update.rb +0 -13
  407. data/lib/usps/imis/models/generated/pipeline.rb +0 -15
  408. data/lib/usps/imis/models/generated/pipeline_stage.rb +0 -17
  409. data/lib/usps/imis/models/generated/postal_code_ref.rb +0 -26
  410. data/lib/usps/imis/models/generated/prefix_ref.rb +0 -17
  411. data/lib/usps/imis/models/generated/price_basis_ref.rb +0 -15
  412. data/lib/usps/imis/models/generated/pricing_type_ref.rb +0 -15
  413. data/lib/usps/imis/models/generated/primary_fam_members.rb +0 -14
  414. data/lib/usps/imis/models/generated/process_type_default_owner_all_users.rb +0 -15
  415. data/lib/usps/imis/models/generated/product_price_sheet.rb +0 -20
  416. data/lib/usps/imis/models/generated/product_status_ref.rb +0 -15
  417. data/lib/usps/imis/models/generated/product_trans.rb +0 -31
  418. data/lib/usps/imis/models/generated/product_trans_detail.rb +0 -17
  419. data/lib/usps/imis/models/generated/profile_documents.rb +0 -15
  420. data/lib/usps/imis/models/generated/profile_page.rb +0 -36
  421. data/lib/usps/imis/models/generated/program_group_status.rb +0 -14
  422. data/lib/usps/imis/models/generated/program_status.rb +0 -14
  423. data/lib/usps/imis/models/generated/promotion_rule_ref.rb +0 -15
  424. data/lib/usps/imis/models/generated/property_definition.rb +0 -33
  425. data/lib/usps/imis/models/generated/prospect.rb +0 -38
  426. data/lib/usps/imis/models/generated/publish_priority.rb +0 -14
  427. data/lib/usps/imis/models/generated/publish_request.rb +0 -18
  428. data/lib/usps/imis/models/generated/publish_request_detail.rb +0 -22
  429. data/lib/usps/imis/models/generated/publish_request_status.rb +0 -15
  430. data/lib/usps/imis/models/generated/publish_server.rb +0 -29
  431. data/lib/usps/imis/models/generated/quality_ref.rb +0 -15
  432. data/lib/usps/imis/models/generated/rank.rb +0 -21
  433. data/lib/usps/imis/models/generated/receipt_report.rb +0 -24
  434. data/lib/usps/imis/models/generated/receipt_status_ref.rb +0 -15
  435. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set.rb +0 -19
  436. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set_list.rb +0 -20
  437. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set_status.rb +0 -15
  438. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_status.rb +0 -15
  439. data/lib/usps/imis/models/generated/recurring_donation_frequency_ref.rb +0 -15
  440. data/lib/usps/imis/models/generated/reference_date.rb +0 -13
  441. data/lib/usps/imis/models/generated/registered_component.rb +0 -27
  442. data/lib/usps/imis/models/generated/registration_status.rb +0 -14
  443. data/lib/usps/imis/models/generated/relationship.rb +0 -18
  444. data/lib/usps/imis/models/generated/relationship_category.rb +0 -17
  445. data/lib/usps/imis/models/generated/relationship_type_category.rb +0 -17
  446. data/lib/usps/imis/models/generated/relationship_type_ref.rb +0 -16
  447. data/lib/usps/imis/models/generated/relationship_update.rb +0 -16
  448. data/lib/usps/imis/models/generated/relationship_update_contact_panel.rb +0 -16
  449. data/lib/usps/imis/models/generated/remove_district_org_committee_terms.rb +0 -28
  450. data/lib/usps/imis/models/generated/remove_squadron_org_committee_terms.rb +0 -28
  451. data/lib/usps/imis/models/generated/reporting_group_user.rb +0 -14
  452. data/lib/usps/imis/models/generated/response_media_ref.rb +0 -14
  453. data/lib/usps/imis/models/generated/response_type_ref.rb +0 -15
  454. data/lib/usps/imis/models/generated/restock_price_ref.rb +0 -15
  455. data/lib/usps/imis/models/generated/sales_location_status_ref.rb +0 -15
  456. data/lib/usps/imis/models/generated/salutation_ref.rb +0 -22
  457. data/lib/usps/imis/models/generated/sbuddy_answers.rb +0 -23
  458. data/lib/usps/imis/models/generated/sbuddy_definition.rb +0 -28
  459. data/lib/usps/imis/models/generated/schedule_frequency_ref.rb +0 -14
  460. data/lib/usps/imis/models/generated/segmentation_job_status_ref.rb +0 -15
  461. data/lib/usps/imis/models/generated/sequence_counter.rb +0 -16
  462. data/lib/usps/imis/models/generated/set_district_org_committee_terms.rb +0 -28
  463. data/lib/usps/imis/models/generated/set_squadron_org_committee_terms.rb +0 -28
  464. data/lib/usps/imis/models/generated/ship_price_ref.rb +0 -15
  465. data/lib/usps/imis/models/generated/soa_group.rb +0 -21
  466. data/lib/usps/imis/models/generated/soa_group_member.rb +0 -19
  467. data/lib/usps/imis/models/generated/soa_group_member_detail.rb +0 -28
  468. data/lib/usps/imis/models/generated/social_network_ref.rb +0 -15
  469. data/lib/usps/imis/models/generated/solicitation.rb +0 -40
  470. data/lib/usps/imis/models/generated/solicitation_status_ref.rb +0 -15
  471. data/lib/usps/imis/models/generated/source_code.rb +0 -43
  472. data/lib/usps/imis/models/generated/source_code_status_ref.rb +0 -15
  473. data/lib/usps/imis/models/generated/source_code_type_ref.rb +0 -15
  474. data/lib/usps/imis/models/generated/squad_form_add_fam.rb +0 -23
  475. data/lib/usps/imis/models/generated/squad_form_add_individual.rb +0 -31
  476. data/lib/usps/imis/models/generated/squad_leader_add_individual_contact.rb +0 -28
  477. data/lib/usps/imis/models/generated/squad_note.rb +0 -13
  478. data/lib/usps/imis/models/generated/squad_to_district.rb +0 -18
  479. data/lib/usps/imis/models/generated/squadron_chap_com.rb +0 -16
  480. data/lib/usps/imis/models/generated/squadron_district_lookup.rb +0 -18
  481. data/lib/usps/imis/models/generated/squadrons_and_primary_members.rb +0 -15
  482. data/lib/usps/imis/models/generated/standard_page.rb +0 -15
  483. data/lib/usps/imis/models/generated/state_province_ref.rb +0 -21
  484. data/lib/usps/imis/models/generated/suffix_ref.rb +0 -16
  485. data/lib/usps/imis/models/generated/supplement.rb +0 -27
  486. data/lib/usps/imis/models/generated/supplement_status_ref.rb +0 -15
  487. data/lib/usps/imis/models/generated/supplement_type_ref.rb +0 -15
  488. data/lib/usps/imis/models/generated/system_config_xml.rb +0 -14
  489. data/lib/usps/imis/models/generated/system_param_int.rb +0 -23
  490. data/lib/usps/imis/models/generated/tag_hierarchy.rb +0 -32
  491. data/lib/usps/imis/models/generated/tag_relationship_type.rb +0 -16
  492. data/lib/usps/imis/models/generated/task_item.rb +0 -32
  493. data/lib/usps/imis/models/generated/task_item_status_ref.rb +0 -15
  494. data/lib/usps/imis/models/generated/task_latest_log.rb +0 -15
  495. data/lib/usps/imis/models/generated/task_notify_creator_ref.rb +0 -15
  496. data/lib/usps/imis/models/generated/task_priority.rb +0 -15
  497. data/lib/usps/imis/models/generated/task_status.rb +0 -16
  498. data/lib/usps/imis/models/generated/task_type.rb +0 -15
  499. data/lib/usps/imis/models/generated/tax_authority_level_ref.rb +0 -15
  500. data/lib/usps/imis/models/generated/time_zone_ref.rb +0 -20
  501. data/lib/usps/imis/models/generated/top_level_parent_organization.rb +0 -20
  502. data/lib/usps/imis/models/generated/transaction_detail.rb +0 -56
  503. data/lib/usps/imis/models/generated/transaction_summary_large_batch.rb +0 -44
  504. data/lib/usps/imis/models/generated/uniform_registry.rb +0 -14
  505. data/lib/usps/imis/models/generated/uniform_tag.rb +0 -17
  506. data/lib/usps/imis/models/generated/upgrade_log_detail.rb +0 -19
  507. data/lib/usps/imis/models/generated/url_mapping_type_ref.rb +0 -15
  508. data/lib/usps/imis/models/generated/user_data.rb +0 -33
  509. data/lib/usps/imis/models/generated/user_role.rb +0 -14
  510. data/lib/usps/imis/models/generated/user_token.rb +0 -14
  511. data/lib/usps/imis/models/generated/vertical_alignment_ref.rb +0 -15
  512. data/lib/usps/imis/models/generated/vessels.rb +0 -18
  513. data/lib/usps/imis/models/generated/volunteer_information.rb +0 -22
  514. data/lib/usps/imis/models/generated/warehouse_status_ref.rb +0 -14
  515. data/lib/usps/imis/models/generated/warehouse_type_ref.rb +0 -14
  516. data/lib/usps/imis/models/generated/web_user_control_ref.rb +0 -15
  517. data/lib/usps/imis/models/generated/workflow_queue_item.rb +0 -25
  518. data/lib/usps/imis/models/generated/workflow_queue_item_with_status.rb +0 -25
  519. data/lib/usps/imis/models/generated/workflow_queue_status_ref.rb +0 -15
  520. data/lib/usps/imis/models/generated/workflow_status_ref.rb +0 -15
  521. data/lib/usps/imis/models/party/address.rb +0 -32
  522. data/lib/usps/imis/models/party/alternate_id.rb +0 -16
  523. data/lib/usps/imis/models/party/email.rb +0 -17
  524. data/lib/usps/imis/models/party/phone.rb +0 -17
  525. data/lib/usps/imis/models/party/salutation.rb +0 -18
  526. data/lib/usps/imis/models/party.rb +0 -131
  527. data/lib/usps/imis/models/types/upcase_string.rb +0 -18
  528. data/lib/usps/imis/models/vessel_safety_checks.rb +0 -20
  529. data/lib/usps/imis/models.rb +0 -92
  530. data/lib/usps/imis/panels/base_panel.rb +0 -136
  531. data/lib/usps/imis/panels/education.rb +0 -29
  532. data/lib/usps/imis/panels/vsc.rb +0 -28
  533. data/lib/usps/imis/panels.rb +0 -25
  534. data/lib/usps/imis/party_data.rb +0 -88
  535. data/lib/usps/imis/properties.rb +0 -74
  536. data/lib/usps/imis/query.rb +0 -163
  537. data/lib/usps/imis/requests.rb +0 -67
  538. data/spec/support/usps/simple_cov_uncovered_lines_formatter.rb +0 -53
  539. data/spec/support/usps/vcr/config.rb +0 -47
  540. data/spec/support/usps/vcr/filters.rb +0 -89
  541. data/spec/support/usps/vcr.rb +0 -8
data/lib/usps/imis/api.rb CHANGED
@@ -1,313 +1,207 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'business_object'
4
- require_relative 'mapper'
5
- require_relative 'query'
6
-
7
3
  module Usps
8
4
  module Imis
9
- # The core API wrapper
10
- #
11
5
  class Api
12
- include Requests
13
- include Imis::Helpers
14
-
15
- NAME = 'USPS iMIS API - Ruby'
16
-
17
- # Endpoint for (re-)authentication requests
18
- #
19
6
  AUTHENTICATION_PATH = 'Token'
7
+ API_PATH = 'api'
8
+ QUERY_PATH = 'api/Query'
9
+ PANELS = Struct.new(:vsc, :education)
20
10
 
21
- # API bearer token
22
- #
23
- attr_reader :token
24
-
25
- # Expiration time for the API bearer token
26
- #
27
- # Used to automatically re-authenticate as needed
28
- #
29
- attr_reader :token_expiration
30
-
31
- # Currently selected iMIS ID for API requests
32
- #
33
- attr_reader :imis_id
34
-
35
- # Whether to lock changes to the selected iMIS ID
36
- #
37
- attr_reader :lock_imis_id
38
-
39
- # Tagged logger
40
- #
41
- attr_reader :logger
42
-
43
- # Name and version of the API
44
- #
45
- def self.version = "#{NAME} (v#{Imis::VERSION})"
46
-
47
- # Create a new instance of +Api+ and provide an existing auth token
48
- #
49
- # @param token [String] Auth token
50
- #
51
- def self.with_token(token)
52
- new.tap do |api|
53
- api.instance_variable_set(:@token, token)
54
- api.instance_variable_set(:@token_expiration, Time.now + 3600) # Greater than the actual lifetime of the token
55
- end
56
- end
57
-
58
- # A new instance of +Api+
59
- #
60
- # @param imis_id [Integer, String] iMIS ID to select immediately on initialization
61
- # @param record_id [Integer, String] iMIS ID to select immediately on initialization
62
- # @param certificate [String] Certificate to convert to iMIS ID immediately on initialization
63
- #
64
- def initialize(imis_id: nil, record_id: nil, certificate: nil)
65
- raise ArgumentError, 'Cannot provide both imis_id and certificate' if imis_id && certificate
66
-
67
- @logger = Imis.logger('Api')
68
- Imis.config.validate!
11
+ attr_reader :token, :token_expiration, :imis_id
69
12
 
13
+ def initialize(skip_authentication: false, imis_id: nil)
14
+ authenticate unless skip_authentication
70
15
  self.imis_id = imis_id if imis_id
71
- self.record_id = record_id if record_id
72
- imis_id_for(certificate) if certificate
73
16
  end
74
17
 
75
18
  # Manually set the current ID, if you already have it for a given member
76
19
  #
77
- # Supports integer ID and UUID string
78
- #
79
- # @param id [Integer, String] iMIS ID to select for future requests
80
- #
81
- # @return [Integer, String] iMIS ID
82
- #
83
20
  def imis_id=(id)
84
- raise Errors::LockedIdError if lock_imis_id
85
-
86
- @imis_id = format_id(id)
21
+ @imis_id = id.to_i.to_s
87
22
  end
88
23
 
89
- # Manually set the current record ID
90
- #
91
- # @param id [Integer, String] Record ID to select for future requests
92
- #
93
- # @return [Integer] Record ID
94
- #
95
- def record_id=(id)
96
- return if id.nil?
97
-
98
- raise Errors::LockedIdError if lock_imis_id
99
-
100
- @record_id = format_id(id)
101
- end
102
-
103
- # Currently selected Record ID for API requests
104
- #
105
- # Defaults to the iMIS ID
106
- #
107
- def record_id = @record_id || imis_id
108
-
109
24
  # Convert a member's certificate number into an iMIS ID number
110
25
  #
111
- # @param certificate [String] Certificate number to lookup the corresponding iMIS ID for
112
- #
113
- # @return [Integer] Corresponding iMIS ID
114
- #
115
26
  def imis_id_for(certificate)
116
- raise Errors::LockedIdError if lock_imis_id
117
-
118
- logger.debug "Fetching iMIS ID for #{certificate}"
119
-
120
- net_contact_data = query('NetContactData', MajorKey: certificate).one
121
- raise Errors::NotFoundError, 'Member not found' if net_contact_data.nil?
122
-
123
- party = query('Party', UniformId: net_contact_data.id).one
124
- raise Errors::NotFoundError, 'Member not found' if party.nil?
125
-
126
- self.imis_id = party.imis_id
127
- rescue Errors::ResponseError
128
- raise Errors::NotFoundError, 'Member not found'
27
+ result = query(Imis.configuration.imis_id_query_name, { certificate: })
28
+ @imis_id = result['Items']['$values'][0]['ID']
29
+ rescue StandardError
30
+ raise Error::Api, 'Member not found'
129
31
  end
130
32
 
131
33
  # Run requests as DSL, with specific iMIS ID only maintained for this scope
132
34
  #
133
- # Either +id+ or +certificate+ is required.
134
- #
135
- # While in this block, changes to the value of +imis_id+ are not allowed
35
+ # This should be used with methods that do not change the value of `imis_id`
136
36
  #
137
- # If no block is given, this sets the iMIS ID and returns self.
138
- #
139
- # @param id [Integer, String] iMIS ID to select for requests within the block
140
- # @param certificate [String] Certificate number to convert to iMIS ID and select for requests within the block
141
- # @param record_id [Integer] Record ID to select for requests within the block
142
- # @yield Block context to run requests with a specific iMIS ID
143
- # @yieldparam [Api]
144
- #
145
- # @example
146
- # with(12345) do
147
- # update(mm: 15)
148
- # end
149
- #
150
- # @return [Usps::Imis::Api]
151
- #
152
- def with(id = nil, certificate: nil, record_id: nil, &)
153
- raise ArgumentError, 'Must provide id or certificate' unless id || certificate
154
-
37
+ def with(id, &)
155
38
  old_id = imis_id
156
- old_record_id = @record_id
157
-
158
- id.nil? ? imis_id_for(certificate) : self.imis_id = id
159
- self.record_id = record_id
160
- return self unless block_given?
161
-
162
- @lock_imis_id = true
39
+ self.imis_id = id
163
40
  instance_eval(&)
164
41
  ensure
165
- if block_given?
166
- @lock_imis_id = false
167
- self.imis_id = old_id
168
- self.record_id = old_record_id
169
- end
42
+ self.imis_id = old_id
170
43
  end
171
44
 
172
- # Build a Query interface
173
- #
174
- # Works with IQA queries and Business Objects
175
- #
176
- # @param query_name [String] Full path of the query, e.g. +$/_ABC/Fiander/iMIS_ID+
177
- # @query_params [Hash] Conforms to pattern +{ param_name => param_value }+
45
+ # Get a business object for the current member
178
46
  #
179
- # @return [Usps::Imis::Query] Query wrapper
180
- #
181
- def query(query_name, query_params = {}) = Query.new(self, query_name, **query_params)
47
+ def get(business_object_name, url_id: nil)
48
+ uri = uri_for(business_object_name, url_id:)
49
+ request = Net::HTTP::Get.new(uri)
50
+ result = submit(uri, authorize(request))
51
+ JSON.parse(result.body)
52
+ end
182
53
 
183
- # Run requests as DSL, with specific +BusinessObject+ only maintained for this scope
184
- #
185
- # If no block is given, this returns the specified +BusinessObject+.
54
+ # Update only specific fields on a business object for the current member
186
55
  #
187
- # @param business_object_name [String, Symbol] Name of the business object
188
- # @param ordinal [Integer] Ordinal to build override ID param of the URL (e.g. used for Panels)
189
- # @yield Block context to run requests on a specific +BusinessObject+
190
- # @yieldparam [Api]
56
+ # fields - hash of shape: { field_name => new_value }
191
57
  #
192
- # @return [Usps::Imis::BusinessObject]
193
- #
194
- def on(business_object_name, ordinal: nil, &)
195
- object = BusinessObject.new(self, business_object_name, ordinal:)
196
- return object unless block_given?
197
-
198
- object.instance_eval(&)
58
+ def put_fields(business_object_name, fields, url_id: nil)
59
+ updated = filter_fields(business_object_name, fields)
60
+ put(business_object_name, updated, url_id:)
199
61
  end
200
62
 
201
- # An instance of +Mapper+, using this instance as its parent +Api+
63
+ # Update a business object for the current member
202
64
  #
203
- def mapper
204
- @mapper ||= Mapper.new(self)
65
+ def put(business_object_name, body, url_id: nil)
66
+ uri = uri_for(business_object_name, url_id:)
67
+ request = Net::HTTP::Put.new(uri)
68
+ request.body = JSON.dump(body)
69
+ result = submit(uri, authorize(request))
70
+ JSON.parse(result.body)
205
71
  end
206
72
 
207
- # Convenience alias for reading mapped fields
208
- #
209
- # @return Value of the specified field
210
- #
211
- delegate :fetch, to: :mapper
212
- alias [] fetch
213
-
214
- # Convenience alias for reading multiple mapped fields
215
- #
216
- # @return [Array] Values of the specified fields
217
- #
218
- delegate :fetch_all, to: :mapper
219
-
220
- # Convenience alias for updating mapped fields
73
+ # Create a business object for the current member
221
74
  #
222
- # @return [Array] Array containing the updated object
223
- #
224
- def put_field(field_key, value) = update(field_key => value)
225
- alias []= put_field
75
+ def post(business_object_name, body, url_id: nil)
76
+ uri = uri_for(business_object_name, url_id:)
77
+ request = Net::HTTP::Post.new(uri)
78
+ request.body = JSON.dump(body)
79
+ result = submit(uri, authorize(request))
80
+ JSON.parse(result.body)
81
+ end
226
82
 
227
- # Convenience alias for updating mapped fields
83
+ # Remove a business object for the current member
228
84
  #
229
- # @return [Usps::Imis::Data] Updated object
85
+ # Returns empty string on success
230
86
  #
231
- delegate :update, to: :mapper
87
+ def delete(business_object_name, url_id: nil)
88
+ uri = uri_for(business_object_name, url_id:)
89
+ request = Net::HTTP::Delete.new(uri)
90
+ result = submit(uri, authorize(request))
91
+ result.body
92
+ end
232
93
 
233
- # Names of every Business Object that has a registered +Models::Base+
234
- # wrapper, partitioned by whether the name carries an +ABC+ prefix.
235
- # Sourced from the in-process registry — no HTTP — so this answers
236
- # "what does the gem know how to wrap?", not "what does the server
237
- # expose?". Anything not listed still round-trips as raw +Data+.
94
+ # Run an IQA Query
238
95
  #
239
- # @return [Hash<Symbol, Array<String>>] Grouped registered Business Objects
96
+ # query_name - the full path of the query in IQA, e.g. `$/_ABC/Fiander/iMIS_ID`
97
+ # query_params - hash of shape: { param_name => param_value }
240
98
  #
241
- def business_objects
242
- abc, other = Models.entity_names.partition { it.include?('ABC') }
99
+ def query(query_name, query_params = {})
100
+ query_params[:QueryName] = query_name
101
+ path = "#{QUERY_PATH}?#{query_params.to_query}"
102
+ uri = URI(File.join(imis_hostname, path))
103
+ request = Net::HTTP::Get.new(uri)
104
+ result = submit(uri, authorize(request))
105
+ JSON.parse(result.body)
106
+ end
243
107
 
244
- { abc:, other: }
108
+ def mapper
109
+ @mapper ||= Mapper.new(self)
245
110
  end
246
111
 
247
- # Convenience accessor for available Panel objects, each using this instance as its parent
248
- # +Api+
249
- #
250
112
  def panels
251
- @panels ||= Panels.all(self)
113
+ @panels ||= PANELS.new(
114
+ Panel::Vsc.new(self),
115
+ Panel::Education.new(self)
116
+ )
252
117
  end
253
118
 
254
- # Used by the CLI wrappers to reduce authentication requests
255
- #
256
- def auth_token
257
- authenticate
258
-
259
- { token: @token, token_expiration: @token_expiration }
119
+ def update(data)
120
+ mapper.update(data)
260
121
  end
261
122
 
262
- # Persistent HTTP connection for reuse across requests
263
- #
264
- def http_connection
265
- return @http_connection if @http_connection&.started?
123
+ def instance_variables_to_inspect = %i[@token_expiration @imis_id]
124
+
125
+ private
266
126
 
267
- config = Imis.configuration
268
- hostname = URI(config.hostname)
269
- @http_connection = Net::HTTP.new(hostname.host, hostname.port).tap do |http|
127
+ def client(uri)
128
+ Net::HTTP.new(uri.host, uri.port).tap do |http|
270
129
  http.use_ssl = true
271
130
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
272
- http.open_timeout = config.open_timeout
273
- http.read_timeout = config.read_timeout
274
- http.write_timeout = config.write_timeout
275
- http.keep_alive_timeout = 30
276
- http.start
277
131
  end
278
132
  end
279
133
 
280
- # Ruby 3.5 instance variable filter
281
- #
282
- def instance_variables_to_inspect = %i[@token_expiration @imis_id]
134
+ def imis_hostname
135
+ Imis.configuration.hostname
136
+ end
283
137
 
284
- # Authenticate to the iMIS API, and store the access token and expiration time
138
+ # Authorize a request prior to submitting
285
139
  #
286
- def authenticate
287
- json = nil # Scope
140
+ # If the current token is missing/expired, request a new one
141
+ #
142
+ def authorize(request)
143
+ authenticate if token_expiration < Time.now
144
+ request.tap { |r| r.add_field('Authorization', "Bearer #{token}") }
145
+ end
288
146
 
289
- logger.tagged('Auth') do
290
- logger.info 'Authenticating with iMIS'
147
+ # Construct a business object API endpoint address
148
+ #
149
+ def uri_for(business_object_name, url_id: nil)
150
+ url_id ||= imis_id
151
+ url_id = CGI.escape(url_id)
152
+ URI(File.join(imis_hostname, "#{API_PATH}/#{business_object_name}/#{url_id}"))
153
+ end
291
154
 
292
- request = http_post
293
- request.body = URI.encode_www_form(
294
- grant_type: 'password',
295
- username: Imis.configuration.username,
296
- password: Imis.configuration.password
297
- )
298
- result = submit(request)
299
- json = JSON.parse(result.body)
155
+ def submit(uri, request)
156
+ client(uri).request(request).tap do |result|
157
+ raise Error::Response.from(result) unless result.is_a?(Net::HTTPSuccess)
300
158
  end
159
+ end
160
+
161
+ # Authenticate to the iMIS API, and store the access token and expiration time
162
+ #
163
+ def authenticate
164
+ uri = URI(File.join(imis_hostname, AUTHENTICATION_PATH))
165
+ req = Net::HTTP::Post.new(uri)
166
+ authentication_data = {
167
+ grant_type: 'password',
168
+ username: Imis.configuration.username,
169
+ password: Imis.configuration.password
170
+ }
171
+ req.body = URI.encode_www_form(authentication_data)
172
+ result = submit(uri, req)
173
+ json = JSON.parse(result.body)
301
174
 
302
175
  @token = json['access_token']
303
- @token_expiration = Time.now + json['expires_in'] - 60
176
+ @token_expiration = Time.parse(json['.expires'])
304
177
  end
305
178
 
306
- private
307
-
308
- # URI for the authentication endpoint
179
+ # Manually assemble the matching data structure, with fields in the correct order
309
180
  #
310
- def uri(...) = URI(File.join(Imis.configuration.hostname, AUTHENTICATION_PATH))
181
+ def filter_fields(business_object_name, fields)
182
+ existing = get(business_object_name)
183
+
184
+ JSON.parse(JSON.dump(existing)).tap do |updated|
185
+ # The first property is always the iMIS ID again
186
+ updated['Properties']['$values'] = [existing['Properties']['$values'][0]]
187
+
188
+ # Iterate through all existing fields
189
+ existing['Properties']['$values'].each do |value|
190
+ next unless fields.keys.include?(value['Name'])
191
+
192
+ # Strings are not wrapped in the type definition structure
193
+ new_value = fields[value['Name']]
194
+ if new_value.is_a?(String)
195
+ value['Value'] = new_value
196
+ else
197
+ value['Value']['$value'] = new_value
198
+ end
199
+
200
+ # Add the completed field with the updated value
201
+ updated['Properties']['$values'] << value
202
+ end
203
+ end
204
+ end
311
205
  end
312
206
  end
313
207
  end
@@ -1,175 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'logger'
4
-
5
3
  module Usps
6
4
  module Imis
7
- # API Configuration
8
- #
9
5
  class Config
10
6
  IMIS_ROOT_URL_PROD = 'https://portal.americasboatingclub.org'
11
7
  IMIS_ROOT_URL_DEV = 'https://abcdev.imiscloud.com'
12
- DEFAULT_GLOBAL_LOG_PATH = '/var/log/imis/imis.log'
13
-
14
- # Net::HTTP timeouts for the API connection (seconds). open_timeout governs connection
15
- # establishment (TCP connect + TLS handshake) — the phase that stalls when iMIS is unreachable,
16
- # so it defaults low to fail fast rather than pin the caller.
17
- DEFAULT_OPEN_TIMEOUT = 3
18
- DEFAULT_READ_TIMEOUT = 30
19
- DEFAULT_WRITE_TIMEOUT = 30
20
-
21
- REQUIRED = %w[username password].freeze
22
- OPTIONAL = %w[
23
- environment logger_file global_log_path pretty_print_api
24
- open_timeout read_timeout write_timeout
25
- ].freeze
26
- SETTABLE = (REQUIRED + OPTIONAL).freeze
27
-
28
- class << self
29
- # Opt-in +.env+ loader. The gem no longer auto-loads dotenv on require —
30
- # call this from your app boot (or before +Imis.configure+) if you want
31
- # +ENV+ populated from +.env+. Idempotent.
32
- #
33
- def load_dotenv!
34
- Dotenv.load
35
- end
36
- end
37
8
 
38
- attr_accessor :username, :password, :pretty_print_api, :open_timeout, :read_timeout, :write_timeout
39
- attr_reader :environment, :logger, :logger_level, :logger_file
9
+ attr_accessor :environment, :imis_id_query_name, :username, :password
40
10
 
41
11
  def initialize
42
- @environment = default_environment
43
- @username = ENV.fetch('IMIS_USERNAME', nil)
44
- @password = ENV.fetch('IMIS_PASSWORD', nil)
45
- @open_timeout = Integer(ENV.fetch('IMIS_OPEN_TIMEOUT', DEFAULT_OPEN_TIMEOUT).to_s, 10)
46
- @read_timeout = Integer(ENV.fetch('IMIS_READ_TIMEOUT', DEFAULT_READ_TIMEOUT).to_s, 10)
47
- @write_timeout = Integer(ENV.fetch('IMIS_WRITE_TIMEOUT', DEFAULT_WRITE_TIMEOUT).to_s, 10)
48
- @base_logger = Logger.new($stdout, level: :info)
49
- @logger = ActiveSupport::TaggedLogging.new(@base_logger)
50
-
51
12
  yield self if block_given?
52
-
53
- @logger_level = logger.class::SEV_LABEL[logger.level].downcase.to_sym
54
- end
55
-
56
- # Define the API environment
57
- #
58
- # @param env [String] Environment to use
59
- #
60
- def environment=(env)
61
- @environment = ActiveSupport::StringInquirer.new(env.to_s)
62
- end
63
-
64
- # Override the main logger
65
- #
66
- # @param logger [Logger] Configured logging object
67
- #
68
- def logger=(logger)
69
- @base_logger = logger.tap { it.formatter = LoggerFormatter.new }
70
- @base_logger.singleton_class.include(LoggerHelpers)
71
- @logger = ActiveSupport::TaggedLogging.new(@base_logger)
72
- end
73
-
74
- # Define the main logger
75
- #
76
- # @param path [path, nil] Path to write log to, or +nil+ to log to +STDOUT+
77
- #
78
- def logger_file=(path)
79
- @logger_file = path
80
- @base_logger = Logger.new(@logger_file.nil? ? $stdout : @logger_file, level: logger.level)
81
- @logger = ActiveSupport::TaggedLogging.new(@base_logger)
82
- end
83
-
84
- # Current global mirror debug logger
85
- #
86
- def global_logger
87
- return @global_logger if @global_logger
88
-
89
- global_log_path
90
- @global_logger
91
- end
92
-
93
- # Current path for the global mirror debug logger
94
- #
95
- def global_log_path
96
- return @global_log_path if defined?(@global_log_path)
97
-
98
- self.global_log_path = DEFAULT_GLOBAL_LOG_PATH
99
13
  end
100
14
 
101
- # Define the global mirror debug logger
102
- #
103
- # @param path [path, nil] Path to write log to, or +nil+ to disable
104
- #
105
- def global_log_path=(path)
106
- @global_log_path = path
107
- @global_logger = build_global_logger
108
- end
109
-
110
- # Whether the global mirror debug logger writes anywhere. Disabled or unwritable, it is a null
111
- # logger, and nothing needs to be mirrored to it.
112
- #
113
- def global_logging?
114
- global_logger
115
- @global_logging
116
- end
117
-
118
- def silence!
119
- self.logger = Logger.new(nil)
120
- end
121
-
122
- # Environment-specific API endpoint hostname
123
- #
124
- # @return The API hostname for the current environment
125
- #
126
15
  def hostname
127
- return IMIS_ROOT_URL_PROD if environment.production?
128
- return IMIS_ROOT_URL_DEV if environment.development?
129
-
130
- raise Errors::ConfigError, "Unexpected API environment: #{environment}"
131
- end
132
-
133
- # Ruby 3.5 instance variable filter
134
- #
135
- def instance_variables_to_inspect = instance_variables - %i[@password @base_logger @logger @global_logger]
136
-
137
- # Parameters to filter out of logging
138
- #
139
- def filtered_parameters = %i[password]
140
-
141
- def validate!
142
- missing_config = REQUIRED.filter_map { it if public_send(it).nil? }
143
- return if missing_config.empty?
144
-
145
- raise Errors::ConfigError, "Missing required configuration: #{missing_config.join(', ')}"
146
- end
147
-
148
- private
149
-
150
- def default_environment
151
- return ::Rails.env if defined?(::Rails)
152
-
153
- ActiveSupport::StringInquirer.new(ENV.fetch('IMIS_ENVIRONMENT', 'development'))
16
+ case environment.to_sym
17
+ when :production
18
+ IMIS_ROOT_URL_PROD
19
+ when :development
20
+ IMIS_ROOT_URL_DEV
21
+ else
22
+ raise Error::Api, "Unexpected API environment: #{environment}"
23
+ end
154
24
  end
155
25
 
156
- def build_global_logger
157
- writable =
158
- begin
159
- FileUtils.mkdir_p(File.dirname(global_log_path))
160
- File.writable?(global_log_path) || File.writable?(File.dirname(global_log_path))
161
- rescue StandardError
162
- false
163
- end
164
- @global_logging = writable
165
- return ActiveSupport::TaggedLogging.new(::Logger.new(nil)) unless writable
166
-
167
- ActiveSupport::TaggedLogging.new(
168
- ::Logger
169
- .new(File.open(global_log_path, 'a'), level: :debug)
170
- .tap { it.formatter = LoggerFormatter.new }
171
- )
172
- end
26
+ def instance_variables_to_inspect = %i[@environment @imis_id_query_name @username]
173
27
  end
174
28
  end
175
29
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Error
6
+ class Api < StandardError
7
+ attr_accessor :metadata
8
+
9
+ def initialize(message, metadata = {})
10
+ super(message)
11
+ @metadata = metadata
12
+ end
13
+
14
+ def bugsnag_meta_data
15
+ metadata == {} ? {} : base_metadata
16
+ end
17
+
18
+ private
19
+
20
+ def base_metadata
21
+ { api: metadata }
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Error
6
+ class Mapper < Api; end
7
+ end
8
+ end
9
+ end