Skip to content

Commit 0578617

Browse files
authored
Merge pull request #1126 from appwrite/feat-object-params
feat: object params in js/ts sdks
2 parents 5a13191 + 1e976f8 commit 0578617

File tree

10 files changed

+393
-7
lines changed

10 files changed

+393
-7
lines changed

templates/node/src/services/template.ts.twig

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ export class {{ service.name | caseUcfirst }} {
2727
{%~ for method in service.methods %}
2828
/**
2929
{%~ if method.description %}
30-
* {{ method.description | replace({'\n': '\n * '}) }}
30+
* {{ method.description | replace({'\n': '\n * '}) | raw }}
3131
{%~ endif %}
3232
*
3333
{%~ for parameter in method.parameters.all %}
34-
* @param {{ '{' }}{{ parameter | getPropertyType(method) | raw }}{{ '}' }} {{ parameter.name | caseCamel | escapeKeyword }}
34+
* @param {{ '{' }}{{ parameter | getPropertyType(method) | raw }}{{ '}' }} {{ parameter.name | caseCamel | escapeKeyword }} - {{ parameter.description | raw }}
3535
{%~ endfor %}
3636
* @throws {{ '{' }}{{ spec.title | caseUcfirst}}Exception}
3737
* @returns {{ '{' }}{{ method | getReturn(spec) | raw }}{{ '}' }}
@@ -43,7 +43,55 @@ export class {{ service.name | caseUcfirst }} {
4343
{%~ endif %}
4444
{%~ endif %}
4545
*/
46+
{%~ if method.parameters.all|length > 0 %}
47+
{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(params: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} {% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {}{% endif %} }): {{ method | getReturn(spec) | raw }};
48+
/**
49+
* @deprecated This API has been deprecated.
50+
*/
51+
{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {}{% endif %}): {{ method | getReturn(spec) | raw }};
52+
{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(
53+
{% if method.parameters.all|length > 0 %}paramsOrFirst{% if not method.parameters.all[0].required or method.parameters.all[0].nullable %}?{% endif %}: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {} {% endif %} } | {{ method.parameters.all[0] | getPropertyType(method) | raw }}{% if method.parameters.all|length > 1 %},
54+
...rest: [{% for parameter in method.parameters.all[1:] %}({{ parameter | getPropertyType(method) | raw }})?{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %},((progress: UploadProgress) => {})?{% endif %}]{% endif %}{% endif %}
55+
56+
): {{ method | getReturn(spec) | raw }} {
57+
{%~ if method.parameters.all|length > 0 %}
58+
let params: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} };
59+
{%~ if 'multipart/form-data' in method.consumes %}
60+
let onProgress: ((progress: UploadProgress) => {});
61+
{%~ endif %}
62+
63+
if (paramsOrFirst && typeof paramsOrFirst === 'object' && !Array.isArray(paramsOrFirst)) {
64+
params = paramsOrFirst as { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} };
65+
{%~ if 'multipart/form-data' in method.consumes %}
66+
onProgress = paramsOrFirst.onProgress as ((progress: UploadProgress) => {});
67+
{%~ endif %}
68+
} else {
69+
params = {
70+
{%~ for parameter in method.parameters.all %}
71+
{{ parameter.name | caseCamel | escapeKeyword }}: {% if loop.index0 == 0 %}paramsOrFirst{% else %}rest[{{ loop.index0 - 1 }}]{% endif %} as {{ parameter | getPropertyType(method) | raw }}{% if not parameter.required or parameter.nullable %} | undefined{% endif %}{% if not loop.last %},
72+
{% endif %}
73+
{%~ endfor %}
74+
75+
};
76+
{%~ if 'multipart/form-data' in method.consumes %}
77+
onProgress = rest[{{ method.parameters.all|length - 1 }}] as ((progress: UploadProgress) => {});
78+
{%~ endif %}
79+
}
80+
81+
{%~ for parameter in method.parameters.all %}
82+
const {{ parameter.name | caseCamel | escapeKeyword }} = params.{{ parameter.name | caseCamel | escapeKeyword }};
83+
{%~ endfor %}
84+
85+
{%~ else %}
86+
{%~ if 'multipart/form-data' in method.consumes %}
87+
if (typeof paramsOrFirst === 'function') {
88+
onProgress = paramsOrFirst;
89+
}
90+
{%~ endif %}
91+
{%~ endif %}
92+
{%~ else %}
4693
{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress = (progress: UploadProgress) => {}{% endif %}): {{ method | getReturn(spec) | raw }} {
94+
{%~ endif %}
4795
{%~ for parameter in method.parameters.all %}
4896
{%~ if parameter.required %}
4997
if (typeof {{ parameter.name | caseCamel | escapeKeyword }} === 'undefined') {

templates/web/src/services/template.ts.twig

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ export class {{ service.name | caseUcfirst }} {
2828
{%~ for method in service.methods %}
2929
/**
3030
{%~ if method.description %}
31-
* {{ method.description | replace({'\n': '\n * '}) }}
31+
* {{ method.description | replace({'\n': '\n * '}) | raw }}
3232
{%~ endif %}
3333
*
3434
{%~ for parameter in method.parameters.all %}
35-
* @param {{ '{' }}{{ parameter | getPropertyType(method) | raw }}{{ '}' }} {{ parameter.name | caseCamel | escapeKeyword }}
35+
* @param {{ '{' }}{{ parameter | getPropertyType(method) | raw }}{{ '}' }} {{ parameter.name | caseCamel | escapeKeyword }} - {{ parameter.description | raw }}
3636
{%~ endfor %}
3737
* @throws {{ '{' }}{{ spec.title | caseUcfirst}}Exception}
3838
* @returns {{ '{' }}{{ method | getReturn(spec) | raw }}{{ '}' }}
@@ -44,7 +44,55 @@ export class {{ service.name | caseUcfirst }} {
4444
{%~ endif %}
4545
{%~ endif %}
4646
*/
47+
{%~ if method.parameters.all|length > 0 %}
48+
{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(params: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} {% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {}{% endif %} }): {{ method | getReturn(spec) | raw }};
49+
/**
50+
* @deprecated This API has been deprecated.
51+
*/
52+
{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {}{% endif %}): {{ method | getReturn(spec) | raw }};
53+
{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(
54+
{% if method.parameters.all|length > 0 %}paramsOrFirst{% if not method.parameters.all[0].required or method.parameters.all[0].nullable %}?{% endif %}: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {} {% endif %} } | {{ method.parameters.all[0] | getPropertyType(method) | raw }}{% if method.parameters.all|length > 1 %},
55+
...rest: [{% for parameter in method.parameters.all[1:] %}({{ parameter | getPropertyType(method) | raw }})?{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %},((progress: UploadProgress) => {})?{% endif %}]{% endif %}{% endif %}
56+
57+
): {{ method | getReturn(spec) | raw }} {
58+
{%~ if method.parameters.all|length > 0 %}
59+
let params: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} };
60+
{%~ if 'multipart/form-data' in method.consumes %}
61+
let onProgress: ((progress: UploadProgress) => {});
62+
{%~ endif %}
63+
64+
if (paramsOrFirst && typeof paramsOrFirst === 'object' && !Array.isArray(paramsOrFirst)) {
65+
params = paramsOrFirst as { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} };
66+
{%~ if 'multipart/form-data' in method.consumes %}
67+
onProgress = paramsOrFirst.onProgress as ((progress: UploadProgress) => {});
68+
{%~ endif %}
69+
} else {
70+
params = {
71+
{%~ for parameter in method.parameters.all %}
72+
{{ parameter.name | caseCamel | escapeKeyword }}: {% if loop.index0 == 0 %}paramsOrFirst{% else %}rest[{{ loop.index0 - 1 }}]{% endif %} as {{ parameter | getPropertyType(method) | raw }}{% if not parameter.required or parameter.nullable %} | undefined{% endif %}{% if not loop.last %},
73+
{% endif %}
74+
{%~ endfor %}
75+
76+
};
77+
{%~ if 'multipart/form-data' in method.consumes %}
78+
onProgress = rest[{{ method.parameters.all|length - 1 }}] as ((progress: UploadProgress) => {});
79+
{%~ endif %}
80+
}
81+
82+
{%~ for parameter in method.parameters.all %}
83+
const {{ parameter.name | caseCamel | escapeKeyword }} = params.{{ parameter.name | caseCamel | escapeKeyword }};
84+
{%~ endfor %}
85+
86+
{%~ else %}
87+
{%~ if 'multipart/form-data' in method.consumes %}
88+
if (typeof paramsOrFirst === 'function') {
89+
onProgress = paramsOrFirst;
90+
}
91+
{%~ endif %}
92+
{%~ endif %}
93+
{%~ else %}
4794
{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress = (progress: UploadProgress) => {}{% endif %}): {{ method | getReturn(spec) | raw }} {
95+
{%~ endif %}
4896
{%~ for parameter in method.parameters.all %}
4997
{%~ if parameter.required %}
5098
if (typeof {{ parameter.name | caseCamel | escapeKeyword }} === 'undefined') {

tests/Node16Test.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ class Node16Test extends Base
2222
protected array $expectedOutput = [
2323
...Base::PING_RESPONSE,
2424
...Base::FOO_RESPONSES,
25+
...Base::FOO_RESPONSES, // Object params
2526
...Base::BAR_RESPONSES,
27+
...Base::BAR_RESPONSES, // Object params
2628
...Base::GENERAL_RESPONSES,
2729
...Base::UPLOAD_RESPONSES,
30+
...Base::UPLOAD_RESPONSES, // Object params
2831
...Base::ENUM_RESPONSES,
2932
...Base::EXCEPTION_RESPONSES,
3033
...Base::OAUTH_RESPONSES,

tests/Node18Test.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ class Node18Test extends Base
2222
protected array $expectedOutput = [
2323
...Base::PING_RESPONSE,
2424
...Base::FOO_RESPONSES,
25+
...Base::FOO_RESPONSES, // Object params
2526
...Base::BAR_RESPONSES,
27+
...Base::BAR_RESPONSES, // Object params
2628
...Base::GENERAL_RESPONSES,
2729
...Base::UPLOAD_RESPONSES,
30+
...Base::UPLOAD_RESPONSES, // Object params
2831
...Base::ENUM_RESPONSES,
2932
...Base::EXCEPTION_RESPONSES,
3033
...Base::OAUTH_RESPONSES,

tests/Node20Test.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ class Node20Test extends Base
2222
protected array $expectedOutput = [
2323
...Base::PING_RESPONSE,
2424
...Base::FOO_RESPONSES,
25+
...Base::FOO_RESPONSES, // Object params
2526
...Base::BAR_RESPONSES,
27+
...Base::BAR_RESPONSES, // Object params
2628
...Base::GENERAL_RESPONSES,
2729
...Base::UPLOAD_RESPONSES,
30+
...Base::UPLOAD_RESPONSES, // Object params
2831
...Base::ENUM_RESPONSES,
2932
...Base::EXCEPTION_RESPONSES,
3033
...Base::OAUTH_RESPONSES,

tests/WebChromiumTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@ class WebChromiumTest extends Base
2323
protected array $expectedOutput = [
2424
...Base::PING_RESPONSE,
2525
...Base::FOO_RESPONSES,
26+
...Base::FOO_RESPONSES, // Object params
2627
...Base::BAR_RESPONSES,
28+
...Base::BAR_RESPONSES, // Object params
2729
...Base::GENERAL_RESPONSES,
2830
...Base::UPLOAD_RESPONSES,
31+
...Base::UPLOAD_RESPONSES, // Object params
2932
...Base::ENUM_RESPONSES,
3033
...Base::EXCEPTION_RESPONSES,
3134
...Base::REALTIME_RESPONSES,

tests/WebNodeTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ class WebNodeTest extends Base
2424
protected array $expectedOutput = [
2525
...Base::PING_RESPONSE,
2626
...Base::FOO_RESPONSES,
27+
...Base::FOO_RESPONSES, // Object params
2728
...Base::BAR_RESPONSES,
29+
...Base::BAR_RESPONSES, // Object params
2830
...Base::GENERAL_RESPONSES,
2931
...Base::UPLOAD_RESPONSES,
3032
...Base::ENUM_RESPONSES,

tests/languages/node/test.js

Lines changed: 114 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,10 @@ async function start() {
3030
console.log('\nTest Started');
3131

3232
// Ping
33-
3433
response = await client.ping();
3534
console.log(response.result);
3635

3736
// Foo
38-
3937
response = await foo.get('string', 123, ['string in array']);
4038
console.log(response.result);
4139

@@ -51,8 +49,43 @@ async function start() {
5149
response = await foo.delete('string', 123, ['string in array']);
5250
console.log(response.result);
5351

54-
// Bar
52+
// Foo (Object params)
53+
response = await foo.get({
54+
x: 'string',
55+
y: 123,
56+
z: ['string in array']
57+
});
58+
console.log(response.result);
59+
60+
response = await foo.post({
61+
x: 'string',
62+
y: 123,
63+
z: ['string in array']
64+
});
65+
console.log(response.result);
66+
67+
response = await foo.put({
68+
x: 'string',
69+
y: 123,
70+
z: ['string in array']
71+
});
72+
console.log(response.result);
5573

74+
response = await foo.patch({
75+
x: 'string',
76+
y: 123,
77+
z: ['string in array']
78+
});
79+
console.log(response.result);
80+
81+
response = await foo.delete({
82+
x: 'string',
83+
y: 123,
84+
z: ['string in array']
85+
});
86+
console.log(response.result);
87+
88+
// Bar
5689
response = await bar.get('string', 123, ['string in array']);
5790
console.log(response.result);
5891

@@ -68,9 +101,47 @@ async function start() {
68101
response = await bar.delete('string', 123, ['string in array']);
69102
console.log(response.result);
70103

104+
// Bar (Object params)
105+
response = await bar.get({
106+
required: 'string',
107+
xdefault: 123,
108+
z: ['string in array']
109+
});
110+
console.log(response.result);
111+
112+
response = await bar.post({
113+
required: 'string',
114+
xdefault: 123,
115+
z: ['string in array']
116+
});
117+
console.log(response.result);
118+
119+
response = await bar.put({
120+
required: 'string',
121+
xdefault: 123,
122+
z: ['string in array']
123+
});
124+
console.log(response.result);
125+
126+
response = await bar.patch({
127+
required: 'string',
128+
xdefault: 123,
129+
z: ['string in array']
130+
});
131+
console.log(response.result);
132+
133+
response = await bar.delete({
134+
required: 'string',
135+
xdefault: 123,
136+
z: ['string in array']
137+
});
138+
console.log(response.result);
139+
140+
// General
71141
response = await general.redirect();
72142
console.log(response.result);
73143

144+
// Upload
74145
response = await general.upload('string', 123, ['string in array'], InputFile.fromPath(__dirname + '/../../resources/file.png', 'file.png'));
75146
console.log(response.result);
76147

@@ -85,6 +156,46 @@ async function start() {
85156
response = await general.upload('string', 123, ['string in array'], InputFile.fromBuffer(largeBuffer, 'large_file.mp4'))
86157
console.log(response.result);
87158

159+
// Upload (Object params)
160+
response = await general.upload({
161+
x: 'string',
162+
y: 123,
163+
z: ['string in array'],
164+
file: InputFile.fromPath(__dirname + '/../../resources/file.png', 'file.png')
165+
});
166+
console.log(response.result);
167+
168+
response = await general.upload({
169+
x: 'string',
170+
y: 123,
171+
z: ['string in array'],
172+
file: InputFile.fromPath(__dirname + '/../../resources/large_file.mp4', 'large_file.mp4')
173+
});
174+
console.log(response.result);
175+
176+
response = await general.upload({
177+
x: 'string',
178+
y: 123,
179+
z: ['string in array'],
180+
file: InputFile.fromBuffer(smallBuffer, 'file.png'),
181+
onProgress: (progress) => {
182+
// nothing
183+
}
184+
});
185+
console.log(response.result);
186+
187+
response = await general.upload({
188+
x: 'string',
189+
y: 123,
190+
z: ['string in array'],
191+
file: InputFile.fromBuffer(largeBuffer, 'large_file.mp4'),
192+
onProgress: (progress) => {
193+
// nothing
194+
}
195+
});
196+
console.log(response.result);
197+
198+
// Enum
88199
response = await general.enum(MockType.First);
89200
console.log(response.result);
90201

0 commit comments

Comments
 (0)