From ec4e4419ac5b2d452a89161031870eeea59c26ea Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 12 Jun 2022 10:06:48 +0000 Subject: [PATCH 1/5] Flutter template refactoring --- templates/flutter/base/api.twig | 34 +++++++ templates/flutter/base/file.twig | 49 ++++++++++ templates/flutter/base/macros.twig | 5 + templates/flutter/base/oauth.twig | 44 +++++++++ .../flutter/lib/services/service.dart.twig | 96 ++----------------- 5 files changed, 139 insertions(+), 89 deletions(-) create mode 100644 templates/flutter/base/api.twig create mode 100644 templates/flutter/base/file.twig create mode 100644 templates/flutter/base/macros.twig create mode 100644 templates/flutter/base/oauth.twig diff --git a/templates/flutter/base/api.twig b/templates/flutter/base/api.twig new file mode 100644 index 000000000..ee5e88246 --- /dev/null +++ b/templates/flutter/base/api.twig @@ -0,0 +1,34 @@ +{% import "flutter/base/macros.twig" as macros %} + + final Map params = { +{% for parameter in method.parameters.query %} + {{ macros.map_parameter(parameter) }} +{% endfor %} +{% for parameter in method.parameters.body %} + {{ macros.map_parameter(parameter) }} +{% endfor %} +{% if method.type == 'location' %} +{% if method.security|length > 0 %} +{% for node in method.security %} +{% for key,header in node|keys %} + '{{header|caseLower}}': client.config['{{header|caseLower}}'], +{% endfor %} +{% endfor %} +{% endif %} +{% endif %} + }; + +{% if method.type == 'location' %} + final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); + return res.data; +{% else %} + final Map headers = { +{% for key, header in method.headers %} + '{{ key }}': '{{ header }}', +{% endfor %} + }; + + final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); + + return {% if method.responseModel and method.responseModel != 'any' %}models.{{method.responseModel | caseUcfirst}}.fromMap(res.data){% else %} res.data{% endif %}; +{% endif %} \ No newline at end of file diff --git a/templates/flutter/base/file.twig b/templates/flutter/base/file.twig new file mode 100644 index 000000000..d1fdb3817 --- /dev/null +++ b/templates/flutter/base/file.twig @@ -0,0 +1,49 @@ +{% import "flutter/base/macros.twig" as macros %} + + final Map params = { +{% for parameter in method.parameters.query %} + {{ macros.map_parameter(parameter) }} +{% endfor %} +{% for parameter in method.parameters.body %} + {{ macros.map_parameter(parameter) }} +{% endfor %} + }; + + final Map headers = { +{% for key, header in method.headers %} + '{{ key }}': '{{ header }}', +{% endfor %} + }; + +{% if 'multipart/form-data' in method.consumes %} + dynamic res; + if(kIsWeb) { +{% for parameter in method.parameters.all %} +{% if parameter.type == 'file' %} + params['{{ parameter.name }}'] = {{ parameter.name }}.file; +{% endif %} +{% endfor %} + res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); + } else { + String idParamName = ''; +{% for parameter in method.parameters.all %} +{% if parameter.type == 'file' %} + final paramName = '{{ parameter.name }}'; +{% endif %} +{% if parameter.isUploadID %} + idParamName = '{{ parameter.name }}'; +{% endif %} +{% endfor %} + res = await chunkedUpload( + client: client, + path: path, + params: params, + paramName: paramName, + idParamName: idParamName, + headers: headers, + onProgress: onProgress, + ); + } + + return {% if method.responseModel and method.responseModel != 'any' %}models.{{method.responseModel | caseUcfirst}}.fromMap(res.data){% else %} res.data{% endif %}; +{% endif %} diff --git a/templates/flutter/base/macros.twig b/templates/flutter/base/macros.twig new file mode 100644 index 000000000..45e95820c --- /dev/null +++ b/templates/flutter/base/macros.twig @@ -0,0 +1,5 @@ +{% macro parameter(parameter) %}{% if parameter.required %}required {{ parameter.type | typeName }}{% else %}{{ parameter.type | typeName }}?{% endif %} {{ parameter.name | caseCamel | escapeKeyword }}{% endmacro %} +{% macro method_parameters(parameters, consumes) %} +{% if parameters.all|length > 0 %}{{ '{' }}{% for parameter in parameters.all %}{{ _self.parameter(parameter) }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in consumes %}, Function(UploadProgress)? onProgress{% endif %}{{ '}' }}{% endif %} +{% endmacro %} +{% macro map_parameter(parameter) %}'{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }},{% endmacro %} \ No newline at end of file diff --git a/templates/flutter/base/oauth.twig b/templates/flutter/base/oauth.twig new file mode 100644 index 000000000..369131e8e --- /dev/null +++ b/templates/flutter/base/oauth.twig @@ -0,0 +1,44 @@ +{% import "flutter/base/macros.twig" as macros %} + + final Map params = { +{% for parameter in method.parameters.query %} + {{ macros.map_parameter(parameter) }} +{% endfor %} +{% for parameter in method.parameters.body %} + {{ macros.map_parameter(parameter) }} +{% endfor %} +{% if method.type == 'webAuth' %} +{% if method.security|length > 0 %} +{% for node in method.security %} +{% for key,header in node|keys %} + '{{header|caseLower}}': client.config['{{header|caseLower}}'], +{% endfor %} +{% endfor %} +{% endif %} +{% endif %} + }; + +{% if method.type == 'webAuth' %} + + final List query = []; + + params.forEach((key, value) { + if (value is List) { + for (var item in value) { + query.add(Uri.encodeComponent(key + '[]') + '=' + Uri.encodeComponent(item)); + } + } else if(value != null) { + query.add(Uri.encodeComponent(key) + '=' + Uri.encodeComponent(value)); + } + }); + + Uri endpoint = Uri.parse(client.endPoint); + Uri url = Uri(scheme: endpoint.scheme, + host: endpoint.host, + port: endpoint.port, + path: endpoint.path + path, + query: query.join('&') + ); + + return client.webAuth(url); +{% endif %} \ No newline at end of file diff --git a/templates/flutter/lib/services/service.dart.twig b/templates/flutter/lib/services/service.dart.twig index 23cc10289..7e99b15f3 100644 --- a/templates/flutter/lib/services/service.dart.twig +++ b/templates/flutter/lib/services/service.dart.twig @@ -1,10 +1,6 @@ part of {{ language.params.packageName }}; -{% macro parameter(parameter) %}{% if parameter.required %}required {{ parameter.type | typeName }}{% else %}{{ parameter.type | typeName }}?{% endif %} {{ parameter.name | caseCamel | escapeKeyword }}{% endmacro %} -{% macro method_parameters(parameters, consumes) %} -{% if parameters.all|length > 0 %}{{ '{' }}{% for parameter in parameters.all %}{{ _self.parameter(parameter) }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in consumes %}, Function(UploadProgress)? onProgress{% endif %}{{ '}' }}{% endif %} -{% endmacro %} -{% macro map_parameter(parameter) %}'{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }},{% endmacro %} +{% import "flutter/base/macros.twig" as macros %} {%if service.description %} {{ service.description|dartComment}} @@ -19,95 +15,17 @@ class {{ service.name | caseUcfirst }} extends Service { {{ method.description|dartComment }} /// {% endif %} - {% if method.type == 'webAuth' %}Future{% elseif method.type == 'location' %} Future {% else %} {% if method.responseModel and method.responseModel != 'any' %}Future{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel }}({{ _self.method_parameters(method.parameters, method.consumes) }}) async { + {% if method.type == 'webAuth' %}Future{% elseif method.type == 'location' %} Future {% else %} {% if method.responseModel and method.responseModel != 'any' %}Future{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel }}({{ macros.method_parameters(method.parameters, method.consumes) }}) async { {% if method.parameters.path | length > 0 %}final{% else %}const{% endif %} String path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %}; - final Map params = { -{% for parameter in method.parameters.query %} - {{ _self.map_parameter(parameter) }} -{% endfor %} -{% for parameter in method.parameters.body %} - {{ _self.map_parameter(parameter) }} -{% endfor %} -{% if method.type == 'webAuth' or method.type == 'location' %} -{% if method.security|length > 0 %} -{% for node in method.security %} -{% for key,header in node|keys %} - '{{header|caseLower}}': client.config['{{header|caseLower}}'], -{% endfor %} -{% endfor %} -{% endif %} -{% endif %} - }; - -{% if method.type == 'webAuth' %} - - final List query = []; - - params.forEach((key, value) { - if (value is List) { - for (var item in value) { - query.add(Uri.encodeComponent(key + '[]') + '=' + Uri.encodeComponent(item)); - } - } else if(value != null) { - query.add(Uri.encodeComponent(key) + '=' + Uri.encodeComponent(value)); - } - }); - - Uri endpoint = Uri.parse(client.endPoint); - Uri url = Uri(scheme: endpoint.scheme, - host: endpoint.host, - port: endpoint.port, - path: endpoint.path + path, - query: query.join('&') - ); - - return client.webAuth(url); - -{% elseif method.type == 'location' %} - final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); - return res.data; -{% else %} - final Map headers = { -{% for key, header in method.headers %} - '{{ key }}': '{{ header }}', -{% endfor %} - }; - {% if 'multipart/form-data' in method.consumes %} - dynamic res; - if(kIsWeb) { -{% for parameter in method.parameters.all %} -{% if parameter.type == 'file' %} - params['{{ parameter.name }}'] = {{ parameter.name }}.file; -{% endif %} -{% endfor %} - res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); - } else { - String idParamName = ''; -{% for parameter in method.parameters.all %} -{% if parameter.type == 'file' %} - final paramName = '{{ parameter.name }}'; -{% endif %} -{% if parameter.isUploadID %} - idParamName = '{{ parameter.name }}'; -{% endif %} -{% endfor %} - res = await chunkedUpload( - client: client, - path: path, - params: params, - paramName: paramName, - idParamName: idParamName, - headers: headers, - onProgress: onProgress, - ); - } +{{ include('flutter/base/file.twig') }} +{% elseif method.type == 'webAuth' %} +{{ include('flutter/base/oauth.twig') }} {% else %} - final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); -{% endif %} - return {% if method.responseModel and method.responseModel != 'any' %}models.{{method.responseModel | caseUcfirst}}.fromMap(res.data){% else %} res.data{% endif %}; +{{ include('flutter/base/api.twig') }} {% endif %} + } {% endfor %} } \ No newline at end of file From 9c1892da96311075fda2d3ee7045aec7f37bb17f Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 13 Jun 2022 05:18:32 +0000 Subject: [PATCH 2/5] location method template separated --- templates/flutter/base/api.twig | 14 ------------- templates/flutter/base/location.twig | 20 +++++++++++++++++++ .../flutter/lib/services/service.dart.twig | 2 ++ 3 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 templates/flutter/base/location.twig diff --git a/templates/flutter/base/api.twig b/templates/flutter/base/api.twig index ee5e88246..68ceb9a7c 100644 --- a/templates/flutter/base/api.twig +++ b/templates/flutter/base/api.twig @@ -7,21 +7,8 @@ {% for parameter in method.parameters.body %} {{ macros.map_parameter(parameter) }} {% endfor %} -{% if method.type == 'location' %} -{% if method.security|length > 0 %} -{% for node in method.security %} -{% for key,header in node|keys %} - '{{header|caseLower}}': client.config['{{header|caseLower}}'], -{% endfor %} -{% endfor %} -{% endif %} -{% endif %} }; -{% if method.type == 'location' %} - final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); - return res.data; -{% else %} final Map headers = { {% for key, header in method.headers %} '{{ key }}': '{{ header }}', @@ -31,4 +18,3 @@ final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); return {% if method.responseModel and method.responseModel != 'any' %}models.{{method.responseModel | caseUcfirst}}.fromMap(res.data){% else %} res.data{% endif %}; -{% endif %} \ No newline at end of file diff --git a/templates/flutter/base/location.twig b/templates/flutter/base/location.twig new file mode 100644 index 000000000..6ed854ee4 --- /dev/null +++ b/templates/flutter/base/location.twig @@ -0,0 +1,20 @@ +{% import "flutter/base/macros.twig" as macros %} + + final Map params = { +{% for parameter in method.parameters.query %} + {{ macros.map_parameter(parameter) }} +{% endfor %} +{% for parameter in method.parameters.body %} + {{ macros.map_parameter(parameter) }} +{% endfor %} +{% if method.security|length > 0 %} +{% for node in method.security %} +{% for key,header in node|keys %} + '{{header|caseLower}}': client.config['{{header|caseLower}}'], +{% endfor %} +{% endfor %} +{% endif %} + }; + + final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); + return res.data; \ No newline at end of file diff --git a/templates/flutter/lib/services/service.dart.twig b/templates/flutter/lib/services/service.dart.twig index 7e99b15f3..1c9d183b6 100644 --- a/templates/flutter/lib/services/service.dart.twig +++ b/templates/flutter/lib/services/service.dart.twig @@ -22,6 +22,8 @@ class {{ service.name | caseUcfirst }} extends Service { {{ include('flutter/base/file.twig') }} {% elseif method.type == 'webAuth' %} {{ include('flutter/base/oauth.twig') }} +{% elseif method.type == 'location' %} +{{ include('flutter/base/location.twig') }} {% else %} {{ include('flutter/base/api.twig') }} {% endif %} From 9d39a4319bd794fcaf10046f98474e92bdd7dfd4 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 14 Jun 2022 01:33:09 +0000 Subject: [PATCH 3/5] more refactor --- templates/flutter/base/macros.twig | 5 ----- templates/flutter/base/{ => requests}/api.twig | 6 ++---- templates/flutter/base/{ => requests}/file.twig | 8 +++----- .../flutter/base/{ => requests}/location.twig | 6 ++---- templates/flutter/base/{ => requests}/oauth.twig | 6 ++---- templates/flutter/lib/services/service.dart.twig | 16 +++++++++------- 6 files changed, 18 insertions(+), 29 deletions(-) delete mode 100644 templates/flutter/base/macros.twig rename templates/flutter/base/{ => requests}/api.twig (78%) rename templates/flutter/base/{ => requests}/file.twig (86%) rename templates/flutter/base/{ => requests}/location.twig (76%) rename templates/flutter/base/{ => requests}/oauth.twig (87%) diff --git a/templates/flutter/base/macros.twig b/templates/flutter/base/macros.twig deleted file mode 100644 index 45e95820c..000000000 --- a/templates/flutter/base/macros.twig +++ /dev/null @@ -1,5 +0,0 @@ -{% macro parameter(parameter) %}{% if parameter.required %}required {{ parameter.type | typeName }}{% else %}{{ parameter.type | typeName }}?{% endif %} {{ parameter.name | caseCamel | escapeKeyword }}{% endmacro %} -{% macro method_parameters(parameters, consumes) %} -{% if parameters.all|length > 0 %}{{ '{' }}{% for parameter in parameters.all %}{{ _self.parameter(parameter) }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in consumes %}, Function(UploadProgress)? onProgress{% endif %}{{ '}' }}{% endif %} -{% endmacro %} -{% macro map_parameter(parameter) %}'{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }},{% endmacro %} \ No newline at end of file diff --git a/templates/flutter/base/api.twig b/templates/flutter/base/requests/api.twig similarity index 78% rename from templates/flutter/base/api.twig rename to templates/flutter/base/requests/api.twig index 68ceb9a7c..fdd9e2448 100644 --- a/templates/flutter/base/api.twig +++ b/templates/flutter/base/requests/api.twig @@ -1,11 +1,9 @@ -{% import "flutter/base/macros.twig" as macros %} - final Map params = { {% for parameter in method.parameters.query %} - {{ macros.map_parameter(parameter) }} + '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, {% endfor %} {% for parameter in method.parameters.body %} - {{ macros.map_parameter(parameter) }} + '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, {% endfor %} }; diff --git a/templates/flutter/base/file.twig b/templates/flutter/base/requests/file.twig similarity index 86% rename from templates/flutter/base/file.twig rename to templates/flutter/base/requests/file.twig index d1fdb3817..6e859099e 100644 --- a/templates/flutter/base/file.twig +++ b/templates/flutter/base/requests/file.twig @@ -1,11 +1,9 @@ -{% import "flutter/base/macros.twig" as macros %} - - final Map params = { + final Map params = { {% for parameter in method.parameters.query %} - {{ macros.map_parameter(parameter) }} + '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, {% endfor %} {% for parameter in method.parameters.body %} - {{ macros.map_parameter(parameter) }} + '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, {% endfor %} }; diff --git a/templates/flutter/base/location.twig b/templates/flutter/base/requests/location.twig similarity index 76% rename from templates/flutter/base/location.twig rename to templates/flutter/base/requests/location.twig index 6ed854ee4..38a81eae0 100644 --- a/templates/flutter/base/location.twig +++ b/templates/flutter/base/requests/location.twig @@ -1,11 +1,9 @@ -{% import "flutter/base/macros.twig" as macros %} - final Map params = { {% for parameter in method.parameters.query %} - {{ macros.map_parameter(parameter) }} + '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, {% endfor %} {% for parameter in method.parameters.body %} - {{ macros.map_parameter(parameter) }} + '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, {% endfor %} {% if method.security|length > 0 %} {% for node in method.security %} diff --git a/templates/flutter/base/oauth.twig b/templates/flutter/base/requests/oauth.twig similarity index 87% rename from templates/flutter/base/oauth.twig rename to templates/flutter/base/requests/oauth.twig index 369131e8e..bf0989ec7 100644 --- a/templates/flutter/base/oauth.twig +++ b/templates/flutter/base/requests/oauth.twig @@ -1,11 +1,9 @@ -{% import "flutter/base/macros.twig" as macros %} - final Map params = { {% for parameter in method.parameters.query %} - {{ macros.map_parameter(parameter) }} + '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, {% endfor %} {% for parameter in method.parameters.body %} - {{ macros.map_parameter(parameter) }} + '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, {% endfor %} {% if method.type == 'webAuth' %} {% if method.security|length > 0 %} diff --git a/templates/flutter/lib/services/service.dart.twig b/templates/flutter/lib/services/service.dart.twig index 1c9d183b6..e253f1cfb 100644 --- a/templates/flutter/lib/services/service.dart.twig +++ b/templates/flutter/lib/services/service.dart.twig @@ -1,6 +1,8 @@ part of {{ language.params.packageName }}; - -{% import "flutter/base/macros.twig" as macros %} +{% macro parameter(parameter) %}{% if parameter.required %}required {{ parameter.type | typeName }}{% else %}{{ parameter.type | typeName }}?{% endif %} {{ parameter.name | caseCamel | escapeKeyword }}{% endmacro %} +{% macro method_parameters(parameters, consumes) %} +{% if parameters.all|length > 0 %}{{ '{' }}{% for parameter in parameters.all %}{{ _self.parameter(parameter) }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in consumes %}, Function(UploadProgress)? onProgress{% endif %}{{ '}' }}{% endif %} +{% endmacro %} {%if service.description %} {{ service.description|dartComment}} @@ -15,17 +17,17 @@ class {{ service.name | caseUcfirst }} extends Service { {{ method.description|dartComment }} /// {% endif %} - {% if method.type == 'webAuth' %}Future{% elseif method.type == 'location' %} Future {% else %} {% if method.responseModel and method.responseModel != 'any' %}Future{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel }}({{ macros.method_parameters(method.parameters, method.consumes) }}) async { + {% if method.type == 'webAuth' %}Future{% elseif method.type == 'location' %} Future {% else %} {% if method.responseModel and method.responseModel != 'any' %}Future{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel }}({{ _self.method_parameters(method.parameters, method.consumes) }}) async { {% if method.parameters.path | length > 0 %}final{% else %}const{% endif %} String path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %}; {% if 'multipart/form-data' in method.consumes %} -{{ include('flutter/base/file.twig') }} +{{ include('flutter/base/requests/file.twig') }} {% elseif method.type == 'webAuth' %} -{{ include('flutter/base/oauth.twig') }} +{{ include('flutter/base/requests/oauth.twig') }} {% elseif method.type == 'location' %} -{{ include('flutter/base/location.twig') }} +{{ include('flutter/base/requests/location.twig') }} {% else %} -{{ include('flutter/base/api.twig') }} +{{ include('flutter/base/requests/api.twig') }} {% endif %} } From 1648b3c269935bfebd3e0925c2b4db73e60867de Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 14 Jun 2022 01:46:27 +0000 Subject: [PATCH 4/5] more cleaning up --- templates/flutter/base/requests/api.twig | 13 ++++--------- templates/flutter/base/requests/file.twig | 15 +++++---------- templates/flutter/base/requests/location.twig | 12 ++++-------- templates/flutter/base/requests/oauth.twig | 16 ++++------------ templates/flutter/base/utils.twig | 11 +++++++++++ 5 files changed, 28 insertions(+), 39 deletions(-) create mode 100644 templates/flutter/base/utils.twig diff --git a/templates/flutter/base/requests/api.twig b/templates/flutter/base/requests/api.twig index fdd9e2448..b3e5dd819 100644 --- a/templates/flutter/base/requests/api.twig +++ b/templates/flutter/base/requests/api.twig @@ -1,16 +1,11 @@ +{% import 'flutter/base/utils.twig' as utils %} final Map params = { -{% for parameter in method.parameters.query %} - '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, -{% endfor %} -{% for parameter in method.parameters.body %} - '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, -{% endfor %} + {{ utils.map_parameter(method.parameters.query) }} + {{ utils.map_parameter(method.parameters.body) }} }; final Map headers = { -{% for key, header in method.headers %} - '{{ key }}': '{{ header }}', -{% endfor %} + {{ utils.map_headers(method.headers) }} }; final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); diff --git a/templates/flutter/base/requests/file.twig b/templates/flutter/base/requests/file.twig index 6e859099e..e2e80cbad 100644 --- a/templates/flutter/base/requests/file.twig +++ b/templates/flutter/base/requests/file.twig @@ -1,16 +1,11 @@ - final Map params = { -{% for parameter in method.parameters.query %} - '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, -{% endfor %} -{% for parameter in method.parameters.body %} - '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, -{% endfor %} + {% import 'flutter/base/utils.twig' as utils %} + final Map params = { + {{ utils.map_parameter(method.parameters.query) }} + {{ utils.map_parameter(method.parameters.body) }} }; final Map headers = { -{% for key, header in method.headers %} - '{{ key }}': '{{ header }}', -{% endfor %} + {{ utils.map_headers(method.headers) }} }; {% if 'multipart/form-data' in method.consumes %} diff --git a/templates/flutter/base/requests/location.twig b/templates/flutter/base/requests/location.twig index 38a81eae0..47731d778 100644 --- a/templates/flutter/base/requests/location.twig +++ b/templates/flutter/base/requests/location.twig @@ -1,12 +1,8 @@ +{% import 'flutter/base/utils.twig' as utils %} final Map params = { -{% for parameter in method.parameters.query %} - '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, -{% endfor %} -{% for parameter in method.parameters.body %} - '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, -{% endfor %} -{% if method.security|length > 0 %} -{% for node in method.security %} + {{ utils.map_parameter(method.parameters.query) }} + {{ utils.map_parameter(method.parameters.body) }} +{% if method.security|length > 0 %}{% for node in method.security %} {% for key,header in node|keys %} '{{header|caseLower}}': client.config['{{header|caseLower}}'], {% endfor %} diff --git a/templates/flutter/base/requests/oauth.twig b/templates/flutter/base/requests/oauth.twig index bf0989ec7..4a19160be 100644 --- a/templates/flutter/base/requests/oauth.twig +++ b/templates/flutter/base/requests/oauth.twig @@ -1,23 +1,16 @@ +{% import 'flutter/base/utils.twig' as utils %} final Map params = { -{% for parameter in method.parameters.query %} - '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, -{% endfor %} -{% for parameter in method.parameters.body %} - '{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, -{% endfor %} -{% if method.type == 'webAuth' %} + {{ utils.map_parameter(method.parameters.query) }} + {{ utils.map_parameter(method.parameters.body) }} {% if method.security|length > 0 %} {% for node in method.security %} {% for key,header in node|keys %} '{{header|caseLower}}': client.config['{{header|caseLower}}'], {% endfor %} {% endfor %} -{% endif %} {% endif %} }; -{% if method.type == 'webAuth' %} - final List query = []; params.forEach((key, value) { @@ -38,5 +31,4 @@ query: query.join('&') ); - return client.webAuth(url); -{% endif %} \ No newline at end of file + return client.webAuth(url); \ No newline at end of file diff --git a/templates/flutter/base/utils.twig b/templates/flutter/base/utils.twig new file mode 100644 index 000000000..331cc931f --- /dev/null +++ b/templates/flutter/base/utils.twig @@ -0,0 +1,11 @@ +{% macro map_parameter(parameters) %} +{% for parameter in parameters %} +'{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, +{% endfor %} +{% endmacro %} + +{% macro map_headers(headers) %} +{% for key, header in headers %} + '{{ key }}': '{{ header }}', +{% endfor %} +{% endmacro %} \ No newline at end of file From 5763521184e6466601e58c37af677cea3ac8eb39 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 14 Jun 2022 02:01:14 +0000 Subject: [PATCH 5/5] refactor dart templates --- templates/dart/base/requests/api.twig | 13 ++++ templates/dart/base/requests/file.twig | 42 ++++++++++++ templates/dart/base/requests/location.twig | 14 ++++ templates/dart/base/requests/oauth.twig | 34 ++++++++++ templates/dart/base/utils.twig | 11 +++ templates/dart/lib/services/service.dart.twig | 68 ++----------------- 6 files changed, 120 insertions(+), 62 deletions(-) create mode 100644 templates/dart/base/requests/api.twig create mode 100644 templates/dart/base/requests/file.twig create mode 100644 templates/dart/base/requests/location.twig create mode 100644 templates/dart/base/requests/oauth.twig create mode 100644 templates/dart/base/utils.twig diff --git a/templates/dart/base/requests/api.twig b/templates/dart/base/requests/api.twig new file mode 100644 index 000000000..b3e5dd819 --- /dev/null +++ b/templates/dart/base/requests/api.twig @@ -0,0 +1,13 @@ +{% import 'flutter/base/utils.twig' as utils %} + final Map params = { + {{ utils.map_parameter(method.parameters.query) }} + {{ utils.map_parameter(method.parameters.body) }} + }; + + final Map headers = { + {{ utils.map_headers(method.headers) }} + }; + + final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); + + return {% if method.responseModel and method.responseModel != 'any' %}models.{{method.responseModel | caseUcfirst}}.fromMap(res.data){% else %} res.data{% endif %}; diff --git a/templates/dart/base/requests/file.twig b/templates/dart/base/requests/file.twig new file mode 100644 index 000000000..53b166375 --- /dev/null +++ b/templates/dart/base/requests/file.twig @@ -0,0 +1,42 @@ + {% import 'flutter/base/utils.twig' as utils %} + final Map params = { + {{ utils.map_parameter(method.parameters.query) }} + {{ utils.map_parameter(method.parameters.body) }} + }; + + final Map headers = { + {{ utils.map_headers(method.headers) }} + }; + +{% if 'multipart/form-data' in method.consumes %} + dynamic res; + if(identical(0, 0.0)) { +{% for parameter in method.parameters.all %} +{% if parameter.type == 'file' %} + params['{{ parameter.name }}'] = {{ parameter.name }}.file; +{% endif %} +{% endfor %} + res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); + } else { + String idParamName = ''; +{% for parameter in method.parameters.all %} +{% if parameter.type == 'file' %} + final paramName = '{{ parameter.name }}'; +{% endif %} +{% if parameter.isUploadID %} + idParamName = '{{ parameter.name }}'; +{% endif %} +{% endfor %} + res = await chunkedUpload( + client: client, + path: path, + params: params, + paramName: paramName, + idParamName: idParamName, + headers: headers, + onProgress: onProgress, + ); + } + + return {% if method.responseModel and method.responseModel != 'any' %}models.{{method.responseModel | caseUcfirst}}.fromMap(res.data){% else %} res.data{% endif %}; +{% endif %} diff --git a/templates/dart/base/requests/location.twig b/templates/dart/base/requests/location.twig new file mode 100644 index 000000000..47731d778 --- /dev/null +++ b/templates/dart/base/requests/location.twig @@ -0,0 +1,14 @@ +{% import 'flutter/base/utils.twig' as utils %} + final Map params = { + {{ utils.map_parameter(method.parameters.query) }} + {{ utils.map_parameter(method.parameters.body) }} +{% if method.security|length > 0 %}{% for node in method.security %} +{% for key,header in node|keys %} + '{{header|caseLower}}': client.config['{{header|caseLower}}'], +{% endfor %} +{% endfor %} +{% endif %} + }; + + final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); + return res.data; \ No newline at end of file diff --git a/templates/dart/base/requests/oauth.twig b/templates/dart/base/requests/oauth.twig new file mode 100644 index 000000000..4a19160be --- /dev/null +++ b/templates/dart/base/requests/oauth.twig @@ -0,0 +1,34 @@ +{% import 'flutter/base/utils.twig' as utils %} + final Map params = { + {{ utils.map_parameter(method.parameters.query) }} + {{ utils.map_parameter(method.parameters.body) }} +{% if method.security|length > 0 %} +{% for node in method.security %} +{% for key,header in node|keys %} + '{{header|caseLower}}': client.config['{{header|caseLower}}'], +{% endfor %} +{% endfor %} +{% endif %} + }; + + final List query = []; + + params.forEach((key, value) { + if (value is List) { + for (var item in value) { + query.add(Uri.encodeComponent(key + '[]') + '=' + Uri.encodeComponent(item)); + } + } else if(value != null) { + query.add(Uri.encodeComponent(key) + '=' + Uri.encodeComponent(value)); + } + }); + + Uri endpoint = Uri.parse(client.endPoint); + Uri url = Uri(scheme: endpoint.scheme, + host: endpoint.host, + port: endpoint.port, + path: endpoint.path + path, + query: query.join('&') + ); + + return client.webAuth(url); \ No newline at end of file diff --git a/templates/dart/base/utils.twig b/templates/dart/base/utils.twig new file mode 100644 index 000000000..2a23dbd98 --- /dev/null +++ b/templates/dart/base/utils.twig @@ -0,0 +1,11 @@ +{% macro map_parameter(parameters) %} +{% for parameter in parameters %} +'{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }}, +{% endfor %} +{% endmacro %} + +{% macro map_headers(headers) %} +{% for key, header in headers %} +'{{ key }}': '{{ header }}', +{% endfor %} +{% endmacro %} \ No newline at end of file diff --git a/templates/dart/lib/services/service.dart.twig b/templates/dart/lib/services/service.dart.twig index 1a5390b2a..fa43fb491 100644 --- a/templates/dart/lib/services/service.dart.twig +++ b/templates/dart/lib/services/service.dart.twig @@ -4,7 +4,6 @@ part of {{ language.params.packageName }}; {% macro method_parameters(parameters, consumes) %} {% if parameters.all|length > 0 %}{{ '{' }}{% for parameter in parameters.all %}{{ _self.parameter(parameter) }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in consumes %}, Function(UploadProgress)? onProgress{% endif %}{{ '}' }}{% endif %} {% endmacro %} -{% macro map_parameter(parameter) %}'{{ parameter.name }}': {{ parameter.name | caseCamel | escapeKeyword }},{% endmacro %} {%if service.description %} {{ service.description|dartComment}} @@ -19,72 +18,17 @@ class {{ service.name | caseUcfirst }} extends Service { {{ method.description | dartComment }} /// {% endif %} - {% if method.type == 'webAuth' %}Future{% elseif method.type == 'location' %} Future {% else %} {% if method.responseModel and method.responseModel != 'any' %}Future{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel }}({{ _self.method_parameters(method.parameters, method.consumes) }}) async { + {% if method.type == 'location' %} Future {% else %} {% if method.responseModel and method.responseModel != 'any' %}Future{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel }}({{ _self.method_parameters(method.parameters, method.consumes) }}) async { final String path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %}; - final Map params = { -{% for parameter in method.parameters.query %} - {{ _self.map_parameter(parameter) }} -{% endfor %} -{% for parameter in method.parameters.body %} - {{ _self.map_parameter(parameter) }} -{% endfor %} -{% if method.type == 'location' %} -{% if method.security|length > 0 %} -{% for node in method.security %} -{% for key,header in node|keys %} - '{{header|caseLower}}': client.config['{{header|caseLower}}'], -{% endfor %} -{% endfor %} -{% endif %} -{% endif %} - }; - -{% if method.type == 'location' %} - final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); - return res.data; -{% else %} - final Map headers = { -{% for key, header in method.headers %} - '{{ key }}': '{{ header }}', -{% endfor %} - }; - - {% if 'multipart/form-data' in method.consumes %} - dynamic res; - if(identical(0, 0.0)) { -{% for parameter in method.parameters.all %} -{% if parameter.type == 'file' %} - params['{{ parameter.name }}'] = {{ parameter.name }}.file; -{% endif %} -{% endfor %} - res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); - } else { - String idParamName = ''; -{% for parameter in method.parameters.all %} -{% if parameter.type == 'file' %} - final paramName = '{{ parameter.name }}'; -{% endif %} -{% if parameter.isUploadID %} - idParamName = '{{ parameter.name }}'; -{% endif %} -{% endfor %} - res = await chunkedUpload( - client: client, - path: path, - params: params, - paramName: paramName, - idParamName: idParamName, - headers: headers, - onProgress: onProgress, - ); - } +{{ include('dart/base/requests/file.twig') }} +{% elseif method.type == 'location' %} +{{ include('dart/base/requests/location.twig') }} {% else %} - final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, headers: headers); -{% endif %} - return {% if method.responseModel and method.responseModel != 'any' %}models.{{method.responseModel | caseUcfirst | overrideIdentifier}}.fromMap(res.data){% else %} res.data{% endif %}; +{{ include('dart/base/requests/api.twig') }} {% endif %} + } {% endfor %} } \ No newline at end of file