View | Details | Raw Unified | Return to bug 23653
Collapse All | Expand All

(-)a/Koha/REST/Plugin/PluginRoutes.pm (-6 / +14 lines)
Lines 48-63 sub register { Link Here
48
    if (   C4::Context->preference('UseKohaPlugins')
48
    if (   C4::Context->preference('UseKohaPlugins')
49
        && C4::Context->config("enable_plugins") )
49
        && C4::Context->config("enable_plugins") )
50
    {
50
    {
51
        my $schema = $app->home->rel_file("api/swagger-v2-schema.json");
52
        if ($schema){
53
           $self->{'swagger-v2-schema'} = $schema;
54
        }
55
51
        # plugin needs to define a namespace
56
        # plugin needs to define a namespace
52
        @plugins = Koha::Plugins->new()->GetPlugins(
57
        @plugins = Koha::Plugins->new()->GetPlugins(
53
            {
58
            {
54
                method => 'api_namespace',
59
                method => 'api_namespace',
55
            }
60
            }
56
        );
61
        );
57
    }
58
62
59
    foreach my $plugin ( @plugins ) {
63
        foreach my $plugin ( @plugins ) {
60
        $spec = inject_routes( $spec, $plugin, $validator );
64
            $spec = $self->inject_routes( $spec, $plugin, $validator );
65
        }
61
    }
66
    }
62
67
63
    return $spec;
68
    return $spec;
Lines 68-79 sub register { Link Here
68
=cut
73
=cut
69
74
70
sub inject_routes {
75
sub inject_routes {
71
    my ( $spec, $plugin, $validator ) = @_;
76
    my ( $self, $spec, $plugin, $validator ) = @_;
72
77
73
    return try {
78
    return try {
74
79
75
        my $backup_spec = merge_spec( clone($spec), $plugin );
80
        my $backup_spec = merge_spec( clone($spec), $plugin );
76
        if ( spec_ok( $backup_spec, $validator ) ) {
81
        if ( $self->spec_ok( $backup_spec, $validator ) ) {
77
            $spec = merge_spec( $spec, $plugin );
82
            $spec = merge_spec( $spec, $plugin );
78
        }
83
        }
79
        else {
84
        else {
Lines 137-149 sub merge_spec { Link Here
137
=cut
142
=cut
138
143
139
sub spec_ok {
144
sub spec_ok {
140
    my ( $spec, $validator ) = @_;
145
    my ( $self, $spec, $validator ) = @_;
146
147
    my $schema = $self->{'swagger-v2-schema'};
141
148
142
    return try {
149
    return try {
143
        $validator->load_and_validate_schema(
150
        $validator->load_and_validate_schema(
144
            $spec,
151
            $spec,
145
            {
152
            {
146
                allow_invalid_ref => 1,
153
                allow_invalid_ref => 1,
154
                schema => ( $schema ) ? $schema : undef,
147
            }
155
            }
148
        );
156
        );
149
        return 1;
157
        return 1;
(-)a/Koha/REST/V1.pm (+3 lines)
Lines 58-67 sub startup { Link Here
58
    }
58
    }
59
59
60
    my $validator = JSON::Validator::OpenAPI::Mojolicious->new;
60
    my $validator = JSON::Validator::OpenAPI::Mojolicious->new;
61
    my $swagger_schema = $self->home->rel_file("api/swagger-v2-schema.json");
61
    $validator->load_and_validate_schema(
62
    $validator->load_and_validate_schema(
62
        $self->home->rel_file("api/v1/swagger/swagger.json"),
63
        $self->home->rel_file("api/v1/swagger/swagger.json"),
63
        {
64
        {
64
          allow_invalid_ref  => 1,
65
          allow_invalid_ref  => 1,
66
          schema => ( $swagger_schema ) ? $swagger_schema : undef,
65
        }
67
        }
66
      );
68
      );
67
69
Lines 79-84 sub startup { Link Here
79
        OpenAPI => {
81
        OpenAPI => {
80
            spec  => $spec,
82
            spec  => $spec,
81
            route => $self->routes->under('/api/v1')->to('Auth#under'),
83
            route => $self->routes->under('/api/v1')->to('Auth#under'),
84
            schema => ( $swagger_schema ) ? $swagger_schema : undef,
82
            allow_invalid_ref =>
85
            allow_invalid_ref =>
83
              1,    # required by our spec because $ref directly under
86
              1,    # required by our spec because $ref directly under
84
                    # Paths-, Parameters-, Definitions- & Info-object
87
                    # Paths-, Parameters-, Definitions- & Info-object
(-)a/api/swagger-v2-schema.json (-1 / +1607 lines)
Line 0 Link Here
0
- 
1
{
2
  "title": "A JSON Schema for Swagger 2.0 API.",
3
  "id": "http://swagger.io/v2/schema.json#",
4
  "$schema": "http://json-schema.org/draft-04/schema#",
5
  "type": "object",
6
  "required": [
7
    "swagger",
8
    "info",
9
    "paths"
10
  ],
11
  "additionalProperties": false,
12
  "patternProperties": {
13
    "^x-": {
14
      "$ref": "#/definitions/vendorExtension"
15
    }
16
  },
17
  "properties": {
18
    "swagger": {
19
      "type": "string",
20
      "enum": [
21
        "2.0"
22
      ],
23
      "description": "The Swagger version of this document."
24
    },
25
    "info": {
26
      "$ref": "#/definitions/info"
27
    },
28
    "host": {
29
      "type": "string",
30
      "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$",
31
      "description": "The host (name or ip) of the API. Example: 'swagger.io'"
32
    },
33
    "basePath": {
34
      "type": "string",
35
      "pattern": "^/",
36
      "description": "The base path to the API. Example: '/api'."
37
    },
38
    "schemes": {
39
      "$ref": "#/definitions/schemesList"
40
    },
41
    "consumes": {
42
      "description": "A list of MIME types accepted by the API.",
43
      "allOf": [
44
        {
45
          "$ref": "#/definitions/mediaTypeList"
46
        }
47
      ]
48
    },
49
    "produces": {
50
      "description": "A list of MIME types the API can produce.",
51
      "allOf": [
52
        {
53
          "$ref": "#/definitions/mediaTypeList"
54
        }
55
      ]
56
    },
57
    "paths": {
58
      "$ref": "#/definitions/paths"
59
    },
60
    "definitions": {
61
      "$ref": "#/definitions/definitions"
62
    },
63
    "parameters": {
64
      "$ref": "#/definitions/parameterDefinitions"
65
    },
66
    "responses": {
67
      "$ref": "#/definitions/responseDefinitions"
68
    },
69
    "security": {
70
      "$ref": "#/definitions/security"
71
    },
72
    "securityDefinitions": {
73
      "$ref": "#/definitions/securityDefinitions"
74
    },
75
    "tags": {
76
      "type": "array",
77
      "items": {
78
        "$ref": "#/definitions/tag"
79
      },
80
      "uniqueItems": true
81
    },
82
    "externalDocs": {
83
      "$ref": "#/definitions/externalDocs"
84
    }
85
  },
86
  "definitions": {
87
    "info": {
88
      "type": "object",
89
      "description": "General information about the API.",
90
      "required": [
91
        "version",
92
        "title"
93
      ],
94
      "additionalProperties": false,
95
      "patternProperties": {
96
        "^x-": {
97
          "$ref": "#/definitions/vendorExtension"
98
        }
99
      },
100
      "properties": {
101
        "title": {
102
          "type": "string",
103
          "description": "A unique and precise title of the API."
104
        },
105
        "version": {
106
          "type": "string",
107
          "description": "A semantic version number of the API."
108
        },
109
        "description": {
110
          "type": "string",
111
          "description": "A longer description of the API. Should be different from the title.  GitHub Flavored Markdown is allowed."
112
        },
113
        "termsOfService": {
114
          "type": "string",
115
          "description": "The terms of service for the API."
116
        },
117
        "contact": {
118
          "$ref": "#/definitions/contact"
119
        },
120
        "license": {
121
          "$ref": "#/definitions/license"
122
        }
123
      }
124
    },
125
    "contact": {
126
      "type": "object",
127
      "description": "Contact information for the owners of the API.",
128
      "additionalProperties": false,
129
      "properties": {
130
        "name": {
131
          "type": "string",
132
          "description": "The identifying name of the contact person/organization."
133
        },
134
        "url": {
135
          "type": "string",
136
          "description": "The URL pointing to the contact information.",
137
          "format": "uri"
138
        },
139
        "email": {
140
          "type": "string",
141
          "description": "The email address of the contact person/organization.",
142
          "format": "email"
143
        }
144
      },
145
      "patternProperties": {
146
        "^x-": {
147
          "$ref": "#/definitions/vendorExtension"
148
        }
149
      }
150
    },
151
    "license": {
152
      "type": "object",
153
      "required": [
154
        "name"
155
      ],
156
      "additionalProperties": false,
157
      "properties": {
158
        "name": {
159
          "type": "string",
160
          "description": "The name of the license type. It's encouraged to use an OSI compatible license."
161
        },
162
        "url": {
163
          "type": "string",
164
          "description": "The URL pointing to the license.",
165
          "format": "uri"
166
        }
167
      },
168
      "patternProperties": {
169
        "^x-": {
170
          "$ref": "#/definitions/vendorExtension"
171
        }
172
      }
173
    },
174
    "paths": {
175
      "type": "object",
176
      "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.",
177
      "patternProperties": {
178
        "^x-": {
179
          "$ref": "#/definitions/vendorExtension"
180
        },
181
        "^/": {
182
          "$ref": "#/definitions/pathItem"
183
        }
184
      },
185
      "additionalProperties": false
186
    },
187
    "definitions": {
188
      "type": "object",
189
      "additionalProperties": {
190
        "$ref": "#/definitions/schema"
191
      },
192
      "description": "One or more JSON objects describing the schemas being consumed and produced by the API."
193
    },
194
    "parameterDefinitions": {
195
      "type": "object",
196
      "additionalProperties": {
197
        "$ref": "#/definitions/parameter"
198
      },
199
      "description": "One or more JSON representations for parameters"
200
    },
201
    "responseDefinitions": {
202
      "type": "object",
203
      "additionalProperties": {
204
        "$ref": "#/definitions/response"
205
      },
206
      "description": "One or more JSON representations for responses"
207
    },
208
    "externalDocs": {
209
      "type": "object",
210
      "additionalProperties": false,
211
      "description": "information about external documentation",
212
      "required": [
213
        "url"
214
      ],
215
      "properties": {
216
        "description": {
217
          "type": "string"
218
        },
219
        "url": {
220
          "type": "string",
221
          "format": "uri"
222
        }
223
      },
224
      "patternProperties": {
225
        "^x-": {
226
          "$ref": "#/definitions/vendorExtension"
227
        }
228
      }
229
    },
230
    "examples": {
231
      "type": "object",
232
      "additionalProperties": true
233
    },
234
    "mimeType": {
235
      "type": "string",
236
      "description": "The MIME type of the HTTP message."
237
    },
238
    "operation": {
239
      "type": "object",
240
      "required": [
241
        "responses"
242
      ],
243
      "additionalProperties": false,
244
      "patternProperties": {
245
        "^x-": {
246
          "$ref": "#/definitions/vendorExtension"
247
        }
248
      },
249
      "properties": {
250
        "tags": {
251
          "type": "array",
252
          "items": {
253
            "type": "string"
254
          },
255
          "uniqueItems": true
256
        },
257
        "summary": {
258
          "type": "string",
259
          "description": "A brief summary of the operation."
260
        },
261
        "description": {
262
          "type": "string",
263
          "description": "A longer description of the operation, GitHub Flavored Markdown is allowed."
264
        },
265
        "externalDocs": {
266
          "$ref": "#/definitions/externalDocs"
267
        },
268
        "operationId": {
269
          "type": "string",
270
          "description": "A unique identifier of the operation."
271
        },
272
        "produces": {
273
          "description": "A list of MIME types the API can produce.",
274
          "allOf": [
275
            {
276
              "$ref": "#/definitions/mediaTypeList"
277
            }
278
          ]
279
        },
280
        "consumes": {
281
          "description": "A list of MIME types the API can consume.",
282
          "allOf": [
283
            {
284
              "$ref": "#/definitions/mediaTypeList"
285
            }
286
          ]
287
        },
288
        "parameters": {
289
          "$ref": "#/definitions/parametersList"
290
        },
291
        "responses": {
292
          "$ref": "#/definitions/responses"
293
        },
294
        "schemes": {
295
          "$ref": "#/definitions/schemesList"
296
        },
297
        "deprecated": {
298
          "type": "boolean",
299
          "default": false
300
        },
301
        "security": {
302
          "$ref": "#/definitions/security"
303
        }
304
      }
305
    },
306
    "pathItem": {
307
      "type": "object",
308
      "additionalProperties": false,
309
      "patternProperties": {
310
        "^x-": {
311
          "$ref": "#/definitions/vendorExtension"
312
        }
313
      },
314
      "properties": {
315
        "$ref": {
316
          "type": "string"
317
        },
318
        "get": {
319
          "$ref": "#/definitions/operation"
320
        },
321
        "put": {
322
          "$ref": "#/definitions/operation"
323
        },
324
        "post": {
325
          "$ref": "#/definitions/operation"
326
        },
327
        "delete": {
328
          "$ref": "#/definitions/operation"
329
        },
330
        "options": {
331
          "$ref": "#/definitions/operation"
332
        },
333
        "head": {
334
          "$ref": "#/definitions/operation"
335
        },
336
        "patch": {
337
          "$ref": "#/definitions/operation"
338
        },
339
        "parameters": {
340
          "$ref": "#/definitions/parametersList"
341
        }
342
      }
343
    },
344
    "responses": {
345
      "type": "object",
346
      "description": "Response objects names can either be any valid HTTP status code or 'default'.",
347
      "minProperties": 1,
348
      "additionalProperties": false,
349
      "patternProperties": {
350
        "^([0-9]{3})$|^(default)$": {
351
          "$ref": "#/definitions/responseValue"
352
        },
353
        "^x-": {
354
          "$ref": "#/definitions/vendorExtension"
355
        }
356
      },
357
      "not": {
358
        "type": "object",
359
        "additionalProperties": false,
360
        "patternProperties": {
361
          "^x-": {
362
            "$ref": "#/definitions/vendorExtension"
363
          }
364
        }
365
      }
366
    },
367
    "responseValue": {
368
      "oneOf": [
369
        {
370
          "$ref": "#/definitions/response"
371
        },
372
        {
373
          "$ref": "#/definitions/jsonReference"
374
        }
375
      ]
376
    },
377
    "response": {
378
      "type": "object",
379
      "required": [
380
        "description"
381
      ],
382
      "properties": {
383
        "description": {
384
          "type": "string"
385
        },
386
        "schema": {
387
          "oneOf": [
388
            {
389
              "$ref": "#/definitions/schema"
390
            },
391
            {
392
              "$ref": "#/definitions/fileSchema"
393
            }
394
          ]
395
        },
396
        "headers": {
397
          "$ref": "#/definitions/headers"
398
        },
399
        "examples": {
400
          "$ref": "#/definitions/examples"
401
        }
402
      },
403
      "additionalProperties": false,
404
      "patternProperties": {
405
        "^x-": {
406
          "$ref": "#/definitions/vendorExtension"
407
        }
408
      }
409
    },
410
    "headers": {
411
      "type": "object",
412
      "additionalProperties": {
413
        "$ref": "#/definitions/header"
414
      }
415
    },
416
    "header": {
417
      "type": "object",
418
      "additionalProperties": false,
419
      "required": [
420
        "type"
421
      ],
422
      "properties": {
423
        "type": {
424
          "type": "string",
425
          "enum": [
426
            "string",
427
            "number",
428
            "integer",
429
            "boolean",
430
            "array"
431
          ]
432
        },
433
        "format": {
434
          "type": "string"
435
        },
436
        "items": {
437
          "$ref": "#/definitions/primitivesItems"
438
        },
439
        "collectionFormat": {
440
          "$ref": "#/definitions/collectionFormat"
441
        },
442
        "default": {
443
          "$ref": "#/definitions/default"
444
        },
445
        "maximum": {
446
          "$ref": "#/definitions/maximum"
447
        },
448
        "exclusiveMaximum": {
449
          "$ref": "#/definitions/exclusiveMaximum"
450
        },
451
        "minimum": {
452
          "$ref": "#/definitions/minimum"
453
        },
454
        "exclusiveMinimum": {
455
          "$ref": "#/definitions/exclusiveMinimum"
456
        },
457
        "maxLength": {
458
          "$ref": "#/definitions/maxLength"
459
        },
460
        "minLength": {
461
          "$ref": "#/definitions/minLength"
462
        },
463
        "pattern": {
464
          "$ref": "#/definitions/pattern"
465
        },
466
        "maxItems": {
467
          "$ref": "#/definitions/maxItems"
468
        },
469
        "minItems": {
470
          "$ref": "#/definitions/minItems"
471
        },
472
        "uniqueItems": {
473
          "$ref": "#/definitions/uniqueItems"
474
        },
475
        "enum": {
476
          "$ref": "#/definitions/enum"
477
        },
478
        "multipleOf": {
479
          "$ref": "#/definitions/multipleOf"
480
        },
481
        "description": {
482
          "type": "string"
483
        }
484
      },
485
      "patternProperties": {
486
        "^x-": {
487
          "$ref": "#/definitions/vendorExtension"
488
        }
489
      }
490
    },
491
    "vendorExtension": {
492
      "description": "Any property starting with x- is valid.",
493
      "additionalProperties": true,
494
      "additionalItems": true
495
    },
496
    "bodyParameter": {
497
      "type": "object",
498
      "required": [
499
        "name",
500
        "in",
501
        "schema"
502
      ],
503
      "patternProperties": {
504
        "^x-": {
505
          "$ref": "#/definitions/vendorExtension"
506
        }
507
      },
508
      "properties": {
509
        "description": {
510
          "type": "string",
511
          "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
512
        },
513
        "name": {
514
          "type": "string",
515
          "description": "The name of the parameter."
516
        },
517
        "in": {
518
          "type": "string",
519
          "description": "Determines the location of the parameter.",
520
          "enum": [
521
            "body"
522
          ]
523
        },
524
        "required": {
525
          "type": "boolean",
526
          "description": "Determines whether or not this parameter is required or optional.",
527
          "default": false
528
        },
529
        "schema": {
530
          "$ref": "#/definitions/schema"
531
        }
532
      },
533
      "additionalProperties": false
534
    },
535
    "headerParameterSubSchema": {
536
      "additionalProperties": false,
537
      "patternProperties": {
538
        "^x-": {
539
          "$ref": "#/definitions/vendorExtension"
540
        }
541
      },
542
      "properties": {
543
        "required": {
544
          "type": "boolean",
545
          "description": "Determines whether or not this parameter is required or optional.",
546
          "default": false
547
        },
548
        "in": {
549
          "type": "string",
550
          "description": "Determines the location of the parameter.",
551
          "enum": [
552
            "header"
553
          ]
554
        },
555
        "description": {
556
          "type": "string",
557
          "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
558
        },
559
        "name": {
560
          "type": "string",
561
          "description": "The name of the parameter."
562
        },
563
        "type": {
564
          "type": "string",
565
          "enum": [
566
            "string",
567
            "number",
568
            "boolean",
569
            "integer",
570
            "array"
571
          ]
572
        },
573
        "format": {
574
          "type": "string"
575
        },
576
        "items": {
577
          "$ref": "#/definitions/primitivesItems"
578
        },
579
        "collectionFormat": {
580
          "$ref": "#/definitions/collectionFormat"
581
        },
582
        "default": {
583
          "$ref": "#/definitions/default"
584
        },
585
        "maximum": {
586
          "$ref": "#/definitions/maximum"
587
        },
588
        "exclusiveMaximum": {
589
          "$ref": "#/definitions/exclusiveMaximum"
590
        },
591
        "minimum": {
592
          "$ref": "#/definitions/minimum"
593
        },
594
        "exclusiveMinimum": {
595
          "$ref": "#/definitions/exclusiveMinimum"
596
        },
597
        "maxLength": {
598
          "$ref": "#/definitions/maxLength"
599
        },
600
        "minLength": {
601
          "$ref": "#/definitions/minLength"
602
        },
603
        "pattern": {
604
          "$ref": "#/definitions/pattern"
605
        },
606
        "maxItems": {
607
          "$ref": "#/definitions/maxItems"
608
        },
609
        "minItems": {
610
          "$ref": "#/definitions/minItems"
611
        },
612
        "uniqueItems": {
613
          "$ref": "#/definitions/uniqueItems"
614
        },
615
        "enum": {
616
          "$ref": "#/definitions/enum"
617
        },
618
        "multipleOf": {
619
          "$ref": "#/definitions/multipleOf"
620
        }
621
      }
622
    },
623
    "queryParameterSubSchema": {
624
      "additionalProperties": false,
625
      "patternProperties": {
626
        "^x-": {
627
          "$ref": "#/definitions/vendorExtension"
628
        }
629
      },
630
      "properties": {
631
        "required": {
632
          "type": "boolean",
633
          "description": "Determines whether or not this parameter is required or optional.",
634
          "default": false
635
        },
636
        "in": {
637
          "type": "string",
638
          "description": "Determines the location of the parameter.",
639
          "enum": [
640
            "query"
641
          ]
642
        },
643
        "description": {
644
          "type": "string",
645
          "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
646
        },
647
        "name": {
648
          "type": "string",
649
          "description": "The name of the parameter."
650
        },
651
        "allowEmptyValue": {
652
          "type": "boolean",
653
          "default": false,
654
          "description": "allows sending a parameter by name only or with an empty value."
655
        },
656
        "type": {
657
          "type": "string",
658
          "enum": [
659
            "string",
660
            "number",
661
            "boolean",
662
            "integer",
663
            "array"
664
          ]
665
        },
666
        "format": {
667
          "type": "string"
668
        },
669
        "items": {
670
          "$ref": "#/definitions/primitivesItems"
671
        },
672
        "collectionFormat": {
673
          "$ref": "#/definitions/collectionFormatWithMulti"
674
        },
675
        "default": {
676
          "$ref": "#/definitions/default"
677
        },
678
        "maximum": {
679
          "$ref": "#/definitions/maximum"
680
        },
681
        "exclusiveMaximum": {
682
          "$ref": "#/definitions/exclusiveMaximum"
683
        },
684
        "minimum": {
685
          "$ref": "#/definitions/minimum"
686
        },
687
        "exclusiveMinimum": {
688
          "$ref": "#/definitions/exclusiveMinimum"
689
        },
690
        "maxLength": {
691
          "$ref": "#/definitions/maxLength"
692
        },
693
        "minLength": {
694
          "$ref": "#/definitions/minLength"
695
        },
696
        "pattern": {
697
          "$ref": "#/definitions/pattern"
698
        },
699
        "maxItems": {
700
          "$ref": "#/definitions/maxItems"
701
        },
702
        "minItems": {
703
          "$ref": "#/definitions/minItems"
704
        },
705
        "uniqueItems": {
706
          "$ref": "#/definitions/uniqueItems"
707
        },
708
        "enum": {
709
          "$ref": "#/definitions/enum"
710
        },
711
        "multipleOf": {
712
          "$ref": "#/definitions/multipleOf"
713
        }
714
      }
715
    },
716
    "formDataParameterSubSchema": {
717
      "additionalProperties": false,
718
      "patternProperties": {
719
        "^x-": {
720
          "$ref": "#/definitions/vendorExtension"
721
        }
722
      },
723
      "properties": {
724
        "required": {
725
          "type": "boolean",
726
          "description": "Determines whether or not this parameter is required or optional.",
727
          "default": false
728
        },
729
        "in": {
730
          "type": "string",
731
          "description": "Determines the location of the parameter.",
732
          "enum": [
733
            "formData"
734
          ]
735
        },
736
        "description": {
737
          "type": "string",
738
          "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
739
        },
740
        "name": {
741
          "type": "string",
742
          "description": "The name of the parameter."
743
        },
744
        "allowEmptyValue": {
745
          "type": "boolean",
746
          "default": false,
747
          "description": "allows sending a parameter by name only or with an empty value."
748
        },
749
        "type": {
750
          "type": "string",
751
          "enum": [
752
            "string",
753
            "number",
754
            "boolean",
755
            "integer",
756
            "array",
757
            "file"
758
          ]
759
        },
760
        "format": {
761
          "type": "string"
762
        },
763
        "items": {
764
          "$ref": "#/definitions/primitivesItems"
765
        },
766
        "collectionFormat": {
767
          "$ref": "#/definitions/collectionFormatWithMulti"
768
        },
769
        "default": {
770
          "$ref": "#/definitions/default"
771
        },
772
        "maximum": {
773
          "$ref": "#/definitions/maximum"
774
        },
775
        "exclusiveMaximum": {
776
          "$ref": "#/definitions/exclusiveMaximum"
777
        },
778
        "minimum": {
779
          "$ref": "#/definitions/minimum"
780
        },
781
        "exclusiveMinimum": {
782
          "$ref": "#/definitions/exclusiveMinimum"
783
        },
784
        "maxLength": {
785
          "$ref": "#/definitions/maxLength"
786
        },
787
        "minLength": {
788
          "$ref": "#/definitions/minLength"
789
        },
790
        "pattern": {
791
          "$ref": "#/definitions/pattern"
792
        },
793
        "maxItems": {
794
          "$ref": "#/definitions/maxItems"
795
        },
796
        "minItems": {
797
          "$ref": "#/definitions/minItems"
798
        },
799
        "uniqueItems": {
800
          "$ref": "#/definitions/uniqueItems"
801
        },
802
        "enum": {
803
          "$ref": "#/definitions/enum"
804
        },
805
        "multipleOf": {
806
          "$ref": "#/definitions/multipleOf"
807
        }
808
      }
809
    },
810
    "pathParameterSubSchema": {
811
      "additionalProperties": false,
812
      "patternProperties": {
813
        "^x-": {
814
          "$ref": "#/definitions/vendorExtension"
815
        }
816
      },
817
      "required": [
818
        "required"
819
      ],
820
      "properties": {
821
        "required": {
822
          "type": "boolean",
823
          "enum": [
824
            true
825
          ],
826
          "description": "Determines whether or not this parameter is required or optional."
827
        },
828
        "in": {
829
          "type": "string",
830
          "description": "Determines the location of the parameter.",
831
          "enum": [
832
            "path"
833
          ]
834
        },
835
        "description": {
836
          "type": "string",
837
          "description": "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
838
        },
839
        "name": {
840
          "type": "string",
841
          "description": "The name of the parameter."
842
        },
843
        "type": {
844
          "type": "string",
845
          "enum": [
846
            "string",
847
            "number",
848
            "boolean",
849
            "integer",
850
            "array"
851
          ]
852
        },
853
        "format": {
854
          "type": "string"
855
        },
856
        "items": {
857
          "$ref": "#/definitions/primitivesItems"
858
        },
859
        "collectionFormat": {
860
          "$ref": "#/definitions/collectionFormat"
861
        },
862
        "default": {
863
          "$ref": "#/definitions/default"
864
        },
865
        "maximum": {
866
          "$ref": "#/definitions/maximum"
867
        },
868
        "exclusiveMaximum": {
869
          "$ref": "#/definitions/exclusiveMaximum"
870
        },
871
        "minimum": {
872
          "$ref": "#/definitions/minimum"
873
        },
874
        "exclusiveMinimum": {
875
          "$ref": "#/definitions/exclusiveMinimum"
876
        },
877
        "maxLength": {
878
          "$ref": "#/definitions/maxLength"
879
        },
880
        "minLength": {
881
          "$ref": "#/definitions/minLength"
882
        },
883
        "pattern": {
884
          "$ref": "#/definitions/pattern"
885
        },
886
        "maxItems": {
887
          "$ref": "#/definitions/maxItems"
888
        },
889
        "minItems": {
890
          "$ref": "#/definitions/minItems"
891
        },
892
        "uniqueItems": {
893
          "$ref": "#/definitions/uniqueItems"
894
        },
895
        "enum": {
896
          "$ref": "#/definitions/enum"
897
        },
898
        "multipleOf": {
899
          "$ref": "#/definitions/multipleOf"
900
        }
901
      }
902
    },
903
    "nonBodyParameter": {
904
      "type": "object",
905
      "required": [
906
        "name",
907
        "in",
908
        "type"
909
      ],
910
      "oneOf": [
911
        {
912
          "$ref": "#/definitions/headerParameterSubSchema"
913
        },
914
        {
915
          "$ref": "#/definitions/formDataParameterSubSchema"
916
        },
917
        {
918
          "$ref": "#/definitions/queryParameterSubSchema"
919
        },
920
        {
921
          "$ref": "#/definitions/pathParameterSubSchema"
922
        }
923
      ]
924
    },
925
    "parameter": {
926
      "oneOf": [
927
        {
928
          "$ref": "#/definitions/bodyParameter"
929
        },
930
        {
931
          "$ref": "#/definitions/nonBodyParameter"
932
        }
933
      ]
934
    },
935
    "schema": {
936
      "type": "object",
937
      "description": "A deterministic version of a JSON Schema object.",
938
      "patternProperties": {
939
        "^x-": {
940
          "$ref": "#/definitions/vendorExtension"
941
        }
942
      },
943
      "properties": {
944
        "$ref": {
945
          "type": "string"
946
        },
947
        "format": {
948
          "type": "string"
949
        },
950
        "title": {
951
          "$ref": "http://json-schema.org/draft-04/schema#/properties/title"
952
        },
953
        "description": {
954
          "$ref": "http://json-schema.org/draft-04/schema#/properties/description"
955
        },
956
        "default": {
957
          "$ref": "http://json-schema.org/draft-04/schema#/properties/default"
958
        },
959
        "multipleOf": {
960
          "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf"
961
        },
962
        "maximum": {
963
          "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum"
964
        },
965
        "exclusiveMaximum": {
966
          "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum"
967
        },
968
        "minimum": {
969
          "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum"
970
        },
971
        "exclusiveMinimum": {
972
          "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum"
973
        },
974
        "maxLength": {
975
          "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
976
        },
977
        "minLength": {
978
          "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
979
        },
980
        "pattern": {
981
          "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern"
982
        },
983
        "maxItems": {
984
          "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
985
        },
986
        "minItems": {
987
          "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
988
        },
989
        "uniqueItems": {
990
          "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems"
991
        },
992
        "maxProperties": {
993
          "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
994
        },
995
        "minProperties": {
996
          "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
997
        },
998
        "required": {
999
          "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray"
1000
        },
1001
        "enum": {
1002
          "$ref": "http://json-schema.org/draft-04/schema#/properties/enum"
1003
        },
1004
        "additionalProperties": {
1005
          "anyOf": [
1006
            {
1007
              "$ref": "#/definitions/schema"
1008
            },
1009
            {
1010
              "type": "boolean"
1011
            }
1012
          ],
1013
          "default": {}
1014
        },
1015
        "type": {
1016
          "$ref": "http://json-schema.org/draft-04/schema#/properties/type"
1017
        },
1018
        "items": {
1019
          "anyOf": [
1020
            {
1021
              "$ref": "#/definitions/schema"
1022
            },
1023
            {
1024
              "type": "array",
1025
              "minItems": 1,
1026
              "items": {
1027
                "$ref": "#/definitions/schema"
1028
              }
1029
            }
1030
          ],
1031
          "default": {}
1032
        },
1033
        "allOf": {
1034
          "type": "array",
1035
          "minItems": 1,
1036
          "items": {
1037
            "$ref": "#/definitions/schema"
1038
          }
1039
        },
1040
        "properties": {
1041
          "type": "object",
1042
          "additionalProperties": {
1043
            "$ref": "#/definitions/schema"
1044
          },
1045
          "default": {}
1046
        },
1047
        "discriminator": {
1048
          "type": "string"
1049
        },
1050
        "readOnly": {
1051
          "type": "boolean",
1052
          "default": false
1053
        },
1054
        "xml": {
1055
          "$ref": "#/definitions/xml"
1056
        },
1057
        "externalDocs": {
1058
          "$ref": "#/definitions/externalDocs"
1059
        },
1060
        "example": {}
1061
      },
1062
      "additionalProperties": false
1063
    },
1064
    "fileSchema": {
1065
      "type": "object",
1066
      "description": "A deterministic version of a JSON Schema object.",
1067
      "patternProperties": {
1068
        "^x-": {
1069
          "$ref": "#/definitions/vendorExtension"
1070
        }
1071
      },
1072
      "required": [
1073
        "type"
1074
      ],
1075
      "properties": {
1076
        "format": {
1077
          "type": "string"
1078
        },
1079
        "title": {
1080
          "$ref": "http://json-schema.org/draft-04/schema#/properties/title"
1081
        },
1082
        "description": {
1083
          "$ref": "http://json-schema.org/draft-04/schema#/properties/description"
1084
        },
1085
        "default": {
1086
          "$ref": "http://json-schema.org/draft-04/schema#/properties/default"
1087
        },
1088
        "required": {
1089
          "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray"
1090
        },
1091
        "type": {
1092
          "type": "string",
1093
          "enum": [
1094
            "file"
1095
          ]
1096
        },
1097
        "readOnly": {
1098
          "type": "boolean",
1099
          "default": false
1100
        },
1101
        "externalDocs": {
1102
          "$ref": "#/definitions/externalDocs"
1103
        },
1104
        "example": {}
1105
      },
1106
      "additionalProperties": false
1107
    },
1108
    "primitivesItems": {
1109
      "type": "object",
1110
      "additionalProperties": false,
1111
      "properties": {
1112
        "type": {
1113
          "type": "string",
1114
          "enum": [
1115
            "string",
1116
            "number",
1117
            "integer",
1118
            "boolean",
1119
            "array"
1120
          ]
1121
        },
1122
        "format": {
1123
          "type": "string"
1124
        },
1125
        "items": {
1126
          "$ref": "#/definitions/primitivesItems"
1127
        },
1128
        "collectionFormat": {
1129
          "$ref": "#/definitions/collectionFormat"
1130
        },
1131
        "default": {
1132
          "$ref": "#/definitions/default"
1133
        },
1134
        "maximum": {
1135
          "$ref": "#/definitions/maximum"
1136
        },
1137
        "exclusiveMaximum": {
1138
          "$ref": "#/definitions/exclusiveMaximum"
1139
        },
1140
        "minimum": {
1141
          "$ref": "#/definitions/minimum"
1142
        },
1143
        "exclusiveMinimum": {
1144
          "$ref": "#/definitions/exclusiveMinimum"
1145
        },
1146
        "maxLength": {
1147
          "$ref": "#/definitions/maxLength"
1148
        },
1149
        "minLength": {
1150
          "$ref": "#/definitions/minLength"
1151
        },
1152
        "pattern": {
1153
          "$ref": "#/definitions/pattern"
1154
        },
1155
        "maxItems": {
1156
          "$ref": "#/definitions/maxItems"
1157
        },
1158
        "minItems": {
1159
          "$ref": "#/definitions/minItems"
1160
        },
1161
        "uniqueItems": {
1162
          "$ref": "#/definitions/uniqueItems"
1163
        },
1164
        "enum": {
1165
          "$ref": "#/definitions/enum"
1166
        },
1167
        "multipleOf": {
1168
          "$ref": "#/definitions/multipleOf"
1169
        }
1170
      },
1171
      "patternProperties": {
1172
        "^x-": {
1173
          "$ref": "#/definitions/vendorExtension"
1174
        }
1175
      }
1176
    },
1177
    "security": {
1178
      "type": "array",
1179
      "items": {
1180
        "$ref": "#/definitions/securityRequirement"
1181
      },
1182
      "uniqueItems": true
1183
    },
1184
    "securityRequirement": {
1185
      "type": "object",
1186
      "additionalProperties": {
1187
        "type": "array",
1188
        "items": {
1189
          "type": "string"
1190
        },
1191
        "uniqueItems": true
1192
      }
1193
    },
1194
    "xml": {
1195
      "type": "object",
1196
      "additionalProperties": false,
1197
      "properties": {
1198
        "name": {
1199
          "type": "string"
1200
        },
1201
        "namespace": {
1202
          "type": "string"
1203
        },
1204
        "prefix": {
1205
          "type": "string"
1206
        },
1207
        "attribute": {
1208
          "type": "boolean",
1209
          "default": false
1210
        },
1211
        "wrapped": {
1212
          "type": "boolean",
1213
          "default": false
1214
        }
1215
      },
1216
      "patternProperties": {
1217
        "^x-": {
1218
          "$ref": "#/definitions/vendorExtension"
1219
        }
1220
      }
1221
    },
1222
    "tag": {
1223
      "type": "object",
1224
      "additionalProperties": false,
1225
      "required": [
1226
        "name"
1227
      ],
1228
      "properties": {
1229
        "name": {
1230
          "type": "string"
1231
        },
1232
        "description": {
1233
          "type": "string"
1234
        },
1235
        "externalDocs": {
1236
          "$ref": "#/definitions/externalDocs"
1237
        }
1238
      },
1239
      "patternProperties": {
1240
        "^x-": {
1241
          "$ref": "#/definitions/vendorExtension"
1242
        }
1243
      }
1244
    },
1245
    "securityDefinitions": {
1246
      "type": "object",
1247
      "additionalProperties": {
1248
        "oneOf": [
1249
          {
1250
            "$ref": "#/definitions/basicAuthenticationSecurity"
1251
          },
1252
          {
1253
            "$ref": "#/definitions/apiKeySecurity"
1254
          },
1255
          {
1256
            "$ref": "#/definitions/oauth2ImplicitSecurity"
1257
          },
1258
          {
1259
            "$ref": "#/definitions/oauth2PasswordSecurity"
1260
          },
1261
          {
1262
            "$ref": "#/definitions/oauth2ApplicationSecurity"
1263
          },
1264
          {
1265
            "$ref": "#/definitions/oauth2AccessCodeSecurity"
1266
          }
1267
        ]
1268
      }
1269
    },
1270
    "basicAuthenticationSecurity": {
1271
      "type": "object",
1272
      "additionalProperties": false,
1273
      "required": [
1274
        "type"
1275
      ],
1276
      "properties": {
1277
        "type": {
1278
          "type": "string",
1279
          "enum": [
1280
            "basic"
1281
          ]
1282
        },
1283
        "description": {
1284
          "type": "string"
1285
        }
1286
      },
1287
      "patternProperties": {
1288
        "^x-": {
1289
          "$ref": "#/definitions/vendorExtension"
1290
        }
1291
      }
1292
    },
1293
    "apiKeySecurity": {
1294
      "type": "object",
1295
      "additionalProperties": false,
1296
      "required": [
1297
        "type",
1298
        "name",
1299
        "in"
1300
      ],
1301
      "properties": {
1302
        "type": {
1303
          "type": "string",
1304
          "enum": [
1305
            "apiKey"
1306
          ]
1307
        },
1308
        "name": {
1309
          "type": "string"
1310
        },
1311
        "in": {
1312
          "type": "string",
1313
          "enum": [
1314
            "header",
1315
            "query"
1316
          ]
1317
        },
1318
        "description": {
1319
          "type": "string"
1320
        }
1321
      },
1322
      "patternProperties": {
1323
        "^x-": {
1324
          "$ref": "#/definitions/vendorExtension"
1325
        }
1326
      }
1327
    },
1328
    "oauth2ImplicitSecurity": {
1329
      "type": "object",
1330
      "additionalProperties": false,
1331
      "required": [
1332
        "type",
1333
        "flow",
1334
        "authorizationUrl"
1335
      ],
1336
      "properties": {
1337
        "type": {
1338
          "type": "string",
1339
          "enum": [
1340
            "oauth2"
1341
          ]
1342
        },
1343
        "flow": {
1344
          "type": "string",
1345
          "enum": [
1346
            "implicit"
1347
          ]
1348
        },
1349
        "scopes": {
1350
          "$ref": "#/definitions/oauth2Scopes"
1351
        },
1352
        "authorizationUrl": {
1353
          "type": "string",
1354
          "format": "uri"
1355
        },
1356
        "description": {
1357
          "type": "string"
1358
        }
1359
      },
1360
      "patternProperties": {
1361
        "^x-": {
1362
          "$ref": "#/definitions/vendorExtension"
1363
        }
1364
      }
1365
    },
1366
    "oauth2PasswordSecurity": {
1367
      "type": "object",
1368
      "additionalProperties": false,
1369
      "required": [
1370
        "type",
1371
        "flow",
1372
        "tokenUrl"
1373
      ],
1374
      "properties": {
1375
        "type": {
1376
          "type": "string",
1377
          "enum": [
1378
            "oauth2"
1379
          ]
1380
        },
1381
        "flow": {
1382
          "type": "string",
1383
          "enum": [
1384
            "password"
1385
          ]
1386
        },
1387
        "scopes": {
1388
          "$ref": "#/definitions/oauth2Scopes"
1389
        },
1390
        "tokenUrl": {
1391
          "type": "string",
1392
          "format": "uri"
1393
        },
1394
        "description": {
1395
          "type": "string"
1396
        }
1397
      },
1398
      "patternProperties": {
1399
        "^x-": {
1400
          "$ref": "#/definitions/vendorExtension"
1401
        }
1402
      }
1403
    },
1404
    "oauth2ApplicationSecurity": {
1405
      "type": "object",
1406
      "additionalProperties": false,
1407
      "required": [
1408
        "type",
1409
        "flow",
1410
        "tokenUrl"
1411
      ],
1412
      "properties": {
1413
        "type": {
1414
          "type": "string",
1415
          "enum": [
1416
            "oauth2"
1417
          ]
1418
        },
1419
        "flow": {
1420
          "type": "string",
1421
          "enum": [
1422
            "application"
1423
          ]
1424
        },
1425
        "scopes": {
1426
          "$ref": "#/definitions/oauth2Scopes"
1427
        },
1428
        "tokenUrl": {
1429
          "type": "string",
1430
          "format": "uri"
1431
        },
1432
        "description": {
1433
          "type": "string"
1434
        }
1435
      },
1436
      "patternProperties": {
1437
        "^x-": {
1438
          "$ref": "#/definitions/vendorExtension"
1439
        }
1440
      }
1441
    },
1442
    "oauth2AccessCodeSecurity": {
1443
      "type": "object",
1444
      "additionalProperties": false,
1445
      "required": [
1446
        "type",
1447
        "flow",
1448
        "authorizationUrl",
1449
        "tokenUrl"
1450
      ],
1451
      "properties": {
1452
        "type": {
1453
          "type": "string",
1454
          "enum": [
1455
            "oauth2"
1456
          ]
1457
        },
1458
        "flow": {
1459
          "type": "string",
1460
          "enum": [
1461
            "accessCode"
1462
          ]
1463
        },
1464
        "scopes": {
1465
          "$ref": "#/definitions/oauth2Scopes"
1466
        },
1467
        "authorizationUrl": {
1468
          "type": "string",
1469
          "format": "uri"
1470
        },
1471
        "tokenUrl": {
1472
          "type": "string",
1473
          "format": "uri"
1474
        },
1475
        "description": {
1476
          "type": "string"
1477
        }
1478
      },
1479
      "patternProperties": {
1480
        "^x-": {
1481
          "$ref": "#/definitions/vendorExtension"
1482
        }
1483
      }
1484
    },
1485
    "oauth2Scopes": {
1486
      "type": "object",
1487
      "additionalProperties": {
1488
        "type": "string"
1489
      }
1490
    },
1491
    "mediaTypeList": {
1492
      "type": "array",
1493
      "items": {
1494
        "$ref": "#/definitions/mimeType"
1495
      },
1496
      "uniqueItems": true
1497
    },
1498
    "parametersList": {
1499
      "type": "array",
1500
      "description": "The parameters needed to send a valid API call.",
1501
      "additionalItems": false,
1502
      "items": {
1503
        "oneOf": [
1504
          {
1505
            "$ref": "#/definitions/parameter"
1506
          },
1507
          {
1508
            "$ref": "#/definitions/jsonReference"
1509
          }
1510
        ]
1511
      },
1512
      "uniqueItems": true
1513
    },
1514
    "schemesList": {
1515
      "type": "array",
1516
      "description": "The transfer protocol of the API.",
1517
      "items": {
1518
        "type": "string",
1519
        "enum": [
1520
          "http",
1521
          "https",
1522
          "ws",
1523
          "wss"
1524
        ]
1525
      },
1526
      "uniqueItems": true
1527
    },
1528
    "collectionFormat": {
1529
      "type": "string",
1530
      "enum": [
1531
        "csv",
1532
        "ssv",
1533
        "tsv",
1534
        "pipes"
1535
      ],
1536
      "default": "csv"
1537
    },
1538
    "collectionFormatWithMulti": {
1539
      "type": "string",
1540
      "enum": [
1541
        "csv",
1542
        "ssv",
1543
        "tsv",
1544
        "pipes",
1545
        "multi"
1546
      ],
1547
      "default": "csv"
1548
    },
1549
    "title": {
1550
      "$ref": "http://json-schema.org/draft-04/schema#/properties/title"
1551
    },
1552
    "description": {
1553
      "$ref": "http://json-schema.org/draft-04/schema#/properties/description"
1554
    },
1555
    "default": {
1556
      "$ref": "http://json-schema.org/draft-04/schema#/properties/default"
1557
    },
1558
    "multipleOf": {
1559
      "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf"
1560
    },
1561
    "maximum": {
1562
      "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum"
1563
    },
1564
    "exclusiveMaximum": {
1565
      "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum"
1566
    },
1567
    "minimum": {
1568
      "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum"
1569
    },
1570
    "exclusiveMinimum": {
1571
      "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum"
1572
    },
1573
    "maxLength": {
1574
      "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
1575
    },
1576
    "minLength": {
1577
      "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
1578
    },
1579
    "pattern": {
1580
      "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern"
1581
    },
1582
    "maxItems": {
1583
      "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
1584
    },
1585
    "minItems": {
1586
      "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
1587
    },
1588
    "uniqueItems": {
1589
      "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems"
1590
    },
1591
    "enum": {
1592
      "$ref": "http://json-schema.org/draft-04/schema#/properties/enum"
1593
    },
1594
    "jsonReference": {
1595
      "type": "object",
1596
      "required": [
1597
        "$ref"
1598
      ],
1599
      "additionalProperties": false,
1600
      "properties": {
1601
        "$ref": {
1602
          "type": "string"
1603
        }
1604
      }
1605
    }
1606
  }
1607
}

Return to bug 23653