Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(deno): response models #306

Merged
merged 4 commits into from
Nov 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion example.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ function getSSLPage($url) {
// $spec = getSSLPage('https://appwrite.io/v1/open-api-2.json?extensions=1'); // Enable only with Appwrite local server running on port 80
// $spec = getSSLPage('https://appwrite.io/v1/open-api-2.json?extensions=1&platform=console'); // Enable only with Appwrite local server running on port 80
// $spec = file_get_contents('https://appwrite.io/specs/swagger2?platform=client');
$spec = file_get_contents('./specs/swagger-appwrite.0.10.0.json');
$spec = file_get_contents('./specs/swagger-appwrite.0.11.0.json');

if(empty($spec)) {
throw new Exception('Failed to fetch spec from Appwrite server');
Expand Down
1 change: 1 addition & 0 deletions specs/swagger-appwrite.0.11.0.json

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions src/SDK/Language/Deno.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ public function getFiles()
'template' => 'deno/src/service.ts.twig',
'minify' => false,
],
[
'scope' => 'default',
'destination' => '/src/models.d.ts',
'template' => 'deno/src/models.d.ts.twig',
'minify' => false,
],
[
'scope' => 'default',
'destination' => '/src/exception.ts',
Expand Down
4 changes: 3 additions & 1 deletion templates/deno/mod.ts.twig
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ export {
{% for service in spec.services %}
{{service.name | caseUcfirst}},
{% endfor %}
};
};

export type { Models } from "./src/models.d.ts";
6 changes: 3 additions & 3 deletions templates/deno/src/client.ts.twig
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export class Client {
'{{key}}':'{{header}}',
{% endfor %}
};

{% for header in spec.global.headers %}
/**
* Set {{header.key | caseUcfirst}}
Expand Down Expand Up @@ -50,7 +50,7 @@ export class Client {
*/
addHeader(key: string, value: string): this {
this.headers[key.toLowerCase()] = value;

return this;
}

Expand Down Expand Up @@ -81,7 +81,7 @@ export class Client {
} else {
body = JSON.stringify(params);
}

const options = {
method: method.toUpperCase(),
headers: headers,
Expand Down
52 changes: 52 additions & 0 deletions templates/deno/src/models.d.ts.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{% macro sub_schema(property, definition, spec) %}
{% spaceless %}
{% if property.sub_schema %}
{% if _self.get_generics_sub(definition, spec) %}
{{property.sub_schema | caseUcfirst}}<{{ _self.get_generics_sub(definition, spec) }}>{% if property.type == 'array' %}[]{% endif %}
{% else %}
{{property.sub_schema | caseUcfirst}}{% if property.type == 'array' %}[]{% endif %}
{% endif %}
{% else %}
{{property.type | typeName}}
{% endif %}
{% endspaceless %}
{% endmacro %}
{% macro get_generics(definition, spec) %}
{% spaceless %}
{% for property in definition.properties %}
{% if spec.definitions[property.sub_schema].additionalProperties %}
{{property.sub_schema | caseUcfirst}} extends Models.{{property.sub_schema | caseUcfirst}}
{% endif %}
{% if spec.definitions[property.sub_schema] %}
{{_self.get_generics(spec.definitions[property.sub_schema], spec)}}
{% endif %}
{% endfor %}
{% endspaceless %}
{% endmacro %}
{% macro get_generics_sub(definition, spec, output = false) %}
{% spaceless %}
{% for property in definition.properties %}
{% if spec.definitions[property.sub_schema].additionalProperties and output %}
{{property.sub_schema | caseUcfirst}}
{% endif %}
{% if spec.definitions[property.sub_schema] %}
{{_self.get_generics_sub(spec.definitions[property.sub_schema], spec, true)}}
{% endif %}
{% endfor %}
{% endspaceless %}
{% endmacro %}
export namespace Models {
{% for definition in spec.definitions %}
/**
* {{ definition.description }}
*/
export type {{ definition.name | caseUcfirst }}{% if _self.get_generics(definition, spec) %}<{{_self.get_generics(definition, spec)}}>{% endif %} = {
{% for property in definition.properties %}
/**
* {{ property.description }}
*/
{{ property.name | escapeKeyword }}{% if not property.required %}?{% endif %}: {{_self.sub_schema(property, definition, spec)}};
{% endfor %}
}
{% endfor %}
}
1 change: 0 additions & 1 deletion templates/deno/src/service.ts.twig
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Client } from "./client.ts";

export abstract class Service {

client: Client;

/**
Expand Down
39 changes: 34 additions & 5 deletions templates/deno/src/services/service.ts.twig
Original file line number Diff line number Diff line change
@@ -1,10 +1,39 @@
{% macro get_generics(definition, spec, output = false, first = false) %}
{% spaceless %}
{% if first and definition.additionalProperties %}
{{definition.name | caseUcfirst}} extends Models.{{definition.name | caseUcfirst}}
{% endif %}
{% for property in definition.properties %}
{% if spec.definitions[property.sub_schema].additionalProperties and output %}
{{property.sub_schema | caseUcfirst}} extends Models.{{property.sub_schema | caseUcfirst}}
{% endif %}
{% if spec.definitions[property.sub_schema] %}
{{_self.get_generics(spec.definitions[property.sub_schema], spec, true)}}
{% endif %}
{% endfor %}
{% endspaceless %}
{% endmacro %}
{% macro get_generics_return(definition, spec) %}
{% spaceless %}
{% for property in definition.properties %}
{% if spec.definitions[property.sub_schema].additionalProperties %}
{{property.sub_schema | caseUcfirst}}
{% endif %}
{% if spec.definitions[property.sub_schema] %}
{{_self.get_generics_return(spec.definitions[property.sub_schema], spec)}}
{% endif %}
{% endfor %}
{% endspaceless %}
{% endmacro %}
import { Service } from '../service.ts';
import { Payload } from '../client.ts';
import { AppwriteException } from '../exception.ts';
import type { Models } from '../models.d.ts'

export class {{ service.name | caseUcfirst }} extends Service {
{% for method in service.methods %}

{% set generics = _self.get_generics(spec.definitions[method.responseModel], spec, true, true) %}
{% set generics_return = _self.get_generics_return(spec.definitions[method.responseModel], spec) %}
/**
* {{ method.title }}
*
Expand All @@ -18,7 +47,7 @@ export class {{ service.name | caseUcfirst }} extends Service {
* @throws {AppwriteException}
* @returns {Promise}
*/
async {{ method.name | caseCamel }}{% if method.type != "location" %}<T extends unknown>{% endif %}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required%}?{% endif %}: {{ parameter.type | typeName }}{% if not loop.last %}, {% endif %}{% endfor %}): Promise<{% if method.type == 'location' %}Response{% else %}T{% endif %}> {
async {{ method.name | caseCamel }}{% if generics %}<{{generics}}>{% endif %}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required %}?{% endif %}: {{ parameter.type | typeName }}{% if not loop.last %}, {% endif %}{% endfor %}): Promise<{% if method.type == 'webAuth' %}Response{% elseif method.type == 'location' %}Response{% else %}{% if method.responseModel and method.responseModel != 'any' %}{% if not spec.definitions[method.responseModel].additionalProperties %}Models.{% endif %}{{method.responseModel | caseUcfirst}}{% if generics_return %}<{{generics_return}}>{% endif %}{% else %}Response{% endif %}{% endif %}> {
{% for parameter in method.parameters.all %}
{% if parameter.required %}
if (typeof {{ parameter.name | caseCamel | escapeKeyword }} === 'undefined') {
Expand All @@ -44,12 +73,12 @@ export class {{ service.name | caseUcfirst }} extends Service {
{% endfor %}
return await this.client.call('{{ method.method | caseLower }}', path, {
{% for parameter in method.parameters.header %}
'{{ parameter.name }}': ${{ parameter.name | caseCamel | escapeKeyword }},
'{{ parameter.name }}': ${{ parameter.name | caseCamel | escapeKeyword }},
{% endfor %}
{% for key, header in method.headers %}
'{{ key }}': '{{ header }}',
'{{ key }}': '{{ header }}',
{% endfor %}
}, payload);
}, payload);
}
{% endfor %}
}