blob: 3e5d82a374445809a5d52a21a00a476a7dbb2219 [file] [log] [blame]
syntax = "proto3";
package xos;
import "google/protobuf/empty.proto";
import "google/api/annotations.proto";
import "common.proto";
import "xosoptions.proto";
{%- macro fieldOpts(field) -%}
{%- set needComma=False -%}
{%- set needBrack=True -%}
{%- if field.max_length!=None -%}
{%- if needBrack -%}[{%- endif -%}{%- if needComma -%}, {%- endif -%}{%- set needComma=True -%}{%- set needBrack=False -%}
(val).maxLength = {{ field.max_length }}
{%- endif -%}
{%- if field.null==False -%}
{%- if needBrack -%}[{%- endif -%}{%- if needComma -%}, {%- endif -%}{%- set needComma=True -%}{%- set needBrack=False -%}
(val).nonNull= true
{%- endif -%}
{%- if field.related and field.related.model and field.related.model.__name__ -%}
{%- if needBrack -%}[{%- endif -%}{%- if needComma -%}, {%- endif -%}{%- set needComma=True -%}{%- set needBrack=False -%}
(foreignKey).modelName = "{{ field.related.model.__name__ }}"
{%- endif -%}
{%- if not needBrack -%}]{%- endif -%}
{%- endmacro %}
// Note: all fields are wrapped in a "oneof". This causes proto3 to always send
// fields that are set by the caller, regardless if they are set to a default
// value. XOS uses this to know when to apply a default value.
{% for object in generator.all() %}
message {{ object.camel() }} {
{%- for field in object.all_fields %}
oneof {{ field.name }}_present {
{%- if (field.get_internal_type() == "CharField") or (field.get_internal_type() == "TextField") or (field.get_internal_type() == "SlugField") %}
string {{ field.name }} = {{ loop.index }} {{ fieldOpts(field) }};
{%- elif field.get_internal_type() == "BooleanField" %}
bool {{ field.name }} = {{ loop.index }};
{%- elif field.get_internal_type() == "ForeignKey" %}
int32 {{ field.name }}_id = {{ loop.index }} {{ fieldOpts(field) }};
{%- elif field.get_internal_type() == "DateTimeField" %}
float {{ field.name }} = {{ loop.index }};
{%- elif field.get_internal_type() == "AutoField" %}
int32 {{ field.name }} = {{ loop.index }};
{%- elif field.get_internal_type() == "IntegerField" %}
int32 {{ field.name }} = {{ loop.index }};
{%- elif field.get_internal_type() == "PositiveIntegerField" %}
uint32 {{ field.name }} = {{ loop.index }};
{%- elif field.get_internal_type() == "FloatField" %}
float {{ field.name }} = {{ loop.index }};
{%- elif field.get_internal_type() == "GenericIPAddressField" %}
string {{ field.name }} = {{ loop.index }};
{%- else %}
UNKNOWN {{ field.get_internal_type() }} {{ field.name }} = {{ loop.index }};
{%- endif %}
}
{%- endfor -%}
{%- for ref in object.reverse_refs %}
repeated int32 {{ ref.related_name }}_ids = {{ loop.index+100 }} [(reverseForeignKey).modelName = "{{ ref.camel() }}"];
{%- endfor %}
string class_names = 201;
}
message {{ object.camel() }}s {
repeated {{ object.camel() }} items = 1;
}
{% endfor %}
service xos {
{% for object in generator.all() %}
rpc List{{ object.camel() }}(google.protobuf.Empty) returns ({{ object.camel() }}s) {
option (google.api.http) = {
get: "/xosapi/v1/{{ object.app_name }}/{{ object.plural() }}"
};
}
rpc Filter{{ object.camel() }}(Query) returns ({{ object.camel() }}s) {
}
rpc Get{{ object.camel() }}(ID) returns ({{ object.camel() }}) {
option (google.api.http) = {
get: "/xosapi/v1/{{ object.app_name }}/{{ object.plural() }}/{id}"
};
}
rpc Create{{ object.camel() }}({{ object.camel() }}) returns ({{ object.camel() }}) {
option (google.api.http) = {
post: "/xosapi/v1/{{ object.app_name }}/{{ object.plural() }}"
body: "*"
};
}
rpc Update{{ object.camel() }}({{ object.camel() }}) returns ({{ object.camel() }}) {
option (google.api.http) = {
put: "/xosapi/v1/{{ object.app_name }}/{{ object.plural() }}/{id}"
body: "*"
};
}
rpc Delete{{ object.camel() }}(ID) returns (google.protobuf.Empty) {
option (google.api.http) = {
delete: "/xosapi/v1/{{ object.app_name }}/{{ object.plural() }}/{id}"
};
}
{% endfor %}
}