{
components =>
{
schemas =>
{
# NOTE: schemas -> api_errors
api_errors =>
{
description => q{Definition of standard errors returned by MetaCPAN API},
properties =>
{
code =>
{
description => q{A 3 digits code representing the error.},
maxLength => 3,
type => 'string',
},
message =>
{
description => q{The error message designed for human consumption with more details about the error.},
maxLength => 20000,
type => 'string',
},
param =>
{
description => q{If the error is parameter-specific, the parameter related to the error.},
maxLength => 2048,
type => 'string',
},
},
required => [
'code',
],
title => 'APIErrors',
type => 'object',
},
# NOTE: schemas -> author_mapping
author_mapping =>
{
description => q{This is the object representing the availble fields for the [author object](https://explorer.metacpan.org/?url=/author/_mapping).},
properties =>
{
schema =>
{
'$ref' => "#/components/schemas/profile",
}
},
title => 'AuthorMapping',
type => 'object',
},
# NOTE: schemas -> changes
changes =>
{
description => q{This is the object representing a MetaCPAN [module changes file](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches)},
properties =>
{
author =>
{
type => 'string',
},
authorized =>
{
type => 'boolean',
},
binary =>
{
type => 'boolean',
},
category =>
{
type => 'string',
},
content =>
{
type => 'string',
},
date =>
{
type => 'string',
format => 'date-time',
},
deprecated =>
{
type => 'boolean',
},
directory =>
{
type => 'boolean',
},
dist_fav_count =>
{
type => 'integer',
},
distribution =>
{
type => 'string',
},
download_url =>
{
type => 'string',
},
id =>
{
type => 'string',
},
indexed =>
{
type => 'boolean',
},
level =>
{
type => 'integer',
},
maturity =>
{
type => 'string',
},
mime =>
{
type => 'string',
},
module =>
{
items =>
{
type => 'string',
},
type => 'array',
},
name =>
{
type => 'string',
},
path =>
{
type => 'string',
},
pod =>
{
type => 'string',
},
release =>
{
type => 'string',
},
sloc =>
{
type => 'integer',
},
slop =>
{
type => 'integer',
},
'stat' =>
{
properties =>
{
mode =>
{
type => 'integer',
},
mtime =>
{
type => 'integer',
},
size =>
{
type => 'integer',
}
},
},
status =>
{
type => 'string',
},
version =>
{
description => 'Package version string',
type => 'string',
},
version_numified =>
{
type => 'number',
format => 'float',
}
},
title => 'Changes',
type => 'object',
},
# NOTE: schemas -> contributor
contributor =>
{
description => q{This is the object representing contributors},
properties =>
{
distribution =>
{
maxLength => 2048,
type => 'string',
},
pauseid =>
{
maxLength => 2048,
type => 'string',
},
release_author =>
{
maxLength => 2048,
type => 'string',
},
release_name =>
{
maxLength => 2048,
type => 'string',
},
},
title => 'Contributor',
type => 'object',
},
# NOTE: schemas -> contributor_mapping
contributor_mapping =>
{
description => q{This is the object representing the availble fields for the [contributor object](https://explorer.metacpan.org/?url=/contributor/_mapping).},
properties =>
{
schema =>
{
'$ref' => "#/components/schemas/contributor",
}
},
title => 'ContributorMapping',
type => 'object',
},
# NOTE: schemas -> cover
cover =>
{
description => q{This is the object representing a MetaCPAN [module coverage](http://cpancover.com/)},
properties =>
{
criteria =>
{
description => 'CPAN Cover results',
properties =>
{
branch =>
{
description => 'Percentage of branch code coverage',
type => 'number',
},
condition =>
{
description => 'Percentage of condition code coverage',
type => 'number',
},
statement =>
{
description => 'Percentage of statement code coverage',
type => 'number',
},
subroutine =>
{
description => 'Percentage of subroutine code coverage',
type => 'number',
},
total =>
{
description => 'Percentage of total code coverage',
type => 'number',
}
},
},
distribution =>
{
description => 'Name of the distribution',
type => 'string',
},
release =>
{
description => 'Package name with version',
type => 'string',
},
url =>
{
description => 'URL for cpancover report',
type => 'string',
},
version =>
{
description => 'Package version string',
type => 'string',
},
},
title => 'Cover',
type => 'object',
},
# NOTE: schemas -> diff
diff =>
{
description => q{This is the object representing difference in multiple files between 2 releases},
properties =>
{
diff =>
{
description => 'This property is only available when comparing 2 file IDs',
type => 'string',
},
source =>
{
type => 'string',
},
statistics =>
{
items =>
{
properties =>
{
deletions =>
{
type => 'integer',
},
diff =>
{
type => 'string',
},
insertions =>
{
type => 'integer',
},
source =>
{
type => 'string',
},
target =>
{
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
target =>
{
type => 'string',
},
},
title => 'Diff',
type => 'object',
},
# NOTE: schemas -> distribution
distribution =>
{
description => q{This is the object representing a MetaCPAN [author distribution](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#distributiondistribution)},
properties =>
{
bugs =>
{
properties =>
{
github =>
{
properties =>
{
active => { type => 'integer' },
closed => { type => 'integer' },
'open' => { type => 'integer' },
source =>
{
maxLength => 2048,
type => 'string',
},
},
},
rt =>
{
properties =>
{
'<html>' => { type => 'number' },
active => { type => 'integer' },
closed => { type => 'integer' },
new => { type => 'integer' },
'open' => { type => 'integer' },
patched => { type => 'integer' },
rejected => { type => 'integer' },
resolved => { type => 'integer' },
source =>
{
maxLength => 2048,
type => 'string',
},
stalled => { type => 'integer' },
},
},
},
},
external_package =>
{
properties =>
{
cygwin =>
{
maxLength => 2048,
type => 'string',
},
debian =>
{
maxLength => 2048,
type => 'string',
},
fedora =>
{
maxLength => 2048,
type => 'string',
},
},
},
name =>
{
maxLength => 2048,
type => 'string',
},
river =>
{
properties =>
{
bucket => { type => 'integer' },
bus_factor => { type => 'integer' },
immediate => { type => 'integer' },
total => { type => 'integer' },
},
},
},
title => 'Distribution',
type => 'object',
},
# NOTE: schemas -> distribution_mapping
distribution_mapping =>
{
description => q{This is the object representing the availble fields for the [distribution object](https://explorer.metacpan.org/?url=/distribution/_mapping).},
properties =>
{
schema =>
{
'$ref' => "#/components/schemas/distribution",
}
},
title => 'DistributionMapping',
type => 'object',
},
# NOTE: schemas -> distributions
distributions =>
{
description => q{This is the object representing a list of distributions.},
properties =>
{
distributions =>
{
additionalProperties =>
{
type => 'object',
properties =>
{
avg =>
{
format => 'float',
type => 'number',
},
count =>
{
type => 'integer',
},
max =>
{
format => 'float',
type => 'number',
},
min =>
{
format => 'float',
type => 'number',
},
sum =>
{
format => 'float',
type => 'number',
},
},
},
type => 'object',
description => 'This contains dynamic properties named after the perl distribution name, such as "HTTP-Message"',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
title => 'Distributions',
type => 'object',
},
# NOTE: schemas -> download_url
download_url =>
{
description => q{This is the object representing a MetaCPAN [distribution download URL](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#download_urlmodule)},
properties =>
{
checksum_md5 =>
{
type => 'string',
},
checksum_sha256 =>
{
type => 'string',
},
date =>
{
description => 'An ISO 8601 datetime',
type => 'string',
format => 'date-time',
},
download_url =>
{
type => 'string',
},
release =>
{
type => 'string',
},
status =>
{
type => 'string',
},
version =>
{
type => 'string',
},
},
title => 'DownloadURL',
type => 'object',
},
# NOTE: schemas -> elastic_search
# Taken from ElasticSearch specs <https://www.elastic.co/guide/en/cloud/current/ec-openapi-specification.html>
elastic_search =>
{
description => "An Elasticsearch search request with a subset of options.",
properties =>
{
_source =>
{
properties => {},
type => "object",
},
from =>
{
format => "int32",
type => "integer",
},
query =>
{
'$ref' => "#/components/schemas/es_query_container"
},
size =>
{
description => "The maximum number of search results to return.",
format => "int32",
type => "integer",
},
sort =>
{
description => "An array of fields to sort the search results by.",
items =>
{
properties => {},
type => "object",
},
type => "array",
},
},
title => 'Search',
type => "object",
},
# NOTE: schemas -> es_bool_query
es_bool_query =>
{
description => "A query for documents that match boolean combinations of other queries.",
properties =>
{
filter =>
{
items =>
{
'$ref' => "#/components/schemas/es_query_container"
},
type => "array",
},
minimum_should_match =>
{
description => "The minimum number of optional should clauses to match.",
format => "int32",
type => "integer",
},
must =>
{
items =>
{
'$ref' => "#/components/schemas/es_query_container"
},
type => "array",
},
must_not =>
{
items =>
{
'$ref' => "#/components/schemas/es_query_container"
},
type => "array",
},
should =>
{
items =>
{
'$ref' => "#/components/schemas/es_query_container"
},
type => "array",
},
},
type => "object",
},
# NOTE: schemas -> es_exists_query
es_exists_query =>
{
description => "Matches documents that have at least one non-`null` value in the original field.",
properties =>
{
field =>
{
description => "The field to check for non-null values in.",
type => "string",
},
},
required => ["field"],
type => "object",
},
# NOTE: schemas -> es_match_query
es_match_query =>
{
description => "Consumes and analyzes text, numbers, and dates, then constructs a query.",
properties =>
{
analyzer =>
{
description => "The analyzer that will be used to perform the analysis process on the text. Defaults to the analyzer that was used to index the field.",
type => "string",
},
minimum_should_match =>
{
description => "The minimum number of optional should clauses to match.",
format => "int32",
type => "integer",
},
operator =>
{
description => "The operator flag can be set to or or and to control the boolean clauses (defaults to or).",
type => "string",
},
query =>
{
description => "The text/numeric/date to query for.",
type => "string",
},
},
required => ["query"],
type => "object",
},
# NOTE: schemas -> es_match_all_query
es_match_all_query =>
{
description => "A query that matches all documents.",
type => "object",
},
# NOTE: schemas -> es_match_none_query
es_match_none_query =>
{
description => "A query that doesn't match any documents.",
type => "object",
},
# NOTE: schemas -> es_nested_query
es_nested_query =>
{
description => "A query that matches nested objects.",
properties =>
{
path =>
{
description => "The path to the nested object.",
type => "string"
},
query =>
{
'$ref' => "#/components/schemas/es_query_container",
description => "The actual query to execute on the nested objects.",
},
score_mode =>
{
description => "Allows to specify how inner children matching affects score of the parent. Refer to the Elasticsearch documentation for details.",
enum => [qw( avg sum min max none )],
type => "string",
},
},
required => [qw( path query )],
type => "object",
},
# NOTE: schemas -> es_prefix_query
es_prefix_query =>
{
description => "The query that matches documents with fields that contain terms with a specified, not analyzed, prefix.",
properties =>
{
boost =>
{
description => "An optional boost value to apply to the query.",
format => "float",
type => "number",
},
value =>
{
description => "The prefix to search for.",
type => "string"
},
},
required => ["value"],
type => "object",
},
# NOTE: schemas -> es_query_container
es_query_container =>
{
description => "The container for all of the allowed Elasticsearch queries. Specify only one property each time.",
properties =>
{
bool =>
{
'$ref' => "#/components/schemas/es_bool_query"
},
exists =>
{
'$ref' => "#/components/schemas/es_exists_query"
},
match =>
{
additionalProperties =>
{
'$ref' => "#/components/schemas/es_match_query"
},
type => "object",
},
match_all =>
{
'$ref' => "#/components/schemas/es_match_all_query"
},
match_none =>
{
'$ref' => "#/components/schemas/es_match_none_query"
},
nested =>
{
'$ref' => "#/components/schemas/es_nested_query"
},
prefix =>
{
additionalProperties =>
{
'$ref' => "#/components/schemas/es_prefix_query"
},
type => "object",
},
query_string =>
{
'$ref' => "#/components/schemas/es_query_string_query"
},
range =>
{
additionalProperties =>
{
'$ref' => "#/components/schemas/es_range_query"
},
type => "object",
},
simple_query_string =>
{
'$ref' => "#/components/schemas/es_simple_query_string_query"
},
term =>
{
additionalProperties =>
{
'$ref' => "#/components/schemas/es_term_query"
},
type => "object",
},
},
type => "object",
},
# NOTE: schemas -> es_query_string_query
es_query_string_query =>
{
description => "A query that uses the strict query string syntax for parsing. Will return an error for invalid syntax.",
properties =>
{
allow_leading_wildcard =>
{
description => "When set, * or ? are allowed as the first character. Defaults to false.",
type => "boolean",
},
analyzer =>
{
description => "The analyzer used to analyze each term of the query when creating composite queries.",
type => "string",
},
default_field =>
{
description => "The default field for query terms if no prefix field is specified.",
type => "string",
},
default_operator =>
{
description => "The default operator used if no explicit operator is specified.",
type => "string",
},
query =>
{
description => "The actual query to be parsed.",
type => "string",
},
},
required => ["query"],
type => "object",
},
# NOTE: schemas -> es_range_query
es_range_query =>
{
description => "The query that matches documents with fields that contain terms within a specified range.",
properties =>
{
boost =>
{
description => "An optional boost value to apply to the query.",
format => "float",
type => "number",
},
format =>
{
description => "Formatted dates will be parsed using the format specified on the date field by default, but it can be overridden by passing the format parameter.",
type => "string",
},
gt =>
{
description => "Greater-than",
properties => {},
type => "object"
},
gte =>
{
description => "Greater-than or equal to",
properties => {},
type => "object",
},
lt =>
{
description => "Less-than",
properties => {},
type => "object",
},
lte =>
{
description => "Less-than or equal to.",
properties => {},
type => "object",
},
time_zone =>
{
description => "Dates can be converted from another timezone to UTC either by specifying the time zone in the date value itself (if the format accepts it), or it can be specified as the time_zone parameter.",
type => "string",
},
},
type => "object",
},
# NOTE: schemas -> es_simple_query_string_query
es_simple_query_string_query =>
{
description => "A query that uses simple query string syntax. Will ignore invalid syntax.",
properties =>
{
analyze_wildcard =>
{
description => "If `true`, the query attempts to analyze wildcard terms. Defaults to `false`.",
type => "boolean",
},
analyzer =>
{
description => "The name of the analyzer to use to convert the query text into tokens.",
type => "string",
},
auto_generate_synonyms_phrase_query =>
{
description => "If `true`, the parse creates a `match_phrase` uery for each multi-position token. Defaults to `true`.",
type => "boolean",
},
default_operator =>
{
description => "The boolean operator used to combine the terms of the query. Valid values are `OR` (default) and `AND`.",
type => "string",
},
fields =>
{
description => "Array of fields to search",
items =>
{
type => "string"
},
type => "array",
},
flags =>
{
description => "List of enabled operators for the simple query string syntax. Defaults to `ALL`.",
type => "string",
},
fuzzy_max_expansions =>
{
description => "Maximum number of terms to which the query expands for fuzzy matching. Defaults to 50.",
format => "int32",
type => "integer",
},
fuzzy_prefix_length =>
{
description => "Number of beginning characters left unchanged for fuzzy matching. Defaults to 0.",
format => "int32",
type => "integer",
},
fuzzy_transpositions =>
{
description => "If `true`, edits for fuzzy matching include transpositions of two adjacent characters. Defaults to `false`.",
type => "boolean",
},
lenient =>
{
description => "If `true`, format-based errors, such as providing a text value for a numeric field are ignored. Defaults to `false`.",
type => "boolean",
},
minimum_should_match =>
{
description => "Minimum number of clauses that must match for a document to be returned.",
type => "string",
},
query =>
{
description => "The query expressed in simple query string syntax.",
type => "string",
},
quote_field_suffix =>
{
description => "Suffix appended to quoted text in the query string.",
type => "string",
},
},
required => ["query"],
type => "object",
},
# NOTE: schemas -> es_term_query
es_term_query =>
{
description => "A query for documents that contain the specified term in the inverted index.",
properties =>
{
value =>
{
description => "The exact value to query for.",
type => "string"
},
},
required => ["value"],
type => "object",
},
# NOTE: schemas -> error
error =>
{
description => "An error response from the MetaCPAN API",
properties =>
{
error =>
{
'$ref' => '#/components/schemas/api_errors'
}
},
required => [
'error'
],
title => 'Error',
type => 'object',
},
# NOTE: schemas -> favorite
favorite =>
{
description => q{This is the object representing favorites},
properties =>
{
author =>
{
maxLength => 2048,
type => 'string',
},
date =>
{
description => 'ISO8601 date format',
type => 'string',
format => 'date-time',
},
distribution =>
{
maxLength => 2048,
type => 'string',
},
id =>
{
maxLength => 2048,
type => 'string',
},
release =>
{
maxLength => 2048,
type => 'string',
},
user =>
{
maxLength => 2048,
type => 'string',
},
},
title => 'Favorite',
type => 'object',
},
# NOTE: schemas -> favorites
favorites =>
{
description => q{This is the object representing a user favorites},
properties =>
{
favorites =>
{
items =>
{
'$ref' => '#/components/schemas/favorite',
},
type => 'array',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
title => 'Favorites',
type => 'object',
},
# NOTE: schemas -> favorite_mapping
favorite_mapping =>
{
description => q{This is the object representing the availble fields for the [favorite object](https://explorer.metacpan.org/?url=/favorite/_mapping).},
properties =>
{
schema =>
{
'$ref' => "#/components/schemas/favorite",
}
},
title => 'FavoriteMapping',
type => 'object',
},
# NOTE: schemas -> file
file =>
{
description => q{This is the object representing a file},
properties =>
{
abstract =>
{
maxLength => 2048,
type => 'string',
},
author =>
{
maxLength => 2048,
type => 'string',
},
authorized => { type => 'boolean' },
binary => { type => 'boolean' },
date =>
{
description => 'ISO8601 date format',
type => 'string',
format => 'date-time',
},
deprecated => { type => 'boolean' },
description =>
{
maxLength => 2048,
type => 'string',
},
dir =>
{
maxLength => 2048,
type => 'string',
},
directory => { type => 'boolean' },
dist_fav_count => { type => 'integer' },
distribution =>
{
maxLength => 2048,
type => 'string',
},
documentation =>
{
maxLength => 2048,
type => 'string',
},
download_url =>
{
maxLength => 2048,
type => 'string',
},
id =>
{
maxLength => 2048,
type => 'string',
},
indexed => { type => 'boolean' },
level => { type => 'integer' },
maturity =>
{
maxLength => 2048,
type => 'string',
},
mime =>
{
example => 'text/x-script.perl-module',
maxLength => 2048,
type => 'string',
},
# See <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Document/File.pm#L150>
module =>
{
items =>
{
'$ref' => '#/components/schemas/module',
},
type => 'array',
},
name =>
{
maxLength => 2048,
type => 'string',
},
path =>
{
maxLength => 2048,
type => 'string',
},
pod =>
{
type => 'string',
},
pod_lines =>
{
maxLength => 2048,
type => 'string',
},
release =>
{
maxLength => 2048,
type => 'string',
},
sloc => { type => 'integer' },
slop => { type => 'integer' },
stat =>
{
properties =>
{
gid => { type => 'number' },
mode => { type => 'integer' },
mtime => { type => 'integer' },
size => { type => 'integer' },
uid => { type => 'number' },
},
},
status =>
{
maxLength => 2048,
type => 'string',
},
# TODO Clueless as to what that could be. Find out
suggest => {},
version => { type => 'string' },
version_numified => { type => 'number' },
},
title => 'File',
type => 'object',
},
# NOTE: schemas -> file_snapshot
file_snapshot =>
{
description => q{This is the object representing a file snapshot},
properties =>
{
author =>
{
maxLength => 2048,
type => 'string',
},
category => { type => 'string' },
distribution =>
{
maxLength => 2048,
type => 'string',
},
documentation =>
{
maxLength => 2048,
type => 'string',
},
name =>
{
maxLength => 2048,
type => 'string',
},
path =>
{
maxLength => 2048,
type => 'string',
},
pod_lines =>
{
maxLength => 2048,
type => 'string',
},
release =>
{
maxLength => 2048,
type => 'string',
},
status =>
{
maxLength => 2048,
type => 'string',
},
},
title => 'FileSnapshot',
type => 'object',
},
# NOTE: schemas -> file_preview
file_preview =>
{
description => q{This represents a file preview used in endpoint `/file/dir`},
properties =>
{
directory => { type => 'boolean' },
documentation =>
{
maxLength => 2048,
type => 'string',
},
mime =>
{
example => 'text/x-script.perl-module',
maxLength => 2048,
type => 'string',
},
name =>
{
maxLength => 2048,
type => 'string',
},
path =>
{
maxLength => 2048,
type => 'string',
},
slop => { type => 'integer' },
'stat.mime' => { type => 'integer' },
'stat.size' => { type => 'integer' },
},
title => 'FilePreview',
type => 'object',
},
# NOTE: schemas -> file_mapping
file_mapping =>
{
description => q{This is the object representing the availble fields for the [file object](https://explorer.metacpan.org/?url=/module/_mapping).},
properties =>
{
schema =>
{
'$ref' => "#/components/schemas/file",
}
},
title => 'FileMapping',
type => 'object',
},
# NOTE: schemas -> files
files =>
{
description => q{This is the object representing a list of files},
properties =>
{
files =>
{
items =>
{
'$ref' => '#/components/schemas/file',
},
type => 'array',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
title => 'Files',
type => 'object',
},
# NOTE: schemas -> files_categories
files_categories =>
{
description => q{This is the object representing a list of files by categories},
properties =>
{
categories =>
{
properties =>
{
changelog =>
{
items =>
{
'$ref' => '#/components/schemas/file_snapshot',
},
type => 'array',
},
contributing =>
{
items =>
{
'$ref' => '#/components/schemas/file_snapshot',
},
type => 'array',
},
dist =>
{
items =>
{
'$ref' => '#/components/schemas/file_snapshot',
},
type => 'array',
},
license =>
{
items =>
{
'$ref' => '#/components/schemas/file_snapshot',
},
type => 'array',
},
other =>
{
items =>
{
'$ref' => '#/components/schemas/file_snapshot',
},
type => 'array',
},
},
type => 'object',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
title => 'FilesCategories',
type => 'object',
},
# NOTE: schemas -> files_interesting
files_interesting =>
{
description => q{This is the object representing a list of files},
properties =>
{
files =>
{
items =>
{
'$ref' => '#/components/schemas/file_snapshot',
},
type => 'array',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
title => 'FilesInteresting',
type => 'object',
},
# NOTE: schemas -> metadata
metadata =>
{
properties =>
{
abstract =>
{
maxLength => 2048,
type => 'string',
},
author =>
{
maxLength => 2048,
type => 'string',
},
dynamic_config =>
{
type => 'boolean',
},
generated_by =>
{
maxLength => 2048,
type => 'string',
},
license =>
{
maxLength => 2048,
type => 'string',
},
meta_spec =>
{
properties =>
{
url =>
{
maxLength => 2048,
type => 'string',
},
version =>
{
type => 'integer',
}
},
},
name =>
{
maxLength => 2048,
type => 'string'
},
no_index =>
{
properties =>
{
directory =>
{
maxLength => 2048,
type => 'string'
},
package =>
{
maxLength => 2048,
type => 'string'
}
}
},
prereqs =>
{
properties =>
{
build =>
{
properties =>
{
requires =>
{
additionalProperties =>
{
description => "Key-value pairs of module names with their version number",
type => 'string',
},
}
}
},
configure =>
{
properties =>
{
requires =>
{
additionalProperties =>
{
description => "Key-value pairs of module names with their version number",
type => 'string',
},
}
}
},
runtime =>
{
properties =>
{
requires =>
{
additionalProperties =>
{
description => "Key-value pairs of module names with their version number",
type => 'string',
},
}
}
},
test =>
{
properties =>
{
requires =>
{
additionalProperties =>
{
description => "Key-value pairs of module names with their version number",
type => 'string',
},
}
}
}
}
},
release_status =>
{
maxLength => 2048,
type => 'string'
},
resources =>
{
properties =>
{
bugtracker =>
{
properties =>
{
web =>
{
maxLength => 2048,
type => 'string'
},
type =>
{
maxLength => 2048,
type => 'string'
}
}
},
repository =>
{
properties =>
{
web =>
{
maxLength => 2048,
type => 'string'
},
type =>
{
maxLength => 2048,
type => 'string'
}
}
},
homepage =>
{
type => 'string'
},
license =>
{
type => 'string'
}
},
type => 'object'
},
version =>
{
type => 'string'
}
},
title => 'Metadata',
type => 'object',
},
# NOTE: schemas -> mirror
mirror =>
{
description => q{This is the object representing a mirror},
properties =>
{
aka_name =>
{
type => 'string',
},
A_or_CNAME =>
{
type => 'string',
},
ccode =>
{
description => 'A 2-characters ISO 3166 country code',
maxLength => 2,
type => 'string',
},
city =>
{
type => 'string',
},
contact =>
{
items =>
{
properties =>
{
contact_site =>
{
type => 'string',
},
contact_user =>
{
type => 'string',
},
},
type => 'object'
},
type => 'array',
},
continent =>
{
type => 'string',
},
country =>
{
type => 'string',
},
distance =>
{
type => 'string',
},
distance =>
{
type => 'string',
},
dnsrr =>
{
type => 'string',
},
ftp =>
{
type => 'string',
},
freq =>
{
type => 'string',
},
http =>
{
type => 'string',
},
inceptdate =>
{
type => 'string',
format => 'date-time',
},
location =>
{
items =>
{
type => 'string',
},
type => 'array',
},
name =>
{
type => 'string',
},
note =>
{
type => 'string',
},
org =>
{
type => 'string',
},
region =>
{
type => 'string',
},
reitredate =>
{
type => 'string',
format => 'date-time',
},
rsync =>
{
type => 'string',
},
src =>
{
type => 'string',
},
tz =>
{
type => 'string',
},
},
title => 'Mirror',
type => 'object',
},
# NOTE: schemas -> mirrors
mirrors =>
{
description => q{This is the object representing a list of mirrors},
properties =>
{
mirrors =>
{
items =>
{
'$ref' => '#/components/schemas/mirror',
},
type => 'array',
},
total =>
{
type => 'integer',
},
took =>
{
type => 'integer',
},
},
title => 'Mirrors',
type => 'object',
},
# NOTE: schemas -> module
module =>
{
description => q{This is the object representing a module},
properties =>
{
abstract =>
{
maxLength => 2048,
type => 'string',
},
# NOTE: This property is not found in file object
associated_pod => { type => 'string' },
author =>
{
maxLength => 2048,
type => 'string',
},
authorized => { type => 'boolean' },
binary => { type => 'boolean' },
date =>
{
description => 'ISO8601 date format',
type => 'string',
format => 'date-time',
},
deprecated => { type => 'boolean' },
description =>
{
maxLength => 2048,
type => 'string',
},
dir =>
{
maxLength => 2048,
type => 'string',
},
directory => { type => 'boolean' },
dist_fav_count => { type => 'integer' },
distribution =>
{
maxLength => 2048,
type => 'string',
},
documentation =>
{
maxLength => 2048,
type => 'string',
},
download_url =>
{
maxLength => 2048,
type => 'string',
},
id =>
{
maxLength => 2048,
type => 'string',
},
indexed => { type => 'boolean' },
level => { type => 'integer' },
maturity =>
{
maxLength => 2048,
type => 'string',
},
mime =>
{
maxLength => 2048,
type => 'string',
},
# See <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Document/File.pm#L150>
module =>
{
'$ref' => '#/components/schemas/module',
},
name =>
{
maxLength => 2048,
type => 'string',
},
path =>
{
maxLength => 2048,
type => 'string',
},
pod =>
{
type => 'string',
},
pod_lines =>
{
maxLength => 2048,
type => 'string',
},
release =>
{
maxLength => 2048,
type => 'string',
},
sloc => { type => 'integer' },
slop => { type => 'integer' },
stat =>
{
properties =>
{
gid => { type => 'number' },
mode => { type => 'integer' },
mtime => { type => 'integer' },
size => { type => 'integer' },
uid => { type => 'number' },
},
},
status =>
{
maxLength => 2048,
type => 'string',
},
# TODO Clueless as to what that could be. Find out
suggest => {},
version =>
{
maxLength => 2048,
type => 'string',
},
version_numified => { type => 'number' },
},
title => 'Module',
type => 'object',
},
# NOTE: schemas -> module_mapping
module_mapping =>
{
description => q{This is the object representing the availble fields for the [module object](https://explorer.metacpan.org/?url=/module/_mapping).},
properties =>
{
schema =>
{
'$ref' => "#/components/schemas/module",
}
},
title => 'ModuleMapping',
type => 'object',
},
# NOTE: schemas -> package
package =>
{
description => q{This is the object representing a MetaCPAN [module package](https://github.com/metacpan/metacpan-api/blob/master/lib/MetaCPAN/Document/Package.pm)},
properties =>
{
author =>
{
maxLength => 2048,
type => 'string',
},
dist_version =>
{
maxLength => 2048,
type => 'string',
},
distribution =>
{
maxLength => 2048,
type => 'string',
},
file =>
{
maxLength => 2048,
type => 'string',
},
module_name =>
{
maxLength => 2048,
type => 'string',
},
version =>
{
maxLength => 2048,
type => 'string',
},
},
title => 'Package',
type => 'object',
},
# NOTE: schemas -> permission
permission =>
{
description => q{This is the object representing a MetaCPAN [module permission](https://github.com/metacpan/metacpan-api/blob/master/lib/MetaCPAN/Document/Permission.pm)},
properties =>
{
co_maintainers =>
{
items =>
{
maxLength => 2048,
type => 'string',
},
type => 'array',
},
module_name =>
{
maxLength => 2048,
type => 'string',
},
owner =>
{
maxLength => 2048,
type => 'string',
},
},
title => 'Permission',
type => 'object',
},
# NOTE: schemas -> permissions
permissions =>
{
description => q{This is the object representing a user permissions},
properties =>
{
permissions =>
{
items =>
{
properties =>
{
co_maintainers =>
{
items =>
{
description => "List of co-maintainer's pause ID",
maxLength => 2048,
type => 'string',
},
type => 'array',
},
module_name =>
{
example => 'Bundle::DBI',
maxLength => 2048,
type => 'string',
},
owner =>
{
description => "This is the owner's pause ID",
example => 'TIMB',
maxLength => 2048,
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
title => 'Permissions',
type => 'object',
},
# NOTE: schemas -> profile
profile =>
{
description => q{This is the object representing a MetaCPAN [author profile](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#authorauthor)},
properties =>
{
asciiname =>
{
maxLength => 2048,
type => 'string',
},
blog =>
{
properties =>
{
feed =>
{
maxLength => 2048,
type => 'string'
},
url =>
{
maxLength => 2048,
type => 'string'
},
},
},
city =>
{
maxLength => 2048,
type => 'string'
},
country =>
{
maxLength => 2048,
type => 'string'
},
donation =>
{
items =>
{
anyOf => [
{
properties =>
{
id =>
{
maxLength => 2048,
type => 'string'
},
name =>
{
maxLength => 2048,
type => 'string'
},
},
}],
},
type => 'array',
},
email =>
{
items =>
{
maxLength => 2048,
type => 'string',
},
type => 'array',
},
gravatar_url =>
{
maxLength => 2048,
type => 'string'
},
is_pause_custodial_account => { type => 'boolean' },
# NOTE: although 'links' is present in data returned, it is undocumented
links =>
{
description => "An hash of key-URI pairs",
properties =>
{
backpan_directory => { type => 'string' },
cpan_directory => { type => 'string' },
cpantesters_matrix => { type => 'string' },
cpantesters_reports => { type => 'string' },
cpants => { type => 'string' },
metacpan_explorer => { type => 'string' },
repology => { type => 'string' },
},
},
# NOTE: location -> [ 52.847098, -8.98849 ]
location =>
{
items =>
{
type => 'number',
format => 'float',
},
type => 'array',
},
name =>
{
maxLength => 2048,
type => 'string'
},
pauseid =>
{
maxLength => 2048,
type => 'string'
},
perlmongers =>
{
properties =>
{
name =>
{
maxLength => 2048,
type => 'string'
},
url =>
{
maxLength => 2048,
type => 'string'
},
},
},
profile =>
{
items =>
{
properties =>
{
id =>
{
maxLength => 2048,
type => 'string'
},
name =>
{
maxLength => 2048,
type => 'string'
},
},
type => 'object',
},
type => 'array',
},
# NOTE: 'release_count' is present in data returned by the REST API, but is undocumented
release_count =>
{
properties =>
{
'backpan-only' => { type => 'integer' },
cpan => { type => 'integer' },
latest => { type => 'integer' },
},
},
region =>
{
maxLength => 2048,
type => 'string'
},
updated =>
{
type => 'string',
format => 'date-time',
},
user =>
{
maxLength => 2048,
type => 'string'
},
website =>
{
items =>
{
maxLength => 2048,
type => 'string',
},
type => 'array',
},
},
title => 'Profile',
type => 'object',
},
# NOTE: schemas -> rating
rating =>
{
description => q{This is the object representing a rating)},
properties =>
{
author =>
{
maxLength => 2048,
type => 'string'
},
date =>
{
description => 'ISO8601 datetime',
type => 'string',
format => 'date-time',
},
# See <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Document/Rating.pm#L12>
details =>
{
properties =>
{
description =>
{
maxLength => 2048,
type => 'string',
},
},
},
distribution =>
{
maxLength => 2048,
type => 'string'
},
helpful =>
{
items =>
{
properties =>
{
user =>
{
maxLength => 2048,
type => 'string'
},
value => { type => 'boolean' },
},
type => 'object',
},
type => 'array',
},
rating => { type => 'number' },
release =>
{
maxLength => 2048,
type => 'string'
},
user =>
{
maxLength => 2048,
type => 'string'
},
},
title => 'Rating',
type => 'object',
},
# NOTE: schemas -> rating_mapping
rating_mapping =>
{
description => q{This is the object representing the availble fields for the [rating object](https://explorer.metacpan.org/?url=/rating/_mapping).},
properties =>
{
schema =>
{
'$ref' => "#/components/schemas/rating",
}
},
title => 'RatingMapping',
type => 'object',
},
# NOTE: schemas -> release
release =>
{
description => q{This is the object representing a release)},
properties =>
{
abstract =>
{
maxLength => 2048,
type => 'string'
},
archive =>
{
maxLength => 2048,
type => 'string'
},
author =>
{
maxLength => 2048,
type => 'string'
},
authorized => { type => 'boolean' },
changes_file =>
{
maxLength => 2048,
type => 'string'
},
checksum_md5 =>
{
maxLength => 2048,
type => 'string'
},
checksum_sha256 =>
{
maxLength => 2048,
type => 'string'
},
date =>
{
description => 'ISO8601 datetime',
type => 'string',
format => 'date-time',
},
dependency =>
{
items =>
{
type => 'object',
properties =>
{
module =>
{
maxLength => 2048,
type => 'string'
},
phase =>
{
maxLength => 2048,
type => 'string'
},
relationship =>
{
maxLength => 2048,
type => 'string'
},
version =>
{
maxLength => 2048,
type => 'string'
},
},
},
type => 'array',
},
deprecated => { type => 'boolean' },
distribution =>
{
maxLength => 2048,
type => 'string'
},
download_url =>
{
maxLength => 2048,
type => 'string'
},
first => { type => 'boolean' },
id =>
{
maxLength => 2048,
type => 'string'
},
license =>
{
items =>
{
# e.g.: perl_5
maxLength => 2048,
type => 'string',
},
type => 'array',
},
main_module =>
{
maxLength => 2048,
type => 'string'
},
maturity =>
{
maxLength => 2048,
type => 'string'
},
metadata =>
{
'$ref' => '#/components/schemas/metadata',
},
name =>
{
maxLength => 2048,
type => 'string'
},
provides =>
{
items =>
{
maxLength => 2048,
type => 'string'
},
type => 'array'
},
# See <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Types/TypeTiny.pm#L74>
resources =>
{
properties =>
{
bugtracker =>
{
properties =>
{
mailto =>
{
maxLength => 2048,
type => 'string'
},
web =>
{
maxLength => 2048,
type => 'string'
},
},
},
homepage =>
{
maxLength => 2048,
type => 'string'
},
license =>
{
items =>
{
maxLength => 2048,
type => 'string',
},
type => 'array',
},
repository =>
{
properties =>
{
type =>
{
maxLength => 2048,
type => 'string'
},
url =>
{
maxLength => 2048,
type => 'string'
},
web =>
{
maxLength => 2048,
type => 'string'
},
},
},
},
},
stat =>
{
properties =>
{
gid => { type => 'number' },
mode => { type => 'integer' },
mtime => { type => 'integer' },
size => { type => 'integer' },
uid => { type => 'number' },
},
},
status =>
{
maxLength => 2048,
type => 'string'
},
tests =>
{
properties =>
{
fail => { type => 'integer' },
na => { type => 'integer' },
pass => { type => 'integer' },
unknown => { type => 'integer' },
},
},
version =>
{
maxLength => 2048,
type => 'string'
},
version_numified => { type => 'number' },
},
title => 'Release',
type => 'object',
},
# NOTE: schemas -> release_recents
release_recents =>
{
description => q{This is the object representing a list of recent releases},
properties =>
{
releases =>
{
items =>
{
properties =>
{
abstract =>
{
type => 'string',
},
author =>
{
type => 'string',
},
date =>
{
type => 'string',
format => 'date-time',
},
distribution =>
{
type => 'string',
},
maturity =>
{
type => 'string',
},
name =>
{
type => 'string',
},
status =>
{
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
total =>
{
type => 'integer',
},
took =>
{
type => 'integer',
},
},
title => 'ReleaseRecents',
type => 'object',
},
# NOTE: schemas -> release_mapping
release_mapping =>
{
description => q{This is the object representing the availble fields for the [release object](https://explorer.metacpan.org/?url=/release/_mapping).},
properties =>
{
schema =>
{
'$ref' => "#/components/schemas/release",
}
},
title => 'ReleaseMapping',
type => 'object',
},
# NOTE: schemas -> releases
releases =>
{
description => q{This is the object representing a list of releases},
properties =>
{
releases =>
{
items =>
{
'$ref' => '#/components/schemas/release',
},
type => 'array',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
title => 'Releases',
type => 'object',
},
# NOTE: schemas -> result_set
result_set =>
{
description => q{This is the object representing a search result set)},
properties =>
{
hits =>
{
properties =>
{
hits =>
{
items =>
{
properties =>
{
_id => { type => 'string' },
_index =>
{
description => "For example: cpan_v1_01",
type => "string",
},
_score => { type => 'number' },
_source =>
{
oneOf => [
{ '$ref' => '#/components/schemas/profile' },
{ '$ref' => '#/components/schemas/distribution' },
{ '$ref' => '#/components/schemas/favorite' },
{ '$ref' => '#/components/schemas/file' },
{ '$ref' => '#/components/schemas/rating' },
{ '$ref' => '#/components/schemas/release' },
],
},
_type =>
{
enum => [qw( author distribution favorite file rating release )],
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
total => { type => 'integer' },
max_score => { type => 'number' },
},
},
_shards =>
{
properties =>
{
total => { type => 'integer' },
successful => { type => 'integer' },
failed => { type => 'integer' },
},
},
took => { type => 'integer' },
timed_out => { type => 'boolean' },
},
title => 'ResultSet',
type => 'object',
},
# NOTE: schemas -> result_web_set
result_web_set =>
{
description => q{This is the object representing a web search result set)},
properties =>
{
collapsed =>
{
type => 'boolean',
},
results =>
{
items =>
{
properties =>
{
distribution =>
{
type => 'string',
},
hits =>
{
items =>
{
abstract =>
{
type => 'string',
},
author =>
{
type => 'string',
},
authorized =>
{
type => 'boolean',
},
date =>
{
type => 'datetime',
},
description =>
{
type => 'string',
},
distribution =>
{
type => 'string',
},
documentation =>
{
type => 'string',
},
favorites =>
{
type => 'integer',
},
id =>
{
type => 'string',
},
'index' =>
{
type => 'boolean',
},
path =>
{
type => 'string',
},
pod_lines =>
{
items =>
{
type => 'integer',
},
type => 'array',
},
release =>
{
type => 'string',
},
score =>
{
type => 'float',
},
status =>
{
type => 'string',
},
},
type => 'array',
},
total =>
{
type => 'integer',
},
},
},
type => 'array',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
},
# NOTE: schemas -> reverse_dependencies
reverse_dependencies =>
{
description => q{This is the object representing a reverse dependencies result set)},
properties =>
{
data =>
{
items =>
{
'$ref' => '#/components/schemas/release',
},
type => 'array',
},
took => { type => 'integer' },
timed_out => { type => 'boolean' },
},
title => 'ReverseDependencies',
type => 'object',
},
# NOTE: schemas -> river
river =>
{
description => q{This is the object representing a distribution river)},
example => '/v1/distribution/river/HTTP-Message',
properties =>
{
river =>
{
properties =>
{
module =>
{
properties =>
{
bus_factor =>
{
type => 'integer',
},
bucket =>
{
type => 'integer',
},
immediate =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
type => 'object',
example => 'HTTP-Message',
},
},
type => 'object'
},
},
title => 'River',
type => 'object',
},
# NOTE: schemas -> scroll
scroll =>
{
description => q{This is the object representing a scroll search follow-on query)},
properties =>
{
scroll =>
{
description => "Specifies the [scroll query time to live](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
type => 'string',
},
size =>
{
description => "Specifies the [scroll page size](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html).",
type => 'integer',
},
scroll_id =>
{
description => "Specifies the [search scroll ID](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html).",
type => 'string',
},
},
required => ["scroll", "scroll_id"],
title => 'Scroll search',
type => 'object',
},
# NOTE: schemas -> scroll_result_set
scroll_result_set =>
{
description => q{This is the object representing a scroll search result set)},
allOf => [
{ '$ref' => '#/components/schemas/result_set' },
{
properties =>
{
_scroll_id =>
{
type => 'string',
},
},
type => 'object',
}
],
title => 'ResultSet',
},
},
},
info =>
{
contact =>
{
email => 'admin@metacpan.org',
name => 'CPAN Administrators',
url => 'https://metacpan.org',
},
description => 'The MetaCPAN REST API. Please see https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md for more details.',
termsOfService => "https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#being-polite",
title => 'MetaCPAN API',
version => '2023-07-27',
},
openapi => '3.0.0',
paths =>
{
# NOTE: /v1/activity
'/v1/activity' =>
{
get =>
{
description => 'Retrieves the release activity for the last 24 months',
example => 'curl https://fastapi.metacpan.org/v1/activity?author=OALDERS&res=1M',
operationId => 'GetActivity',
parameters => [
{
description => 'An optional author ID',
example => 'OALDERS',
in => 'query',
name => 'author',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'An optional distribution name',
example => 'HTTP-Message',
in => 'query',
name => 'distribution',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'An optional module used as a dependency.',
example => 'HTTP::Message',
in => 'query',
name => 'module',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'To show only new distributions',
example => 'n',
in => 'query',
name => 'new_dists',
required => \0,
schema =>
{
enum => [qw( n )],
type => 'string',
},
style => 'simple',
},
{
description => 'The aggregation interval. See [ElasticSearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-range-query.html#_date_format_in_range_queries)',
example => '1M',
in => 'query',
name => 'res',
required => \0,
schema =>
{
enum => [qw( n )],
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
activity =>
{
items =>
{
type => 'integer',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves the release activity for the last 24 months',
example => 'curl https://fastapi.metacpan.org/v1/activity?author=OALDERS&res=1M',
operationId => 'PostActivity',
parameters => [
{
description => 'An optional author ID',
example => 'OALDERS',
in => 'query',
name => 'author',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'An optional distribution name',
example => 'HTTP-Message',
in => 'query',
name => 'distribution',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'An optional module used as a dependency.',
example => 'HTTP::Message',
in => 'query',
name => 'module',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'To show only new distributions',
example => 'n',
in => 'query',
name => 'new_dists',
required => \0,
schema =>
{
enum => [qw( n )],
type => 'string',
},
style => 'simple',
},
{
description => 'The aggregation interval. See [ElasticSearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-range-query.html#_date_format_in_range_queries)',
example => '1M',
in => 'query',
name => 'res',
required => \0,
schema =>
{
enum => [qw( n )],
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
description => 'Although the `POST` method is supported, the API does not recognise JSON payload, but only query string.',
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
activity =>
{
items =>
{
type => 'integer',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/author
'/v1/author' =>
{
get =>
{
description => 'Retrieves authors information details using a simple search.',
example => 'curl https://fastapi.metacpan.org/v1/author?q=OALDERS',
operationId => 'GetAuthor',
parameters => [
{
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'The offset starting from 0 within the total data.',
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => 'The size of each page, i.e. how many results are returned per page. This usually defaults to 10.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves authors information details using a simple search.',
example => q{curl -XPOST https://fastapi.metacpan.org/v1/author -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"query": { "filtered": {
"query": { "match_all":{} },
"filter": {
"and": [
{ "term": { "pauseid": "OALDERS" } }
]
}
}}
}
EOT},
operationId => 'PostAuthor',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/elastic_search',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Author.pm#L45>
# NOTE: /v1/author/by_ids
'/v1/author/by_ids' =>
{
get =>
{
description => 'Retrieves author information details for the specified pause IDs.',
example => 'curl https://fastapi.metacpan.org/v1/author/by_ids?id=OALDERS&id=JDEGUEST',
operationId => 'GetAuthorByPauseID',
parameters => [
{
in => 'query',
name => 'id',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves author information details for the specified pause IDs.',
example => q{curl -XPOST https://fastapi.metacpan.org/v1/author/by_ids -H 'Content-Type: application/json; charset=utf-8' -d '{"id" : ["OALDERS", "JDEGUEST"]}'},
operationId => 'PostAuthorByPauseID',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
id =>
{
maxLength => 2048,
type => 'string',
},
fields =>
{
description => "Specifies which fields in the response should be provided.",
maxLength => 2048,
type => 'string',
},
},
type => 'object',
required => ["id"],
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Author.pm#L64>
# NOTE: /v1/author/by_prefix/{prefix}
'/v1/author/by_prefix/{prefix}' =>
{
get =>
{
description => 'Retrieves authors information details using the initial characters of their pause ID.',
example => q{curl https://fastapi.metacpan.org/v1/author/by_prefix/OAL},
operationId => 'GetAuthorByPrefix',
parameters => [
{
in => 'path',
name => 'prefix',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies from which offset to return the results.",
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer'
},
},
{
description => "Specifies the maximum size of the results.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer'
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves authors information details using the initial characters of their pause ID.',
example => q{curl -XPOST https://fastapi.metacpan.org/v1/author/by_prefix/O?from=40&size=20'},
operationId => 'PostAuthorByPrefix',
parameters => [
{
in => 'path',
name => 'prefix',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies from which offset to return the results.",
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer'
},
},
{
description => "Specifies the maximum size of the results.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer'
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Author.pm#L57>
# NOTE: /v1/author/by_user
'/v1/author/by_user' =>
{
get =>
{
description => 'Retrieves authors information details using their user ID.',
example => 'curl https://fastapi.metacpan.org/v1/author/by_user?user=oa-cmsLWTTOALauLxve1LA&user=2n2yGvQ4QxenVpSzkkTitQ',
operationId => 'GetAuthorByUserIDQuery',
parameters => [
{
in => 'query',
name => 'user',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves authors information details using their user ID.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/author/by_user -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"user" : [
"oa-cmsLWTTOALauLxve1LA",
"2n2yGvQ4QxenVpSzkkTitQ"
]
}
EOT},
operationId => 'PostAuthorByUserIDQuery',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
user =>
{
description => 'This is the user id, which is different from the PAUSEID',
maxLength => 2048,
type => 'string',
},
fields =>
{
description => "Specifies which fields in the response should be provided.",
maxLength => 2048,
type => 'string',
},
},
type => 'object',
required => ["user"],
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Author.pm#L51>
# NOTE: /v1/author/by_user/{user}
'/v1/author/by_user/{user}' =>
{
get =>
{
description => 'Retrieves a author information details using his or her user ID.',
example => 'curl https://fastapi.metacpan.org/v1/author/by_user/FepgBJBZQ8u92eG_TcyIGQ',
operationId => 'GetAuthorByUserID',
parameters => [
{
description => 'This is the user id, which is different from the PAUSEID',
in => 'path',
name => 'user',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a author information details using his or her user ID.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/author/by_user/FepgBJBZQ8u92eG_TcyIGQ',
operationId => 'PostAuthorByUserID',
parameters => [
{
description => 'This is the user id, which is different from the PAUSEID',
in => 'path',
name => 'user',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/author/{author}
'/v1/author/{author}' =>
{
get =>
{
description => 'Retrieves an author information details.',
example => 'curl https://fastapi.metacpan.org/v1/author/OALDERS?join=release',
operationId => 'GetAuthorProfile',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
in => 'query',
name => 'join',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/profile",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves an author information details.',
example => q{curl -XPOST https://fastapi.metacpan.org/v1/author/OALDERS},
operationId => 'PostAuthorProfile',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result. Even for the POST method, a query string is required.",
in => 'query',
name => 'join',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/profile",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/author/_mapping
'/v1/author/_mapping' =>
{
get =>
{
description => qq{Returns the available fields for the [author object](https://explorer.metacpan.org/?url=/author/_mapping).},
example => q{curl https://fastapi.metacpan.org/v1/author/_mapping},
operationId => 'GetAuthorMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/author_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the available fields for the [author object](https://explorer.metacpan.org/?url=/author/_mapping).},
example => q{curl -XPOST https://fastapi.metacpan.org/v1/author/_mapping},
operationId => 'PostAuthorMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/author_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/author/_search
'/v1/author/_search' =>
{
get =>
{
description => qq{Returns the result set for the author search.},
example => q{curl https://fastapi.metacpan.org/v1/author/_search?from=10&q=Tokyo&size=10},
operationId => 'GetAuthorSearch',
parameters => [
{
description => "Specifies the [search query](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches).",
in => 'query',
name => 'q',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the offset from which to return results.",
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the time to live of the [scroll search](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
in => 'query',
name => 'scroll',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the maximum number of [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result elements.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the author search.},
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/author/_search -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"query" : {
"filtered" : {
"filter" : {
"and" : [
{
"term" : {
"city" : "Tokyo"
}
}
]
},
"query" : {
"match_all" : {}
}
}
}
}
EOT},
operationId => 'PostAuthorSearch',
parameters => [
{
description => "Specifies the time to live of the [scroll search](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
in => 'query',
name => 'scroll',
required => \0,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/elastic_search',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/author/_search/scroll
'/v1/author/_search/scroll' =>
{
'delete' =>
{
description => qq{Clear a [scroll](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/paginate-search-results.html#clear-scroll)},
operationId => 'DeleteAuthorSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
oneOf => [
{
properties =>
{
scroll_id =>
{
type => 'string',
},
},
},
{
properties =>
{
scroll_id =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
},
],
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
type => 'object',
properties =>
{
# TODO: Need to find out what is returned upon clearing a scroll
removed =>
{
type => 'boolean',
}
}
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
get =>
{
description => qq{Returns the result set for the author search.},
operationId => 'GetAuthorSearchScroll',
parameters => [
{
description => "Specifies the time to live of the [scroll search](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
in => 'query',
name => 'scroll',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the [scroll ID](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html).",
in => 'query',
name => 'scroll_id',
required => \1,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the author search.},
operationId => 'PostAuthorSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/scroll',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Changes.pm#L68>
# NOTE: /v1/changes/by_releases
'/v1/changes/by_releases' =>
{
get =>
{
description => 'Retrieves one or more distribution Changes file details using author and release information.',
example => 'curl https://fastapi.metacpan.org/v1/changes/by_releases?release=OALDERS%2FHTTP-Message-6.37&release=JDEGUEST%2FModule-Generic-v0.30.1',
operationId => 'GetChangesFileByRelease',
parameters => [
{
in => 'query',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
description => 'One or more releases information.',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
changes =>
{
items =>
{
properties =>
{
author =>
{
description => 'This is CPAN Pause ID.',
example => 'JOHNDOE',
type => 'string',
},
changes_file =>
{
description => 'This is the change file name, such as Changes or CHANGES.',
type => 'string',
},
changes_text =>
{
description => 'This contaisn the content of the release change file.',
type => 'string',
},
release =>
{
example => 'Foo-Bar-1.2345',
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves one or more distribution Changes file details using author and release information.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/changes/by_releases -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"release" : [
"OALDERS/HTTP-Message-6.37",
"JDEGUEST/Module-Generic-v0.30.1"
]
}
EOT},
operationId => 'PostChangesFileByRelease',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
release =>
{
description => 'One mor more releases information',
example => '{"release":"OALDERS/HTTP-Message-6.37"} or {"release":["OALDERS/HTTP-Message-6.37","Module-Generic-v0.30.1"]}',
maxLength => 2048,
type => 'string',
},
},
required => ["release"],
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
changes =>
{
items =>
{
properties =>
{
author =>
{
description => 'This is CPAN Pause ID.',
example => 'JOHNDOE',
type => 'string',
},
changes_file =>
{
description => 'This is the change file name, such as Changes or CHANGES.',
type => 'string',
},
changes_text =>
{
description => 'This contaisn the content of the release change file.',
type => 'string',
},
release =>
{
example => 'Foo-Bar-1.2345',
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Changes.pm#L55>
# NOTE: /v1/changes/{distribution}
'/v1/changes/{distribution}' =>
{
get =>
{
description => 'Retrieves a Changes file details based on the latest release of the specified distribution.',
operationId => 'GetChangesFile',
example => 'curl https://fastapi.metacpan.org/v1/changes/HTTP-Message',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/changes",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a Changes file details based on the latest release of the specified distribution.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/changes/HTTP-Message',
operationId => 'PostChangesFile',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/changes",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/changes/{author}/{release}
'/v1/changes/{author}/{release}' =>
{
get =>
{
description => 'Retrieves a Changes file details based on the specified release.',
operationId => 'GetChangesFileAuthor',
example => 'curl https://fastapi.metacpan.org/v1/changes/OALDERS/HTTP-Message-6.36',
parameters => [
{
example => 'JDEGUEST',
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
example => 'Nice-Try-v1.3.4',
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/changes",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a Changes file details based on the specified release.',
operationId => 'PostChangesFileAuthor',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/changes/OALDERS/HTTP-Message-6.36',
parameters => [
{
example => 'JDEGUEST',
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
example => 'Nice-Try-v1.3.4',
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/changes",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Contributor.pm#L19>
# NOTE: /v1/contributor/by_pauseid/{author}
'/v1/contributor/by_pauseid/{author}' =>
{
get =>
{
description => 'Retrieves a list of module contributed to by the specified Pause ID.',
example => 'curl https://fastapi.metacpan.org/v1/contributor/by_pauseid/OALDERS',
operationId => 'GetModuleContributedByPauseID',
parameters => [
{
description => 'The author or Pause ID is an all uppercase ID, such as OALDERS',
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
contributors =>
{
items =>
{
properties =>
{
distribution =>
{
type => 'string',
},
pauseid =>
{
type => 'string',
},
release_author =>
{
type => 'string',
},
release_name =>
{
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a list of module contributed to by the specified Pause ID.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/contributor/by_pauseid/OALDERS',
operationId => 'PostModuleContributedByPauseID',
parameters => [
{
description => 'The author or Pause ID is an all uppercase ID, such as OALDERS',
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
contributors =>
{
items =>
{
properties =>
{
distribution =>
{
type => 'string',
},
pauseid =>
{
type => 'string',
},
release_author =>
{
type => 'string',
},
release_name =>
{
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Contributor.pm#L13>
# NOTE: /v1/contributor/{author}/{release}
'/v1/contributor/{author}/{release}' =>
{
get =>
{
description => 'Retrieves a list of release contributors details.',
example => 'curl https://fastapi.metacpan.org/v1/contributor/OALDERS/HTTP-Message-6.37',
operationId => 'GetModuleContributors',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
contributors =>
{
items =>
{
properties =>
{
distribution =>
{
type => 'string',
},
pauseid =>
{
type => 'string',
},
release_author =>
{
type => 'string',
},
release_name =>
{
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a list of release contributors details.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/contributor/OALDERS/HTTP-Message-6.37',
operationId => 'PostModuleContributors',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
contributors =>
{
items =>
{
properties =>
{
distribution =>
{
type => 'string',
},
pauseid =>
{
type => 'string',
},
release_author =>
{
type => 'string',
},
release_name =>
{
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/contributor/_mapping
'/v1/contributor/_mapping' =>
{
get =>
{
description => qq{Returns the available fields for the [contributor object](https://explorer.metacpan.org/?url=/contributor/_mapping).},
example => 'curl https://fastapi.metacpan.org/v1/contributor/_mapping',
operationId => 'GetContributorMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/contributor_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the available fields for the [contributor object](https://explorer.metacpan.org/?url=/contributor/_mapping).},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/contributor/_mapping',
operationId => 'PostContributorMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/contributor_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Changes.pm#L23>
# NOTE: /v1/cover/{release}
'/v1/cover/{release}' =>
{
get =>
{
description => 'Retrieves a module cover details.',
operationId => 'GetModuleCover',
example => 'curl https://fastapi.metacpan.org/v1/cover/HTTP-Message-6.37',
parameters => [
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/cover",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a module cover details.',
operationId => 'PostModuleCover',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/cover/HTTP-Message-6.37',
parameters => [
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/cover",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/CVE.pm#L24>
# NOTE: /v1/cve
'/v1/cve' =>
{
get =>
{
description => 'Retrieves CVE (Common Vulnerabilities & Exposures) information details. See [the source information](https://hackeriet.github.io/cpansa-feed/cpansa.json)',
example => 'curl https://fastapi.metacpan.org/v1/cve',
operationId => 'GetCVE',
parameters => [
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves CVE (Common Vulnerabilities & Exposures) information details. See [the source information](https://hackeriet.github.io/cpansa-feed/cpansa.json)',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/cve',
operationId => 'PostCVE',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
fields =>
{
description => "Specifies which fields in the response should be provided.",
maxLength => 2048,
type => 'string'
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/CVE.pm#L24>
# NOTE: /v1/cve/dist/{distribution}
'/v1/cve/dist/{distribution}' =>
{
get =>
{
description => 'Retrieves Distribution CVE (Common Vulnerabilities & Exposures) information details. See [the source information](https://hackeriet.github.io/cpansa-feed/cpansa.json)',
example => 'curl https://fastapi.metacpan.org/v1/cve/dist/HTTP-Message',
operationId => 'GetCVEByDistribution',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies the release version.",
in => 'query',
name => 'version',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \1,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves Distribution CVE (Common Vulnerabilities & Exposures) information details. See [the source information](https://hackeriet.github.io/cpansa-feed/cpansa.json)',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/cve/dist/HTTP-Message',
operationId => 'PostCVEByDistribution',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \1,
properties =>
{
fields =>
{
description => "Specifies which fields in the response should be provided.",
maxLength => 2048,
type => 'string'
},
version =>
{
maxLength => 2048,
type => 'string'
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/CVE.pm#L18>
# NOTE: /v1/cve/release/{author}/{release}
'/v1/cve/release/{author}/{release}' =>
{
get =>
{
description => 'Retrieves Release CVE (Common Vulnerabilities & Exposures) information details. See [the source information](https://hackeriet.github.io/cpansa-feed/cpansa.json)',
example => 'curl https://fastapi.metacpan.org/v1/cve/release/OALDERS/HTTP-Message-6.36',
operationId => 'GetCVEByAuthorRelease',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves Release CVE (Common Vulnerabilities & Exposures) information details. See [the source information](https://hackeriet.github.io/cpansa-feed/cpansa.json)',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/cve/release/OALDERS/HTTP-Message-6.36',
operationId => 'PostCVEByAuthorRelease',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
fields =>
{
description => "Specifies which fields in the response should be provided.",
maxLength => 2048,
type => 'string'
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/CVE.pm#L18>
# NOTE: /v1/cve/{cpanid}
'/v1/cve/{cpanid}' =>
{
get =>
{
description => 'Retrieves CPAN ID CVE (Common Vulnerabilities & Exposures) information details. See [the source information](https://hackeriet.github.io/cpansa-feed/cpansa.json)',
example => 'curl https://fastapi.metacpan.org/v1/cve/OALDERS',
operationId => 'GetCVEByCpanID',
parameters => [
{
in => 'path',
name => 'cpanid',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves CPAN ID CVE (Common Vulnerabilities & Exposures) information details. See [the source information](https://hackeriet.github.io/cpansa-feed/cpansa.json)',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/cve/OALDERS',
operationId => 'PostCVEByCpanID',
parameters => [
{
in => 'path',
name => 'cpanid',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
fields =>
{
description => "Specifies which fields in the response should be provided.",
maxLength => 2048,
type => 'string'
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Diff.pm#L19>
# NOTE: /v1/diff/release/{distribution}
'/v1/diff/release/{distribution}' =>
{
get =>
{
description => 'Retrieves a diff of the latest release and its previous version.',
example => 'curl https://fastapi.metacpan.org/v1/diff/release/HTTP-Message',
operationId => 'GetReleaseDiff',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
# See also: <https://metacpan.org/pod/Catalyst::TraitFor::Request::REST#accepted_content_types>
description => 'This influences the output rendered by the API. You can also use the `HTTP` headers `Accept` or `Content-Type`.',
in => 'query',
name => 'content-type',
required => \0,
schema =>
{
enum => [qw( application/json text/plain )],
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/diff',
},
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a diff of the latest release and its previous version.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/diff/release/HTTP-Message',
operationId => 'PostReleaseDiff',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
# See also: <https://metacpan.org/pod/Catalyst::TraitFor::Request::REST#accepted_content_types>
description => 'This influences the output rendered by the API. You can also use the `HTTP` headers `Accept` or `Content-Type`.',
in => 'query',
name => 'content-type',
required => \0,
schema =>
{
enum => [qw( application/json text/plain )],
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/diff',
},
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Diff.pm#L19>
# NOTE: /v1/diff/release/{author1}/{release1}/{author2}/{release2}
'/v1/diff/release/{author1}/{release1}/{author2}/{release2}' =>
{
get =>
{
description => 'Retrieves a diff of two releases.',
operationId => 'Get2ReleasesDiff',
example => 'curl https://fastapi.metacpan.org/v1/diff/release/OALDERS/HTTP-Message-6.35/OALDERS/HTTP-Message-6.36',
parameters => [
{
in => 'path',
name => 'author1',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release1',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'author2',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release2',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
# See also: <https://metacpan.org/pod/Catalyst::TraitFor::Request::REST#accepted_content_types>
description => 'This influences the output rendered by the API. You can also use the `HTTP` headers `Accept` or `Content-Type`.',
in => 'query',
name => 'content-type',
required => \0,
schema =>
{
enum => [qw( application/json text/plain )],
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/diff',
},
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a diff of two releases.',
operationId => 'Post2ReleasesDiff',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/diff/release/OALDERS/HTTP-Message-6.35/OALDERS/HTTP-Message-6.36',
parameters => [
{
in => 'path',
name => 'author1',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release1',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'author2',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release2',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
# See also: <https://metacpan.org/pod/Catalyst::TraitFor::Request::REST#accepted_content_types>
description => 'This influences the output rendered by the API. You can also use the `HTTP` headers `Accept` or `Content-Type`.',
in => 'query',
name => 'content-type',
required => \0,
schema =>
{
enum => [qw( application/json text/plain )],
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/diff',
},
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Diff.pm#L49C7-L49C73>
# NOTE: /v1/diff/file/{file1}/{file2}
'/v1/diff/file/{file1}/{file2}' =>
{
get =>
{
description => 'Retrieves a diff of two files.',
operationId => 'Get2FilesDiff',
example => 'curl https://fastapi.metacpan.org/v1/diff/file/AcREzFgg3ExIrFTURa0QJfn8nto/Ies7Ysw0GjCxUU6Wj_WzI9s8ysU',
parameters => [
{
in => 'path',
name => 'file1',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'file2',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
# See also: <https://metacpan.org/pod/Catalyst::TraitFor::Request::REST#accepted_content_types>
description => 'This influences the output rendered by the API. You can also use the `HTTP` headers `Accept` or `Content-Type`.',
in => 'query',
name => 'content-type',
required => \0,
schema =>
{
enum => [qw( application/json text/plain )],
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/diff',
},
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a diff of two files.',
operationId => 'Post2FilesDiff',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/diff/file/AcREzFgg3ExIrFTURa0QJfn8nto/Ies7Ysw0GjCxUU6Wj_WzI9s8ysU',
parameters => [
{
in => 'path',
name => 'file1',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'file2',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
# See also: <https://metacpan.org/pod/Catalyst::TraitFor::Request::REST#accepted_content_types>
description => 'This influences the output rendered by the API. You can also use the `HTTP` headers `Accept` or `Content-Type`.',
in => 'query',
name => 'content-type',
required => \0,
schema =>
{
enum => [qw( application/json text/plain )],
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/diff',
},
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/distribution
'/v1/distribution' =>
{
get =>
{
description => 'Retrieves distributions information details.',
example => 'curl https://fastapi.metacpan.org/v1/distribution?from=10&q=HTTP&size=10',
operationId => 'GetDistribution',
parameters => [
{
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'The offset starting from 0 within the total data.',
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => 'The size of each page, i.e. how many results are returned per page. This usually defaults to 10.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves distributions information details.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/distribution -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"query" : {
"regexp" : {
"name" : "HTTP.*"
}
}
}
EOT},
operationId => 'PostDistribution',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
maxLength => 2048,
type => 'string',
},
from =>
{
type => 'integer',
},
size =>
{
type => 'integer',
},
fields =>
{
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/distribution/{distribution}
'/v1/distribution/{distribution}' =>
{
get =>
{
description => 'Retrieves the specified distribution latest release information.',
example => 'curl https://fastapi.metacpan.org/v1/distribution/HTTP-Message',
operationId => 'GetModuleDistribution',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/distribution",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves the specified distribution latest release information.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/distribution/HTTP-Message',
operationId => 'PostModuleDistribution',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/distribution",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Distribution.pm#L18>
# NOTE: /v1/distribution/river
'/v1/distribution/river' =>
{
get =>
{
description => 'Returns the river of specified distributions',
operationId => 'GetModuleDistributionRiverWithQuery',
example => 'curl https://fastapi.metacpan.org/v1/distribution/river?distribution=HTTP-Message&distribution=Module-Generic',
parameters => [
{
description => "Specifies one or more distributions to get the river data.",
in => 'query',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/river",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Returns the river of specified distributions',
operationId => 'PostModuleDistributionRiverWithJSON',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/distribution/river -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"distribution" : [
"HTTP-Message",
"Module-Generic"
]
}
EOT},
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
distribution =>
{
maxLength => 2048,
type => 'string'
},
},
required => ["distribution"],
type => 'object'
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/river",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Distribution.pm#L13>
# NOTE: /v1/distribution/river/{distribution}
'/v1/distribution/river/{distribution}' =>
{
get =>
{
description => 'Returns the river of a specific distribution.',
operationId => 'GetModuleDistributionRiverWithParam',
example => 'curl https://fastapi.metacpan.org/v1/distribution/river/HTTP-Message',
parameters => [
{
description => 'Distribution name',
example => 'HTTP-Message',
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/river",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Returns the river of a specific distribution.',
operationId => 'PostModuleDistributionRiverWithParam',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/distribution/river/HTTP-Message',
parameters => [
{
description => 'Distribution name',
example => 'HTTP-Message',
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/river",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/distribution/_mapping
'/v1/distribution/_mapping' =>
{
get =>
{
description => qq{Returns the available fields for the [distribution object](https://explorer.metacpan.org/?url=/distribution/_mapping).},
example => 'curl https://fastapi.metacpan.org/v1/distribution/_mapping',
operationId => 'GetDistributionMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/distribution_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the available fields for the [distribution object](https://explorer.metacpan.org/?url=/distribution/_mapping).},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/distribution/_mapping',
operationId => 'PostDistributionMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/distribution_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/distribution/_search
'/v1/distribution/_search' =>
{
get =>
{
description => qq{Returns the result set for the distribution search.},
example => 'curl https://fastapi.metacpan.org/v1/distribution/_search?q=HTTP.*&size=10',
operationId => 'GetDistributionSearch',
parameters => [
{
description => "Specifies the [search query](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches).",
in => 'query',
name => 'q',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the maximum number of [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result elements.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the distribution search.},
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/distribution/_search -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"query" : {
"regexp" : {
"name" : "HTTP.*"
}
}
}
EOT},
operationId => 'PostDistributionSearch',
parameters => [
{
in => 'query',
name => 'query',
required => \1,
schema =>
{
type => 'string',
}
},
{
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
}
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/elastic_search',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/distribution/_search/scroll
'/v1/distribution/_search/scroll' =>
{
'delete' =>
{
description => qq{Clear a [scroll](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/paginate-search-results.html#clear-scroll)},
operationId => 'DeleteDistributionSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
oneOf => [
{
properties =>
{
scroll_id =>
{
type => 'string',
},
},
},
{
properties =>
{
scroll_id =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
},
],
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
type => 'object',
properties =>
{
# TODO: Need to find out what is returned upon clearing a scroll
removed =>
{
type => 'boolean',
}
}
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
get =>
{
description => qq{Returns the result set for the scroll search.},
operationId => 'GetDistributionSearchScroll',
parameters => [
{
description => "Specifies the time to live of the [scroll search](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
in => 'query',
name => 'scroll',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the [scroll ID](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html).",
in => 'query',
name => 'scroll_id',
required => \1,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the author search.},
operationId => 'PostDistributionSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/scroll',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/download_url/{module}
'/v1/download_url/{module}' =>
{
get =>
{
description => qq{Retrieves a download URL for a given module.\nThe `/download_url` endpoint exists specifically for the `cpanm` client. It takes a module name with an optional version (or range of versions) and an optional `dev` flag (for development releases) and returns a `download_url` as well as some other helpful info.\n\nObviously anyone can use this endpoint, but we'll only consider changes to this endpoint after considering how `cpanm` might be affected.},
example => 'curl https://fastapi.metacpan.org/v1/download_url/HTTP::Message',
operationId => 'GetDownloadURL',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/download_url",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Retrieves a download URL for a given module.\nThe `/download_url` endpoint exists specifically for the `cpanm` client. It takes a module name with an optional version (or range of versions) and an optional `dev` flag (for development releases) and returns a `download_url` as well as some other helpful info.\n\nObviously anyone can use this endpoint, but we'll only consider changes to this endpoint after considering how `cpanm` might be affected.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/download_url/HTTP::Message',
operationId => 'PostDownloadURL',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/download_url",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/favorite
'/v1/favorite' =>
{
get =>
{
description => 'Retrieves favorites information details.',
example => 'curl https://fastapi.metacpan.org/v1/favorite?q=HTTP&size=10',
operationId => 'GetFavorite',
parameters => [
{
example => '/v1/favorite?q=distribution:HTTP-Message',
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'The offset starting from 0 within the total data.',
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => 'The size of each page, i.e. how many results are returned per page. This usually defaults to 10.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves favorites information details.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/favorite -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"query" : {
"regexp" : {
"release" : "HTTP.*"
}
}
}
EOT},
operationId => 'PostFavorite',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
example => '{"q": "distribution:HTTP-Message"}',
maxLength => 2048,
type => 'string',
},
from =>
{
type => 'integer',
},
size =>
{
type => 'integer',
},
fields =>
{
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Favorite.pm#L13>
# NOTE: /v1/favorite/{user}/{distribution}
'/v1/favorite/{user}/{distribution}' =>
{
get =>
{
description => 'Retrieves favorites information details for a specific distribution.',
operationId => 'GetFavoriteByUserModule',
example => 'curl https://fastapi.metacpan.org/v1/favorite/q_15sjOkRminDY93g9DuZQ/DBI',
parameters => [
{
in => 'path',
name => 'user',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorite",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves favorites information details for a specific distribution.',
operationId => 'PostFavoriteByUserModule',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/favorite/q_15sjOkRminDY93g9DuZQ/DBI',
parameters => [
{
in => 'path',
name => 'user',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorite",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Favorite.pm#L56C34-L56C54>
# NOTE: /v1/favorite/agg_by_distributions
'/v1/favorite/agg_by_distributions' =>
{
get =>
{
description => 'Retrieves favorites agregate by distributions.',
operationId => 'GetFavoriteAggregateDistribution',
example => 'curl https://fastapi.metacpan.org/v1/favorite/agg_by_distributions?distribution=HTTP-Message&distribution=DBI',
parameters => [
{
description => "Specifies the distribution to get the favorites.",
example => 'Nice-Try',
in => 'query',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string'
},
},
{
description => "Specifies the user to get the favorites.",
example => 'AhTh1sISr3eA11yW3e1rd',
in => 'query',
name => 'user',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
favorites =>
{
example => 'Nice:;Try',
module =>
{
type => 'integer',
},
type => 'object',
},
myfavorites =>
{
module =>
{
type => 'integer',
},
type => 'object',
},
took =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
properties =>
{
users =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves favorites agregate by distributions using JSON parameters.',
operationId => 'PostFavoriteAggregateDistribution',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/favorite/agg_by_distributions -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"distribution" : [
"HTTP-Message",
"DBI"
]
}
EOT},
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
distribution =>
{
description => "Specifies the distribution to get the favorites.",
example => 'Nice-Try',
type => 'string',
required => \1,
},
user =>
{
description => "Specifies the user to get the favorites.",
example => 'AhTh1sISr3eA11yW3e1rd',
type => 'string',
},
},
type => 'object'
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
favorites =>
{
example => 'Nice:;Try',
module =>
{
type => 'integer',
},
type => 'object',
},
myfavorites =>
{
module =>
{
type => 'integer',
},
type => 'object',
},
took =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
properties =>
{
users =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Favorite.pm#L29>
# NOTE: /v1/favorite/by_user/{user}
'/v1/favorite/by_user/{user}' =>
{
get =>
{
description => 'Retrieves user favorites information details.',
operationId => 'GetFavoriteByUser',
example => 'curl https://fastapi.metacpan.org/v1/favorite/by_user/q_15sjOkRminDY93g9DuZQ',
# XXX There is presumably an optional 'size' parmeter, but it is not working. When specifying 5, it returns 3. When specifying 10, it returns 7. POSTing it as JSON does not work.
parameters => [
{
in => 'path',
name => 'user',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorites",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves user favorites information details.',
operationId => 'PostFavoriteByUser',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/favorite/by_user/q_15sjOkRminDY93g9DuZQ',
# XXX There is presumably an optional 'size' parmeter, but it is not working. When specifying 5, it returns 3. When specifying 10, it returns 7. POSTing it as JSON does not work.
parameters => [
{
in => 'path',
name => 'user',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorites",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Favorite.pm#L51C25-L51C36leaderboard>
# NOTE: /v1/favorite/leaderboard
'/v1/favorite/leaderboard' =>
{
get =>
{
description => 'Retrieves top favorite distributions (leaderboard).',
operationId => 'GetFavoriteLeaderboard',
example => 'curl https://fastapi.metacpan.org/v1/favorite/leaderboard',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
leaderboard =>
{
items =>
{
properties =>
{
doc_count =>
{
type => 'integer',
},
key =>
{
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
properties =>
{
users =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves top favorite distributions (leaderboard).',
operationId => 'PostFavoriteLeaderboard',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/favorite/leaderboard',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
leaderboard =>
{
items =>
{
properties =>
{
doc_count =>
{
type => 'integer',
},
key =>
{
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
properties =>
{
users =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/favorite/recent
'/v1/favorite/recent' =>
{
get =>
{
description => 'Retrieves list of recent favorite distributions.',
example => 'curl https://fastapi.metacpan.org/v1/favorite/recent?page=10&size=10',
operationId => 'GetFavoriteRecent',
parameters => [
{
description => "Specifies the page offset starting from 1.",
in => 'query',
name => 'page',
required => \0,
schema =>
{
type => 'integer'
},
},
{
description => "Specifies the size of the result page.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorites",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
properties =>
{
users =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves list of recent favorite distributions.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/favorite/recent -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"page" : 10,
"size" : 10
}
EOT},
operationId => 'PostFavoriteRecent',
parameters => [
{
description => "Specifies the page offset starting from 1.",
in => 'query',
name => 'page',
required => \0,
schema =>
{
type => 'integer'
},
},
{
description => "Specifies the size of the result page.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorites",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
properties =>
{
users =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Favorite.pm#L35C35-L35C56>
# NOTE: /v1/favorite/users_by_distribution/{distribution}
'/v1/favorite/users_by_distribution/{distribution}' =>
{
get =>
{
description => 'Retrieves list of users who favorited a distribution.',
operationId => 'GetFavoriteUsers',
example => 'curl https://fastapi.metacpan.org/v1/favorite/users_by_distribution/HTTP-Message',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorites",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
properties =>
{
users =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves list of users who favorited a distribution.',
operationId => 'PostFavoriteUsers',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/favorite/users_by_distribution/HTTP-Message',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorites",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
properties =>
{
users =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/favorite/_mapping
'/v1/favorite/_mapping' =>
{
get =>
{
description => qq{Returns the available fields for the [favorite object](https://explorer.metacpan.org/?url=/favorite/_mapping).},
operationId => 'GetFavoriteMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorite_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the available fields for the [favorite object](https://explorer.metacpan.org/?url=/favorite/_mapping).},
operationId => 'PostFavoriteMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/favorite_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/favorite/_search
'/v1/favorite/_search' =>
{
get =>
{
description => qq{Returns the result set for the favorite search.},
example => 'curl https://fastapi.metacpan.org/v1/favorite/_search?from=40&q=HTTP&size=20',
operationId => 'GetFavoriteSearch',
parameters => [
{
description => "Specifies the [search query](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches).",
in => 'query',
name => 'q',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the maximum number of [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result elements.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the favorite search.},
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/favorite/_search -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"distribution" : "HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostFavoriteSearch',
parameters => [
{
in => 'query',
name => 'query',
required => \1,
schema =>
{
type => 'string',
},
},
{
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/elastic_search',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/favorite/_search/scroll
'/v1/favorite/_search/scroll' =>
{
'delete' =>
{
description => qq{Clear a [scroll](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/paginate-search-results.html#clear-scroll)},
operationId => 'DeleteFavoriteSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
oneOf => [
{
properties =>
{
scroll_id =>
{
type => 'string',
},
},
},
{
properties =>
{
scroll_id =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
},
],
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
type => 'object',
properties =>
{
# TODO: Need to find out what is returned upon clearing a scroll
removed =>
{
type => 'boolean',
}
}
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
get =>
{
description => qq{Returns the result set for the favorite search.},
operationId => 'GetFavoriteSearchScroll',
parameters => [
{
description => "Specifies the time to live of the [scroll search](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
in => 'query',
name => 'scroll',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the [scroll ID](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html).",
in => 'query',
name => 'scroll_id',
required => \1,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the favorite search.},
operationId => 'PostFavoriteSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/scroll',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/file
'/v1/file' =>
{
get =>
{
description => 'Queries files information details using simple search.',
example => 'curl https://fastapi.metacpan.org/v1/file?from=40&q=HTTP&size=20',
operationId => 'GetFile',
parameters => [
{
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'The offset starting from 0 within the total data.',
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => 'The size of each page, i.e. how many results are returned per page. This usually defaults to 10.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Queries files information details using ElasticSearch format.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/file -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"release" : "HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostFile',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
maxLength => 2048,
type => 'string',
},
from =>
{
type => 'integer',
},
size =>
{
type => 'integer',
},
fields =>
{
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/File.pm#L31>
# NOTE: /v1/file/{author}/{release}/{path}
'/v1/file/{author}/{release}/{path}' =>
{
get =>
{
description => 'Retrieves a file information details specified by its release and file path.',
operationId => 'GetFileByAuthorReleaseFilePath',
example => 'curl https://fastapi.metacpan.org/v1/file/OALDERS/HTTP-Message-6.36/lib/HTTP/Message.pm',
parameters => [
{
description => 'The author or Pause ID is an all uppercase ID, such as OALDERS',
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'A distribution name.',
example => 'HTTP-Message-6.36',
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/file",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a file information details specified by its release and file path.',
operationId => 'PostFileByAuthorReleaseFilePath',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/file/OALDERS/HTTP-Message-6.36/lib/HTTP/Message.pm',
parameters => [
{
description => 'The author or Pause ID is an all uppercase ID, such as OALDERS',
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'A distribution name.',
example => 'HTTP-Message-6.36',
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/file",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/File.pm#L50>
# NOTE: /v1/file/dir/{path}
'/v1/file/dir/{path}' =>
{
get =>
{
description => 'Retrieves a specific release directory content.',
example => 'curl https://fastapi.metacpan.org/v1/file/dir/OALDERS/HTTP-Message-6.36/lib/HTTP',
operationId => 'GetFilePathDirectoryContent',
parameters => [
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
dir =>
{
items =>
{
'$ref' => "#/components/schemas/file_preview",
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves a specific release directory content.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/file/dir/OALDERS/HTTP-Message-6.36/lib/HTTP',
operationId => 'PostFilePathDirectoryContent',
parameters => [
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
dir =>
{
items =>
{
'$ref' => "#/components/schemas/file_preview",
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/file/_mapping
'/v1/file/_mapping' =>
{
get =>
{
description => qq{Returns the available fields for the [file object](https://explorer.metacpan.org/?url=/file/_mapping).},
operationId => 'GetFileMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/file_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the available fields for the [file object](https://explorer.metacpan.org/?url=/file/_mapping).},
operationId => 'PostFileMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/file_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/file/_search
'/v1/file/_search' =>
{
get =>
{
description => qq{Returns the result set for the file search.},
example => 'curl https://fastapi.metacpan.org/v1/file/_search?from=40&q=HTTP&size=20',
operationId => 'GetFileSearch',
parameters => [
{
description => "Specifies the [search query](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches).",
in => 'query',
name => 'q',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the maximum number of [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result elements.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the file search.},
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/file/_search -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"path" : ".*HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostFileSearch',
parameters => [
{
in => 'query',
name => 'query',
required => \1,
schema =>
{
type => 'string',
},
},
{
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/elastic_search',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/file/_search/scroll
'/v1/file/_search/scroll' =>
{
'delete' =>
{
description => qq{Clear a [scroll](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/paginate-search-results.html#clear-scroll)},
operationId => 'DeleteFileSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
oneOf => [
{
properties =>
{
scroll_id =>
{
type => 'string',
},
},
},
{
properties =>
{
scroll_id =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
},
],
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
type => 'object',
properties =>
{
# TODO: Need to find out what is returned upon clearing a scroll
removed =>
{
type => 'boolean',
}
}
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
get =>
{
description => qq{Returns the result set for the file search.},
operationId => 'GetFileSearchScroll',
parameters => [
{
description => "Specifies the time to live of the [scroll search](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
in => 'query',
name => 'scroll',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the [scroll ID](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html).",
in => 'query',
name => 'scroll_id',
required => \1,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the file search.},
operationId => 'PostFileSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/scroll',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/login/index
'/v1/login/index' =>
{
get =>
{
description => 'Returns a login HTML page.',
example => 'curl https://fastapi.metacpan.org/v1/login/index',
operationId => 'GetLoginPage',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/html' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Returns a login HTML page.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/login/index',
operationId => 'PostLoginPage',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/html' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/mirror
'/v1/mirror' =>
{
get =>
{
description => qq{Returns a `mirrors` object containing a list of `mirror` objects. Currently, the API only returns one mirror, because CPAN now uses CDN instead of mirrors.},
example => 'curl https://fastapi.metacpan.org/v1/mirror',
operationId => 'GetMirror',
parameters => [
{
description => "Specifies an optional keyword to find the matching mirrors.",
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/mirrors",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns a `mirrors` object containing a list of `mirror` objects. Currently, the API only returns one mirror, because CPAN now uses CDN instead of mirrors.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/mirror',
operationId => 'PostMirror',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
description => "Specifies an optional keyword to find the matching mirrors.",
maxLength => 2048,
type => 'string'
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/mirrors",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Mirror.pm#L12>
# NOTE: /v1/mirror/search
'/v1/mirror/search' =>
{
get =>
{
description => qq{Returns a `mirrors` object containing a list of `mirror` objects. Currently, the API only returns one mirror, because CPAN now uses CDN instead of mirrors.},
example => 'curl https://fastapi.metacpan.org/v1/mirror/search?from=0&q=CPAN&size=20',
operationId => 'GetMirrorSearch',
parameters => [
{
description => "Specifies an optional keyword to find the matching mirrors.",
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/mirrors",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns a `mirrors` object containing a list of `mirror` objects. Currently, the API only returns one mirror, because CPAN now uses CDN instead of mirrors.},
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/mirror/search -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 0,
"query" : {
"regexp" : {
"path" : ".*HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostMirrorSearch',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
description => "Specifies an optional keyword to find the matching mirrors.",
maxLength => 2048,
type => 'string'
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/mirrors",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/module
'/v1/module' =>
{
get =>
{
description => 'Queries modules information details using simple search.',
example => 'curl https://fastapi.metacpan.org/v1/module?from=40&q=HTTP&size=20',
operationId => 'GetModule',
parameters => [
{
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'The offset starting from 0 within the total data.',
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => 'The size of each page, i.e. how many results are returned per page. This usually defaults to 10.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Queries modules information details using advanced ElasticSearch.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/module -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"name" : "HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostModule',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
maxLength => 2048,
type => 'string',
},
from =>
{
type => 'integer',
},
size =>
{
type => 'integer',
},
fields =>
{
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/module/{module}
'/v1/module/{module}' =>
{
get =>
{
description => qq{Returns the corresponding `file` of the latest version of the `module`. Considering that HTTP-Message-6.37 is the latest release, the result of [/module/HTTP::Message](https://fastapi.metacpan.org/v1/module/HTTP::Message) is the same as [/file/OALDERS/HTTP-Message-6.37/lib/HTTP/Message.pm](https://fastapi.metacpan.org/v1/file/OALDERS/HTTP-Message-6.37/lib/HTTP/Message.pm).},
example => 'curl https://fastapi.metacpan.org/v1/module/HTTP::Message',
operationId => 'GetModuleFile',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
in => 'query',
name => 'join',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/file",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the corresponding `file` of the latest version of the `module`. Considering that HTTP-Message-6.37 is the latest release, the result of [/module/HTTP::Message](https://fastapi.metacpan.org/v1/module/HTTP::Message) is the same as [/file/OALDERS/HTTP-Message-6.37/lib/HTTP/Message.pm](https://fastapi.metacpan.org/v1/file/OALDERS/HTTP-Message-6.37/lib/HTTP/Message.pm).},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/module/HTTP::Message',
operationId => 'PostModuleFile',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
in => 'query',
name => 'join',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/file",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/module/_mapping
'/v1/module/_mapping' =>
{
get =>
{
description => qq{Returns the available fields for the [module object](https://explorer.metacpan.org/?url=/module/_mapping).},
operationId => 'GetModuleMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/module_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the available fields for the [module object](https://explorer.metacpan.org/?url=/module/_mapping).},
operationId => 'PostModuleMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/module_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/module/_search
'/v1/module/_search' =>
{
get =>
{
description => qq{Returns the result set for the module search.},
example => 'curl https://fastapi.metacpan.org/v1/module/_search?from=40&q=HTTP&size=20',
operationId => 'GetModuleSearch',
parameters => [
{
description => "Specifies the [search query](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches).",
in => 'query',
name => 'q',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the maximum number of [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result elements.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the module search.},
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/module/_search -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"path" : ".*HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostModuleSearch',
parameters => [
{
in => 'query',
name => 'query',
required => \1,
schema =>
{
type => 'string',
},
},
{
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/elastic_search',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/module/_search/scroll
'/v1/module/_search/scroll' =>
{
'delete' =>
{
description => qq{Clear a [scroll](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/paginate-search-results.html#clear-scroll)},
operationId => 'DeleteModuleSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
oneOf => [
{
properties =>
{
scroll_id =>
{
type => 'string',
},
},
},
{
properties =>
{
scroll_id =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
},
],
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
type => 'object',
properties =>
{
# TODO: Need to find out what is returned upon clearing a scroll
removed =>
{
type => 'boolean',
}
}
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
get =>
{
description => qq{Returns the result set for the module search.},
operationId => 'GetModuleSearchScroll',
parameters => [
{
description => "Specifies the time to live of the [scroll search](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
in => 'query',
name => 'scroll',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the [scroll ID](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html).",
in => 'query',
name => 'scroll_id',
required => \1,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the module search.},
operationId => 'PostModuleSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/scroll',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/package
'/v1/package' =>
{
get =>
{
description => 'Queries packages information details using simple search.',
example => 'curl https://fastapi.metacpan.org/v1/package?from=40&q=HTTP&size=20',
operationId => 'GetPackage',
parameters => [
{
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'The offset starting from 0 within the total data.',
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => 'The size of each page, i.e. how many results are returned per page. This usually defaults to 10.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Queries packages information details using advanced ElasticSearch.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/package -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"module_name" : "HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostPackage',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
maxLength => 2048,
type => 'string',
},
from =>
{
type => 'integer',
},
size =>
{
type => 'integer',
},
fields =>
{
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Package.pm#L10C31-L10C56>
# NOTE: /v1/package/modules/{distribution}
'/v1/package/modules/{distribution}' =>
{
get =>
{
description => 'Retrieves the list of a distribution packages.',
example => 'curl https://fastapi.metacpan.org/v1/package/modules/HTTP-Message',
operationId => 'GetPackageDistributionList',
parameters => [
{
description => 'The name of the distribution to get its modules.',
example => 'HTTP-Message',
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
property =>
{
modules =>
{
items =>
{
example => 'HTTP::Message',
maxLength => 2048,
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves the list of a distribution packages.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/package/modules/HTTP-Message',
operationId => 'PostPackageDistributionList',
parameters => [
{
description => 'The name of the distribution to get its modules.',
example => 'HTTP-Message',
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
property =>
{
modules =>
{
items =>
{
example => 'HTTP::Message',
maxLength => 2048,
type => 'string',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/package/{module}
'/v1/package/{module}' =>
{
get =>
{
description => qq{Retrieves the latest release and package information for the specified `module`.},
example => 'curl https://fastapi.metacpan.org/v1/package/HTTP::Message',
operationId => 'GetModulePackage',
parameters => [
{
description => 'The package name of the module to get its information.',
example => 'HTTP::Message',
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/package",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Retrieves the latest release and package information for the specified `module`.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/package/HTTP::Message',
operationId => 'PostModulePackage',
parameters => [
{
description => 'The package name of the module to get its information.',
example => 'HTTP::Message',
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/package",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/permission
'/v1/permission' =>
{
get =>
{
description => 'Queries permissions information details using simple search.',
example => 'curl https://fastapi.metacpan.org/v1/permission?from=40&q=HTTP&size=20',
operationId => 'GetPermission',
parameters => [
{
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'The offset starting from 0 within the total data.',
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => 'The size of each page, i.e. how many results are returned per page. This usually defaults to 10.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Queries permissions information details using advanced ElasticSearch.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/permission -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"module_name" : "HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostPermission',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
maxLength => 2048,
type => 'string',
},
from =>
{
type => 'integer',
},
size =>
{
type => 'integer',
},
fields =>
{
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/permission/by_author/{author}
'/v1/permission/by_author/{author}' =>
{
get =>
{
description => 'Retrieves permission information details for the specified author.',
example => 'curl https://fastapi.metacpan.org/v1/permission/by_author/OALDERS?from=40&q=HTTP&size=20',
operationId => 'GetPermissionByAuthor',
parameters => [
{
description => "This is the user's pause ID",
example => 'OALDERS',
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/permissions",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves permission information details for the specified author.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/permission/by_author/OALDERS -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"module_name" : "HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostPermissionByAuthor',
parameters => [
{
description => "This is the user's pause ID",
example => 'OALDERS',
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/permissions",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Permission.pm#L20>
# NOTE: /v1/permission/by_module
'/v1/permission/by_module' =>
{
get =>
{
description => 'Retrieves permission information details for the specified modules.',
operationId => 'GetPermissionByModuleQueryString',
example => 'curl https://fastapi.metacpan.org/v1/permission/by_module?module=HTTP%3A%3AMessage&module=Nice%3A%3ATry',
parameters => [
{
description => "This is the module package name",
example => 'DBD::DBM::Statement',
in => 'query',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/permissions",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves permission information details for the specified modules.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/permission/by_module -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"module" : [
"HTTP::Message",
"Nice::Try"
]
}
EOT},
operationId => 'PostPermissionByModuleJSON',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
module =>
{
description => "This is the module package name",
example => 'DBD::DBM::Statement',
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/permissions",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Permission.pm#L15>
# NOTE: /v1/permission/by_module/{module}
'/v1/permission/by_module/{module}' =>
{
get =>
{
description => 'Retrieves permission information details for the specified module.',
example => 'curl https://fastapi.metacpan.org/v1/permission/by_module/HTTP::Message',
operationId => 'GetPermissionByModule',
parameters => [
{
description => "This is the module package name",
example => 'HTTP::Message',
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/permissions",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves permission information details for the specified module.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/permission/by_module/HTTP::Message',
operationId => 'PostPermissionByModule',
parameters => [
{
description => "This is the module package name",
example => 'HTTP::Message',
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/permissions",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/permission/{module}
'/v1/permission/{module}' =>
{
get =>
{
description => qq{Returns the corresponding `permission` for the specified `module`.},
example => 'curl https://fastapi.metacpan.org/v1/permission/HTTP::Message',
operationId => 'GetModulePermission',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/permission",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the corresponding `permission` for the specified `module`.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/permission/HTTP::Message',
operationId => 'PostModulePermission',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/permission",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/pod_render
'/v1/pod_render' =>
{
get =>
{
description => qq{Takes some POD data and check for errors. It returns the POD provided in formatted plan text.},
example => 'curl https://fastapi.metacpan.org/v1/pod_render?pod=%3Dencoding+utf-8%0A%0A%3Dhead1+Hello+World%0A%0ASomething+here%0A%0A%3Doops%0A%0A%3Dcut%0A',
operationId => 'GetRenderPOD',
parameters => [
{
description => 'The POD data to format',
example => qq{=encoding utf-8\n\n=head1 Hello World\n\nSomething here\n\n=oops\n\n=cut\n},
in => 'query',
name => 'pod',
required => \1,
schema =>
{
type => 'string',
},
},
{
in => 'query',
name => 'show_errors',
required => \0,
schema =>
{
type => 'boolean',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
example => qq{Hello World\n Something here\n\nPOD ERRORS\n Hey! The above document had some coding errors, which are explained below:\n\n Around line 7:\n Unknown directive: =oops\n},
}
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Takes some POD data and check for errors. It returns the POD provided in formatted plan text.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/pod_render?pod=%3Dencoding+utf-8%0A%0A%3Dhead1+Hello+World%0A%0ASomething+here%0A%0A%3Doops%0A%0A%3Dcut%0A',
operationId => 'PostRenderPOD',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
pod =>
{
type => 'string',
description => 'The POD data to format',
example => q{=encoding utf-8\n\n=head1 Hello World\n\nSomething here\n\n=oops\n\n=cut\n},
},
show_errors =>
{
type => 'boolean',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/pod/{module}
'/v1/pod/{module}' =>
{
get =>
{
description => qq{Returns the POD of the given module. You can change the output format by either passing a `content-type` query parameter (e.g. [/pod/HTTP-Message?content-type=text/plain](https://fastapi.metacpan.org/v1/pod/HTTP::Message?content-type=text/plain) or by adding an `Accept` header to the HTTP request. Valid content types are:\n\n* text/html (default)\n* text/plain\n* text/x-pod\n* text/x-markdown},
example => 'curl https://fastapi.metacpan.org/v1/pod/HTTP::Message?content-type=text/plain',
operationId => 'GetModulePOD',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'query',
name => 'show_errors',
required => \0,
schema =>
{
type => 'boolean',
},
},
{
in => 'query',
name => 'url_prefix',
required => \0,
# XXX /pod/author/release/path?url_prefix -> Not sure what the valid values are
schema =>
{
maxLength => 2048,
type => 'string',
},
},
{
description => qq{You can change the output format by either passing a `content-type` query parameter (e.g. [/pod/HTTP-Message?content-type=text/plain](https://fastapi.metacpan.org/v1/pod/HTTP-Message?content-type=text/plain) or by adding an `Accept` header to the HTTP request. Valid content types are:\n\n* text/html (default)\n* text/plain\n* text/x-pod\n* text/x-markdown},
in => 'query',
name => 'content-type',
required => \0,
schema =>
{
type => 'string',
},
enum => [qw( text/html text/plain text/x-markdown text/x-pod )],
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/html' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/x-pod' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/x-markdown' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
# Accepts POST method, but with a query string, not with a JSON payload
post =>
{
description => qq{Returns the POD of the given module. You can change the output format by either passing a `content-type` query parameter (e.g. [/pod/HTTP-Message?content-type=text/plain](https://fastapi.metacpan.org/v1/pod/HTTP::Message?content-type=text/plain) or by adding an `Accept` header to the HTTP request. Valid content types are:\n\n* text/html (default)\n* text/plain\n* text/x-pod\n* text/x-markdown. POST method is possible, but still with a query string. JSON payload are not recognised.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/pod/HTTP::Message?content-type=text/plain',
operationId => 'PostModulePOD',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'query',
name => 'show_errors',
required => \0,
schema =>
{
type => 'boolean',
},
},
{
in => 'query',
name => 'url_prefix',
required => \0,
# XXX /pod/author/release/path?url_prefix -> Not sure what the valid values are
schema =>
{
maxLength => 2048,
type => 'string',
},
},
{
description => qq{You can change the output format by either passing a `content-type` query parameter (e.g. [/pod/HTTP-Message?content-type=text/plain](https://fastapi.metacpan.org/v1/pod/HTTP-Message?content-type=text/plain) or by adding an `Accept` header to the HTTP request. Valid content types are:\n\n* text/html (default)\n* text/plain\n* text/x-pod\n* text/x-markdown},
in => 'query',
name => 'content-type',
schema =>
{
type => 'string',
},
enum => [qw( text/html text/plain text/x-markdown text/x-pod )],
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/html' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/x-pod' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/x-markdown' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Pod.pm#L12>
# NOTE: /v1/pod/{author}/{release}/{path}
'/v1/pod/{author}/{release}/{path}' =>
{
get =>
{
description => qq{Returns the POD of the given module in the specified release. You can change the output format by either passing a `content-type` query parameter (e.g. [/pod/HTTP-Message?content-type=text/plain](https://fastapi.metacpan.org/v1/pod/HTTP-Message?content-type=text/plain) or by adding an `Accept` header to the HTTP request. Valid content types are:\n\n* text/html (default)\n* text/plain\n* text/x-pod\n* text/x-markdown},
example => 'curl https://fastapi.metacpan.org/v1/pod/OALDERS/HTTP-Message-6.36/lib/HTTP/Message.pm?content-type=text/x-markdown',
operationId => 'GetModuleReleasePod',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'query',
name => 'show_errors',
required => \0,
schema =>
{
type => 'boolean',
},
},
{
in => 'query',
name => 'url_prefix',
required => \0,
# XXX /pod/author/release/path?url_prefix -> Not sure what the valid values are
schema =>
{
maxLength => 2048,
type => 'string',
},
},
{
description => qq{You can change the output format by either passing a `content-type` query parameter (e.g. [/pod/HTTP-Message?content-type=text/plain](https://fastapi.metacpan.org/v1/pod/HTTP-Message?content-type=text/plain) or by adding an `Accept` header to the HTTP request. Valid content types are:\n\n* text/html (default)\n* text/plain\n* text/x-pod\n* text/x-markdown},
in => 'query',
name => 'content-type',
required => \0,
schema =>
{
type => 'string',
},
enum => [qw( text/html text/plain text/x-markdown text/x-pod )],
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/html' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/x-pod' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/x-markdown' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
# Accepts POST method, but with a query string, not with a JSON payload
post =>
{
description => qq{Returns the POD of the given module in the specified release. You can change the output format by either passing a `content-type` query parameter (e.g. [/pod/HTTP-Message?content-type=text/plain](https://fastapi.metacpan.org/v1/pod/HTTP-Message?content-type=text/plain) or by adding an `Accept` header to the HTTP request. Valid content types are:\n\n* text/html (default)\n* text/plain\n* text/x-pod\n* text/x-markdown},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/pod/OALDERS/HTTP-Message-6.36/lib/HTTP/Message.pm?content-type=text/x-markdown',
operationId => 'PostModuleReleasePod',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'query',
name => 'show_errors',
required => \0,
schema =>
{
type => 'boolean',
},
},
{
in => 'query',
name => 'url_prefix',
required => \0,
# XXX /pod/author/release/path?url_prefix -> Not sure what the valid values are
schema =>
{
maxLength => 2048,
type => 'string',
},
},
{
description => qq{You can change the output format by either passing a `content-type` query parameter (e.g. [/pod/HTTP-Message?content-type=text/plain](https://fastapi.metacpan.org/v1/pod/HTTP-Message?content-type=text/plain) or by adding an `Accept` header to the HTTP request. Valid content types are:\n\n* text/html (default)\n* text/plain\n* text/x-pod\n* text/x-markdown},
in => 'query',
name => 'content-type',
required => \0,
schema =>
{
type => 'string',
},
enum => [qw( text/html text/plain text/x-markdown text/x-pod )],
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/html' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/x-pod' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
'text/x-markdown' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/rating
'/v1/rating' =>
{
get =>
{
description => 'Queries ratings information details using simple search.',
example => 'curl https://fastapi.metacpan.org/v1/rating?from=40&q=HTTP&size=20',
operationId => 'GetRating',
parameters => [
{
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'The offset starting from 0 within the total data.',
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => 'The size of each page, i.e. how many results are returned per page. This usually defaults to 10.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Queries ratings information details using advanced ElasticSearch.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/rating -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"distribution" : "HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostRating',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
maxLength => 2048,
type => 'string',
},
from =>
{
type => 'integer',
},
size =>
{
type => 'integer',
},
fields =>
{
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Rating.pm#L12>
# NOTE: /v1/rating/by_distributions
'/v1/rating/by_distributions' =>
{
get =>
{
description => 'Retrieves rating informations details for the specified distributions.',
operationId => 'GetRatingByDistribution',
example => 'curl https://fastapi.metacpan.org/v1/rating/by_distributions?distribution=HTTP-Tiny',
parameters => [
{
in => 'query',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/distributions",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Retrieves rating informations details for the specified distributions.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/rating/by_distributions -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"distribution" : "HTTP-Tiny"
}},
operationId => 'PostRatingByDistribution',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
distribution =>
{
maxLength => 2048,
type => 'string',
example => 'HTTP-Message',
},
},
type => 'object'
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/distributions",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/rating/_mapping
'/v1/rating/_mapping' =>
{
get =>
{
description => qq{Returns the available fields for the [rating object](https://explorer.metacpan.org/?url=/rating/_mapping).},
operationId => 'GetRatingMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/rating_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the available fields for the [rating object](https://explorer.metacpan.org/?url=/rating/_mapping).},
operationId => 'PostRatingMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/rating_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/rating/_search
'/v1/rating/_search' =>
{
get =>
{
description => qq{Returns the result set for the rating search.},
example => 'curl https://fastapi.metacpan.org/v1/rating/_search?from=40&q=HTTP&size=20',
operationId => 'GetRatingSearch',
parameters => [
{
description => "Specifies the [search query](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches).",
in => 'query',
name => 'q',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the maximum number of [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result elements.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the rating search.},
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/rating/_search -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"distribution" : ".*HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostRatingSearch',
parameters => [
{
in => 'query',
name => 'query',
required => \1,
schema =>
{
type => 'string',
},
},
{
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/elastic_search',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/rating/_search/scroll
'/v1/rating/_search/scroll' =>
{
'delete' =>
{
description => qq{Clear a [scroll](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/paginate-search-results.html#clear-scroll)},
operationId => 'DeleteRatingSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
oneOf => [
{
properties =>
{
scroll_id =>
{
type => 'string',
},
},
},
{
properties =>
{
scroll_id =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
},
],
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
type => 'object',
properties =>
{
# TODO: Need to find out what is returned upon clearing a scroll
removed =>
{
type => 'boolean',
}
}
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
get =>
{
description => qq{Returns the result set for the rating search.},
operationId => 'GetRatingSearchScroll',
parameters => [
{
description => "Specifies the time to live of the [scroll search](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
in => 'query',
name => 'scroll',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the [scroll ID](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html).",
in => 'query',
name => 'scroll_id',
required => \1,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the rating search.},
operationId => 'PostRatingSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/scroll',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/release
'/v1/release' =>
{
get =>
{
description => 'Queries releases information details using simple search.',
example => 'curl https://fastapi.metacpan.org/v1/release?from=40&q=HTTP&size=20',
operationId => 'GetRelease',
parameters => [
{
in => 'query',
name => 'q',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'The offset starting from 0 within the total data.',
in => 'query',
name => 'from',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => 'The size of each page, i.e. how many results are returned per page. This usually defaults to 10.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Queries releases information details using advanced ElasticSearch.',
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/release -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"distribution" : "HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostRelease',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
"q" =>
{
maxLength => 2048,
type => 'string',
},
from =>
{
type => 'integer',
},
size =>
{
type => 'integer',
},
fields =>
{
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Release.pm#L22>
# NOTE: /v1/release/{distribution}
'/v1/release/{distribution}' =>
{
get =>
{
description => qq{Retrieves the latest distribution release information details.\nThe `/release` endpoint accepts either the name of a `distribution` (e.g. [/release/HTTP-Message](https://fastapi.metacpan.org/v1/release/HTTP-Message)), which returns the most recent release of the distribution.},
example => 'curl https://fastapi.metacpan.org/v1/release/HTTP-Message',
operationId => 'GetReleaseDistribution',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
in => 'query',
name => 'join',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/release",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Retrieves the latest distribution release information details.\nThe `/release` endpoint accepts either the name of a `distribution` (e.g. [/release/HTTP-Message](https://fastapi.metacpan.org/v1/release/HTTP-Message)), which returns the most recent release of the distribution.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/HTTP-Message',
operationId => 'PostReleaseDistribution',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
'join' =>
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
maxLength => 2048,
type => 'string'
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/release",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Release.pm#L29>
# NOTE: /v1/release/{author}/{release}
'/v1/release/{author}/{release}' =>
{
get =>
{
description => qq{Retrieves a distribution release information details.\nThis `/release` endpoint accepts the name of an `author` and the name of the `release` (e.g. [/release/DOY/OALDERS/HTTP-Message-6.37](https://fastapi.metacpan.org/v1/release/DOY/OALDERS/HTTP-Message-6.37)), which returns the most recent release of the distribution.},
operationId => 'GetAuthorReleaseDistribution',
example => 'curl https://fastapi.metacpan.org/v1/release/OALDERS/HTTP-Message-6.36',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
in => 'query',
name => 'join',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
release =>
{
schema =>
{
'$ref' => "#/components/schemas/release",
},
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Retrieves a distribution release information details.\nThis `/release` endpoint accepts the name of an `author` and the name of the `release` (e.g. [/release/DOY/OALDERS/HTTP-Message-6.37](https://fastapi.metacpan.org/v1/release/DOY/OALDERS/HTTP-Message-6.37)), which returns the most recent release of the distribution.},
operationId => 'PostAuthorReleaseDistribution',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/OALDERS/HTTP-Message-6.36',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
'join' =>
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
maxLength => 2048,
type => 'string'
}
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
release =>
{
schema =>
{
'$ref' => "#/components/schemas/release",
},
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Release.pm#L80>
# NOTE: /v1/release/all_by_author/{author}
'/v1/release/all_by_author/{author}' =>
{
get =>
{
description => qq{Get all releases by the specified author},
operationId => 'GetAllReleasesByAuthor',
example => 'curl https://fastapi.metacpan.org/v1/release/all_by_author/OALDERS?page=2&page_size=100',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies the page offset starting from 1.",
in => 'query',
name => 'page',
required => \0,
schema =>
{
type => 'integer'
},
},
{
description => "Specifies the page size, i.e. the number of elements returned in one page.",
in => 'query',
name => 'page_size',
required => \0,
schema =>
{
type => 'integer'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/releases',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Get all releases by the specified author},
operationId => 'PostAllReleasesByAuthor',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/all_by_author/OALDERS?page=2&page_size=100',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
page =>
{
description => "Specifies the page offset starting from 1.",
type => 'integer'
},
page_size =>
{
description => "Specifies the page size, i.e. the number of elements returned in one page.",
type => 'integer'
}
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/releases',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/release/by_author/{author}
'/v1/release/by_author/{author}' =>
{
get =>
{
description => qq{Get releases by a specified author.},
example => 'curl https://fastapi.metacpan.org/v1/release/by_author/OALDERS',
operationId => 'GetReleaseByAuthor',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies the page size, i.e. the number of elements returned in one page.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer'
},
},
{
description => "Specifies the page offset starting from 1.",
in => 'query',
name => 'page',
required => \0,
schema =>
{
type => 'integer'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/releases',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Get releases by a specified author.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/by_author/OALDERS',
operationId => 'PostReleaseByAuthor',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
size =>
{
description => "Specifies the page size, i.e. the number of elements returned in one page.",
type => 'integer'
},
page =>
{
description => "Specifies the page offset starting from 1.",
type => 'integer'
}
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/releases',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Release.pm#L37>
# NOTE: /v1/release/contributors/{author}/{release}
'/v1/release/contributors/{author}/{release}' =>
{
get =>
{
description => qq{Retrieves the list of contributors for the specified release.},
example => 'curl https://fastapi.metacpan.org/v1/release/contributors/OALDERS/HTTP-Message-6.36',
operationId => 'GetReleaseDistributionContributors',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
in => 'query',
name => 'join',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
contributors =>
{
items =>
{
properties =>
{
email =>
{
items =>
{
maxLength => 2048,
type => 'string',
},
type => 'array',
},
gravatar_url =>
{
description => "Contributor profile picture",
maxLength => 2048,
type => 'string',
},
name =>
{
description => "Contributor's name",
maxLength => 2048,
type => 'string',
},
pause_id =>
{
description => "Contributor's CPAN ID",
maxLength => 2048,
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Retrieves the list of contributors for the specified release.},
operationId => 'PostReleaseDistributionContributors',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/contributors/OALDERS/HTTP-Message-6.36',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
'join' =>
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
maxLength => 2048,
type => 'string'
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
contributors =>
{
items =>
{
properties =>
{
email =>
{
items =>
{
maxLength => 2048,
type => 'string',
},
type => 'array',
},
gravatar_url =>
{
description => "Contributor profile picture",
maxLength => 2048,
type => 'string',
},
name =>
{
description => "Contributor's name",
maxLength => 2048,
type => 'string',
},
pause_id =>
{
description => "Contributor's CPAN ID",
maxLength => 2048,
type => 'string',
},
},
type => 'object',
},
type => 'array',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/release/files_by_category/{author}/{release}
'/v1/release/files_by_category/{author}/{release}' =>
{
get =>
{
description => qq{Retrieves the list of release key files by category},
operationId => 'GetReleaseKeyFilesByCategory',
example => 'curl https://fastapi.metacpan.org/v1/release/files_by_category/OALDERS/HTTP-Message-6.36',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'query',
name => 'category',
description => 'An optional category can be specified to refine the result. Valid vlues include `changelog`, `contributing`, `dist`, `license`, `other`',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/files_categories',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Retrieves the list of release key files by category},
operationId => 'PostReleaseKeyFilesByCategory',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/files_by_category/OALDERS/HTTP-Message-6.36',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
category =>
{
description => 'An optional category can be specified to refine the result. Valid vlues include `changelog`, `contributing`, `dist`, `license`, `other`',
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/files_categories',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/release/interesting_files/{author}/{release}
'/v1/release/interesting_files/{author}/{release}' =>
{
get =>
{
description => qq{Retrieves the list of interesting files for the specified release.},
example => 'curl https://fastapi.metacpan.org/v1/release/interesting_files/OALDERS/HTTP-Message-6.36',
operationId => 'GetReleaseInterestingFiles',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'query',
name => 'category',
description => 'An optional category can be specified to refine the result. Valid vlues include `changelog`, `contributing`, `dist`, `license`, `other`',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/files_interesting',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Retrieves the list of interesting files for the specified release.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/interesting_files/OALDERS/HTTP-Message-6.36',
operationId => 'PostReleaseInterestingFiles',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
category =>
{
description => 'An optional category can be specified to refine the result. Valid vlues include `changelog`, `contributing`, `dist`, `license`, `other`',
maxLength => 2048,
type => 'string',
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/files_interesting',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Release.pm#L75>
# NOTE: /v1/release/latest_by_author/{author}
'/v1/release/latest_by_author/{author}' =>
{
get =>
{
description => qq{Get latest releases by the specified author},
example => 'curl https://fastapi.metacpan.org/v1/release/latest_by_author/OALDERS',
operationId => 'GetLatestReleaseByAuthor',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/releases',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Get latest releases by the specified author},
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/release/latest_by_author/OALDERS},
operationId => 'PostLatestReleaseByAuthor',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/releases',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Release.pm#L68>
# NOTE: /v1/release/latest_by_distribution/{distribution}
'/v1/release/latest_by_distribution/{distribution}' =>
{
get =>
{
description => qq{Get latest releases for a specified distribution.},
example => 'curl https://fastapi.metacpan.org/v1/release/latest_by_distribution/HTTP-Message',
operationId => 'GetLatestReleaseByDistribution',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
release =>
{
schema =>
{
'$ref' => '#/components/schemas/release',
}
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Get latest releases for a specified distribution.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/latest_by_distribution/HTTP-Message',
operationId => 'PostLatestReleaseByDistribution',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
release =>
{
schema =>
{
'$ref' => '#/components/schemas/release',
}
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/release/modules/{author}/{release}
'/v1/release/modules/{author}/{release}' =>
{
get =>
{
description => qq{Retrieves the list of modules in the specified release},
example => 'curl https://fastapi.metacpan.org/v1/release/modules/OALDERS/HTTP-Message-6.36',
operationId => 'GetReleaseModules',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
in => 'query',
name => 'join',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/files',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Retrieves the list of modules in the specified release},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/modules/OALDERS/HTTP-Message-6.36',
operationId => 'PostReleaseModules',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
'join' =>
{
description => "Specifies which object to [join](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#joins) in the result.",
maxLength => 2048,
type => 'string'
},
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/files',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Release.pm#L56>
# NOTE: /v1/release/recent
'/v1/release/recent' =>
{
get =>
{
description => qq{Get recent releases},
example => 'curl https://fastapi.metacpan.org/v1/release/recent',
operationId => 'GetReleaseRecent',
parameters => [
{
description => "Specifies the page offset starting from 1.",
in => 'query',
name => 'page',
required => \0,
schema =>
{
type => 'integer'
},
},
{
description => "Specifies the page size, i.e. the number of elements returned in one page.",
in => 'query',
name => 'page_size',
required => \0,
schema =>
{
type => 'integer'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/release_recents',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Get recent releases},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/recent',
operationId => 'PostReleaseRecent',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
page =>
{
description => "Specifies the page offset starting from 1.",
type => 'integer'
},
page_size =>
{
description => "Specifies the page size, i.e. the number of elements returned in one page.",
type => 'integer'
}
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/release_recents',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Release.pm#L106>
# NOTE: /v1/release/top_uploaders
'/v1/release/top_uploaders' =>
{
get =>
{
description => qq{Get top release uploaders},
example => 'curl https://fastapi.metacpan.org/v1/release/top_uploaders',
operationId => 'GetTopReleaseUploaders',
parameters => [
{
description => "Specifies the result range. Valid values are `all`, `weekly`, `monthly` or `yearly`. It defaults to `weekly`",
in => 'query',
name => 'range',
required => \0,
schema =>
{
type => 'string'
},
},
{
description => "Specifies the page size, i.e. the number of elements returned in one page.",
in => 'query',
name => 'page_size',
required => \0,
schema =>
{
type => 'integer'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
count =>
{
items =>
{
additionalProperties =>
{
type => 'string',
},
type => 'object',
},
# TODO: /v1/release/top_uploaders: Not sure this is the number of distributions. Need to be double checked
description => 'Array of pause IDs to the number of distributions',
example => '"NOBUNAGA" : 5',
type => 'array',
},
took =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Get top release uploaders},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/top_uploaders',
operationId => 'PostTopReleaseUploaders',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
range =>
{
description => "Specifies the result range. Valid values are `all`, `weekly`, `monthly` or `yearly`. It defaults to `weekly`",
type => 'string'
}
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
count =>
{
items =>
{
additionalProperties =>
{
type => 'string',
},
type => 'object',
},
# TODO: /v1/release/top_uploaders: Not sure this is the number of distributions. Need to be double checked
description => 'Array of pause IDs to the number of distributions',
example => '"NOBUNAGA" : 5',
type => 'array',
},
took =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Release.pm#L87>
# NOTE: /v1/release/versions/{distribution}
'/v1/release/versions/{distribution}' =>
{
get =>
{
description => qq{Get all releases by versions for the specified distribution},
example => 'curl https://fastapi.metacpan.org/v1/release/versions/HTTP-Message',
operationId => 'GetAllReleasesByVersion',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies the version(s) to return as a comma-sepated value.",
example => 'v0.30.5,v0.31.0',
in => 'query',
name => 'versions',
required => \0,
schema =>
{
type => 'string'
},
},
{
description => "Specifies whether the result should be returned in plain mode.",
in => 'query',
name => 'plain',
required => \0,
schema =>
{
type => 'boolean'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/releases',
}
},
'text/plain' =>
{
description => 'Lines of version and download URL spearated by a space are returned when the option `plain` is enabled.',
example => "6.44 https://cpan.metacpan.org/authors/id/O/OA/OALDERS/HTTP-Message-6.44.tar.gz\n6.43 https://cpan.metacpan.org/authors/id/S/SI/SIMBABQUE/HTTP-Message-6.43.tar.gz",
schema =>
{
format => 'binary',
type => 'string',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Get all releases by versions for the specified distribution},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/release/versions/HTTP-Message',
operationId => 'PostAllReleasesByVersion',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
versions =>
{
description => "Specifies the version(s) to return as a comma-sepated value.",
example => 'v0.30.5,v0.31.0',
type => 'string'
},
plain =>
{
description => "Specifies whether the result should be returned in plain mode.",
type => 'boolean'
}
},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => '#/components/schemas/releases',
}
},
'text/plain' =>
{
description => 'Lines of version and download URL spearated by a space are returned when the option `plain` is enabled.',
example => "6.44 https://cpan.metacpan.org/authors/id/O/OA/OALDERS/HTTP-Message-6.44.tar.gz\n6.43 https://cpan.metacpan.org/authors/id/S/SI/SIMBABQUE/HTTP-Message-6.43.tar.gz",
schema =>
{
format => 'binary',
type => 'string',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/release/_mapping
'/v1/release/_mapping' =>
{
get =>
{
description => qq{Returns the available fields for the [release object](https://explorer.metacpan.org/?url=/release/_mapping).},
operationId => 'GetReleaseMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/release_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the available fields for the [release object](https://explorer.metacpan.org/?url=/release/_mapping).},
operationId => 'PostReleaseMapping',
parameters => [],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/release_mapping",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/release/_search
'/v1/release/_search' =>
{
get =>
{
description => qq{Returns the result set for the release search.},
example => 'curl https://fastapi.metacpan.org/v1/release/_search?from=40&q=HTTP&size=20',
operationId => 'GetReleaseSearch',
parameters => [
{
description => "Specifies the [search query](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches).",
in => 'query',
name => 'q',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the maximum number of [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result elements.",
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the release search.},
example => qq{curl -XPOST https://fastapi.metacpan.org/v1/release/_search -H 'Content-Type: application/json; charset=utf-8' --data-binary \@- <<EOT
{
"from" : 40,
"query" : {
"regexp" : {
"name" : ".*HTTP.*"
}
},
"size" : 20
}
EOT},
operationId => 'PostReleaseSearch',
parameters => [
{
in => 'query',
name => 'query',
required => \1,
schema =>
{
type => 'string',
},
},
{
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => "Specifies the elements to sort the [search](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#get-searches) result.",
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/elastic_search',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/release/_search/scroll
'/v1/release/_search/scroll' =>
{
'delete' =>
{
description => qq{Clear a [scroll](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/paginate-search-results.html#clear-scroll)},
operationId => 'DeleteReleaseSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
oneOf => [
{
properties =>
{
scroll_id =>
{
type => 'string',
},
},
},
{
properties =>
{
scroll_id =>
{
items =>
{
type => 'string',
},
type => 'array',
},
},
},
],
}
}
},
required => \1,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
type => 'object',
properties =>
{
# TODO: Need to find out what is returned upon clearing a scroll
removed =>
{
type => 'boolean',
}
}
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
get =>
{
description => qq{Returns the result set for the release search.},
operationId => 'GetReleaseSearchScroll',
parameters => [
{
description => "Specifies the time to live of the [scroll search](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html#scroll-search-context).",
in => 'query',
name => 'scroll',
required => \1,
schema =>
{
type => 'string',
},
},
{
description => "Specifies the [scroll ID](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html).",
in => 'query',
name => 'scroll_id',
required => \1,
schema =>
{
type => 'string',
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns the result set for the release search.},
operationId => 'PostReleaseSearchScroll',
parameters => [],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
'$ref' => '#/components/schemas/scroll',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/scroll_result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/ReverseDependencies.pm#L14>
# NOTE: /v1/reverse_dependencies/dist/{distribution}
'/v1/reverse_dependencies/dist/{distribution}' =>
{
get =>
{
description => qq{Returns a list of all the modules who depend on the specified distribution.`.},
example => 'curl https://fastapi.metacpan.org/v1/reverse_dependencies/dist/HTTP-Message',
operationId => 'GetReverseDependencyDist',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'Specifies the page offset starting from 1.',
in => 'query',
name => 'page',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => 'Specifies the number of result per page to be returned. Usually one would use `size` only.',
in => 'query',
name => 'page_size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => 'Specifies the maximum total number of result to be returned.',
in => 'query',
name => 'size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => 'Specifies how the result is sorted.',
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/reverse_dependencies",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns a list of all the modules who depend on the specified distribution.`.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/reverse_dependencies/dist/HTTP-Message',
operationId => 'PostReverseDependencyDist',
parameters => [
{
in => 'path',
name => 'distribution',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
page =>
{
description => 'Specifies the page offset starting from 1.',
type => 'integer',
},
page_size =>
{
description => 'Specifies the number of result per page to be returned. Usually one would use `size` only.',
type => 'integer',
},
size =>
{
description => 'Specifies the maximum total number of result to be returned.',
type => 'integer',
},
sort =>
{
description => 'Specifies how the result is sorted.',
type => 'string',
},
},
required => [],
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/reverse_dependencies",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/ReverseDependencies.pm#L23>
# NOTE: /v1/reverse_dependencies/module/{module}
'/v1/reverse_dependencies/module/{module}' =>
{
get =>
{
description => qq{Returns a list of all the modules who depend on the specified module.},
example => 'curl https://fastapi.metacpan.org/v1/reverse_dependencies/module/HTTP::Message',
operationId => 'GetReverseDependencyModule',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => 'Specifies the page offset starting from 1.',
in => 'query',
name => 'page',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => 'Specifies the number of result per page to be returned.',
in => 'query',
name => 'page_size',
required => \0,
schema =>
{
type => 'integer',
},
},
{
description => 'Specifies how the result is sorted.',
in => 'query',
name => 'sort',
required => \0,
schema =>
{
type => 'string',
},
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/reverse_dependencies",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Returns a list of all the modules who depend on the specified module.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/reverse_dependencies/module/HTTP::Message',
operationId => 'PostReverseDependencyModule',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/json' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties =>
{
page =>
{
description => 'Specifies the page offset starting from 1.',
type => 'integer',
},
page_size =>
{
description => 'Specifies the number of result per page to be returned.',
type => 'integer',
},
sort =>
{
description => 'Specifies how the result is sorted.',
type => 'string',
},
},
required => [],
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/reverse_dependencies",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/search
'/v1/search' =>
{
get =>
{
description => qq{Returns result set based on the search query.},
operationId => 'GetSearchResult',
parameters => [
{
description => "Specifies the search keywords to be queried.",
in => 'query',
name => 'q',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/search/autocomplete
'/v1/search/autocomplete' =>
{
get =>
{
description => qq{Returns result set based on the autocomplete search query.},
example => 'https://fastapi.metacpan.org/search/autocomplete?q=HTTP',
operationId => 'GetSearchAutocompleteResult',
parameters => [
{
description => "Specifies the search keyword to be queried.",
in => 'query',
name => 'q',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/search/autocomplete/suggest
'/v1/search/autocomplete/suggest' =>
{
get =>
{
description => qq{Returns suggested result set based on the autocomplete search query.},
operationId => 'GetSearchAutocompleteSuggestResult',
parameters => [
{
description => "Specifies the search keyword to be queried.",
in => 'query',
name => 'q',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/search/first
'/v1/search/first' =>
{
get =>
{
description => qq{Perform API search and return the first result (I'm Feeling Lucky)},
operationId => 'GetSearchFirstResult',
parameters => [
{
description => "Specifies the search keywords to be queried.",
in => 'query',
name => 'q',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
path =>
{
type => 'string',
description => "Relative path to module with full name",
},
authorized =>
{
type => 'boolean',
},
description =>
{
type => 'string',
description => "Module description",
},
id =>
{
type => 'string',
},
distribution =>
{
type => 'string',
description => "Name of the distribution the module is contained in",
},
author =>
{
type => 'string',
description => "Module author ID",
},
release =>
{
type => 'string',
description => "Package name with version",
},
status =>
{
type => 'string',
},
'abstract.analyzed' =>
{
type => 'string',
description => "The module's abstract as analyzed from POD",
},
dist_fav_count =>
{
type => 'integer',
description => "Number of times favorited",
},
date =>
{
type => 'string',
description => "date module was indexed",
format => 'date-time',
},
documentation =>
{
type => 'string',
},
pod_lines =>
{
type => 'array',
},
items =>
{
type => 'integer',
},
indexed =>
{
type => 'boolean',
description => "Is the module indexed by PAUSE",
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/db7c3a90925ec85e6ae6a9f6dd64677305feac8d/lib/MetaCPAN/Document/File/Set.pm#L436>
# NOTE: /v1/search/history/module/{module}/{path}
'/v1/search/history/module/{module}/{path}' =>
{
get =>
{
description => qq{Find the history of a given module.},
example => 'curl https://fastapi.metacpan.org/v1/search/history/module/HTTP::Message/lib/HTTP/Message.pm',
operationId => 'GetModuleHistory',
parameters => [
{
description => "Specifies the module name.",
in => 'path',
name => 'module',
required => \1,
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set"
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Find the history of a given module.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/search/history/module/HTTP::Message/lib/HTTP/Message.pm',
operationId => 'PostModuleHistory',
parameters => [
{
description => "Specifies the module name.",
in => 'path',
name => 'module',
required => \1,
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set"
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/db7c3a90925ec85e6ae6a9f6dd64677305feac8d/lib/MetaCPAN/Document/File/Set.pm#L436>
# NOTE: /v1/search/history/file/{distribution}/{path}
'/v1/search/history/file/{distribution}/{path}' =>
{
get =>
{
description => qq{Find the history of a given distribution file.},
example => 'curl https://fastapi.metacpan.org/v1/search/history/file/HTTP-Message/lib/HTTP/Message.pm',
operationId => 'GetFileHistory',
parameters => [
{
description => "Specifies the distribution name.",
in => 'path',
name => 'distribution',
required => \1,
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set"
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Find the history of a given distribution file.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/search/history/file/HTTP-Message/lib/HTTP/Message.pm',
operationId => 'PostFileHistory',
parameters => [
{
description => "Specifies the distribution name.",
in => 'path',
name => 'distribution',
required => \1,
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set"
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/db7c3a90925ec85e6ae6a9f6dd64677305feac8d/lib/MetaCPAN/Document/File/Set.pm#L436>
# NOTE: /v1/search/history/module/{module}/{path}
'/v1/search/history/documentation/{module}/{path}' =>
{
get =>
{
description => qq{Find the history of a given module documentation.},
example => 'curl https://fastapi.metacpan.org/v1/search/history/documentation/HTTP::Message/lib/HTTP/Message.pm',
operationId => 'GetDocumentationHistory',
parameters => [
{
description => "Specifies the module name.",
in => 'path',
name => 'module',
required => \1,
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set"
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => qq{Find the history of a given module documentation.},
example => 'curl -XPOST https://fastapi.metacpan.org/v1/search/history/documentation/HTTP::Message/lib/HTTP/Message.pm',
operationId => 'PostDocumentationHistory',
parameters => [
{
description => "Specifies the module name.",
in => 'path',
name => 'module',
required => \1,
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set"
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# NOTE: /v1/search/web
'/v1/search/web' =>
{
get =>
{
description => qq{Perform API search in the same fashion as the Web UI},
example => 'curl https://fastapi.metacpan.org/v1/search/web?q=HTTP&from=0&size=10&collapsed=1',
operationId => 'GetSearchWebResult',
parameters => [
{
description => "The query search term. If the search term contains a term with the tags `dist:` or `module:` results will be in expanded form, otherwise collapsed form.\n\nSee also `collapsed`",
in => 'query',
name => 'q',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
description => "The offset to use in the result set",
in => 'query',
name => 'from',
required => \0,
schema =>
{
default => 0,
type => 'integer',
},
style => 'simple',
},
{
description => "Number of results per page",
in => 'query',
name => 'size',
required => \0,
schema =>
{
default => 20,
type => 'integer',
},
style => 'simple',
},
{
description => "Force a collapsed even when searching for a particular distribution or module name.",
in => 'query',
name => 'collapsed',
required => \0,
schema =>
{
type => 'boolean',
},
style => 'simple',
},
{
description => "Specifies which fields in the response should be provided.",
in => 'query',
name => 'fields',
required => \0,
schema =>
{
maxLength => 2048,
type => 'string'
},
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object',
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'application/json' =>
{
schema =>
{
properties =>
{
collapsed =>
{
type => 'boolean',
},
results =>
{
items =>
{
schema =>
{
'$ref' => "#/components/schemas/result_set",
},
},
type => 'array',
},
took =>
{
type => 'integer',
},
total =>
{
type => 'integer',
},
},
type => 'object',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Source.pm#L17>
# NOTE: /v1/source/{author}/{release}/{path}
'/v1/source/{author}/{release}/{path}' =>
{
get =>
{
description => 'Returns the source code of the given module path within the specified release.',
operationId => 'GetSourceReleasePath',
example => 'curl https://fastapi.metacpan.org/v1/source/OALDERS/HTTP-Message-6.36/lib/HTTP/Message.pm',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Returns the source code of the given module path within the specified release.',
operationId => 'PostSourceReleasePath',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/source/OALDERS/HTTP-Message-6.36/lib/HTTP/Message.pm',
parameters => [
{
in => 'path',
name => 'author',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'release',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
},
{
in => 'path',
name => 'path',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
},
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
# <https://github.com/metacpan/metacpan-api/blob/97b4791bf274bfb4e25f3a122e7115a2e9315404/lib/MetaCPAN/Server/Controller/Source.pm#L61>
# NOTE: /v1/source/{module}
'/v1/source/{module}' =>
{
get =>
{
description => 'Returns the full source of the latest, authorized version of the given `module`.',
example => 'curl https://fastapi.metacpan.org/v1/source/HTTP::Message',
operationId => 'GetModuleSource',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
post =>
{
description => 'Returns the full source of the latest, authorized version of the given `module`.',
example => 'curl -XPOST https://fastapi.metacpan.org/v1/source/HTTP::Message',
operationId => 'PostModuleSource',
parameters => [
{
in => 'path',
name => 'module',
required => \1,
schema =>
{
maxLength => 2048,
type => 'string',
},
style => 'simple',
}],
requestBody =>
{
content =>
{
'application/x-www-form-urlencoded' =>
{
encoding => {},
schema =>
{
additionalProperties => \0,
properties => {},
type => 'object'
}
}
},
required => \0,
},
responses =>
{
200 =>
{
content =>
{
'text/plain' =>
{
schema =>
{
format => 'binary',
type => 'string',
}
}
},
description => 'Successful response.',
},
default =>
{
content =>
{
"application/json" =>
{
schema =>
{
'$ref' => "#/components/schemas/error",
}
}
},
description => "Error response.",
}
}
},
},
},
security => [],
servers => [
{ url => 'https://fastapi.metacpan.org' },
],
}