Fix the API service to use the new Swagger description form
This commit is contained in:
parent
0bc1c29dff
commit
3fb2a33ee7
5 changed files with 42 additions and 38 deletions
|
@ -94,9 +94,15 @@ def swagger_route_data(include_internal=False, compact=False):
|
|||
swagger_path = PARAM_REGEX.sub(r'{\2}', rule.rule)
|
||||
path_swagger = {
|
||||
'name': fully_qualified_name(view_class),
|
||||
'path': swagger_path,
|
||||
'tag': tag_name
|
||||
}
|
||||
|
||||
if include_internal:
|
||||
related_user_res = method_metadata(view_class, 'related_user_resource')
|
||||
if related_user_res is not None:
|
||||
path_swagger['quay_user_related'] = fully_qualified_name(related_user_res)
|
||||
|
||||
paths[swagger_path] = path_swagger
|
||||
|
||||
# Add any global path parameters.
|
||||
|
@ -139,10 +145,6 @@ def swagger_route_data(include_internal=False, compact=False):
|
|||
if requires_fresh_login is not None:
|
||||
operation_swagger['requires_fresh_login'] = True
|
||||
|
||||
related_user_res = method_metadata(view_class, 'related_user_resource')
|
||||
if related_user_res is not None:
|
||||
operation_swagger['quayUserRelated'] = fully_qualified_name(related_user_res)
|
||||
|
||||
# Add the path parameters.
|
||||
if rule.arguments:
|
||||
for path_parameter in rule.arguments:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
""" Acces usage logs for organizations or repositories. """
|
||||
""" Access usage logs for organizations or repositories. """
|
||||
|
||||
import json
|
||||
|
||||
|
|
|
@ -70,6 +70,7 @@ def robots_list(prefix, include_permissions=False):
|
|||
return {'robots': robots.values()}
|
||||
|
||||
@resource('/v1/user/robots')
|
||||
@internal_only
|
||||
class UserRobotList(ApiResource):
|
||||
""" Resource for listing user robots. """
|
||||
@require_user_admin
|
||||
|
|
|
@ -101,27 +101,14 @@ angular.module('quay').factory('ApiService', ['Restangular', '$q', 'UtilService'
|
|||
|
||||
var getMatchingUserOperationName = function(orgOperationName, method, userRelatedResource) {
|
||||
if (userRelatedResource) {
|
||||
var operations = userRelatedResource['operations'];
|
||||
for (var i = 0; i < operations.length; ++i) {
|
||||
var operation = operations[i];
|
||||
if (operation['method'].toLowerCase() == method) {
|
||||
return operation['nickname'];
|
||||
}
|
||||
if (userRelatedResource[method.toLowerCase()]) {
|
||||
return userRelatedResource[method.toLowerCase()]['operationId'];
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error('Could not find user operation matching org operation: ' + orgOperationName);
|
||||
};
|
||||
|
||||
var buildMethodsForEndpointResource = function(endpointResource, resourceMap) {
|
||||
var name = endpointResource['name'];
|
||||
var operations = endpointResource['operations'];
|
||||
for (var i = 0; i < operations.length; ++i) {
|
||||
var operation = operations[i];
|
||||
buildMethodsForOperation(operation, endpointResource, resourceMap);
|
||||
}
|
||||
};
|
||||
|
||||
var freshLoginInProgress = [];
|
||||
var reject = function(msg) {
|
||||
for (var i = 0; i < freshLoginInProgress.length; ++i) {
|
||||
|
@ -224,14 +211,13 @@ angular.module('quay').factory('ApiService', ['Restangular', '$q', 'UtilService'
|
|||
};
|
||||
};
|
||||
|
||||
var buildMethodsForOperation = function(operation, resource, resourceMap) {
|
||||
var method = operation['method'].toLowerCase();
|
||||
var operationName = operation['nickname'];
|
||||
var path = resource['path'];
|
||||
var buildMethodsForOperation = function(operation, method, path, resourceMap) {
|
||||
var operationName = operation['operationId'];
|
||||
var urlPath = path['path'];
|
||||
|
||||
// Add the operation itself.
|
||||
apiService[operationName] = function(opt_options, opt_parameters, opt_background, opt_forcessl) {
|
||||
var one = Restangular.one(buildUrl(path, opt_parameters, opt_forcessl));
|
||||
var one = Restangular.one(buildUrl(urlPath, opt_parameters, opt_forcessl));
|
||||
if (opt_background) {
|
||||
one.withHttpConfig({
|
||||
'ignoreLoadingBar': true
|
||||
|
@ -251,15 +237,15 @@ angular.module('quay').factory('ApiService', ['Restangular', '$q', 'UtilService'
|
|||
// If the method for the operation is a GET, add an operationAsResource method.
|
||||
if (method == 'get') {
|
||||
apiService[operationName + 'AsResource'] = function(opt_parameters, opt_background) {
|
||||
return getResource(buildUrl(path, opt_parameters), opt_background);
|
||||
return getResource(buildUrl(urlPath, opt_parameters), opt_background);
|
||||
};
|
||||
}
|
||||
|
||||
// If the resource has a user-related resource, then make a generic operation for this operation
|
||||
// If the operation has a user-related operation, then make a generic operation for this operation
|
||||
// that can call both the user and the organization versions of the operation, depending on the
|
||||
// parameters given.
|
||||
if (resource['quayUserRelated']) {
|
||||
var userOperationName = getMatchingUserOperationName(operationName, method, resourceMap[resource['quayUserRelated']]);
|
||||
if (path['quay_user_related']) {
|
||||
var userOperationName = getMatchingUserOperationName(operationName, method, resourceMap[path['quay_user_related']]);
|
||||
var genericOperationName = getGenericOperationName(userOperationName);
|
||||
apiService[genericOperationName] = function(orgname, opt_options, opt_parameters, opt_background) {
|
||||
if (orgname) {
|
||||
|
@ -280,19 +266,34 @@ angular.module('quay').factory('ApiService', ['Restangular', '$q', 'UtilService'
|
|||
return apiService;
|
||||
}
|
||||
|
||||
var allowedMethods = ['get', 'post', 'put', 'delete'];
|
||||
var resourceMap = {};
|
||||
var forEachOperation = function(callback) {
|
||||
for (var path in window.__endpoints) {
|
||||
if (!window.__endpoints.hasOwnProperty(path)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (var method in window.__endpoints[path]) {
|
||||
if (!window.__endpoints[path].hasOwnProperty(method)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (allowedMethods.indexOf(method.toLowerCase()) < 0) { continue; }
|
||||
callback(window.__endpoints[path][method], method, window.__endpoints[path]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Build the map of resource names to their objects.
|
||||
for (var i = 0; i < window.__endpoints.length; ++i) {
|
||||
var endpointResource = window.__endpoints[i];
|
||||
resourceMap[endpointResource['name']] = endpointResource;
|
||||
}
|
||||
forEachOperation(function(operation, method, path) {
|
||||
resourceMap[path.name] = path;
|
||||
});
|
||||
|
||||
// Construct the methods for each API endpoint.
|
||||
for (var i = 0; i < window.__endpoints.length; ++i) {
|
||||
var endpointResource = window.__endpoints[i];
|
||||
buildMethodsForEndpointResource(endpointResource, resourceMap);
|
||||
}
|
||||
forEachOperation(function(operation, method, path) {
|
||||
buildMethodsForOperation(operation, method, path, resourceMap);
|
||||
});
|
||||
|
||||
apiService.getErrorMessage = function(resp, defaultMessage) {
|
||||
var message = defaultMessage;
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
{% endblock %}
|
||||
|
||||
<script type="text/javascript">
|
||||
window.__endpoints = {{ route_data|safe }}.apis;
|
||||
window.__endpoints = {{ route_data|safe }}.paths;
|
||||
window.__features = {{ feature_set|safe }};
|
||||
window.__config = {{ config_set|safe }};
|
||||
window.__oauth = {{ oauth_set|safe }};
|
||||
|
|
Reference in a new issue