bns 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/._.rspec_status +0 -0
  3. data/CHANGELOG.md +13 -0
  4. data/Gemfile +2 -0
  5. data/README.md +163 -4
  6. data/SECURITY.md +13 -0
  7. data/lib/bns/dispatcher/discord/exceptions/invalid_webhook_token.rb +2 -2
  8. data/lib/bns/dispatcher/discord/implementation.rb +1 -1
  9. data/lib/bns/dispatcher/slack/exceptions/invalid_webhook_token.rb +16 -0
  10. data/lib/bns/dispatcher/slack/implementation.rb +51 -0
  11. data/lib/bns/dispatcher/slack/types/response.rb +21 -0
  12. data/lib/bns/domain/birthday.rb +2 -0
  13. data/lib/bns/domain/pto.rb +2 -0
  14. data/lib/bns/domain/work_items_limit.rb +39 -0
  15. data/lib/bns/fetcher/base.rb +13 -0
  16. data/lib/bns/fetcher/notion/{pto.rb → base.rb} +11 -7
  17. data/lib/bns/fetcher/notion/types/response.rb +1 -1
  18. data/lib/bns/fetcher/notion/use_case/birthday_next_week.rb +41 -0
  19. data/lib/bns/fetcher/notion/use_case/birthday_today.rb +29 -0
  20. data/lib/bns/fetcher/notion/use_case/pto_next_week.rb +71 -0
  21. data/lib/bns/fetcher/notion/use_case/pto_today.rb +30 -0
  22. data/lib/bns/fetcher/notion/use_case/work_items_limit.rb +37 -0
  23. data/lib/bns/fetcher/postgres/base.rb +46 -0
  24. data/lib/bns/fetcher/postgres/helper.rb +16 -0
  25. data/lib/bns/fetcher/postgres/types/response.rb +42 -0
  26. data/lib/bns/fetcher/postgres/use_case/pto_today.rb +32 -0
  27. data/lib/bns/formatter/base.rb +27 -3
  28. data/lib/bns/formatter/birthday.rb +34 -0
  29. data/lib/bns/formatter/exceptions/invalid_data.rb +15 -0
  30. data/lib/bns/formatter/pto.rb +76 -0
  31. data/lib/bns/formatter/work_items_limit.rb +43 -0
  32. data/lib/bns/mapper/notion/{birthday.rb → birthday_today.rb} +13 -21
  33. data/lib/bns/mapper/notion/{pto.rb → pto_today.rb} +15 -41
  34. data/lib/bns/mapper/notion/work_items_limit.rb +65 -0
  35. data/lib/bns/mapper/postgres/pto_today.rb +47 -0
  36. data/lib/bns/use_cases/use_cases.rb +227 -49
  37. data/lib/bns/version.rb +1 -1
  38. data/renovate.json +6 -0
  39. metadata +27 -10
  40. data/Gemfile.lock +0 -91
  41. data/lib/bns/fetcher/notion/birthday.rb +0 -53
  42. data/lib/bns/formatter/discord/birthday.rb +0 -43
  43. data/lib/bns/formatter/discord/exceptions/invalid_data.rb +0 -17
  44. data/lib/bns/formatter/discord/pto.rb +0 -52
@@ -1,14 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../fetcher/notion/birthday"
4
- require_relative "../mapper/notion/birthday"
5
- require_relative "../formatter/discord/birthday"
3
+ require_relative "../fetcher/notion/use_case/birthday_today"
4
+ require_relative "../fetcher/notion/use_case/birthday_next_week"
5
+ require_relative "../fetcher/notion/use_case/pto_today"
6
+ require_relative "../fetcher/notion/use_case/pto_next_week"
7
+ require_relative "../fetcher/notion/use_case/work_items_limit"
8
+ require_relative "../fetcher/postgres/use_case/pto_today"
6
9
 
7
- require_relative "../fetcher/notion/pto"
8
- require_relative "../mapper/notion/pto"
9
- require_relative "../formatter/discord/pto"
10
+ require_relative "../mapper/notion/birthday_today"
11
+ require_relative "../mapper/notion/pto_today"
12
+ require_relative "../mapper/notion/work_items_limit"
13
+ require_relative "../mapper/postgres/pto_today"
14
+
15
+ require_relative "../formatter/birthday"
16
+ require_relative "../formatter/pto"
17
+ require_relative "../formatter/work_items_limit"
10
18
 
11
19
  require_relative "../dispatcher/discord/implementation"
20
+ require_relative "../dispatcher/slack/implementation"
21
+
12
22
  require_relative "use_case"
13
23
  require_relative "./types/config"
14
24
 
@@ -21,33 +31,70 @@ module UseCases
21
31
  #
22
32
  # <b>Example</b>
23
33
  #
24
- # "filter": {
25
- # "or": [
26
- # {
27
- # "property": "BD_this_year",
28
- # "date": {
29
- # "equals": today
30
- # }
31
- # }
32
- # ]
34
+ # options = {
35
+ # fetch_options: {
36
+ # database_id: NOTION_DATABASE_ID,
37
+ # secret: NOTION_API_INTEGRATION_SECRET,
33
38
  # },
34
- # "sorts": []
39
+ # dispatch_options: {
40
+ # webhook: "https://discord.com/api/webhooks/1199213527672565760/KmpoIzBet9xYG16oFh8W1RWHbpIqT7UtTBRrhfLcvWZdNiVZCTM-gpil2Qoy4eYEgpdf",
41
+ # name: "Birthday Bot"
42
+ # }
35
43
  # }
36
44
  #
45
+ # use_case = UseCases.notify_birthday_from_notion_to_discord(options)
46
+ # use_case.perform
47
+ #
48
+ # #################################################################################
49
+ #
50
+ # Requirements:
51
+ # * Notion database ID, from a database with the following structure:
52
+ #
53
+ # _________________________________________________________________________________
54
+ # | Complete Name (text) | BD_this_year (formula) | BD (date) |
55
+ # | -------------------- | --------------------------- | ------------------------ |
56
+ # | John Doe | January 24, 2024 | January 24, 2000 |
57
+ # | Jane Doe | June 20, 2024 | June 20, 2000 |
58
+ # ---------------------------------------------------------------------------------
59
+ # With the following formula for the BD_this_year column:
60
+ # dateAdd(prop("BD"), year(now()) - year(prop("BD")), "years")
61
+ #
62
+ # * A Notion secret, which can be obtained, by creating an integration here: `https://developers.notion.com/`,
63
+ # browsing on the <View my integations> option, and selecting the <New Integration> or <Create new>
64
+ # integration** buttons.
65
+ # * A webhook key, which can be generated directly on discrod on the desired channel, following this instructions:
66
+ # https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
67
+ #
68
+ def self.notify_birthday_from_notion_to_discord(options)
69
+ fetcher = Fetcher::Notion::BirthdayToday.new(options[:fetch_options])
70
+ mapper = Mapper::Notion::BirthdayToday.new
71
+ formatter = Formatter::Birthday.new(options[:format_options])
72
+ dispatcher = Dispatcher::Discord::Implementation.new(options[:dispatch_options])
73
+ use_case_config = UseCases::Types::Config.new(fetcher, mapper, formatter, dispatcher)
74
+
75
+ UseCases::UseCase.new(use_case_config)
76
+ end
77
+
78
+ # Provides an instance of the next week Birthdays notifications from Notion to Discord use case implementation.
79
+ #
80
+ # <b>Example</b>
81
+ #
37
82
  # options = {
38
83
  # fetch_options: {
39
- # base_url: "https://api.notion.com",
40
84
  # database_id: NOTION_DATABASE_ID,
41
85
  # secret: NOTION_API_INTEGRATION_SECRET,
42
- # filter: filter
43
86
  # },
44
87
  # dispatch_options: {
45
88
  # webhook: "https://discord.com/api/webhooks/1199213527672565760/KmpoIzBet9xYG16oFh8W1RWHbpIqT7UtTBRrhfLcvWZdNiVZCTM-gpil2Qoy4eYEgpdf",
46
89
  # name: "Birthday Bot"
90
+ # },
91
+ # format_options: {
92
+ # template: "individual_name, Wishing you a very happy birthday! Enjoy your special day! :birthday: :gift:",
93
+ # timezone: "-05:00"
47
94
  # }
48
95
  # }
49
96
  #
50
- # use_case = UseCases.notify_birthday_from_notion_to_discord(options)
97
+ # use_case = UseCases.notify_next_week_birthday_from_notion_to_discord(options)
51
98
  # use_case.perform
52
99
  #
53
100
  # #################################################################################
@@ -70,10 +117,10 @@ module UseCases
70
117
  # * A webhook key, which can be generated directly on discrod on the desired channel, following this instructions:
71
118
  # https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
72
119
  #
73
- def self.notify_birthday_from_notion_to_discord(options)
74
- fetcher = Fetcher::Notion::Birthday.new(options[:fetch_options])
75
- mapper = Mapper::Notion::Birthday.new
76
- formatter = Formatter::Discord::Birthday.new
120
+ def self.notify_next_week_birthday_from_notion_to_discord(options)
121
+ fetcher = Fetcher::Notion::BirthdayNextWeek.new(options[:fetch_options])
122
+ mapper = Mapper::Notion::BirthdayToday.new
123
+ formatter = Formatter::Birthday.new(options[:format_options])
77
124
  dispatcher = Dispatcher::Discord::Implementation.new(options[:dispatch_options])
78
125
  use_case_cofig = UseCases::Types::Config.new(fetcher, mapper, formatter, dispatcher)
79
126
 
@@ -85,31 +132,10 @@ module UseCases
85
132
  # <br>
86
133
  # <b>Example</b>
87
134
  #
88
- # "filter": {
89
- # "and": [
90
- # {
91
- # property: "Desde?",
92
- # date: {
93
- # "on_or_before": today
94
- # }
95
- # },
96
- # {s
97
- # property: "Hasta?",
98
- # date: {
99
- # "on_or_after": today
100
- # }
101
- # }
102
- # ]
103
- # },
104
- # "sorts": []
105
- # }
106
- #
107
135
  # options = {
108
136
  # fetch_options: {
109
- # base_url: "https://api.notion.com",
110
137
  # database_id: NOTION_DATABASE_ID,
111
138
  # secret: NOTION_API_INTEGRATION_SECRET,
112
- # filter: filter
113
139
  # },
114
140
  # dispatch_options: {
115
141
  # webhook: "https://discord.com/api/webhooks/1199213527672565760/KmpoIzBet9xYG16oFh8W1RWHbpIqT7UtTBRrhfLcvWZdNiVZCTM-gpil2Qoy4eYEgpdf",
@@ -139,12 +165,164 @@ module UseCases
139
165
  # https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
140
166
  #
141
167
  def self.notify_pto_from_notion_to_discord(options)
142
- fetcher = Fetcher::Notion::Pto.new(options[:fetch_options])
143
- mapper = Mapper::Notion::Pto.new
144
- formatter = Formatter::Discord::Pto.new
168
+ fetcher = Fetcher::Notion::PtoToday.new(options[:fetch_options])
169
+ mapper = Mapper::Notion::PtoToday.new
170
+ formatter = Formatter::Pto.new(options[:format_options])
145
171
  dispatcher = Dispatcher::Discord::Implementation.new(options[:dispatch_options])
146
- use_case_cofig = UseCases::Types::Config.new(fetcher, mapper, formatter, dispatcher)
172
+ use_case_config = UseCases::Types::Config.new(fetcher, mapper, formatter, dispatcher)
147
173
 
148
- UseCases::UseCase.new(use_case_cofig)
174
+ UseCases::UseCase.new(use_case_config)
175
+ end
176
+
177
+ # Provides an instance of the next week PTO notifications from Notion to Discord use case implementation.
178
+ #
179
+ # <br>
180
+ # <b>Example</b>
181
+ #
182
+ # options = {
183
+ # fetch_options: {
184
+ # database_id: NOTION_DATABASE_ID,
185
+ # secret: NOTION_API_INTEGRATION_SECRET,
186
+ # },
187
+ # dispatch_options: {
188
+ # webhook: "https://discord.com/api/webhooks/1199213527672565760/KmpoIzBet9xYG16oFh8W1RWHbpIqT7UtTBRrhfLcvWZdNiVZCTM-gpil2Qoy4eYEgpdf",
189
+ # name: "Pto Bot"
190
+ # },
191
+ # format_options: {
192
+ # template: ":beach: individual_name its going to be on PTO next week,",
193
+ # timezone: "-05:00"
194
+ # }
195
+ # }
196
+ #
197
+ # use_case = UseCases.notify_next_week_pto_from_notion_to_discord(options)
198
+ # use_case.perform
199
+ #
200
+ # #################################################################################
201
+ #
202
+ # Requirements:
203
+ # * Notion database ID, from a database with the following structure:
204
+ #
205
+ # ________________________________________________________________________________________________________
206
+ # | Person (person) | Desde? (date) | Hasta? (date) |
207
+ # | -------------------- | --------------------------------------- | ------------------------------------ |
208
+ # | John Doe | January 24, 2024 | January 27, 2024 |
209
+ # | Jane Doe | November 11, 2024 2:00 PM | November 11, 2024 6:00 PM |
210
+ # ---------------------------------------------------------------------------------------------------------
211
+ #
212
+ # * A Notion secret, which can be obtained, by creating an integration here: `https://developers.notion.com/`,
213
+ # browsing on the <View my integations> option, and selecting the <New Integration> or <Create new>
214
+ # integration** buttons.
215
+ # * A webhook key, which can be generated directly on discrod on the desired channel, following this instructions:
216
+ # https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
217
+ #
218
+ def self.notify_next_week_pto_from_notion_to_discord(options)
219
+ fetcher = Fetcher::Notion::PtoNextWeek.new(options[:fetch_options])
220
+ mapper = Mapper::Notion::PtoToday.new
221
+ formatter = Formatter::Pto.new(options[:format_options])
222
+ dispatcher = Dispatcher::Discord::Implementation.new(options[:dispatch_options])
223
+ use_case_config = UseCases::Types::Config.new(fetcher, mapper, formatter, dispatcher)
224
+
225
+ UseCases::UseCase.new(use_case_config)
226
+ end
227
+
228
+ # Provides an instance of the PTO notifications from Postgres to Slack use case implementation.
229
+ #
230
+ # <br>
231
+ # <b>Example</b>
232
+ #
233
+ # options = {
234
+ # fetch_options: {
235
+ # connection: {
236
+ # host: "localhost",
237
+ # port: 5432,
238
+ # dbname: "db_pto",
239
+ # user: "postgres",
240
+ # password: "postgres"
241
+ # }
242
+ # },
243
+ # dispatch_options:{
244
+ # webhook: "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX",
245
+ # name: "Pto Bot"
246
+ # },
247
+ # format_options: {
248
+ # template: "Custom template",
249
+ # timezone: "-05:00"
250
+ # }
251
+ # }
252
+ #
253
+ # use_case = UseCases.notify_pto_from_postgres_to_slack(options)
254
+ # use_case.perform
255
+ #
256
+ # #################################################################################
257
+ #
258
+ # Requirements:
259
+ # * A connection to a Postgres database and a table with the following structure:
260
+ #
261
+ # Column | Type | Collation | Nullable | Default
262
+ # -----------------+------------------------+-----------+----------+------------------------------
263
+ # id | integer | | not null | generated always as identity
264
+ # create_time | date | | |
265
+ # individual_name | character varying(255) | | |
266
+ # start_date | date | | |
267
+ # end_date | date | | |
268
+ #
269
+ # * A webhook key, which can be generated directly on slack on the desired channel, following this instructions:
270
+ # https://api.slack.com/messaging/webhooks#create_a_webhook
271
+ #
272
+ def self.notify_pto_from_postgres_to_slack(options)
273
+ fetcher = Fetcher::Postgres::PtoToday.new(options[:fetch_options])
274
+ mapper = Mapper::Postgres::PtoToday.new
275
+ formatter = Formatter::Pto.new(options[:format_options])
276
+ dispatcher = Dispatcher::Slack::Implementation.new(options[:dispatch_options])
277
+ use_case_config = UseCases::Types::Config.new(fetcher, mapper, formatter, dispatcher)
278
+
279
+ UseCases::UseCase.new(use_case_config)
280
+ end
281
+
282
+ # Provides an instance of the Work Items wip limit notifications from Notion to Discord use case implementation.
283
+ #
284
+ # <br>
285
+ # <b>Example</b>
286
+ #
287
+ # options = {
288
+ # fetch_options: {
289
+ # database_id: NOTION_DATABASE_ID,
290
+ # secret: NOTION_API_INTEGRATION_SECRET
291
+ # },
292
+ # dispatch_options: {
293
+ # webhook: "https://discord.com/api/webhooks/1199213527672565760/KmpoIzBet9xYG16oFh8W1RWHbpIqT7UtTBRrhfLcvWZdNiVZCTM-gpil2Qoy4eYEgpdf",
294
+ # name: "wipLimit"
295
+ # }
296
+ # }
297
+ #
298
+ # use_case = UseCases.notify_wip_limit_from_notion_to_discord(options)
299
+ # use_case.perform
300
+ #
301
+ # #################################################################################
302
+ #
303
+ # Requirements:
304
+ # * Notion database ID, from a database with the following structure:
305
+ #
306
+ # _________________________________________________________________________________
307
+ # | OK | Status | Responsible Domain |
308
+ # | -------------------- | --------------------------- | ------------------------ |
309
+ # | ✅ | In Progress | "kommit.admin" |
310
+ # | 🚩 | Fail | "kommit.ops" |
311
+ # ---------------------------------------------------------------------------------
312
+ #
313
+ # * A Notion secret, which can be obtained, by creating an integration here: `https://developers.notion.com/`,
314
+ # browsing on the <View my integations> option, and selecting the <New Integration> or <Create new>
315
+ # integration** buttons.
316
+ # * A webhook key, which can be generated directly on discrod on the desired channel, following this instructions:
317
+ # https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
318
+ #
319
+ def self.notify_wip_limit_from_notion_to_discord(options)
320
+ fetcher = Fetcher::Notion::WorkItemsLimit.new(options[:fetch_options])
321
+ mapper = Mapper::Notion::WorkItemsLimit.new
322
+ formatter = Formatter::WorkItemsLimit.new(options[:format_options])
323
+ dispatcher = Dispatcher::Discord::Implementation.new(options[:dispatch_options])
324
+ use_case_config = UseCases::Types::Config.new(fetcher, mapper, formatter, dispatcher)
325
+
326
+ UseCases::UseCase.new(use_case_config)
149
327
  end
150
328
  end
data/lib/bns/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bns
4
4
  # Gem version
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
data/renovate.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "config:semverAllMonthly"
5
+ ]
6
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bns
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kommitters Open Source
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-06 00:00:00.000000000 Z
11
+ date: 2024-02-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A versatile business notification system offering key components for
14
14
  building various use cases. It provides an easy-to-use tool for implementing
@@ -19,42 +19,59 @@ executables: []
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
+ - "._.rspec_status"
22
23
  - ".rspec"
23
24
  - ".rubocop.yml"
24
25
  - CHANGELOG.md
25
26
  - CODE_OF_CONDUCT.md
26
27
  - CONTRIBUTING.md
27
28
  - Gemfile
28
- - Gemfile.lock
29
29
  - LICENSE
30
30
  - README.md
31
31
  - Rakefile
32
+ - SECURITY.md
32
33
  - lib/bns.rb
33
34
  - lib/bns/dispatcher/base.rb
34
35
  - lib/bns/dispatcher/discord/exceptions/invalid_webhook_token.rb
35
36
  - lib/bns/dispatcher/discord/implementation.rb
36
37
  - lib/bns/dispatcher/discord/types/response.rb
38
+ - lib/bns/dispatcher/slack/exceptions/invalid_webhook_token.rb
39
+ - lib/bns/dispatcher/slack/implementation.rb
40
+ - lib/bns/dispatcher/slack/types/response.rb
37
41
  - lib/bns/domain/birthday.rb
38
42
  - lib/bns/domain/exceptions/function_not_implemented.rb
39
43
  - lib/bns/domain/pto.rb
44
+ - lib/bns/domain/work_items_limit.rb
40
45
  - lib/bns/fetcher/base.rb
41
- - lib/bns/fetcher/notion/birthday.rb
46
+ - lib/bns/fetcher/notion/base.rb
42
47
  - lib/bns/fetcher/notion/exceptions/invalid_api_key.rb
43
48
  - lib/bns/fetcher/notion/exceptions/invalid_database_id.rb
44
49
  - lib/bns/fetcher/notion/helper.rb
45
- - lib/bns/fetcher/notion/pto.rb
46
50
  - lib/bns/fetcher/notion/types/response.rb
51
+ - lib/bns/fetcher/notion/use_case/birthday_next_week.rb
52
+ - lib/bns/fetcher/notion/use_case/birthday_today.rb
53
+ - lib/bns/fetcher/notion/use_case/pto_next_week.rb
54
+ - lib/bns/fetcher/notion/use_case/pto_today.rb
55
+ - lib/bns/fetcher/notion/use_case/work_items_limit.rb
56
+ - lib/bns/fetcher/postgres/base.rb
57
+ - lib/bns/fetcher/postgres/helper.rb
58
+ - lib/bns/fetcher/postgres/types/response.rb
59
+ - lib/bns/fetcher/postgres/use_case/pto_today.rb
47
60
  - lib/bns/formatter/base.rb
48
- - lib/bns/formatter/discord/birthday.rb
49
- - lib/bns/formatter/discord/exceptions/invalid_data.rb
50
- - lib/bns/formatter/discord/pto.rb
61
+ - lib/bns/formatter/birthday.rb
62
+ - lib/bns/formatter/exceptions/invalid_data.rb
63
+ - lib/bns/formatter/pto.rb
64
+ - lib/bns/formatter/work_items_limit.rb
51
65
  - lib/bns/mapper/base.rb
52
- - lib/bns/mapper/notion/birthday.rb
53
- - lib/bns/mapper/notion/pto.rb
66
+ - lib/bns/mapper/notion/birthday_today.rb
67
+ - lib/bns/mapper/notion/pto_today.rb
68
+ - lib/bns/mapper/notion/work_items_limit.rb
69
+ - lib/bns/mapper/postgres/pto_today.rb
54
70
  - lib/bns/use_cases/types/config.rb
55
71
  - lib/bns/use_cases/use_case.rb
56
72
  - lib/bns/use_cases/use_cases.rb
57
73
  - lib/bns/version.rb
74
+ - renovate.json
58
75
  - sig/business_notification_system.rbs
59
76
  homepage: https://github.com/kommitters/bns
60
77
  licenses:
data/Gemfile.lock DELETED
@@ -1,91 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- bns (0.1.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- addressable (2.8.6)
10
- public_suffix (>= 2.0.2, < 6.0)
11
- ast (2.4.2)
12
- crack (0.4.5)
13
- rexml
14
- diff-lcs (1.5.0)
15
- docile (1.4.0)
16
- hashdiff (1.1.0)
17
- httparty (0.21.0)
18
- mini_mime (>= 1.0.0)
19
- multi_xml (>= 0.5.2)
20
- json (2.7.1)
21
- language_server-protocol (3.17.0.3)
22
- mini_mime (1.1.5)
23
- multi_xml (0.6.0)
24
- parallel (1.24.0)
25
- parser (3.3.0.3)
26
- ast (~> 2.4.1)
27
- racc
28
- public_suffix (5.0.4)
29
- racc (1.7.3)
30
- rainbow (3.1.1)
31
- rake (13.1.0)
32
- regexp_parser (2.9.0)
33
- rexml (3.2.6)
34
- rspec (3.12.0)
35
- rspec-core (~> 3.12.0)
36
- rspec-expectations (~> 3.12.0)
37
- rspec-mocks (~> 3.12.0)
38
- rspec-core (3.12.2)
39
- rspec-support (~> 3.12.0)
40
- rspec-expectations (3.12.3)
41
- diff-lcs (>= 1.2.0, < 2.0)
42
- rspec-support (~> 3.12.0)
43
- rspec-mocks (3.12.6)
44
- diff-lcs (>= 1.2.0, < 2.0)
45
- rspec-support (~> 3.12.0)
46
- rspec-support (3.12.1)
47
- rubocop (1.59.0)
48
- json (~> 2.3)
49
- language_server-protocol (>= 3.17.0)
50
- parallel (~> 1.10)
51
- parser (>= 3.2.2.4)
52
- rainbow (>= 2.2.2, < 4.0)
53
- regexp_parser (>= 1.8, < 3.0)
54
- rexml (>= 3.2.5, < 4.0)
55
- rubocop-ast (>= 1.30.0, < 2.0)
56
- ruby-progressbar (~> 1.7)
57
- unicode-display_width (>= 2.4.0, < 3.0)
58
- rubocop-ast (1.30.0)
59
- parser (>= 3.2.1.0)
60
- ruby-progressbar (1.13.0)
61
- simplecov (0.22.0)
62
- docile (~> 1.1)
63
- simplecov-html (~> 0.11)
64
- simplecov_json_formatter (~> 0.1)
65
- simplecov-html (0.12.3)
66
- simplecov-lcov (0.8.0)
67
- simplecov_json_formatter (0.1.4)
68
- unicode-display_width (2.5.0)
69
- vcr (6.2.0)
70
- webmock (3.19.1)
71
- addressable (>= 2.8.0)
72
- crack (>= 0.3.2)
73
- hashdiff (>= 0.4.0, < 2.0.0)
74
-
75
- PLATFORMS
76
- arm64-darwin-23
77
- x86_64-linux
78
-
79
- DEPENDENCIES
80
- bns!
81
- httparty
82
- rake (~> 13.0)
83
- rspec (~> 3.0)
84
- rubocop (~> 1.21)
85
- simplecov
86
- simplecov-lcov (~> 0.8.0)
87
- vcr
88
- webmock
89
-
90
- BUNDLED WITH
91
- 2.4.10
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "httparty"
4
- require "date"
5
-
6
- require_relative "../base"
7
- require_relative "./exceptions/invalid_api_key"
8
- require_relative "./exceptions/invalid_database_id"
9
- require_relative "./types/response"
10
- require_relative "./helper"
11
-
12
- module Fetcher
13
- module Notion
14
- ##
15
- # This class is an implementation of the Fetcher::Base interface, specifically designed
16
- # for fetching birthday data from Notion.
17
- #
18
- class Birthday < Base
19
- # Implements the data fetching logic for Birthdays data from Notion. It sends a POST
20
- # request to the Notion API to query the specified database and returns a validated response.
21
- #
22
- # <br>
23
- # <b>raises</b> <tt>Exceptions::Notion::InvalidApiKey</tt> if the API key provided is incorrect or invalid.
24
- #
25
- # <b>raises</b> <tt>Exceptions::Notion::InvalidDatabaseId</tt> if the Database id provided is incorrect
26
- # or invalid.
27
- #
28
- def fetch
29
- url = build_url(config[:base_url], config[:database_id])
30
-
31
- httparty_response = HTTParty.post(url, { body: config[:filter].to_json, headers: headers })
32
-
33
- notion_response = Fetcher::Notion::Types::Response.new(httparty_response)
34
-
35
- Fetcher::Notion::Helper.validate_response(notion_response)
36
- end
37
-
38
- private
39
-
40
- def headers
41
- {
42
- "Authorization" => "Bearer #{config[:secret]}",
43
- "Content-Type" => "application/json",
44
- "Notion-Version" => "2022-06-28"
45
- }
46
- end
47
-
48
- def build_url(base, database_id)
49
- "#{base}/v1/databases/#{database_id}/query"
50
- end
51
- end
52
- end
53
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../../domain/birthday"
4
- require_relative "../base"
5
- require_relative "./exceptions/invalid_data"
6
-
7
- module Formatter
8
- module Discord
9
- ##
10
- # This class implementats the methods of the Formatter::Base module, specifically designed for formatting birthday
11
- # data in a way suitable for Discord messages.
12
- class Birthday
13
- include Base
14
-
15
- # Implements the logic for building a formatted payload with the given template for birthdays.
16
- #
17
- # <br>
18
- # <b>Params:</b>
19
- # * <tt>List<Domain::Birthday></tt> birthdays_list: list of mapped birthdays.
20
- #
21
- # <br>
22
- # <b>raises</b> <tt>Formatter::Discord::Exceptions::InvalidData</tt> when invalid data is provided.
23
- #
24
- # <br>
25
- # <b>returns</b> <tt>String</tt> payload: formatted payload suitable for a Discord message.
26
- #
27
- def format(birthdays_list)
28
- raise Formatter::Discord::Exceptions::InvalidData unless birthdays_list.all? do |brithday|
29
- brithday.is_a?(Domain::Birthday)
30
- end
31
-
32
- template = "NAME, Wishing you a very happy birthday! Enjoy your special day! :birthday: :gift:"
33
- payload = ""
34
-
35
- birthdays_list.each do |birthday|
36
- payload += "#{template.gsub("NAME", birthday.individual_name)}\n"
37
- end
38
-
39
- payload
40
- end
41
- end
42
- end
43
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Formatter
4
- module Discord
5
- module Exceptions
6
- ##
7
- # Provides a domain-specific representation for errors that occurs when trying to process invalid
8
- # data on a Fetcher::Base implementation
9
- #
10
- class InvalidData < StandardError
11
- def initialize(message = "")
12
- super(message)
13
- end
14
- end
15
- end
16
- end
17
- end