airbyte-agent-jira 0.1.22__py3-none-any.whl

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 (56) hide show
  1. airbyte_agent_jira/__init__.py +91 -0
  2. airbyte_agent_jira/_vendored/__init__.py +1 -0
  3. airbyte_agent_jira/_vendored/connector_sdk/__init__.py +82 -0
  4. airbyte_agent_jira/_vendored/connector_sdk/auth_strategies.py +1123 -0
  5. airbyte_agent_jira/_vendored/connector_sdk/auth_template.py +135 -0
  6. airbyte_agent_jira/_vendored/connector_sdk/cloud_utils/__init__.py +5 -0
  7. airbyte_agent_jira/_vendored/connector_sdk/cloud_utils/client.py +213 -0
  8. airbyte_agent_jira/_vendored/connector_sdk/connector_model_loader.py +965 -0
  9. airbyte_agent_jira/_vendored/connector_sdk/constants.py +78 -0
  10. airbyte_agent_jira/_vendored/connector_sdk/exceptions.py +23 -0
  11. airbyte_agent_jira/_vendored/connector_sdk/executor/__init__.py +31 -0
  12. airbyte_agent_jira/_vendored/connector_sdk/executor/hosted_executor.py +197 -0
  13. airbyte_agent_jira/_vendored/connector_sdk/executor/local_executor.py +1574 -0
  14. airbyte_agent_jira/_vendored/connector_sdk/executor/models.py +190 -0
  15. airbyte_agent_jira/_vendored/connector_sdk/extensions.py +694 -0
  16. airbyte_agent_jira/_vendored/connector_sdk/http/__init__.py +37 -0
  17. airbyte_agent_jira/_vendored/connector_sdk/http/adapters/__init__.py +9 -0
  18. airbyte_agent_jira/_vendored/connector_sdk/http/adapters/httpx_adapter.py +251 -0
  19. airbyte_agent_jira/_vendored/connector_sdk/http/config.py +98 -0
  20. airbyte_agent_jira/_vendored/connector_sdk/http/exceptions.py +119 -0
  21. airbyte_agent_jira/_vendored/connector_sdk/http/protocols.py +114 -0
  22. airbyte_agent_jira/_vendored/connector_sdk/http/response.py +102 -0
  23. airbyte_agent_jira/_vendored/connector_sdk/http_client.py +686 -0
  24. airbyte_agent_jira/_vendored/connector_sdk/introspection.py +262 -0
  25. airbyte_agent_jira/_vendored/connector_sdk/logging/__init__.py +11 -0
  26. airbyte_agent_jira/_vendored/connector_sdk/logging/logger.py +264 -0
  27. airbyte_agent_jira/_vendored/connector_sdk/logging/types.py +92 -0
  28. airbyte_agent_jira/_vendored/connector_sdk/observability/__init__.py +11 -0
  29. airbyte_agent_jira/_vendored/connector_sdk/observability/models.py +19 -0
  30. airbyte_agent_jira/_vendored/connector_sdk/observability/redactor.py +81 -0
  31. airbyte_agent_jira/_vendored/connector_sdk/observability/session.py +94 -0
  32. airbyte_agent_jira/_vendored/connector_sdk/performance/__init__.py +6 -0
  33. airbyte_agent_jira/_vendored/connector_sdk/performance/instrumentation.py +57 -0
  34. airbyte_agent_jira/_vendored/connector_sdk/performance/metrics.py +93 -0
  35. airbyte_agent_jira/_vendored/connector_sdk/schema/__init__.py +75 -0
  36. airbyte_agent_jira/_vendored/connector_sdk/schema/base.py +161 -0
  37. airbyte_agent_jira/_vendored/connector_sdk/schema/components.py +239 -0
  38. airbyte_agent_jira/_vendored/connector_sdk/schema/connector.py +131 -0
  39. airbyte_agent_jira/_vendored/connector_sdk/schema/extensions.py +109 -0
  40. airbyte_agent_jira/_vendored/connector_sdk/schema/operations.py +146 -0
  41. airbyte_agent_jira/_vendored/connector_sdk/schema/security.py +223 -0
  42. airbyte_agent_jira/_vendored/connector_sdk/secrets.py +182 -0
  43. airbyte_agent_jira/_vendored/connector_sdk/telemetry/__init__.py +10 -0
  44. airbyte_agent_jira/_vendored/connector_sdk/telemetry/config.py +32 -0
  45. airbyte_agent_jira/_vendored/connector_sdk/telemetry/events.py +58 -0
  46. airbyte_agent_jira/_vendored/connector_sdk/telemetry/tracker.py +151 -0
  47. airbyte_agent_jira/_vendored/connector_sdk/types.py +245 -0
  48. airbyte_agent_jira/_vendored/connector_sdk/utils.py +60 -0
  49. airbyte_agent_jira/_vendored/connector_sdk/validation.py +822 -0
  50. airbyte_agent_jira/connector.py +978 -0
  51. airbyte_agent_jira/connector_model.py +2827 -0
  52. airbyte_agent_jira/models.py +741 -0
  53. airbyte_agent_jira/types.py +117 -0
  54. airbyte_agent_jira-0.1.22.dist-info/METADATA +113 -0
  55. airbyte_agent_jira-0.1.22.dist-info/RECORD +56 -0
  56. airbyte_agent_jira-0.1.22.dist-info/WHEEL +4 -0
@@ -0,0 +1,2827 @@
1
+ """
2
+ Connector model for jira.
3
+
4
+ This file is auto-generated from the connector definition at build time.
5
+ DO NOT EDIT MANUALLY - changes will be overwritten on next generation.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from ._vendored.connector_sdk.types import (
11
+ Action,
12
+ AuthConfig,
13
+ AuthType,
14
+ ConnectorModel,
15
+ EndpointDefinition,
16
+ EntityDefinition,
17
+ )
18
+ from ._vendored.connector_sdk.schema.security import (
19
+ AirbyteAuthConfig,
20
+ AuthConfigFieldSpec,
21
+ )
22
+ from uuid import (
23
+ UUID,
24
+ )
25
+
26
+ JiraConnectorModel: ConnectorModel = ConnectorModel(
27
+ id=UUID('68e63de2-bb83-4c7e-93fa-a8a9051e3993'),
28
+ name='jira',
29
+ version='1.0.3',
30
+ base_url='https://{subdomain}.atlassian.net',
31
+ auth=AuthConfig(
32
+ type=AuthType.BASIC,
33
+ user_config_spec=AirbyteAuthConfig(
34
+ type='object',
35
+ required=['username', 'password'],
36
+ properties={
37
+ 'username': AuthConfigFieldSpec(
38
+ title='Username',
39
+ description='Authentication username',
40
+ ),
41
+ 'password': AuthConfigFieldSpec(
42
+ title='Password',
43
+ description='Authentication password',
44
+ ),
45
+ },
46
+ auth_mapping={'username': '${username}', 'password': '${password}'},
47
+ ),
48
+ ),
49
+ entities=[
50
+ EntityDefinition(
51
+ name='issues',
52
+ actions=[Action.SEARCH, Action.GET],
53
+ endpoints={
54
+ Action.SEARCH: EndpointDefinition(
55
+ method='GET',
56
+ path='/rest/api/3/search/jql',
57
+ action=Action.SEARCH,
58
+ description='Retrieve issues based on JQL query with pagination support',
59
+ query_params=[
60
+ 'jql',
61
+ 'nextPageToken',
62
+ 'maxResults',
63
+ 'fields',
64
+ 'expand',
65
+ 'properties',
66
+ 'fieldsByKeys',
67
+ 'failFast',
68
+ ],
69
+ query_params_schema={
70
+ 'jql': {'type': 'string', 'required': False},
71
+ 'nextPageToken': {'type': 'string', 'required': False},
72
+ 'maxResults': {'type': 'integer', 'required': False},
73
+ 'fields': {'type': 'string', 'required': False},
74
+ 'expand': {'type': 'string', 'required': False},
75
+ 'properties': {'type': 'string', 'required': False},
76
+ 'fieldsByKeys': {'type': 'boolean', 'required': False},
77
+ 'failFast': {'type': 'boolean', 'required': False},
78
+ },
79
+ response_schema={
80
+ 'type': 'object',
81
+ 'description': 'Paginated list of issues from JQL search',
82
+ 'properties': {
83
+ 'issues': {
84
+ 'type': 'array',
85
+ 'items': {
86
+ 'type': 'object',
87
+ 'description': 'Jira issue object',
88
+ 'properties': {
89
+ 'id': {'type': 'string', 'description': 'Unique issue identifier'},
90
+ 'key': {'type': 'string', 'description': 'Issue key (e.g., PROJ-123)'},
91
+ 'self': {
92
+ 'type': 'string',
93
+ 'format': 'uri',
94
+ 'description': 'URL of the issue',
95
+ },
96
+ 'expand': {
97
+ 'type': ['string', 'null'],
98
+ 'description': 'Expand options that include additional issue details',
99
+ },
100
+ 'fields': {
101
+ 'type': 'object',
102
+ 'description': "Issue fields (actual fields depend on 'fields' parameter in request)",
103
+ 'properties': {
104
+ 'summary': {'type': 'string', 'description': 'Issue summary/title'},
105
+ 'issuetype': {
106
+ 'type': 'object',
107
+ 'description': 'Issue type information',
108
+ 'properties': {
109
+ 'self': {'type': 'string', 'format': 'uri'},
110
+ 'id': {'type': 'string'},
111
+ 'description': {'type': 'string'},
112
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
113
+ 'name': {'type': 'string'},
114
+ 'subtask': {'type': 'boolean'},
115
+ 'avatarId': {
116
+ 'type': ['integer', 'null'],
117
+ },
118
+ 'hierarchyLevel': {
119
+ 'type': ['integer', 'null'],
120
+ },
121
+ },
122
+ },
123
+ 'created': {
124
+ 'type': 'string',
125
+ 'format': 'date-time',
126
+ 'description': 'Issue creation timestamp',
127
+ },
128
+ 'updated': {
129
+ 'type': 'string',
130
+ 'format': 'date-time',
131
+ 'description': 'Issue last update timestamp',
132
+ },
133
+ 'project': {
134
+ 'type': 'object',
135
+ 'description': 'Project information',
136
+ 'properties': {
137
+ 'self': {'type': 'string', 'format': 'uri'},
138
+ 'id': {'type': 'string'},
139
+ 'key': {'type': 'string'},
140
+ 'name': {'type': 'string'},
141
+ 'projectTypeKey': {'type': 'string'},
142
+ 'simplified': {'type': 'boolean'},
143
+ 'avatarUrls': {
144
+ 'type': 'object',
145
+ 'description': 'URLs for user avatars in different sizes',
146
+ 'properties': {
147
+ '16x16': {'type': 'string', 'format': 'uri'},
148
+ '24x24': {'type': 'string', 'format': 'uri'},
149
+ '32x32': {'type': 'string', 'format': 'uri'},
150
+ '48x48': {'type': 'string', 'format': 'uri'},
151
+ },
152
+ },
153
+ 'projectCategory': {
154
+ 'type': ['object', 'null'],
155
+ 'properties': {
156
+ 'self': {'type': 'string', 'format': 'uri'},
157
+ 'id': {'type': 'string'},
158
+ 'name': {'type': 'string'},
159
+ 'description': {'type': 'string'},
160
+ },
161
+ },
162
+ },
163
+ },
164
+ 'reporter': {
165
+ 'type': ['object', 'null'],
166
+ 'description': 'Issue reporter user information',
167
+ 'properties': {
168
+ 'self': {'type': 'string', 'format': 'uri'},
169
+ 'accountId': {'type': 'string'},
170
+ 'emailAddress': {'type': 'string', 'format': 'email'},
171
+ 'avatarUrls': {
172
+ 'type': 'object',
173
+ 'description': 'URLs for user avatars in different sizes',
174
+ 'properties': {
175
+ '16x16': {'type': 'string', 'format': 'uri'},
176
+ '24x24': {'type': 'string', 'format': 'uri'},
177
+ '32x32': {'type': 'string', 'format': 'uri'},
178
+ '48x48': {'type': 'string', 'format': 'uri'},
179
+ },
180
+ },
181
+ 'displayName': {'type': 'string'},
182
+ 'active': {'type': 'boolean'},
183
+ 'timeZone': {'type': 'string'},
184
+ 'accountType': {'type': 'string'},
185
+ },
186
+ },
187
+ 'assignee': {
188
+ 'type': ['object', 'null'],
189
+ 'description': 'Issue assignee user information (null if unassigned)',
190
+ 'properties': {
191
+ 'self': {'type': 'string', 'format': 'uri'},
192
+ 'accountId': {'type': 'string'},
193
+ 'emailAddress': {'type': 'string', 'format': 'email'},
194
+ 'avatarUrls': {
195
+ 'type': 'object',
196
+ 'description': 'URLs for user avatars in different sizes',
197
+ 'properties': {
198
+ '16x16': {'type': 'string', 'format': 'uri'},
199
+ '24x24': {'type': 'string', 'format': 'uri'},
200
+ '32x32': {'type': 'string', 'format': 'uri'},
201
+ '48x48': {'type': 'string', 'format': 'uri'},
202
+ },
203
+ },
204
+ 'displayName': {'type': 'string'},
205
+ 'active': {'type': 'boolean'},
206
+ 'timeZone': {'type': 'string'},
207
+ 'accountType': {'type': 'string'},
208
+ },
209
+ },
210
+ 'priority': {
211
+ 'type': ['object', 'null'],
212
+ 'description': 'Issue priority information',
213
+ 'properties': {
214
+ 'self': {'type': 'string', 'format': 'uri'},
215
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
216
+ 'name': {'type': 'string'},
217
+ 'id': {'type': 'string'},
218
+ },
219
+ },
220
+ 'status': {
221
+ 'type': 'object',
222
+ 'description': 'Issue status information',
223
+ 'properties': {
224
+ 'self': {'type': 'string', 'format': 'uri'},
225
+ 'description': {'type': 'string'},
226
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
227
+ 'name': {'type': 'string'},
228
+ 'id': {'type': 'string'},
229
+ 'statusCategory': {
230
+ 'type': 'object',
231
+ 'properties': {
232
+ 'self': {'type': 'string', 'format': 'uri'},
233
+ 'id': {'type': 'integer'},
234
+ 'key': {'type': 'string'},
235
+ 'colorName': {'type': 'string'},
236
+ 'name': {'type': 'string'},
237
+ },
238
+ },
239
+ },
240
+ },
241
+ },
242
+ },
243
+ },
244
+ 'x-airbyte-entity-name': 'issues',
245
+ },
246
+ 'description': 'Array of issue objects',
247
+ },
248
+ 'total': {'type': 'integer', 'description': 'Total number of issues matching query'},
249
+ 'maxResults': {
250
+ 'type': ['integer', 'null'],
251
+ 'description': 'Maximum number of results per page',
252
+ },
253
+ 'startAt': {
254
+ 'type': ['integer', 'null'],
255
+ 'description': 'Index of first item returned',
256
+ },
257
+ 'nextPageToken': {
258
+ 'type': ['string', 'null'],
259
+ 'description': 'Token for fetching the next page',
260
+ },
261
+ 'isLast': {
262
+ 'type': ['boolean', 'null'],
263
+ 'description': 'Whether this is the last page',
264
+ },
265
+ },
266
+ },
267
+ record_extractor='$.issues',
268
+ meta_extractor={
269
+ 'nextPageToken': '$.nextPageToken',
270
+ 'isLast': '$.isLast',
271
+ 'total': '$.total',
272
+ },
273
+ ),
274
+ Action.GET: EndpointDefinition(
275
+ method='GET',
276
+ path='/rest/api/3/issue/{issueIdOrKey}',
277
+ action=Action.GET,
278
+ description='Retrieve a single issue by its ID or key',
279
+ query_params=[
280
+ 'fields',
281
+ 'expand',
282
+ 'properties',
283
+ 'fieldsByKeys',
284
+ 'updateHistory',
285
+ 'failFast',
286
+ ],
287
+ query_params_schema={
288
+ 'fields': {'type': 'string', 'required': False},
289
+ 'expand': {'type': 'string', 'required': False},
290
+ 'properties': {'type': 'string', 'required': False},
291
+ 'fieldsByKeys': {'type': 'boolean', 'required': False},
292
+ 'updateHistory': {'type': 'boolean', 'required': False},
293
+ 'failFast': {'type': 'boolean', 'required': False},
294
+ },
295
+ path_params=['issueIdOrKey'],
296
+ path_params_schema={
297
+ 'issueIdOrKey': {'type': 'string', 'required': True},
298
+ },
299
+ response_schema={
300
+ 'type': 'object',
301
+ 'description': 'Jira issue object',
302
+ 'properties': {
303
+ 'id': {'type': 'string', 'description': 'Unique issue identifier'},
304
+ 'key': {'type': 'string', 'description': 'Issue key (e.g., PROJ-123)'},
305
+ 'self': {
306
+ 'type': 'string',
307
+ 'format': 'uri',
308
+ 'description': 'URL of the issue',
309
+ },
310
+ 'expand': {
311
+ 'type': ['string', 'null'],
312
+ 'description': 'Expand options that include additional issue details',
313
+ },
314
+ 'fields': {
315
+ 'type': 'object',
316
+ 'description': "Issue fields (actual fields depend on 'fields' parameter in request)",
317
+ 'properties': {
318
+ 'summary': {'type': 'string', 'description': 'Issue summary/title'},
319
+ 'issuetype': {
320
+ 'type': 'object',
321
+ 'description': 'Issue type information',
322
+ 'properties': {
323
+ 'self': {'type': 'string', 'format': 'uri'},
324
+ 'id': {'type': 'string'},
325
+ 'description': {'type': 'string'},
326
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
327
+ 'name': {'type': 'string'},
328
+ 'subtask': {'type': 'boolean'},
329
+ 'avatarId': {
330
+ 'type': ['integer', 'null'],
331
+ },
332
+ 'hierarchyLevel': {
333
+ 'type': ['integer', 'null'],
334
+ },
335
+ },
336
+ },
337
+ 'created': {
338
+ 'type': 'string',
339
+ 'format': 'date-time',
340
+ 'description': 'Issue creation timestamp',
341
+ },
342
+ 'updated': {
343
+ 'type': 'string',
344
+ 'format': 'date-time',
345
+ 'description': 'Issue last update timestamp',
346
+ },
347
+ 'project': {
348
+ 'type': 'object',
349
+ 'description': 'Project information',
350
+ 'properties': {
351
+ 'self': {'type': 'string', 'format': 'uri'},
352
+ 'id': {'type': 'string'},
353
+ 'key': {'type': 'string'},
354
+ 'name': {'type': 'string'},
355
+ 'projectTypeKey': {'type': 'string'},
356
+ 'simplified': {'type': 'boolean'},
357
+ 'avatarUrls': {
358
+ 'type': 'object',
359
+ 'description': 'URLs for user avatars in different sizes',
360
+ 'properties': {
361
+ '16x16': {'type': 'string', 'format': 'uri'},
362
+ '24x24': {'type': 'string', 'format': 'uri'},
363
+ '32x32': {'type': 'string', 'format': 'uri'},
364
+ '48x48': {'type': 'string', 'format': 'uri'},
365
+ },
366
+ },
367
+ 'projectCategory': {
368
+ 'type': ['object', 'null'],
369
+ 'properties': {
370
+ 'self': {'type': 'string', 'format': 'uri'},
371
+ 'id': {'type': 'string'},
372
+ 'name': {'type': 'string'},
373
+ 'description': {'type': 'string'},
374
+ },
375
+ },
376
+ },
377
+ },
378
+ 'reporter': {
379
+ 'type': ['object', 'null'],
380
+ 'description': 'Issue reporter user information',
381
+ 'properties': {
382
+ 'self': {'type': 'string', 'format': 'uri'},
383
+ 'accountId': {'type': 'string'},
384
+ 'emailAddress': {'type': 'string', 'format': 'email'},
385
+ 'avatarUrls': {
386
+ 'type': 'object',
387
+ 'description': 'URLs for user avatars in different sizes',
388
+ 'properties': {
389
+ '16x16': {'type': 'string', 'format': 'uri'},
390
+ '24x24': {'type': 'string', 'format': 'uri'},
391
+ '32x32': {'type': 'string', 'format': 'uri'},
392
+ '48x48': {'type': 'string', 'format': 'uri'},
393
+ },
394
+ },
395
+ 'displayName': {'type': 'string'},
396
+ 'active': {'type': 'boolean'},
397
+ 'timeZone': {'type': 'string'},
398
+ 'accountType': {'type': 'string'},
399
+ },
400
+ },
401
+ 'assignee': {
402
+ 'type': ['object', 'null'],
403
+ 'description': 'Issue assignee user information (null if unassigned)',
404
+ 'properties': {
405
+ 'self': {'type': 'string', 'format': 'uri'},
406
+ 'accountId': {'type': 'string'},
407
+ 'emailAddress': {'type': 'string', 'format': 'email'},
408
+ 'avatarUrls': {
409
+ 'type': 'object',
410
+ 'description': 'URLs for user avatars in different sizes',
411
+ 'properties': {
412
+ '16x16': {'type': 'string', 'format': 'uri'},
413
+ '24x24': {'type': 'string', 'format': 'uri'},
414
+ '32x32': {'type': 'string', 'format': 'uri'},
415
+ '48x48': {'type': 'string', 'format': 'uri'},
416
+ },
417
+ },
418
+ 'displayName': {'type': 'string'},
419
+ 'active': {'type': 'boolean'},
420
+ 'timeZone': {'type': 'string'},
421
+ 'accountType': {'type': 'string'},
422
+ },
423
+ },
424
+ 'priority': {
425
+ 'type': ['object', 'null'],
426
+ 'description': 'Issue priority information',
427
+ 'properties': {
428
+ 'self': {'type': 'string', 'format': 'uri'},
429
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
430
+ 'name': {'type': 'string'},
431
+ 'id': {'type': 'string'},
432
+ },
433
+ },
434
+ 'status': {
435
+ 'type': 'object',
436
+ 'description': 'Issue status information',
437
+ 'properties': {
438
+ 'self': {'type': 'string', 'format': 'uri'},
439
+ 'description': {'type': 'string'},
440
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
441
+ 'name': {'type': 'string'},
442
+ 'id': {'type': 'string'},
443
+ 'statusCategory': {
444
+ 'type': 'object',
445
+ 'properties': {
446
+ 'self': {'type': 'string', 'format': 'uri'},
447
+ 'id': {'type': 'integer'},
448
+ 'key': {'type': 'string'},
449
+ 'colorName': {'type': 'string'},
450
+ 'name': {'type': 'string'},
451
+ },
452
+ },
453
+ },
454
+ },
455
+ },
456
+ },
457
+ },
458
+ 'x-airbyte-entity-name': 'issues',
459
+ },
460
+ ),
461
+ },
462
+ entity_schema={
463
+ 'type': 'object',
464
+ 'description': 'Jira issue object',
465
+ 'properties': {
466
+ 'id': {'type': 'string', 'description': 'Unique issue identifier'},
467
+ 'key': {'type': 'string', 'description': 'Issue key (e.g., PROJ-123)'},
468
+ 'self': {
469
+ 'type': 'string',
470
+ 'format': 'uri',
471
+ 'description': 'URL of the issue',
472
+ },
473
+ 'expand': {
474
+ 'type': ['string', 'null'],
475
+ 'description': 'Expand options that include additional issue details',
476
+ },
477
+ 'fields': {
478
+ 'type': 'object',
479
+ 'description': "Issue fields (actual fields depend on 'fields' parameter in request)",
480
+ 'properties': {
481
+ 'summary': {'type': 'string', 'description': 'Issue summary/title'},
482
+ 'issuetype': {
483
+ 'type': 'object',
484
+ 'description': 'Issue type information',
485
+ 'properties': {
486
+ 'self': {'type': 'string', 'format': 'uri'},
487
+ 'id': {'type': 'string'},
488
+ 'description': {'type': 'string'},
489
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
490
+ 'name': {'type': 'string'},
491
+ 'subtask': {'type': 'boolean'},
492
+ 'avatarId': {
493
+ 'type': ['integer', 'null'],
494
+ },
495
+ 'hierarchyLevel': {
496
+ 'type': ['integer', 'null'],
497
+ },
498
+ },
499
+ },
500
+ 'created': {
501
+ 'type': 'string',
502
+ 'format': 'date-time',
503
+ 'description': 'Issue creation timestamp',
504
+ },
505
+ 'updated': {
506
+ 'type': 'string',
507
+ 'format': 'date-time',
508
+ 'description': 'Issue last update timestamp',
509
+ },
510
+ 'project': {
511
+ 'type': 'object',
512
+ 'description': 'Project information',
513
+ 'properties': {
514
+ 'self': {'type': 'string', 'format': 'uri'},
515
+ 'id': {'type': 'string'},
516
+ 'key': {'type': 'string'},
517
+ 'name': {'type': 'string'},
518
+ 'projectTypeKey': {'type': 'string'},
519
+ 'simplified': {'type': 'boolean'},
520
+ 'avatarUrls': {
521
+ 'type': 'object',
522
+ 'description': 'URLs for user avatars in different sizes',
523
+ 'properties': {
524
+ '16x16': {'type': 'string', 'format': 'uri'},
525
+ '24x24': {'type': 'string', 'format': 'uri'},
526
+ '32x32': {'type': 'string', 'format': 'uri'},
527
+ '48x48': {'type': 'string', 'format': 'uri'},
528
+ },
529
+ },
530
+ 'projectCategory': {
531
+ 'type': ['object', 'null'],
532
+ 'properties': {
533
+ 'self': {'type': 'string', 'format': 'uri'},
534
+ 'id': {'type': 'string'},
535
+ 'name': {'type': 'string'},
536
+ 'description': {'type': 'string'},
537
+ },
538
+ },
539
+ },
540
+ },
541
+ 'reporter': {
542
+ 'type': ['object', 'null'],
543
+ 'description': 'Issue reporter user information',
544
+ 'properties': {
545
+ 'self': {'type': 'string', 'format': 'uri'},
546
+ 'accountId': {'type': 'string'},
547
+ 'emailAddress': {'type': 'string', 'format': 'email'},
548
+ 'avatarUrls': {
549
+ 'type': 'object',
550
+ 'description': 'URLs for user avatars in different sizes',
551
+ 'properties': {
552
+ '16x16': {'type': 'string', 'format': 'uri'},
553
+ '24x24': {'type': 'string', 'format': 'uri'},
554
+ '32x32': {'type': 'string', 'format': 'uri'},
555
+ '48x48': {'type': 'string', 'format': 'uri'},
556
+ },
557
+ },
558
+ 'displayName': {'type': 'string'},
559
+ 'active': {'type': 'boolean'},
560
+ 'timeZone': {'type': 'string'},
561
+ 'accountType': {'type': 'string'},
562
+ },
563
+ },
564
+ 'assignee': {
565
+ 'type': ['object', 'null'],
566
+ 'description': 'Issue assignee user information (null if unassigned)',
567
+ 'properties': {
568
+ 'self': {'type': 'string', 'format': 'uri'},
569
+ 'accountId': {'type': 'string'},
570
+ 'emailAddress': {'type': 'string', 'format': 'email'},
571
+ 'avatarUrls': {
572
+ 'type': 'object',
573
+ 'description': 'URLs for user avatars in different sizes',
574
+ 'properties': {
575
+ '16x16': {'type': 'string', 'format': 'uri'},
576
+ '24x24': {'type': 'string', 'format': 'uri'},
577
+ '32x32': {'type': 'string', 'format': 'uri'},
578
+ '48x48': {'type': 'string', 'format': 'uri'},
579
+ },
580
+ },
581
+ 'displayName': {'type': 'string'},
582
+ 'active': {'type': 'boolean'},
583
+ 'timeZone': {'type': 'string'},
584
+ 'accountType': {'type': 'string'},
585
+ },
586
+ },
587
+ 'priority': {
588
+ 'type': ['object', 'null'],
589
+ 'description': 'Issue priority information',
590
+ 'properties': {
591
+ 'self': {'type': 'string', 'format': 'uri'},
592
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
593
+ 'name': {'type': 'string'},
594
+ 'id': {'type': 'string'},
595
+ },
596
+ },
597
+ 'status': {
598
+ 'type': 'object',
599
+ 'description': 'Issue status information',
600
+ 'properties': {
601
+ 'self': {'type': 'string', 'format': 'uri'},
602
+ 'description': {'type': 'string'},
603
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
604
+ 'name': {'type': 'string'},
605
+ 'id': {'type': 'string'},
606
+ 'statusCategory': {
607
+ 'type': 'object',
608
+ 'properties': {
609
+ 'self': {'type': 'string', 'format': 'uri'},
610
+ 'id': {'type': 'integer'},
611
+ 'key': {'type': 'string'},
612
+ 'colorName': {'type': 'string'},
613
+ 'name': {'type': 'string'},
614
+ },
615
+ },
616
+ },
617
+ },
618
+ },
619
+ },
620
+ },
621
+ 'x-airbyte-entity-name': 'issues',
622
+ },
623
+ ),
624
+ EntityDefinition(
625
+ name='projects',
626
+ actions=[Action.SEARCH, Action.GET],
627
+ endpoints={
628
+ Action.SEARCH: EndpointDefinition(
629
+ method='GET',
630
+ path='/rest/api/3/project/search',
631
+ action=Action.SEARCH,
632
+ description='Search and filter projects with advanced query parameters',
633
+ query_params=[
634
+ 'startAt',
635
+ 'maxResults',
636
+ 'orderBy',
637
+ 'id',
638
+ 'keys',
639
+ 'query',
640
+ 'typeKey',
641
+ 'categoryId',
642
+ 'action',
643
+ 'expand',
644
+ 'status',
645
+ ],
646
+ query_params_schema={
647
+ 'startAt': {
648
+ 'type': 'integer',
649
+ 'required': False,
650
+ 'default': 0,
651
+ },
652
+ 'maxResults': {'type': 'integer', 'required': False},
653
+ 'orderBy': {
654
+ 'type': 'string',
655
+ 'required': False,
656
+ 'default': 'key',
657
+ },
658
+ 'id': {'type': 'array', 'required': False},
659
+ 'keys': {'type': 'array', 'required': False},
660
+ 'query': {'type': 'string', 'required': False},
661
+ 'typeKey': {'type': 'string', 'required': False},
662
+ 'categoryId': {'type': 'integer', 'required': False},
663
+ 'action': {
664
+ 'type': 'string',
665
+ 'required': False,
666
+ 'default': 'view',
667
+ },
668
+ 'expand': {'type': 'string', 'required': False},
669
+ 'status': {'type': 'array', 'required': False},
670
+ },
671
+ response_schema={
672
+ 'type': 'object',
673
+ 'description': 'Paginated list of projects from search results',
674
+ 'properties': {
675
+ 'self': {
676
+ 'type': 'string',
677
+ 'format': 'uri',
678
+ 'description': 'URL of the current page',
679
+ },
680
+ 'nextPage': {
681
+ 'type': ['string', 'null'],
682
+ 'format': 'uri',
683
+ 'description': 'URL of the next page (if exists)',
684
+ },
685
+ 'maxResults': {'type': 'integer', 'description': 'Maximum number of results per page'},
686
+ 'startAt': {'type': 'integer', 'description': 'Index of first item returned'},
687
+ 'total': {'type': 'integer', 'description': 'Total number of projects matching query'},
688
+ 'isLast': {'type': 'boolean', 'description': 'Whether this is the last page'},
689
+ 'values': {
690
+ 'type': 'array',
691
+ 'items': {
692
+ 'type': 'object',
693
+ 'description': 'Jira project object',
694
+ 'properties': {
695
+ 'id': {'type': 'string', 'description': 'Unique project identifier'},
696
+ 'key': {'type': 'string', 'description': 'Project key (e.g., PROJ)'},
697
+ 'name': {'type': 'string', 'description': 'Project name'},
698
+ 'self': {
699
+ 'type': 'string',
700
+ 'format': 'uri',
701
+ 'description': 'URL of the project',
702
+ },
703
+ 'expand': {
704
+ 'type': ['string', 'null'],
705
+ 'description': 'Expand options that were applied',
706
+ },
707
+ 'description': {
708
+ 'type': ['string', 'null'],
709
+ 'description': 'Project description (available with expand=description)',
710
+ },
711
+ 'lead': {
712
+ 'type': ['object', 'null'],
713
+ 'description': 'Project lead user (available with expand=lead)',
714
+ 'properties': {
715
+ 'self': {'type': 'string', 'format': 'uri'},
716
+ 'accountId': {'type': 'string'},
717
+ 'accountType': {'type': 'string'},
718
+ 'avatarUrls': {
719
+ 'type': 'object',
720
+ 'description': 'URLs for user avatars in different sizes',
721
+ 'properties': {
722
+ '16x16': {'type': 'string', 'format': 'uri'},
723
+ '24x24': {'type': 'string', 'format': 'uri'},
724
+ '32x32': {'type': 'string', 'format': 'uri'},
725
+ '48x48': {'type': 'string', 'format': 'uri'},
726
+ },
727
+ },
728
+ 'displayName': {'type': 'string'},
729
+ 'active': {'type': 'boolean'},
730
+ },
731
+ },
732
+ 'avatarUrls': {
733
+ 'type': 'object',
734
+ 'description': 'URLs for project avatars in different sizes',
735
+ 'properties': {
736
+ '16x16': {'type': 'string', 'format': 'uri'},
737
+ '24x24': {'type': 'string', 'format': 'uri'},
738
+ '32x32': {'type': 'string', 'format': 'uri'},
739
+ '48x48': {'type': 'string', 'format': 'uri'},
740
+ },
741
+ },
742
+ 'projectTypeKey': {'type': 'string', 'description': 'Type of the project (e.g., software, service_desk, business)'},
743
+ 'simplified': {'type': 'boolean', 'description': 'Whether the project uses simplified workflow'},
744
+ 'style': {'type': 'string', 'description': 'Project style'},
745
+ 'isPrivate': {'type': 'boolean', 'description': 'Whether the project is private'},
746
+ 'properties': {
747
+ 'type': 'object',
748
+ 'description': 'Custom properties for the project',
749
+ 'additionalProperties': True,
750
+ },
751
+ 'projectCategory': {
752
+ 'type': ['object', 'null'],
753
+ 'description': 'Project category information',
754
+ 'properties': {
755
+ 'self': {'type': 'string', 'format': 'uri'},
756
+ 'id': {'type': 'string'},
757
+ 'name': {'type': 'string'},
758
+ 'description': {'type': 'string'},
759
+ },
760
+ },
761
+ 'entityId': {
762
+ 'type': ['string', 'null'],
763
+ 'description': 'Entity ID',
764
+ },
765
+ 'uuid': {
766
+ 'type': ['string', 'null'],
767
+ 'description': 'UUID of the project',
768
+ },
769
+ 'url': {
770
+ 'type': ['string', 'null'],
771
+ 'description': 'URL for the project (available with expand=url)',
772
+ },
773
+ 'assigneeType': {
774
+ 'type': ['string', 'null'],
775
+ 'description': 'Default assignee type for the project',
776
+ },
777
+ 'components': {
778
+ 'type': ['array', 'null'],
779
+ 'description': 'Project components',
780
+ 'items': {
781
+ 'type': 'object',
782
+ 'properties': {
783
+ 'self': {'type': 'string', 'format': 'uri'},
784
+ 'id': {'type': 'string'},
785
+ 'name': {'type': 'string'},
786
+ 'description': {'type': 'string'},
787
+ 'isAssigneeTypeValid': {'type': 'boolean'},
788
+ },
789
+ },
790
+ },
791
+ 'issueTypes': {
792
+ 'type': ['array', 'null'],
793
+ 'description': 'Issue types available in the project (available with expand=issueTypes)',
794
+ 'items': {
795
+ 'type': 'object',
796
+ 'properties': {
797
+ 'self': {'type': 'string', 'format': 'uri'},
798
+ 'id': {'type': 'string'},
799
+ 'description': {'type': 'string'},
800
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
801
+ 'name': {'type': 'string'},
802
+ 'subtask': {'type': 'boolean'},
803
+ 'avatarId': {
804
+ 'type': ['integer', 'null'],
805
+ },
806
+ 'hierarchyLevel': {
807
+ 'type': ['integer', 'null'],
808
+ },
809
+ },
810
+ },
811
+ },
812
+ 'versions': {
813
+ 'type': ['array', 'null'],
814
+ 'description': 'Project versions',
815
+ 'items': {
816
+ 'type': 'object',
817
+ 'properties': {
818
+ 'self': {'type': 'string', 'format': 'uri'},
819
+ 'id': {'type': 'string'},
820
+ 'name': {'type': 'string'},
821
+ 'description': {'type': 'string'},
822
+ 'archived': {'type': 'boolean'},
823
+ 'released': {'type': 'boolean'},
824
+ 'startDate': {
825
+ 'type': ['string', 'null'],
826
+ 'format': 'date',
827
+ },
828
+ 'releaseDate': {
829
+ 'type': ['string', 'null'],
830
+ 'format': 'date',
831
+ },
832
+ 'overdue': {
833
+ 'type': ['boolean', 'null'],
834
+ },
835
+ 'userStartDate': {
836
+ 'type': ['string', 'null'],
837
+ },
838
+ 'userReleaseDate': {
839
+ 'type': ['string', 'null'],
840
+ },
841
+ 'projectId': {'type': 'integer'},
842
+ },
843
+ },
844
+ },
845
+ 'roles': {
846
+ 'type': ['object', 'null'],
847
+ 'description': 'Project roles and their URLs',
848
+ 'additionalProperties': {'type': 'string', 'format': 'uri'},
849
+ },
850
+ },
851
+ 'x-airbyte-entity-name': 'projects',
852
+ },
853
+ 'description': 'Array of project objects',
854
+ },
855
+ },
856
+ },
857
+ record_extractor='$.values',
858
+ meta_extractor={'nextPage': '$.nextPage', 'total': '$.total'},
859
+ ),
860
+ Action.GET: EndpointDefinition(
861
+ method='GET',
862
+ path='/rest/api/3/project/{projectIdOrKey}',
863
+ action=Action.GET,
864
+ description='Retrieve a single project by its ID or key',
865
+ query_params=['expand', 'properties'],
866
+ query_params_schema={
867
+ 'expand': {'type': 'string', 'required': False},
868
+ 'properties': {'type': 'string', 'required': False},
869
+ },
870
+ path_params=['projectIdOrKey'],
871
+ path_params_schema={
872
+ 'projectIdOrKey': {'type': 'string', 'required': True},
873
+ },
874
+ response_schema={
875
+ 'type': 'object',
876
+ 'description': 'Jira project object',
877
+ 'properties': {
878
+ 'id': {'type': 'string', 'description': 'Unique project identifier'},
879
+ 'key': {'type': 'string', 'description': 'Project key (e.g., PROJ)'},
880
+ 'name': {'type': 'string', 'description': 'Project name'},
881
+ 'self': {
882
+ 'type': 'string',
883
+ 'format': 'uri',
884
+ 'description': 'URL of the project',
885
+ },
886
+ 'expand': {
887
+ 'type': ['string', 'null'],
888
+ 'description': 'Expand options that were applied',
889
+ },
890
+ 'description': {
891
+ 'type': ['string', 'null'],
892
+ 'description': 'Project description (available with expand=description)',
893
+ },
894
+ 'lead': {
895
+ 'type': ['object', 'null'],
896
+ 'description': 'Project lead user (available with expand=lead)',
897
+ 'properties': {
898
+ 'self': {'type': 'string', 'format': 'uri'},
899
+ 'accountId': {'type': 'string'},
900
+ 'accountType': {'type': 'string'},
901
+ 'avatarUrls': {
902
+ 'type': 'object',
903
+ 'description': 'URLs for user avatars in different sizes',
904
+ 'properties': {
905
+ '16x16': {'type': 'string', 'format': 'uri'},
906
+ '24x24': {'type': 'string', 'format': 'uri'},
907
+ '32x32': {'type': 'string', 'format': 'uri'},
908
+ '48x48': {'type': 'string', 'format': 'uri'},
909
+ },
910
+ },
911
+ 'displayName': {'type': 'string'},
912
+ 'active': {'type': 'boolean'},
913
+ },
914
+ },
915
+ 'avatarUrls': {
916
+ 'type': 'object',
917
+ 'description': 'URLs for project avatars in different sizes',
918
+ 'properties': {
919
+ '16x16': {'type': 'string', 'format': 'uri'},
920
+ '24x24': {'type': 'string', 'format': 'uri'},
921
+ '32x32': {'type': 'string', 'format': 'uri'},
922
+ '48x48': {'type': 'string', 'format': 'uri'},
923
+ },
924
+ },
925
+ 'projectTypeKey': {'type': 'string', 'description': 'Type of the project (e.g., software, service_desk, business)'},
926
+ 'simplified': {'type': 'boolean', 'description': 'Whether the project uses simplified workflow'},
927
+ 'style': {'type': 'string', 'description': 'Project style'},
928
+ 'isPrivate': {'type': 'boolean', 'description': 'Whether the project is private'},
929
+ 'properties': {
930
+ 'type': 'object',
931
+ 'description': 'Custom properties for the project',
932
+ 'additionalProperties': True,
933
+ },
934
+ 'projectCategory': {
935
+ 'type': ['object', 'null'],
936
+ 'description': 'Project category information',
937
+ 'properties': {
938
+ 'self': {'type': 'string', 'format': 'uri'},
939
+ 'id': {'type': 'string'},
940
+ 'name': {'type': 'string'},
941
+ 'description': {'type': 'string'},
942
+ },
943
+ },
944
+ 'entityId': {
945
+ 'type': ['string', 'null'],
946
+ 'description': 'Entity ID',
947
+ },
948
+ 'uuid': {
949
+ 'type': ['string', 'null'],
950
+ 'description': 'UUID of the project',
951
+ },
952
+ 'url': {
953
+ 'type': ['string', 'null'],
954
+ 'description': 'URL for the project (available with expand=url)',
955
+ },
956
+ 'assigneeType': {
957
+ 'type': ['string', 'null'],
958
+ 'description': 'Default assignee type for the project',
959
+ },
960
+ 'components': {
961
+ 'type': ['array', 'null'],
962
+ 'description': 'Project components',
963
+ 'items': {
964
+ 'type': 'object',
965
+ 'properties': {
966
+ 'self': {'type': 'string', 'format': 'uri'},
967
+ 'id': {'type': 'string'},
968
+ 'name': {'type': 'string'},
969
+ 'description': {'type': 'string'},
970
+ 'isAssigneeTypeValid': {'type': 'boolean'},
971
+ },
972
+ },
973
+ },
974
+ 'issueTypes': {
975
+ 'type': ['array', 'null'],
976
+ 'description': 'Issue types available in the project (available with expand=issueTypes)',
977
+ 'items': {
978
+ 'type': 'object',
979
+ 'properties': {
980
+ 'self': {'type': 'string', 'format': 'uri'},
981
+ 'id': {'type': 'string'},
982
+ 'description': {'type': 'string'},
983
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
984
+ 'name': {'type': 'string'},
985
+ 'subtask': {'type': 'boolean'},
986
+ 'avatarId': {
987
+ 'type': ['integer', 'null'],
988
+ },
989
+ 'hierarchyLevel': {
990
+ 'type': ['integer', 'null'],
991
+ },
992
+ },
993
+ },
994
+ },
995
+ 'versions': {
996
+ 'type': ['array', 'null'],
997
+ 'description': 'Project versions',
998
+ 'items': {
999
+ 'type': 'object',
1000
+ 'properties': {
1001
+ 'self': {'type': 'string', 'format': 'uri'},
1002
+ 'id': {'type': 'string'},
1003
+ 'name': {'type': 'string'},
1004
+ 'description': {'type': 'string'},
1005
+ 'archived': {'type': 'boolean'},
1006
+ 'released': {'type': 'boolean'},
1007
+ 'startDate': {
1008
+ 'type': ['string', 'null'],
1009
+ 'format': 'date',
1010
+ },
1011
+ 'releaseDate': {
1012
+ 'type': ['string', 'null'],
1013
+ 'format': 'date',
1014
+ },
1015
+ 'overdue': {
1016
+ 'type': ['boolean', 'null'],
1017
+ },
1018
+ 'userStartDate': {
1019
+ 'type': ['string', 'null'],
1020
+ },
1021
+ 'userReleaseDate': {
1022
+ 'type': ['string', 'null'],
1023
+ },
1024
+ 'projectId': {'type': 'integer'},
1025
+ },
1026
+ },
1027
+ },
1028
+ 'roles': {
1029
+ 'type': ['object', 'null'],
1030
+ 'description': 'Project roles and their URLs',
1031
+ 'additionalProperties': {'type': 'string', 'format': 'uri'},
1032
+ },
1033
+ },
1034
+ 'x-airbyte-entity-name': 'projects',
1035
+ },
1036
+ ),
1037
+ },
1038
+ entity_schema={
1039
+ 'type': 'object',
1040
+ 'description': 'Jira project object',
1041
+ 'properties': {
1042
+ 'id': {'type': 'string', 'description': 'Unique project identifier'},
1043
+ 'key': {'type': 'string', 'description': 'Project key (e.g., PROJ)'},
1044
+ 'name': {'type': 'string', 'description': 'Project name'},
1045
+ 'self': {
1046
+ 'type': 'string',
1047
+ 'format': 'uri',
1048
+ 'description': 'URL of the project',
1049
+ },
1050
+ 'expand': {
1051
+ 'type': ['string', 'null'],
1052
+ 'description': 'Expand options that were applied',
1053
+ },
1054
+ 'description': {
1055
+ 'type': ['string', 'null'],
1056
+ 'description': 'Project description (available with expand=description)',
1057
+ },
1058
+ 'lead': {
1059
+ 'type': ['object', 'null'],
1060
+ 'description': 'Project lead user (available with expand=lead)',
1061
+ 'properties': {
1062
+ 'self': {'type': 'string', 'format': 'uri'},
1063
+ 'accountId': {'type': 'string'},
1064
+ 'accountType': {'type': 'string'},
1065
+ 'avatarUrls': {
1066
+ 'type': 'object',
1067
+ 'description': 'URLs for user avatars in different sizes',
1068
+ 'properties': {
1069
+ '16x16': {'type': 'string', 'format': 'uri'},
1070
+ '24x24': {'type': 'string', 'format': 'uri'},
1071
+ '32x32': {'type': 'string', 'format': 'uri'},
1072
+ '48x48': {'type': 'string', 'format': 'uri'},
1073
+ },
1074
+ },
1075
+ 'displayName': {'type': 'string'},
1076
+ 'active': {'type': 'boolean'},
1077
+ },
1078
+ },
1079
+ 'avatarUrls': {
1080
+ 'type': 'object',
1081
+ 'description': 'URLs for project avatars in different sizes',
1082
+ 'properties': {
1083
+ '16x16': {'type': 'string', 'format': 'uri'},
1084
+ '24x24': {'type': 'string', 'format': 'uri'},
1085
+ '32x32': {'type': 'string', 'format': 'uri'},
1086
+ '48x48': {'type': 'string', 'format': 'uri'},
1087
+ },
1088
+ },
1089
+ 'projectTypeKey': {'type': 'string', 'description': 'Type of the project (e.g., software, service_desk, business)'},
1090
+ 'simplified': {'type': 'boolean', 'description': 'Whether the project uses simplified workflow'},
1091
+ 'style': {'type': 'string', 'description': 'Project style'},
1092
+ 'isPrivate': {'type': 'boolean', 'description': 'Whether the project is private'},
1093
+ 'properties': {
1094
+ 'type': 'object',
1095
+ 'description': 'Custom properties for the project',
1096
+ 'additionalProperties': True,
1097
+ },
1098
+ 'projectCategory': {
1099
+ 'type': ['object', 'null'],
1100
+ 'description': 'Project category information',
1101
+ 'properties': {
1102
+ 'self': {'type': 'string', 'format': 'uri'},
1103
+ 'id': {'type': 'string'},
1104
+ 'name': {'type': 'string'},
1105
+ 'description': {'type': 'string'},
1106
+ },
1107
+ },
1108
+ 'entityId': {
1109
+ 'type': ['string', 'null'],
1110
+ 'description': 'Entity ID',
1111
+ },
1112
+ 'uuid': {
1113
+ 'type': ['string', 'null'],
1114
+ 'description': 'UUID of the project',
1115
+ },
1116
+ 'url': {
1117
+ 'type': ['string', 'null'],
1118
+ 'description': 'URL for the project (available with expand=url)',
1119
+ },
1120
+ 'assigneeType': {
1121
+ 'type': ['string', 'null'],
1122
+ 'description': 'Default assignee type for the project',
1123
+ },
1124
+ 'components': {
1125
+ 'type': ['array', 'null'],
1126
+ 'description': 'Project components',
1127
+ 'items': {
1128
+ 'type': 'object',
1129
+ 'properties': {
1130
+ 'self': {'type': 'string', 'format': 'uri'},
1131
+ 'id': {'type': 'string'},
1132
+ 'name': {'type': 'string'},
1133
+ 'description': {'type': 'string'},
1134
+ 'isAssigneeTypeValid': {'type': 'boolean'},
1135
+ },
1136
+ },
1137
+ },
1138
+ 'issueTypes': {
1139
+ 'type': ['array', 'null'],
1140
+ 'description': 'Issue types available in the project (available with expand=issueTypes)',
1141
+ 'items': {
1142
+ 'type': 'object',
1143
+ 'properties': {
1144
+ 'self': {'type': 'string', 'format': 'uri'},
1145
+ 'id': {'type': 'string'},
1146
+ 'description': {'type': 'string'},
1147
+ 'iconUrl': {'type': 'string', 'format': 'uri'},
1148
+ 'name': {'type': 'string'},
1149
+ 'subtask': {'type': 'boolean'},
1150
+ 'avatarId': {
1151
+ 'type': ['integer', 'null'],
1152
+ },
1153
+ 'hierarchyLevel': {
1154
+ 'type': ['integer', 'null'],
1155
+ },
1156
+ },
1157
+ },
1158
+ },
1159
+ 'versions': {
1160
+ 'type': ['array', 'null'],
1161
+ 'description': 'Project versions',
1162
+ 'items': {
1163
+ 'type': 'object',
1164
+ 'properties': {
1165
+ 'self': {'type': 'string', 'format': 'uri'},
1166
+ 'id': {'type': 'string'},
1167
+ 'name': {'type': 'string'},
1168
+ 'description': {'type': 'string'},
1169
+ 'archived': {'type': 'boolean'},
1170
+ 'released': {'type': 'boolean'},
1171
+ 'startDate': {
1172
+ 'type': ['string', 'null'],
1173
+ 'format': 'date',
1174
+ },
1175
+ 'releaseDate': {
1176
+ 'type': ['string', 'null'],
1177
+ 'format': 'date',
1178
+ },
1179
+ 'overdue': {
1180
+ 'type': ['boolean', 'null'],
1181
+ },
1182
+ 'userStartDate': {
1183
+ 'type': ['string', 'null'],
1184
+ },
1185
+ 'userReleaseDate': {
1186
+ 'type': ['string', 'null'],
1187
+ },
1188
+ 'projectId': {'type': 'integer'},
1189
+ },
1190
+ },
1191
+ },
1192
+ 'roles': {
1193
+ 'type': ['object', 'null'],
1194
+ 'description': 'Project roles and their URLs',
1195
+ 'additionalProperties': {'type': 'string', 'format': 'uri'},
1196
+ },
1197
+ },
1198
+ 'x-airbyte-entity-name': 'projects',
1199
+ },
1200
+ ),
1201
+ EntityDefinition(
1202
+ name='users',
1203
+ actions=[Action.GET, Action.LIST, Action.SEARCH],
1204
+ endpoints={
1205
+ Action.GET: EndpointDefinition(
1206
+ method='GET',
1207
+ path='/rest/api/3/user',
1208
+ action=Action.GET,
1209
+ description='Retrieve a single user by their account ID',
1210
+ query_params=['accountId', 'expand'],
1211
+ query_params_schema={
1212
+ 'accountId': {'type': 'string', 'required': True},
1213
+ 'expand': {'type': 'string', 'required': False},
1214
+ },
1215
+ response_schema={
1216
+ 'type': 'object',
1217
+ 'description': 'Jira user object',
1218
+ 'properties': {
1219
+ 'self': {
1220
+ 'type': 'string',
1221
+ 'format': 'uri',
1222
+ 'description': 'URL of the user',
1223
+ },
1224
+ 'accountId': {'type': 'string', 'description': 'Unique account identifier'},
1225
+ 'accountType': {'type': 'string', 'description': 'Type of account (atlassian, app, etc.)'},
1226
+ 'emailAddress': {
1227
+ 'type': ['string', 'null'],
1228
+ 'format': 'email',
1229
+ 'description': 'Email address of the user',
1230
+ },
1231
+ 'avatarUrls': {
1232
+ 'type': 'object',
1233
+ 'description': 'URLs for user avatars in different sizes',
1234
+ 'properties': {
1235
+ '16x16': {'type': 'string', 'format': 'uri'},
1236
+ '24x24': {'type': 'string', 'format': 'uri'},
1237
+ '32x32': {'type': 'string', 'format': 'uri'},
1238
+ '48x48': {'type': 'string', 'format': 'uri'},
1239
+ },
1240
+ },
1241
+ 'displayName': {'type': 'string', 'description': 'Display name of the user'},
1242
+ 'active': {'type': 'boolean', 'description': 'Whether the user is active'},
1243
+ 'timeZone': {
1244
+ 'type': ['string', 'null'],
1245
+ 'description': 'Time zone of the user',
1246
+ },
1247
+ 'locale': {
1248
+ 'type': ['string', 'null'],
1249
+ 'description': 'Locale of the user',
1250
+ },
1251
+ 'expand': {
1252
+ 'type': ['string', 'null'],
1253
+ 'description': 'Expand options that were applied',
1254
+ },
1255
+ 'groups': {
1256
+ 'type': ['object', 'null'],
1257
+ 'description': 'User groups (available with expand=groups)',
1258
+ 'properties': {
1259
+ 'size': {'type': 'integer', 'description': 'Number of groups'},
1260
+ 'items': {
1261
+ 'type': 'array',
1262
+ 'description': 'Array of group objects',
1263
+ 'items': {
1264
+ 'type': 'object',
1265
+ 'properties': {
1266
+ 'name': {'type': 'string'},
1267
+ 'groupId': {'type': 'string'},
1268
+ 'self': {'type': 'string', 'format': 'uri'},
1269
+ },
1270
+ },
1271
+ },
1272
+ },
1273
+ },
1274
+ 'applicationRoles': {
1275
+ 'type': ['object', 'null'],
1276
+ 'description': 'User application roles (available with expand=applicationRoles)',
1277
+ 'properties': {
1278
+ 'size': {'type': 'integer', 'description': 'Number of application roles'},
1279
+ 'items': {
1280
+ 'type': 'array',
1281
+ 'description': 'Array of application role objects',
1282
+ 'items': {
1283
+ 'type': 'object',
1284
+ 'properties': {
1285
+ 'key': {'type': 'string'},
1286
+ 'name': {'type': 'string'},
1287
+ 'groups': {
1288
+ 'type': 'array',
1289
+ 'items': {'type': 'string'},
1290
+ },
1291
+ 'groupDetails': {
1292
+ 'type': 'array',
1293
+ 'items': {
1294
+ 'type': 'object',
1295
+ 'properties': {
1296
+ 'name': {'type': 'string'},
1297
+ 'groupId': {'type': 'string'},
1298
+ 'self': {'type': 'string', 'format': 'uri'},
1299
+ },
1300
+ },
1301
+ },
1302
+ 'defaultGroups': {
1303
+ 'type': 'array',
1304
+ 'items': {'type': 'string'},
1305
+ },
1306
+ 'defaultGroupsDetails': {
1307
+ 'type': 'array',
1308
+ 'items': {
1309
+ 'type': 'object',
1310
+ 'properties': {
1311
+ 'name': {'type': 'string'},
1312
+ 'groupId': {'type': 'string'},
1313
+ 'self': {'type': 'string', 'format': 'uri'},
1314
+ },
1315
+ },
1316
+ },
1317
+ 'selectedByDefault': {'type': 'boolean'},
1318
+ 'defined': {'type': 'boolean'},
1319
+ 'numberOfSeats': {'type': 'integer'},
1320
+ 'remainingSeats': {'type': 'integer'},
1321
+ 'userCount': {'type': 'integer'},
1322
+ 'userCountDescription': {'type': 'string'},
1323
+ 'hasUnlimitedSeats': {'type': 'boolean'},
1324
+ 'platform': {'type': 'boolean'},
1325
+ },
1326
+ },
1327
+ },
1328
+ },
1329
+ },
1330
+ },
1331
+ 'x-airbyte-entity-name': 'users',
1332
+ },
1333
+ ),
1334
+ Action.LIST: EndpointDefinition(
1335
+ method='GET',
1336
+ path='/rest/api/3/users',
1337
+ action=Action.LIST,
1338
+ description='Returns a paginated list of users',
1339
+ query_params=['startAt', 'maxResults'],
1340
+ query_params_schema={
1341
+ 'startAt': {
1342
+ 'type': 'integer',
1343
+ 'required': False,
1344
+ 'default': 0,
1345
+ },
1346
+ 'maxResults': {
1347
+ 'type': 'integer',
1348
+ 'required': False,
1349
+ 'default': 50,
1350
+ },
1351
+ },
1352
+ response_schema={
1353
+ 'type': 'array',
1354
+ 'items': {
1355
+ 'type': 'object',
1356
+ 'description': 'Jira user object',
1357
+ 'properties': {
1358
+ 'self': {
1359
+ 'type': 'string',
1360
+ 'format': 'uri',
1361
+ 'description': 'URL of the user',
1362
+ },
1363
+ 'accountId': {'type': 'string', 'description': 'Unique account identifier'},
1364
+ 'accountType': {'type': 'string', 'description': 'Type of account (atlassian, app, etc.)'},
1365
+ 'emailAddress': {
1366
+ 'type': ['string', 'null'],
1367
+ 'format': 'email',
1368
+ 'description': 'Email address of the user',
1369
+ },
1370
+ 'avatarUrls': {
1371
+ 'type': 'object',
1372
+ 'description': 'URLs for user avatars in different sizes',
1373
+ 'properties': {
1374
+ '16x16': {'type': 'string', 'format': 'uri'},
1375
+ '24x24': {'type': 'string', 'format': 'uri'},
1376
+ '32x32': {'type': 'string', 'format': 'uri'},
1377
+ '48x48': {'type': 'string', 'format': 'uri'},
1378
+ },
1379
+ },
1380
+ 'displayName': {'type': 'string', 'description': 'Display name of the user'},
1381
+ 'active': {'type': 'boolean', 'description': 'Whether the user is active'},
1382
+ 'timeZone': {
1383
+ 'type': ['string', 'null'],
1384
+ 'description': 'Time zone of the user',
1385
+ },
1386
+ 'locale': {
1387
+ 'type': ['string', 'null'],
1388
+ 'description': 'Locale of the user',
1389
+ },
1390
+ 'expand': {
1391
+ 'type': ['string', 'null'],
1392
+ 'description': 'Expand options that were applied',
1393
+ },
1394
+ 'groups': {
1395
+ 'type': ['object', 'null'],
1396
+ 'description': 'User groups (available with expand=groups)',
1397
+ 'properties': {
1398
+ 'size': {'type': 'integer', 'description': 'Number of groups'},
1399
+ 'items': {
1400
+ 'type': 'array',
1401
+ 'description': 'Array of group objects',
1402
+ 'items': {
1403
+ 'type': 'object',
1404
+ 'properties': {
1405
+ 'name': {'type': 'string'},
1406
+ 'groupId': {'type': 'string'},
1407
+ 'self': {'type': 'string', 'format': 'uri'},
1408
+ },
1409
+ },
1410
+ },
1411
+ },
1412
+ },
1413
+ 'applicationRoles': {
1414
+ 'type': ['object', 'null'],
1415
+ 'description': 'User application roles (available with expand=applicationRoles)',
1416
+ 'properties': {
1417
+ 'size': {'type': 'integer', 'description': 'Number of application roles'},
1418
+ 'items': {
1419
+ 'type': 'array',
1420
+ 'description': 'Array of application role objects',
1421
+ 'items': {
1422
+ 'type': 'object',
1423
+ 'properties': {
1424
+ 'key': {'type': 'string'},
1425
+ 'name': {'type': 'string'},
1426
+ 'groups': {
1427
+ 'type': 'array',
1428
+ 'items': {'type': 'string'},
1429
+ },
1430
+ 'groupDetails': {
1431
+ 'type': 'array',
1432
+ 'items': {
1433
+ 'type': 'object',
1434
+ 'properties': {
1435
+ 'name': {'type': 'string'},
1436
+ 'groupId': {'type': 'string'},
1437
+ 'self': {'type': 'string', 'format': 'uri'},
1438
+ },
1439
+ },
1440
+ },
1441
+ 'defaultGroups': {
1442
+ 'type': 'array',
1443
+ 'items': {'type': 'string'},
1444
+ },
1445
+ 'defaultGroupsDetails': {
1446
+ 'type': 'array',
1447
+ 'items': {
1448
+ 'type': 'object',
1449
+ 'properties': {
1450
+ 'name': {'type': 'string'},
1451
+ 'groupId': {'type': 'string'},
1452
+ 'self': {'type': 'string', 'format': 'uri'},
1453
+ },
1454
+ },
1455
+ },
1456
+ 'selectedByDefault': {'type': 'boolean'},
1457
+ 'defined': {'type': 'boolean'},
1458
+ 'numberOfSeats': {'type': 'integer'},
1459
+ 'remainingSeats': {'type': 'integer'},
1460
+ 'userCount': {'type': 'integer'},
1461
+ 'userCountDescription': {'type': 'string'},
1462
+ 'hasUnlimitedSeats': {'type': 'boolean'},
1463
+ 'platform': {'type': 'boolean'},
1464
+ },
1465
+ },
1466
+ },
1467
+ },
1468
+ },
1469
+ },
1470
+ 'x-airbyte-entity-name': 'users',
1471
+ },
1472
+ },
1473
+ ),
1474
+ Action.SEARCH: EndpointDefinition(
1475
+ method='GET',
1476
+ path='/rest/api/3/user/search',
1477
+ action=Action.SEARCH,
1478
+ description='Search for users using a query string',
1479
+ query_params=[
1480
+ 'query',
1481
+ 'startAt',
1482
+ 'maxResults',
1483
+ 'accountId',
1484
+ 'property',
1485
+ ],
1486
+ query_params_schema={
1487
+ 'query': {'type': 'string', 'required': False},
1488
+ 'startAt': {
1489
+ 'type': 'integer',
1490
+ 'required': False,
1491
+ 'default': 0,
1492
+ },
1493
+ 'maxResults': {
1494
+ 'type': 'integer',
1495
+ 'required': False,
1496
+ 'default': 50,
1497
+ },
1498
+ 'accountId': {'type': 'string', 'required': False},
1499
+ 'property': {'type': 'string', 'required': False},
1500
+ },
1501
+ response_schema={
1502
+ 'type': 'array',
1503
+ 'items': {
1504
+ 'type': 'object',
1505
+ 'description': 'Jira user object',
1506
+ 'properties': {
1507
+ 'self': {
1508
+ 'type': 'string',
1509
+ 'format': 'uri',
1510
+ 'description': 'URL of the user',
1511
+ },
1512
+ 'accountId': {'type': 'string', 'description': 'Unique account identifier'},
1513
+ 'accountType': {'type': 'string', 'description': 'Type of account (atlassian, app, etc.)'},
1514
+ 'emailAddress': {
1515
+ 'type': ['string', 'null'],
1516
+ 'format': 'email',
1517
+ 'description': 'Email address of the user',
1518
+ },
1519
+ 'avatarUrls': {
1520
+ 'type': 'object',
1521
+ 'description': 'URLs for user avatars in different sizes',
1522
+ 'properties': {
1523
+ '16x16': {'type': 'string', 'format': 'uri'},
1524
+ '24x24': {'type': 'string', 'format': 'uri'},
1525
+ '32x32': {'type': 'string', 'format': 'uri'},
1526
+ '48x48': {'type': 'string', 'format': 'uri'},
1527
+ },
1528
+ },
1529
+ 'displayName': {'type': 'string', 'description': 'Display name of the user'},
1530
+ 'active': {'type': 'boolean', 'description': 'Whether the user is active'},
1531
+ 'timeZone': {
1532
+ 'type': ['string', 'null'],
1533
+ 'description': 'Time zone of the user',
1534
+ },
1535
+ 'locale': {
1536
+ 'type': ['string', 'null'],
1537
+ 'description': 'Locale of the user',
1538
+ },
1539
+ 'expand': {
1540
+ 'type': ['string', 'null'],
1541
+ 'description': 'Expand options that were applied',
1542
+ },
1543
+ 'groups': {
1544
+ 'type': ['object', 'null'],
1545
+ 'description': 'User groups (available with expand=groups)',
1546
+ 'properties': {
1547
+ 'size': {'type': 'integer', 'description': 'Number of groups'},
1548
+ 'items': {
1549
+ 'type': 'array',
1550
+ 'description': 'Array of group objects',
1551
+ 'items': {
1552
+ 'type': 'object',
1553
+ 'properties': {
1554
+ 'name': {'type': 'string'},
1555
+ 'groupId': {'type': 'string'},
1556
+ 'self': {'type': 'string', 'format': 'uri'},
1557
+ },
1558
+ },
1559
+ },
1560
+ },
1561
+ },
1562
+ 'applicationRoles': {
1563
+ 'type': ['object', 'null'],
1564
+ 'description': 'User application roles (available with expand=applicationRoles)',
1565
+ 'properties': {
1566
+ 'size': {'type': 'integer', 'description': 'Number of application roles'},
1567
+ 'items': {
1568
+ 'type': 'array',
1569
+ 'description': 'Array of application role objects',
1570
+ 'items': {
1571
+ 'type': 'object',
1572
+ 'properties': {
1573
+ 'key': {'type': 'string'},
1574
+ 'name': {'type': 'string'},
1575
+ 'groups': {
1576
+ 'type': 'array',
1577
+ 'items': {'type': 'string'},
1578
+ },
1579
+ 'groupDetails': {
1580
+ 'type': 'array',
1581
+ 'items': {
1582
+ 'type': 'object',
1583
+ 'properties': {
1584
+ 'name': {'type': 'string'},
1585
+ 'groupId': {'type': 'string'},
1586
+ 'self': {'type': 'string', 'format': 'uri'},
1587
+ },
1588
+ },
1589
+ },
1590
+ 'defaultGroups': {
1591
+ 'type': 'array',
1592
+ 'items': {'type': 'string'},
1593
+ },
1594
+ 'defaultGroupsDetails': {
1595
+ 'type': 'array',
1596
+ 'items': {
1597
+ 'type': 'object',
1598
+ 'properties': {
1599
+ 'name': {'type': 'string'},
1600
+ 'groupId': {'type': 'string'},
1601
+ 'self': {'type': 'string', 'format': 'uri'},
1602
+ },
1603
+ },
1604
+ },
1605
+ 'selectedByDefault': {'type': 'boolean'},
1606
+ 'defined': {'type': 'boolean'},
1607
+ 'numberOfSeats': {'type': 'integer'},
1608
+ 'remainingSeats': {'type': 'integer'},
1609
+ 'userCount': {'type': 'integer'},
1610
+ 'userCountDescription': {'type': 'string'},
1611
+ 'hasUnlimitedSeats': {'type': 'boolean'},
1612
+ 'platform': {'type': 'boolean'},
1613
+ },
1614
+ },
1615
+ },
1616
+ },
1617
+ },
1618
+ },
1619
+ 'x-airbyte-entity-name': 'users',
1620
+ },
1621
+ },
1622
+ ),
1623
+ },
1624
+ entity_schema={
1625
+ 'type': 'object',
1626
+ 'description': 'Jira user object',
1627
+ 'properties': {
1628
+ 'self': {
1629
+ 'type': 'string',
1630
+ 'format': 'uri',
1631
+ 'description': 'URL of the user',
1632
+ },
1633
+ 'accountId': {'type': 'string', 'description': 'Unique account identifier'},
1634
+ 'accountType': {'type': 'string', 'description': 'Type of account (atlassian, app, etc.)'},
1635
+ 'emailAddress': {
1636
+ 'type': ['string', 'null'],
1637
+ 'format': 'email',
1638
+ 'description': 'Email address of the user',
1639
+ },
1640
+ 'avatarUrls': {
1641
+ 'type': 'object',
1642
+ 'description': 'URLs for user avatars in different sizes',
1643
+ 'properties': {
1644
+ '16x16': {'type': 'string', 'format': 'uri'},
1645
+ '24x24': {'type': 'string', 'format': 'uri'},
1646
+ '32x32': {'type': 'string', 'format': 'uri'},
1647
+ '48x48': {'type': 'string', 'format': 'uri'},
1648
+ },
1649
+ },
1650
+ 'displayName': {'type': 'string', 'description': 'Display name of the user'},
1651
+ 'active': {'type': 'boolean', 'description': 'Whether the user is active'},
1652
+ 'timeZone': {
1653
+ 'type': ['string', 'null'],
1654
+ 'description': 'Time zone of the user',
1655
+ },
1656
+ 'locale': {
1657
+ 'type': ['string', 'null'],
1658
+ 'description': 'Locale of the user',
1659
+ },
1660
+ 'expand': {
1661
+ 'type': ['string', 'null'],
1662
+ 'description': 'Expand options that were applied',
1663
+ },
1664
+ 'groups': {
1665
+ 'type': ['object', 'null'],
1666
+ 'description': 'User groups (available with expand=groups)',
1667
+ 'properties': {
1668
+ 'size': {'type': 'integer', 'description': 'Number of groups'},
1669
+ 'items': {
1670
+ 'type': 'array',
1671
+ 'description': 'Array of group objects',
1672
+ 'items': {
1673
+ 'type': 'object',
1674
+ 'properties': {
1675
+ 'name': {'type': 'string'},
1676
+ 'groupId': {'type': 'string'},
1677
+ 'self': {'type': 'string', 'format': 'uri'},
1678
+ },
1679
+ },
1680
+ },
1681
+ },
1682
+ },
1683
+ 'applicationRoles': {
1684
+ 'type': ['object', 'null'],
1685
+ 'description': 'User application roles (available with expand=applicationRoles)',
1686
+ 'properties': {
1687
+ 'size': {'type': 'integer', 'description': 'Number of application roles'},
1688
+ 'items': {
1689
+ 'type': 'array',
1690
+ 'description': 'Array of application role objects',
1691
+ 'items': {
1692
+ 'type': 'object',
1693
+ 'properties': {
1694
+ 'key': {'type': 'string'},
1695
+ 'name': {'type': 'string'},
1696
+ 'groups': {
1697
+ 'type': 'array',
1698
+ 'items': {'type': 'string'},
1699
+ },
1700
+ 'groupDetails': {
1701
+ 'type': 'array',
1702
+ 'items': {
1703
+ 'type': 'object',
1704
+ 'properties': {
1705
+ 'name': {'type': 'string'},
1706
+ 'groupId': {'type': 'string'},
1707
+ 'self': {'type': 'string', 'format': 'uri'},
1708
+ },
1709
+ },
1710
+ },
1711
+ 'defaultGroups': {
1712
+ 'type': 'array',
1713
+ 'items': {'type': 'string'},
1714
+ },
1715
+ 'defaultGroupsDetails': {
1716
+ 'type': 'array',
1717
+ 'items': {
1718
+ 'type': 'object',
1719
+ 'properties': {
1720
+ 'name': {'type': 'string'},
1721
+ 'groupId': {'type': 'string'},
1722
+ 'self': {'type': 'string', 'format': 'uri'},
1723
+ },
1724
+ },
1725
+ },
1726
+ 'selectedByDefault': {'type': 'boolean'},
1727
+ 'defined': {'type': 'boolean'},
1728
+ 'numberOfSeats': {'type': 'integer'},
1729
+ 'remainingSeats': {'type': 'integer'},
1730
+ 'userCount': {'type': 'integer'},
1731
+ 'userCountDescription': {'type': 'string'},
1732
+ 'hasUnlimitedSeats': {'type': 'boolean'},
1733
+ 'platform': {'type': 'boolean'},
1734
+ },
1735
+ },
1736
+ },
1737
+ },
1738
+ },
1739
+ },
1740
+ 'x-airbyte-entity-name': 'users',
1741
+ },
1742
+ ),
1743
+ EntityDefinition(
1744
+ name='issue_fields',
1745
+ actions=[Action.LIST, Action.SEARCH],
1746
+ endpoints={
1747
+ Action.LIST: EndpointDefinition(
1748
+ method='GET',
1749
+ path='/rest/api/3/field',
1750
+ action=Action.LIST,
1751
+ description='Returns a list of all custom and system fields',
1752
+ response_schema={
1753
+ 'type': 'array',
1754
+ 'items': {
1755
+ 'type': 'object',
1756
+ 'description': 'Jira issue field object (custom or system field)',
1757
+ 'properties': {
1758
+ 'id': {'type': 'string', 'description': 'Field ID (e.g., customfield_10000 or summary)'},
1759
+ 'key': {
1760
+ 'type': ['string', 'null'],
1761
+ 'description': 'Field key (e.g., summary, customfield_10000)',
1762
+ },
1763
+ 'name': {'type': 'string', 'description': 'Field name (e.g., Summary, Story Points)'},
1764
+ 'custom': {
1765
+ 'type': ['boolean', 'null'],
1766
+ 'description': 'Whether this is a custom field',
1767
+ },
1768
+ 'orderable': {
1769
+ 'type': ['boolean', 'null'],
1770
+ 'description': 'Whether the field can be used for ordering',
1771
+ },
1772
+ 'navigable': {
1773
+ 'type': ['boolean', 'null'],
1774
+ 'description': 'Whether the field is navigable',
1775
+ },
1776
+ 'searchable': {
1777
+ 'type': ['boolean', 'null'],
1778
+ 'description': 'Whether the field is searchable',
1779
+ },
1780
+ 'clauseNames': {
1781
+ 'type': ['array', 'null'],
1782
+ 'items': {'type': 'string'},
1783
+ 'description': 'JQL clause names for this field',
1784
+ },
1785
+ 'schema': {
1786
+ 'type': ['object', 'null'],
1787
+ 'description': 'Schema information for the field',
1788
+ 'properties': {
1789
+ 'type': {'type': 'string', 'description': 'Field type (e.g., string, number, array)'},
1790
+ 'system': {
1791
+ 'type': ['string', 'null'],
1792
+ 'description': 'System field identifier',
1793
+ },
1794
+ 'items': {
1795
+ 'type': ['string', 'null'],
1796
+ 'description': 'Type of items in array fields',
1797
+ },
1798
+ 'custom': {
1799
+ 'type': ['string', 'null'],
1800
+ 'description': 'Custom field type identifier',
1801
+ },
1802
+ 'customId': {
1803
+ 'type': ['integer', 'null'],
1804
+ 'description': 'Custom field ID',
1805
+ },
1806
+ 'configuration': {
1807
+ 'type': ['object', 'null'],
1808
+ 'description': 'Field configuration',
1809
+ 'additionalProperties': True,
1810
+ },
1811
+ },
1812
+ },
1813
+ 'untranslatedName': {
1814
+ 'type': ['string', 'null'],
1815
+ 'description': 'Untranslated field name',
1816
+ },
1817
+ 'typeDisplayName': {
1818
+ 'type': ['string', 'null'],
1819
+ 'description': 'Display name of the field type',
1820
+ },
1821
+ 'description': {
1822
+ 'type': ['string', 'null'],
1823
+ 'description': 'Description of the field',
1824
+ },
1825
+ 'searcherKey': {
1826
+ 'type': ['string', 'null'],
1827
+ 'description': 'Searcher key for the field (available with expand=searcherKey)',
1828
+ },
1829
+ 'screensCount': {
1830
+ 'type': ['integer', 'null'],
1831
+ 'description': 'Number of screens where this field is used (available with expand=screensCount)',
1832
+ },
1833
+ 'contextsCount': {
1834
+ 'type': ['integer', 'null'],
1835
+ 'description': 'Number of contexts where this field is used (available with expand=contextsCount)',
1836
+ },
1837
+ 'isLocked': {
1838
+ 'type': ['boolean', 'null'],
1839
+ 'description': 'Whether the field is locked (available with expand=isLocked)',
1840
+ },
1841
+ 'lastUsed': {
1842
+ 'type': ['string', 'null'],
1843
+ 'description': 'Date when the field was last used (available with expand=lastUsed)',
1844
+ },
1845
+ },
1846
+ 'x-airbyte-entity-name': 'issue_fields',
1847
+ },
1848
+ },
1849
+ ),
1850
+ Action.SEARCH: EndpointDefinition(
1851
+ method='GET',
1852
+ path='/rest/api/3/field/search',
1853
+ action=Action.SEARCH,
1854
+ description='Search and filter issue fields with query parameters',
1855
+ query_params=[
1856
+ 'startAt',
1857
+ 'maxResults',
1858
+ 'type',
1859
+ 'id',
1860
+ 'query',
1861
+ 'orderBy',
1862
+ 'expand',
1863
+ ],
1864
+ query_params_schema={
1865
+ 'startAt': {
1866
+ 'type': 'integer',
1867
+ 'required': False,
1868
+ 'default': 0,
1869
+ },
1870
+ 'maxResults': {
1871
+ 'type': 'integer',
1872
+ 'required': False,
1873
+ 'default': 50,
1874
+ },
1875
+ 'type': {'type': 'array', 'required': False},
1876
+ 'id': {'type': 'array', 'required': False},
1877
+ 'query': {'type': 'string', 'required': False},
1878
+ 'orderBy': {'type': 'string', 'required': False},
1879
+ 'expand': {'type': 'string', 'required': False},
1880
+ },
1881
+ response_schema={
1882
+ 'type': 'object',
1883
+ 'description': 'Paginated search results for issue fields',
1884
+ 'properties': {
1885
+ 'maxResults': {'type': 'integer', 'description': 'Maximum number of results per page'},
1886
+ 'startAt': {'type': 'integer', 'description': 'Index of first item returned'},
1887
+ 'total': {'type': 'integer', 'description': 'Total number of fields matching query'},
1888
+ 'isLast': {'type': 'boolean', 'description': 'Whether this is the last page'},
1889
+ 'values': {
1890
+ 'type': 'array',
1891
+ 'items': {
1892
+ 'type': 'object',
1893
+ 'description': 'Jira issue field object (custom or system field)',
1894
+ 'properties': {
1895
+ 'id': {'type': 'string', 'description': 'Field ID (e.g., customfield_10000 or summary)'},
1896
+ 'key': {
1897
+ 'type': ['string', 'null'],
1898
+ 'description': 'Field key (e.g., summary, customfield_10000)',
1899
+ },
1900
+ 'name': {'type': 'string', 'description': 'Field name (e.g., Summary, Story Points)'},
1901
+ 'custom': {
1902
+ 'type': ['boolean', 'null'],
1903
+ 'description': 'Whether this is a custom field',
1904
+ },
1905
+ 'orderable': {
1906
+ 'type': ['boolean', 'null'],
1907
+ 'description': 'Whether the field can be used for ordering',
1908
+ },
1909
+ 'navigable': {
1910
+ 'type': ['boolean', 'null'],
1911
+ 'description': 'Whether the field is navigable',
1912
+ },
1913
+ 'searchable': {
1914
+ 'type': ['boolean', 'null'],
1915
+ 'description': 'Whether the field is searchable',
1916
+ },
1917
+ 'clauseNames': {
1918
+ 'type': ['array', 'null'],
1919
+ 'items': {'type': 'string'},
1920
+ 'description': 'JQL clause names for this field',
1921
+ },
1922
+ 'schema': {
1923
+ 'type': ['object', 'null'],
1924
+ 'description': 'Schema information for the field',
1925
+ 'properties': {
1926
+ 'type': {'type': 'string', 'description': 'Field type (e.g., string, number, array)'},
1927
+ 'system': {
1928
+ 'type': ['string', 'null'],
1929
+ 'description': 'System field identifier',
1930
+ },
1931
+ 'items': {
1932
+ 'type': ['string', 'null'],
1933
+ 'description': 'Type of items in array fields',
1934
+ },
1935
+ 'custom': {
1936
+ 'type': ['string', 'null'],
1937
+ 'description': 'Custom field type identifier',
1938
+ },
1939
+ 'customId': {
1940
+ 'type': ['integer', 'null'],
1941
+ 'description': 'Custom field ID',
1942
+ },
1943
+ 'configuration': {
1944
+ 'type': ['object', 'null'],
1945
+ 'description': 'Field configuration',
1946
+ 'additionalProperties': True,
1947
+ },
1948
+ },
1949
+ },
1950
+ 'untranslatedName': {
1951
+ 'type': ['string', 'null'],
1952
+ 'description': 'Untranslated field name',
1953
+ },
1954
+ 'typeDisplayName': {
1955
+ 'type': ['string', 'null'],
1956
+ 'description': 'Display name of the field type',
1957
+ },
1958
+ 'description': {
1959
+ 'type': ['string', 'null'],
1960
+ 'description': 'Description of the field',
1961
+ },
1962
+ 'searcherKey': {
1963
+ 'type': ['string', 'null'],
1964
+ 'description': 'Searcher key for the field (available with expand=searcherKey)',
1965
+ },
1966
+ 'screensCount': {
1967
+ 'type': ['integer', 'null'],
1968
+ 'description': 'Number of screens where this field is used (available with expand=screensCount)',
1969
+ },
1970
+ 'contextsCount': {
1971
+ 'type': ['integer', 'null'],
1972
+ 'description': 'Number of contexts where this field is used (available with expand=contextsCount)',
1973
+ },
1974
+ 'isLocked': {
1975
+ 'type': ['boolean', 'null'],
1976
+ 'description': 'Whether the field is locked (available with expand=isLocked)',
1977
+ },
1978
+ 'lastUsed': {
1979
+ 'type': ['string', 'null'],
1980
+ 'description': 'Date when the field was last used (available with expand=lastUsed)',
1981
+ },
1982
+ },
1983
+ 'x-airbyte-entity-name': 'issue_fields',
1984
+ },
1985
+ 'description': 'Array of field objects',
1986
+ },
1987
+ },
1988
+ },
1989
+ ),
1990
+ },
1991
+ entity_schema={
1992
+ 'type': 'object',
1993
+ 'description': 'Jira issue field object (custom or system field)',
1994
+ 'properties': {
1995
+ 'id': {'type': 'string', 'description': 'Field ID (e.g., customfield_10000 or summary)'},
1996
+ 'key': {
1997
+ 'type': ['string', 'null'],
1998
+ 'description': 'Field key (e.g., summary, customfield_10000)',
1999
+ },
2000
+ 'name': {'type': 'string', 'description': 'Field name (e.g., Summary, Story Points)'},
2001
+ 'custom': {
2002
+ 'type': ['boolean', 'null'],
2003
+ 'description': 'Whether this is a custom field',
2004
+ },
2005
+ 'orderable': {
2006
+ 'type': ['boolean', 'null'],
2007
+ 'description': 'Whether the field can be used for ordering',
2008
+ },
2009
+ 'navigable': {
2010
+ 'type': ['boolean', 'null'],
2011
+ 'description': 'Whether the field is navigable',
2012
+ },
2013
+ 'searchable': {
2014
+ 'type': ['boolean', 'null'],
2015
+ 'description': 'Whether the field is searchable',
2016
+ },
2017
+ 'clauseNames': {
2018
+ 'type': ['array', 'null'],
2019
+ 'items': {'type': 'string'},
2020
+ 'description': 'JQL clause names for this field',
2021
+ },
2022
+ 'schema': {
2023
+ 'type': ['object', 'null'],
2024
+ 'description': 'Schema information for the field',
2025
+ 'properties': {
2026
+ 'type': {'type': 'string', 'description': 'Field type (e.g., string, number, array)'},
2027
+ 'system': {
2028
+ 'type': ['string', 'null'],
2029
+ 'description': 'System field identifier',
2030
+ },
2031
+ 'items': {
2032
+ 'type': ['string', 'null'],
2033
+ 'description': 'Type of items in array fields',
2034
+ },
2035
+ 'custom': {
2036
+ 'type': ['string', 'null'],
2037
+ 'description': 'Custom field type identifier',
2038
+ },
2039
+ 'customId': {
2040
+ 'type': ['integer', 'null'],
2041
+ 'description': 'Custom field ID',
2042
+ },
2043
+ 'configuration': {
2044
+ 'type': ['object', 'null'],
2045
+ 'description': 'Field configuration',
2046
+ 'additionalProperties': True,
2047
+ },
2048
+ },
2049
+ },
2050
+ 'untranslatedName': {
2051
+ 'type': ['string', 'null'],
2052
+ 'description': 'Untranslated field name',
2053
+ },
2054
+ 'typeDisplayName': {
2055
+ 'type': ['string', 'null'],
2056
+ 'description': 'Display name of the field type',
2057
+ },
2058
+ 'description': {
2059
+ 'type': ['string', 'null'],
2060
+ 'description': 'Description of the field',
2061
+ },
2062
+ 'searcherKey': {
2063
+ 'type': ['string', 'null'],
2064
+ 'description': 'Searcher key for the field (available with expand=searcherKey)',
2065
+ },
2066
+ 'screensCount': {
2067
+ 'type': ['integer', 'null'],
2068
+ 'description': 'Number of screens where this field is used (available with expand=screensCount)',
2069
+ },
2070
+ 'contextsCount': {
2071
+ 'type': ['integer', 'null'],
2072
+ 'description': 'Number of contexts where this field is used (available with expand=contextsCount)',
2073
+ },
2074
+ 'isLocked': {
2075
+ 'type': ['boolean', 'null'],
2076
+ 'description': 'Whether the field is locked (available with expand=isLocked)',
2077
+ },
2078
+ 'lastUsed': {
2079
+ 'type': ['string', 'null'],
2080
+ 'description': 'Date when the field was last used (available with expand=lastUsed)',
2081
+ },
2082
+ },
2083
+ 'x-airbyte-entity-name': 'issue_fields',
2084
+ },
2085
+ ),
2086
+ EntityDefinition(
2087
+ name='issue_comments',
2088
+ actions=[Action.LIST, Action.GET],
2089
+ endpoints={
2090
+ Action.LIST: EndpointDefinition(
2091
+ method='GET',
2092
+ path='/rest/api/3/issue/{issueIdOrKey}/comment',
2093
+ action=Action.LIST,
2094
+ description='Retrieve all comments for a specific issue',
2095
+ query_params=[
2096
+ 'startAt',
2097
+ 'maxResults',
2098
+ 'orderBy',
2099
+ 'expand',
2100
+ ],
2101
+ query_params_schema={
2102
+ 'startAt': {
2103
+ 'type': 'integer',
2104
+ 'required': False,
2105
+ 'default': 0,
2106
+ },
2107
+ 'maxResults': {
2108
+ 'type': 'integer',
2109
+ 'required': False,
2110
+ 'default': 50,
2111
+ },
2112
+ 'orderBy': {'type': 'string', 'required': False},
2113
+ 'expand': {'type': 'string', 'required': False},
2114
+ },
2115
+ path_params=['issueIdOrKey'],
2116
+ path_params_schema={
2117
+ 'issueIdOrKey': {'type': 'string', 'required': True},
2118
+ },
2119
+ response_schema={
2120
+ 'type': 'object',
2121
+ 'description': 'Paginated list of issue comments',
2122
+ 'properties': {
2123
+ 'startAt': {'type': 'integer', 'description': 'Index of first item returned'},
2124
+ 'maxResults': {'type': 'integer', 'description': 'Maximum number of results per page'},
2125
+ 'total': {'type': 'integer', 'description': 'Total number of comments'},
2126
+ 'comments': {
2127
+ 'type': 'array',
2128
+ 'items': {
2129
+ 'type': 'object',
2130
+ 'description': 'Jira issue comment object',
2131
+ 'properties': {
2132
+ 'id': {'type': 'string', 'description': 'Unique comment identifier'},
2133
+ 'self': {
2134
+ 'type': 'string',
2135
+ 'format': 'uri',
2136
+ 'description': 'URL of the comment',
2137
+ },
2138
+ 'body': {
2139
+ 'type': 'object',
2140
+ 'description': 'Comment content in ADF (Atlassian Document Format)',
2141
+ 'properties': {
2142
+ 'type': {'type': 'string', 'description': "Document type (always 'doc')"},
2143
+ 'version': {'type': 'integer', 'description': 'ADF version'},
2144
+ 'content': {
2145
+ 'type': 'array',
2146
+ 'description': 'Array of content blocks',
2147
+ 'items': {
2148
+ 'type': 'object',
2149
+ 'properties': {
2150
+ 'type': {'type': 'string', 'description': "Block type (e.g., 'paragraph')"},
2151
+ 'content': {
2152
+ 'type': 'array',
2153
+ 'description': 'Nested content items',
2154
+ 'items': {
2155
+ 'type': 'object',
2156
+ 'properties': {
2157
+ 'type': {'type': 'string', 'description': "Content type (e.g., 'text')"},
2158
+ 'text': {'type': 'string', 'description': 'Text content'},
2159
+ },
2160
+ },
2161
+ },
2162
+ },
2163
+ },
2164
+ },
2165
+ },
2166
+ 'additionalProperties': False,
2167
+ },
2168
+ 'author': {
2169
+ 'type': 'object',
2170
+ 'description': 'Comment author user information',
2171
+ 'properties': {
2172
+ 'self': {'type': 'string', 'format': 'uri'},
2173
+ 'accountId': {'type': 'string'},
2174
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2175
+ 'displayName': {'type': 'string'},
2176
+ 'active': {'type': 'boolean'},
2177
+ 'timeZone': {'type': 'string'},
2178
+ 'accountType': {'type': 'string'},
2179
+ 'avatarUrls': {
2180
+ 'type': 'object',
2181
+ 'description': 'URLs for user avatars in different sizes',
2182
+ 'properties': {
2183
+ '16x16': {'type': 'string', 'format': 'uri'},
2184
+ '24x24': {'type': 'string', 'format': 'uri'},
2185
+ '32x32': {'type': 'string', 'format': 'uri'},
2186
+ '48x48': {'type': 'string', 'format': 'uri'},
2187
+ },
2188
+ },
2189
+ },
2190
+ },
2191
+ 'updateAuthor': {
2192
+ 'type': 'object',
2193
+ 'description': 'User who last updated the comment',
2194
+ 'properties': {
2195
+ 'self': {'type': 'string', 'format': 'uri'},
2196
+ 'accountId': {'type': 'string'},
2197
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2198
+ 'displayName': {'type': 'string'},
2199
+ 'active': {'type': 'boolean'},
2200
+ 'timeZone': {'type': 'string'},
2201
+ 'accountType': {'type': 'string'},
2202
+ 'avatarUrls': {
2203
+ 'type': 'object',
2204
+ 'description': 'URLs for user avatars in different sizes',
2205
+ 'properties': {
2206
+ '16x16': {'type': 'string', 'format': 'uri'},
2207
+ '24x24': {'type': 'string', 'format': 'uri'},
2208
+ '32x32': {'type': 'string', 'format': 'uri'},
2209
+ '48x48': {'type': 'string', 'format': 'uri'},
2210
+ },
2211
+ },
2212
+ },
2213
+ },
2214
+ 'created': {
2215
+ 'type': 'string',
2216
+ 'format': 'date-time',
2217
+ 'description': 'Comment creation timestamp',
2218
+ },
2219
+ 'updated': {
2220
+ 'type': 'string',
2221
+ 'format': 'date-time',
2222
+ 'description': 'Comment last update timestamp',
2223
+ },
2224
+ 'jsdPublic': {'type': 'boolean', 'description': 'Whether the comment is public in Jira Service Desk'},
2225
+ 'visibility': {
2226
+ 'type': ['object', 'null'],
2227
+ 'description': 'Visibility restrictions for the comment',
2228
+ 'properties': {
2229
+ 'type': {'type': 'string'},
2230
+ 'value': {'type': 'string'},
2231
+ 'identifier': {
2232
+ 'type': ['string', 'null'],
2233
+ },
2234
+ },
2235
+ },
2236
+ 'renderedBody': {
2237
+ 'type': ['string', 'null'],
2238
+ 'description': 'Rendered comment body as HTML (available with expand=renderedBody)',
2239
+ },
2240
+ 'properties': {
2241
+ 'type': ['array', 'null'],
2242
+ 'description': 'Comment properties (available with expand=properties)',
2243
+ 'items': {'type': 'object', 'additionalProperties': True},
2244
+ },
2245
+ },
2246
+ 'x-airbyte-entity-name': 'issue_comments',
2247
+ },
2248
+ 'description': 'Array of comment objects',
2249
+ },
2250
+ },
2251
+ },
2252
+ record_extractor='$.comments',
2253
+ meta_extractor={
2254
+ 'startAt': '$.startAt',
2255
+ 'maxResults': '$.maxResults',
2256
+ 'total': '$.total',
2257
+ },
2258
+ ),
2259
+ Action.GET: EndpointDefinition(
2260
+ method='GET',
2261
+ path='/rest/api/3/issue/{issueIdOrKey}/comment/{commentId}',
2262
+ action=Action.GET,
2263
+ description='Retrieve a single comment by its ID',
2264
+ query_params=['expand'],
2265
+ query_params_schema={
2266
+ 'expand': {'type': 'string', 'required': False},
2267
+ },
2268
+ path_params=['issueIdOrKey', 'commentId'],
2269
+ path_params_schema={
2270
+ 'issueIdOrKey': {'type': 'string', 'required': True},
2271
+ 'commentId': {'type': 'string', 'required': True},
2272
+ },
2273
+ response_schema={
2274
+ 'type': 'object',
2275
+ 'description': 'Jira issue comment object',
2276
+ 'properties': {
2277
+ 'id': {'type': 'string', 'description': 'Unique comment identifier'},
2278
+ 'self': {
2279
+ 'type': 'string',
2280
+ 'format': 'uri',
2281
+ 'description': 'URL of the comment',
2282
+ },
2283
+ 'body': {
2284
+ 'type': 'object',
2285
+ 'description': 'Comment content in ADF (Atlassian Document Format)',
2286
+ 'properties': {
2287
+ 'type': {'type': 'string', 'description': "Document type (always 'doc')"},
2288
+ 'version': {'type': 'integer', 'description': 'ADF version'},
2289
+ 'content': {
2290
+ 'type': 'array',
2291
+ 'description': 'Array of content blocks',
2292
+ 'items': {
2293
+ 'type': 'object',
2294
+ 'properties': {
2295
+ 'type': {'type': 'string', 'description': "Block type (e.g., 'paragraph')"},
2296
+ 'content': {
2297
+ 'type': 'array',
2298
+ 'description': 'Nested content items',
2299
+ 'items': {
2300
+ 'type': 'object',
2301
+ 'properties': {
2302
+ 'type': {'type': 'string', 'description': "Content type (e.g., 'text')"},
2303
+ 'text': {'type': 'string', 'description': 'Text content'},
2304
+ },
2305
+ },
2306
+ },
2307
+ },
2308
+ },
2309
+ },
2310
+ },
2311
+ 'additionalProperties': False,
2312
+ },
2313
+ 'author': {
2314
+ 'type': 'object',
2315
+ 'description': 'Comment author user information',
2316
+ 'properties': {
2317
+ 'self': {'type': 'string', 'format': 'uri'},
2318
+ 'accountId': {'type': 'string'},
2319
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2320
+ 'displayName': {'type': 'string'},
2321
+ 'active': {'type': 'boolean'},
2322
+ 'timeZone': {'type': 'string'},
2323
+ 'accountType': {'type': 'string'},
2324
+ 'avatarUrls': {
2325
+ 'type': 'object',
2326
+ 'description': 'URLs for user avatars in different sizes',
2327
+ 'properties': {
2328
+ '16x16': {'type': 'string', 'format': 'uri'},
2329
+ '24x24': {'type': 'string', 'format': 'uri'},
2330
+ '32x32': {'type': 'string', 'format': 'uri'},
2331
+ '48x48': {'type': 'string', 'format': 'uri'},
2332
+ },
2333
+ },
2334
+ },
2335
+ },
2336
+ 'updateAuthor': {
2337
+ 'type': 'object',
2338
+ 'description': 'User who last updated the comment',
2339
+ 'properties': {
2340
+ 'self': {'type': 'string', 'format': 'uri'},
2341
+ 'accountId': {'type': 'string'},
2342
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2343
+ 'displayName': {'type': 'string'},
2344
+ 'active': {'type': 'boolean'},
2345
+ 'timeZone': {'type': 'string'},
2346
+ 'accountType': {'type': 'string'},
2347
+ 'avatarUrls': {
2348
+ 'type': 'object',
2349
+ 'description': 'URLs for user avatars in different sizes',
2350
+ 'properties': {
2351
+ '16x16': {'type': 'string', 'format': 'uri'},
2352
+ '24x24': {'type': 'string', 'format': 'uri'},
2353
+ '32x32': {'type': 'string', 'format': 'uri'},
2354
+ '48x48': {'type': 'string', 'format': 'uri'},
2355
+ },
2356
+ },
2357
+ },
2358
+ },
2359
+ 'created': {
2360
+ 'type': 'string',
2361
+ 'format': 'date-time',
2362
+ 'description': 'Comment creation timestamp',
2363
+ },
2364
+ 'updated': {
2365
+ 'type': 'string',
2366
+ 'format': 'date-time',
2367
+ 'description': 'Comment last update timestamp',
2368
+ },
2369
+ 'jsdPublic': {'type': 'boolean', 'description': 'Whether the comment is public in Jira Service Desk'},
2370
+ 'visibility': {
2371
+ 'type': ['object', 'null'],
2372
+ 'description': 'Visibility restrictions for the comment',
2373
+ 'properties': {
2374
+ 'type': {'type': 'string'},
2375
+ 'value': {'type': 'string'},
2376
+ 'identifier': {
2377
+ 'type': ['string', 'null'],
2378
+ },
2379
+ },
2380
+ },
2381
+ 'renderedBody': {
2382
+ 'type': ['string', 'null'],
2383
+ 'description': 'Rendered comment body as HTML (available with expand=renderedBody)',
2384
+ },
2385
+ 'properties': {
2386
+ 'type': ['array', 'null'],
2387
+ 'description': 'Comment properties (available with expand=properties)',
2388
+ 'items': {'type': 'object', 'additionalProperties': True},
2389
+ },
2390
+ },
2391
+ 'x-airbyte-entity-name': 'issue_comments',
2392
+ },
2393
+ ),
2394
+ },
2395
+ entity_schema={
2396
+ 'type': 'object',
2397
+ 'description': 'Jira issue comment object',
2398
+ 'properties': {
2399
+ 'id': {'type': 'string', 'description': 'Unique comment identifier'},
2400
+ 'self': {
2401
+ 'type': 'string',
2402
+ 'format': 'uri',
2403
+ 'description': 'URL of the comment',
2404
+ },
2405
+ 'body': {
2406
+ 'type': 'object',
2407
+ 'description': 'Comment content in ADF (Atlassian Document Format)',
2408
+ 'properties': {
2409
+ 'type': {'type': 'string', 'description': "Document type (always 'doc')"},
2410
+ 'version': {'type': 'integer', 'description': 'ADF version'},
2411
+ 'content': {
2412
+ 'type': 'array',
2413
+ 'description': 'Array of content blocks',
2414
+ 'items': {
2415
+ 'type': 'object',
2416
+ 'properties': {
2417
+ 'type': {'type': 'string', 'description': "Block type (e.g., 'paragraph')"},
2418
+ 'content': {
2419
+ 'type': 'array',
2420
+ 'description': 'Nested content items',
2421
+ 'items': {
2422
+ 'type': 'object',
2423
+ 'properties': {
2424
+ 'type': {'type': 'string', 'description': "Content type (e.g., 'text')"},
2425
+ 'text': {'type': 'string', 'description': 'Text content'},
2426
+ },
2427
+ },
2428
+ },
2429
+ },
2430
+ },
2431
+ },
2432
+ },
2433
+ 'additionalProperties': False,
2434
+ },
2435
+ 'author': {
2436
+ 'type': 'object',
2437
+ 'description': 'Comment author user information',
2438
+ 'properties': {
2439
+ 'self': {'type': 'string', 'format': 'uri'},
2440
+ 'accountId': {'type': 'string'},
2441
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2442
+ 'displayName': {'type': 'string'},
2443
+ 'active': {'type': 'boolean'},
2444
+ 'timeZone': {'type': 'string'},
2445
+ 'accountType': {'type': 'string'},
2446
+ 'avatarUrls': {
2447
+ 'type': 'object',
2448
+ 'description': 'URLs for user avatars in different sizes',
2449
+ 'properties': {
2450
+ '16x16': {'type': 'string', 'format': 'uri'},
2451
+ '24x24': {'type': 'string', 'format': 'uri'},
2452
+ '32x32': {'type': 'string', 'format': 'uri'},
2453
+ '48x48': {'type': 'string', 'format': 'uri'},
2454
+ },
2455
+ },
2456
+ },
2457
+ },
2458
+ 'updateAuthor': {
2459
+ 'type': 'object',
2460
+ 'description': 'User who last updated the comment',
2461
+ 'properties': {
2462
+ 'self': {'type': 'string', 'format': 'uri'},
2463
+ 'accountId': {'type': 'string'},
2464
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2465
+ 'displayName': {'type': 'string'},
2466
+ 'active': {'type': 'boolean'},
2467
+ 'timeZone': {'type': 'string'},
2468
+ 'accountType': {'type': 'string'},
2469
+ 'avatarUrls': {
2470
+ 'type': 'object',
2471
+ 'description': 'URLs for user avatars in different sizes',
2472
+ 'properties': {
2473
+ '16x16': {'type': 'string', 'format': 'uri'},
2474
+ '24x24': {'type': 'string', 'format': 'uri'},
2475
+ '32x32': {'type': 'string', 'format': 'uri'},
2476
+ '48x48': {'type': 'string', 'format': 'uri'},
2477
+ },
2478
+ },
2479
+ },
2480
+ },
2481
+ 'created': {
2482
+ 'type': 'string',
2483
+ 'format': 'date-time',
2484
+ 'description': 'Comment creation timestamp',
2485
+ },
2486
+ 'updated': {
2487
+ 'type': 'string',
2488
+ 'format': 'date-time',
2489
+ 'description': 'Comment last update timestamp',
2490
+ },
2491
+ 'jsdPublic': {'type': 'boolean', 'description': 'Whether the comment is public in Jira Service Desk'},
2492
+ 'visibility': {
2493
+ 'type': ['object', 'null'],
2494
+ 'description': 'Visibility restrictions for the comment',
2495
+ 'properties': {
2496
+ 'type': {'type': 'string'},
2497
+ 'value': {'type': 'string'},
2498
+ 'identifier': {
2499
+ 'type': ['string', 'null'],
2500
+ },
2501
+ },
2502
+ },
2503
+ 'renderedBody': {
2504
+ 'type': ['string', 'null'],
2505
+ 'description': 'Rendered comment body as HTML (available with expand=renderedBody)',
2506
+ },
2507
+ 'properties': {
2508
+ 'type': ['array', 'null'],
2509
+ 'description': 'Comment properties (available with expand=properties)',
2510
+ 'items': {'type': 'object', 'additionalProperties': True},
2511
+ },
2512
+ },
2513
+ 'x-airbyte-entity-name': 'issue_comments',
2514
+ },
2515
+ ),
2516
+ EntityDefinition(
2517
+ name='issue_worklogs',
2518
+ actions=[Action.LIST, Action.GET],
2519
+ endpoints={
2520
+ Action.LIST: EndpointDefinition(
2521
+ method='GET',
2522
+ path='/rest/api/3/issue/{issueIdOrKey}/worklog',
2523
+ action=Action.LIST,
2524
+ description='Retrieve all worklogs for a specific issue',
2525
+ query_params=['startAt', 'maxResults', 'expand'],
2526
+ query_params_schema={
2527
+ 'startAt': {
2528
+ 'type': 'integer',
2529
+ 'required': False,
2530
+ 'default': 0,
2531
+ },
2532
+ 'maxResults': {
2533
+ 'type': 'integer',
2534
+ 'required': False,
2535
+ 'default': 1048576,
2536
+ },
2537
+ 'expand': {'type': 'string', 'required': False},
2538
+ },
2539
+ path_params=['issueIdOrKey'],
2540
+ path_params_schema={
2541
+ 'issueIdOrKey': {'type': 'string', 'required': True},
2542
+ },
2543
+ response_schema={
2544
+ 'type': 'object',
2545
+ 'description': 'Paginated list of issue worklogs',
2546
+ 'properties': {
2547
+ 'startAt': {'type': 'integer', 'description': 'Index of first item returned'},
2548
+ 'maxResults': {'type': 'integer', 'description': 'Maximum number of results per page'},
2549
+ 'total': {'type': 'integer', 'description': 'Total number of worklogs'},
2550
+ 'worklogs': {
2551
+ 'type': 'array',
2552
+ 'items': {
2553
+ 'type': 'object',
2554
+ 'description': 'Jira worklog object',
2555
+ 'properties': {
2556
+ 'id': {'type': 'string', 'description': 'Unique worklog identifier'},
2557
+ 'self': {
2558
+ 'type': 'string',
2559
+ 'format': 'uri',
2560
+ 'description': 'URL of the worklog',
2561
+ },
2562
+ 'author': {
2563
+ 'type': 'object',
2564
+ 'description': 'Worklog author user information',
2565
+ 'properties': {
2566
+ 'self': {'type': 'string', 'format': 'uri'},
2567
+ 'accountId': {'type': 'string'},
2568
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2569
+ 'displayName': {'type': 'string'},
2570
+ 'active': {'type': 'boolean'},
2571
+ 'timeZone': {'type': 'string'},
2572
+ 'accountType': {'type': 'string'},
2573
+ 'avatarUrls': {
2574
+ 'type': 'object',
2575
+ 'description': 'URLs for user avatars in different sizes',
2576
+ 'properties': {
2577
+ '16x16': {'type': 'string', 'format': 'uri'},
2578
+ '24x24': {'type': 'string', 'format': 'uri'},
2579
+ '32x32': {'type': 'string', 'format': 'uri'},
2580
+ '48x48': {'type': 'string', 'format': 'uri'},
2581
+ },
2582
+ },
2583
+ },
2584
+ },
2585
+ 'updateAuthor': {
2586
+ 'type': 'object',
2587
+ 'description': 'User who last updated the worklog',
2588
+ 'properties': {
2589
+ 'self': {'type': 'string', 'format': 'uri'},
2590
+ 'accountId': {'type': 'string'},
2591
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2592
+ 'displayName': {'type': 'string'},
2593
+ 'active': {'type': 'boolean'},
2594
+ 'timeZone': {'type': 'string'},
2595
+ 'accountType': {'type': 'string'},
2596
+ 'avatarUrls': {
2597
+ 'type': 'object',
2598
+ 'description': 'URLs for user avatars in different sizes',
2599
+ 'properties': {
2600
+ '16x16': {'type': 'string', 'format': 'uri'},
2601
+ '24x24': {'type': 'string', 'format': 'uri'},
2602
+ '32x32': {'type': 'string', 'format': 'uri'},
2603
+ '48x48': {'type': 'string', 'format': 'uri'},
2604
+ },
2605
+ },
2606
+ },
2607
+ },
2608
+ 'comment': {
2609
+ 'type': 'object',
2610
+ 'description': 'Comment associated with the worklog (ADF format)',
2611
+ 'properties': {
2612
+ 'type': {'type': 'string', 'description': "Document type (always 'doc')"},
2613
+ 'version': {'type': 'integer', 'description': 'ADF version'},
2614
+ 'content': {
2615
+ 'type': 'array',
2616
+ 'description': 'Array of content blocks',
2617
+ 'items': {
2618
+ 'type': 'object',
2619
+ 'properties': {
2620
+ 'type': {'type': 'string', 'description': "Block type (e.g., 'paragraph')"},
2621
+ 'content': {
2622
+ 'type': 'array',
2623
+ 'description': 'Nested content items',
2624
+ 'items': {
2625
+ 'type': 'object',
2626
+ 'properties': {
2627
+ 'type': {'type': 'string', 'description': "Content type (e.g., 'text')"},
2628
+ 'text': {'type': 'string', 'description': 'Text content'},
2629
+ },
2630
+ },
2631
+ },
2632
+ },
2633
+ },
2634
+ },
2635
+ },
2636
+ 'additionalProperties': False,
2637
+ },
2638
+ 'created': {
2639
+ 'type': 'string',
2640
+ 'format': 'date-time',
2641
+ 'description': 'Worklog creation timestamp',
2642
+ },
2643
+ 'updated': {
2644
+ 'type': 'string',
2645
+ 'format': 'date-time',
2646
+ 'description': 'Worklog last update timestamp',
2647
+ },
2648
+ 'started': {
2649
+ 'type': 'string',
2650
+ 'format': 'date-time',
2651
+ 'description': 'When the work was started',
2652
+ },
2653
+ 'timeSpent': {'type': 'string', 'description': 'Human-readable time spent (e.g., "3h 20m")'},
2654
+ 'timeSpentSeconds': {'type': 'integer', 'description': 'Time spent in seconds'},
2655
+ 'issueId': {'type': 'string', 'description': 'ID of the issue this worklog belongs to'},
2656
+ 'visibility': {
2657
+ 'type': ['object', 'null'],
2658
+ 'description': 'Visibility restrictions for the worklog',
2659
+ 'properties': {
2660
+ 'type': {'type': 'string'},
2661
+ 'value': {'type': 'string'},
2662
+ 'identifier': {
2663
+ 'type': ['string', 'null'],
2664
+ },
2665
+ },
2666
+ },
2667
+ 'properties': {
2668
+ 'type': ['array', 'null'],
2669
+ 'description': 'Worklog properties (available with expand=properties)',
2670
+ 'items': {'type': 'object', 'additionalProperties': True},
2671
+ },
2672
+ },
2673
+ 'x-airbyte-entity-name': 'worklogs',
2674
+ },
2675
+ 'description': 'Array of worklog objects',
2676
+ },
2677
+ },
2678
+ },
2679
+ record_extractor='$.worklogs',
2680
+ meta_extractor={
2681
+ 'startAt': '$.startAt',
2682
+ 'maxResults': '$.maxResults',
2683
+ 'total': '$.total',
2684
+ },
2685
+ ),
2686
+ Action.GET: EndpointDefinition(
2687
+ method='GET',
2688
+ path='/rest/api/3/issue/{issueIdOrKey}/worklog/{worklogId}',
2689
+ action=Action.GET,
2690
+ description='Retrieve a single worklog by its ID',
2691
+ query_params=['expand'],
2692
+ query_params_schema={
2693
+ 'expand': {'type': 'string', 'required': False},
2694
+ },
2695
+ path_params=['issueIdOrKey', 'worklogId'],
2696
+ path_params_schema={
2697
+ 'issueIdOrKey': {'type': 'string', 'required': True},
2698
+ 'worklogId': {'type': 'string', 'required': True},
2699
+ },
2700
+ response_schema={
2701
+ 'type': 'object',
2702
+ 'description': 'Jira worklog object',
2703
+ 'properties': {
2704
+ 'id': {'type': 'string', 'description': 'Unique worklog identifier'},
2705
+ 'self': {
2706
+ 'type': 'string',
2707
+ 'format': 'uri',
2708
+ 'description': 'URL of the worklog',
2709
+ },
2710
+ 'author': {
2711
+ 'type': 'object',
2712
+ 'description': 'Worklog author user information',
2713
+ 'properties': {
2714
+ 'self': {'type': 'string', 'format': 'uri'},
2715
+ 'accountId': {'type': 'string'},
2716
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2717
+ 'displayName': {'type': 'string'},
2718
+ 'active': {'type': 'boolean'},
2719
+ 'timeZone': {'type': 'string'},
2720
+ 'accountType': {'type': 'string'},
2721
+ 'avatarUrls': {
2722
+ 'type': 'object',
2723
+ 'description': 'URLs for user avatars in different sizes',
2724
+ 'properties': {
2725
+ '16x16': {'type': 'string', 'format': 'uri'},
2726
+ '24x24': {'type': 'string', 'format': 'uri'},
2727
+ '32x32': {'type': 'string', 'format': 'uri'},
2728
+ '48x48': {'type': 'string', 'format': 'uri'},
2729
+ },
2730
+ },
2731
+ },
2732
+ },
2733
+ 'updateAuthor': {
2734
+ 'type': 'object',
2735
+ 'description': 'User who last updated the worklog',
2736
+ 'properties': {
2737
+ 'self': {'type': 'string', 'format': 'uri'},
2738
+ 'accountId': {'type': 'string'},
2739
+ 'emailAddress': {'type': 'string', 'format': 'email'},
2740
+ 'displayName': {'type': 'string'},
2741
+ 'active': {'type': 'boolean'},
2742
+ 'timeZone': {'type': 'string'},
2743
+ 'accountType': {'type': 'string'},
2744
+ 'avatarUrls': {
2745
+ 'type': 'object',
2746
+ 'description': 'URLs for user avatars in different sizes',
2747
+ 'properties': {
2748
+ '16x16': {'type': 'string', 'format': 'uri'},
2749
+ '24x24': {'type': 'string', 'format': 'uri'},
2750
+ '32x32': {'type': 'string', 'format': 'uri'},
2751
+ '48x48': {'type': 'string', 'format': 'uri'},
2752
+ },
2753
+ },
2754
+ },
2755
+ },
2756
+ 'comment': {
2757
+ 'type': 'object',
2758
+ 'description': 'Comment associated with the worklog (ADF format)',
2759
+ 'properties': {
2760
+ 'type': {'type': 'string', 'description': "Document type (always 'doc')"},
2761
+ 'version': {'type': 'integer', 'description': 'ADF version'},
2762
+ 'content': {
2763
+ 'type': 'array',
2764
+ 'description': 'Array of content blocks',
2765
+ 'items': {
2766
+ 'type': 'object',
2767
+ 'properties': {
2768
+ 'type': {'type': 'string', 'description': "Block type (e.g., 'paragraph')"},
2769
+ 'content': {
2770
+ 'type': 'array',
2771
+ 'description': 'Nested content items',
2772
+ 'items': {
2773
+ 'type': 'object',
2774
+ 'properties': {
2775
+ 'type': {'type': 'string', 'description': "Content type (e.g., 'text')"},
2776
+ 'text': {'type': 'string', 'description': 'Text content'},
2777
+ },
2778
+ },
2779
+ },
2780
+ },
2781
+ },
2782
+ },
2783
+ },
2784
+ 'additionalProperties': False,
2785
+ },
2786
+ 'created': {
2787
+ 'type': 'string',
2788
+ 'format': 'date-time',
2789
+ 'description': 'Worklog creation timestamp',
2790
+ },
2791
+ 'updated': {
2792
+ 'type': 'string',
2793
+ 'format': 'date-time',
2794
+ 'description': 'Worklog last update timestamp',
2795
+ },
2796
+ 'started': {
2797
+ 'type': 'string',
2798
+ 'format': 'date-time',
2799
+ 'description': 'When the work was started',
2800
+ },
2801
+ 'timeSpent': {'type': 'string', 'description': 'Human-readable time spent (e.g., "3h 20m")'},
2802
+ 'timeSpentSeconds': {'type': 'integer', 'description': 'Time spent in seconds'},
2803
+ 'issueId': {'type': 'string', 'description': 'ID of the issue this worklog belongs to'},
2804
+ 'visibility': {
2805
+ 'type': ['object', 'null'],
2806
+ 'description': 'Visibility restrictions for the worklog',
2807
+ 'properties': {
2808
+ 'type': {'type': 'string'},
2809
+ 'value': {'type': 'string'},
2810
+ 'identifier': {
2811
+ 'type': ['string', 'null'],
2812
+ },
2813
+ },
2814
+ },
2815
+ 'properties': {
2816
+ 'type': ['array', 'null'],
2817
+ 'description': 'Worklog properties (available with expand=properties)',
2818
+ 'items': {'type': 'object', 'additionalProperties': True},
2819
+ },
2820
+ },
2821
+ 'x-airbyte-entity-name': 'worklogs',
2822
+ },
2823
+ ),
2824
+ },
2825
+ ),
2826
+ ],
2827
+ )