From 8ea79a0ed7cac8a261d45d84705ad99f9b744bfb Mon Sep 17 00:00:00 2001 From: siloneco Date: Thu, 11 Jan 2024 08:09:59 +0000 Subject: [PATCH 1/3] feat: implement /api/v1/auth/sign_up --- openapi/api_definition.swagger.yaml | 88 +++++++++++++++++-- .../auth/sign_up/resources/signup.proto | 36 ++++++++ proto/schema/auth/sign_up/signup.proto | 17 ++++ 3 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 proto/schema/auth/sign_up/resources/signup.proto create mode 100644 proto/schema/auth/sign_up/signup.proto diff --git a/openapi/api_definition.swagger.yaml b/openapi/api_definition.swagger.yaml index b5a1066..4b29c14 100644 --- a/openapi/api_definition.swagger.yaml +++ b/openapi/api_definition.swagger.yaml @@ -1,9 +1,10 @@ -swagger: "2.0" +swagger: '2.0' info: title: proto/schema/auth/discord/callback/callback.proto version: version not set tags: - name: DiscordCallbackService + - name: SignUpService - name: TagsService consumes: - application/json @@ -14,11 +15,11 @@ paths: get: operationId: DiscordCallbackService_GetDiscordCallback responses: - "200": + '200': description: A successful response. schema: $ref: '#/definitions/resourcesDiscordToken' - "422": + '422': description: Validation Error schema: {} examples: @@ -36,15 +37,57 @@ paths: type: string tags: - DiscordCallbackService + /v1/auth/sign_up: + post: + operationId: SignUpService_PostSignUp + responses: + '200': + description: A successful response. + schema: + $ref: '#/definitions/resourcesAccount' + '422': + description: Validation Error + schema: {} + examples: + application/json: + detail: + - loc: + - string + - 0 + msg: string + type: string + parameters: + - name: name + in: query + required: false + type: string + - name: email + in: query + required: false + type: string + - name: password + in: query + required: false + type: string + - name: display_name + in: query + required: false + type: string + - name: avatar_url + in: query + required: false + type: string + tags: + - SignUpService /v1/tags: get: operationId: TagsService_GetTags responses: - "200": + '200': description: A successful response. schema: $ref: '#/definitions/rpcGetTagsResponse' - "422": + '422': description: Validation Error schema: {} examples: @@ -76,6 +119,39 @@ paths: tags: - TagsService definitions: + resourcesAccount: + type: object + example: + avatar_url: https://example.com/ + created_at: '2024-01-11T07:56:02.206Z' + display_name: string + github_id: string + id: string + name: string + profile: string + twitter_id: string + updated_at: '2024-01-11T07:56:02.206Z' + properties: + id: + type: string + name: + type: string + display_name: + type: string + avatar_url: + type: string + profile: + type: string + twitter_id: + type: string + github_id: + type: string + created_at: + type: string + title: google.type.Date ? + updated_at: + type: string + title: google.type.Date ? resourcesDiscordToken: type: object example: @@ -101,7 +177,7 @@ definitions: type: object example: color: '#000000' - id: "1" + id: '1' name: tag1 properties: id: diff --git a/proto/schema/auth/sign_up/resources/signup.proto b/proto/schema/auth/sign_up/resources/signup.proto new file mode 100644 index 0000000..1726796 --- /dev/null +++ b/proto/schema/auth/sign_up/resources/signup.proto @@ -0,0 +1,36 @@ +syntax = "proto3"; + +package proto.schema.auth.sign_up.resources; +import "proto/third_party/grpc/openapiv2/options/annotations.proto"; + +option go_package = "./"; + +message InitialAccountTemplate { + string name = 1; + string email = 2; + string password = 3; + string display_name = 4; + string avatar_url = 5; +} + +message Account { + string id = 1; + string name = 2; + string display_name = 3; + string avatar_url = 4; + string profile = 5; + string twitter_id = 6; + string github_id = 7; + string created_at = 8; // google.type.Date ? + string updated_at = 9; // google.type.Date ? + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + example : "{\"id\": \"string\",\"name\": \"string\",\"display_name\": " + "\"string\",\"avatar_url\": " + "\"https://example.com/\",\"profile\": " + "\"string\",\"twitter_id\": \"string\",\"github_id\": " + "\"string\",\"created_at\": " + "\"2024-01-11T07:56:02.206Z\",\"updated_at\": " + "\"2024-01-11T07:56:02.206Z\"}" + }; +} \ No newline at end of file diff --git a/proto/schema/auth/sign_up/signup.proto b/proto/schema/auth/sign_up/signup.proto new file mode 100644 index 0000000..1e17ef2 --- /dev/null +++ b/proto/schema/auth/sign_up/signup.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +package proto.schema.auth.sign_up; + +import "proto/schema/auth/sign_up/resources/signup.proto"; +import "proto/third_party/google/api/annotations.proto"; + +option go_package = "./"; + +service SignUpService { + rpc PostSignUp(proto.schema.auth.sign_up.resources.InitialAccountTemplate) + returns (proto.schema.auth.sign_up.resources.Account) { + option (google.api.http) = { + post : "/v1/auth/sign_up" + }; + }; +} \ No newline at end of file From 0425429be712ba2e01e4a7a9e10ae72bbedc55ae Mon Sep 17 00:00:00 2001 From: siloneco Date: Fri, 23 Feb 2024 12:25:30 +0000 Subject: [PATCH 2/3] use /users/me Account message --- .../auth/sign_up/resources/signup.proto | 23 ---- proto/schema/auth/sign_up/signup.proto | 4 +- proto/schema/users/me/resources/me.proto | 33 ++++++ .../google/api/type/datetime.proto | 104 ++++++++++++++++++ 4 files changed, 140 insertions(+), 24 deletions(-) create mode 100644 proto/schema/users/me/resources/me.proto create mode 100644 proto/third_party/google/api/type/datetime.proto diff --git a/proto/schema/auth/sign_up/resources/signup.proto b/proto/schema/auth/sign_up/resources/signup.proto index 1726796..1e64106 100644 --- a/proto/schema/auth/sign_up/resources/signup.proto +++ b/proto/schema/auth/sign_up/resources/signup.proto @@ -1,7 +1,6 @@ syntax = "proto3"; package proto.schema.auth.sign_up.resources; -import "proto/third_party/grpc/openapiv2/options/annotations.proto"; option go_package = "./"; @@ -12,25 +11,3 @@ message InitialAccountTemplate { string display_name = 4; string avatar_url = 5; } - -message Account { - string id = 1; - string name = 2; - string display_name = 3; - string avatar_url = 4; - string profile = 5; - string twitter_id = 6; - string github_id = 7; - string created_at = 8; // google.type.Date ? - string updated_at = 9; // google.type.Date ? - - option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { - example : "{\"id\": \"string\",\"name\": \"string\",\"display_name\": " - "\"string\",\"avatar_url\": " - "\"https://example.com/\",\"profile\": " - "\"string\",\"twitter_id\": \"string\",\"github_id\": " - "\"string\",\"created_at\": " - "\"2024-01-11T07:56:02.206Z\",\"updated_at\": " - "\"2024-01-11T07:56:02.206Z\"}" - }; -} \ No newline at end of file diff --git a/proto/schema/auth/sign_up/signup.proto b/proto/schema/auth/sign_up/signup.proto index 1e17ef2..02a0e3f 100644 --- a/proto/schema/auth/sign_up/signup.proto +++ b/proto/schema/auth/sign_up/signup.proto @@ -3,13 +3,15 @@ syntax = "proto3"; package proto.schema.auth.sign_up; import "proto/schema/auth/sign_up/resources/signup.proto"; +import "proto/schema/users/me/resources/me.proto"; + import "proto/third_party/google/api/annotations.proto"; option go_package = "./"; service SignUpService { rpc PostSignUp(proto.schema.auth.sign_up.resources.InitialAccountTemplate) - returns (proto.schema.auth.sign_up.resources.Account) { + returns (proto.schema.users.me.resources.Account) { option (google.api.http) = { post : "/v1/auth/sign_up" }; diff --git a/proto/schema/users/me/resources/me.proto b/proto/schema/users/me/resources/me.proto new file mode 100644 index 0000000..13e1e03 --- /dev/null +++ b/proto/schema/users/me/resources/me.proto @@ -0,0 +1,33 @@ +syntax = "proto3"; + +package proto.schema.users.me.resources; +import "proto/third_party/grpc/openapiv2/options/annotations.proto"; +import "proto/third_party/google/api/type/datetime.proto"; + +option go_package = "./"; + +message Account { + string id = 1; + string name = 2; + string display_name = 3; + string avatar_url = 4; + string profile = 5; + string twitter_id = 6; + string github_id = 7; + google.type.DateTime created_at = 8; + google.type.DateTime updated_at = 9; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + example : "{" + "\"id\": \"string\"," + "\"name\": \"string\"," + "\"display_name\": \"string\"," + "\"avatar_url\": \"https://example.com/\"," + "\"profile\": \"string\"," + "\"twitter_id\": \"string\"," + "\"github_id\": \"string\"," + "\"created_at\": \"2024-01-11T07:56:02.206Z\"," + "\"updated_at\": \"2024-01-11T07:56:02.206Z\"" + "}" + }; +} diff --git a/proto/third_party/google/api/type/datetime.proto b/proto/third_party/google/api/type/datetime.proto new file mode 100644 index 0000000..86f98c9 --- /dev/null +++ b/proto/third_party/google/api/type/datetime.proto @@ -0,0 +1,104 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +import "google/protobuf/duration.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/datetime;datetime"; +option java_multiple_files = true; +option java_outer_classname = "DateTimeProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents civil time (or occasionally physical time). +// +// This type can represent a civil time in one of a few possible ways: +// +// * When utc_offset is set and time_zone is unset: a civil time on a calendar +// day with a particular offset from UTC. +// * When time_zone is set and utc_offset is unset: a civil time on a calendar +// day in a particular time zone. +// * When neither time_zone nor utc_offset is set: a civil time on a calendar +// day in local time. +// +// The date is relative to the Proleptic Gregorian Calendar. +// +// If year is 0, the DateTime is considered not to have a specific year. month +// and day must have valid, non-zero values. +// +// This type may also be used to represent a physical time if all the date and +// time fields are set and either case of the `time_offset` oneof is set. +// Consider using `Timestamp` message for physical time instead. If your use +// case also would like to store the user's timezone, that can be done in +// another field. +// +// This type is more flexible than some applications may want. Make sure to +// document and validate your application's limitations. +message DateTime { + // Optional. Year of date. Must be from 1 to 9999, or 0 if specifying a + // datetime without a year. + int32 year = 1; + + // Required. Month of year. Must be from 1 to 12. + int32 month = 2; + + // Required. Day of month. Must be from 1 to 31 and valid for the year and + // month. + int32 day = 3; + + // Required. Hours of day in 24 hour format. Should be from 0 to 23. An API + // may choose to allow the value "24:00:00" for scenarios like business + // closing time. + int32 hours = 4; + + // Required. Minutes of hour of day. Must be from 0 to 59. + int32 minutes = 5; + + // Required. Seconds of minutes of the time. Must normally be from 0 to 59. An + // API may allow the value 60 if it allows leap-seconds. + int32 seconds = 6; + + // Required. Fractions of seconds in nanoseconds. Must be from 0 to + // 999,999,999. + int32 nanos = 7; + + // Optional. Specifies either the UTC offset or the time zone of the DateTime. + // Choose carefully between them, considering that time zone data may change + // in the future (for example, a country modifies their DST start/end dates, + // and future DateTimes in the affected range had already been stored). + // If omitted, the DateTime is considered to be in local time. + oneof time_offset { + // UTC offset. Must be whole seconds, between -18 hours and +18 hours. + // For example, a UTC offset of -4:00 would be represented as + // { seconds: -14400 }. + google.protobuf.Duration utc_offset = 8; + + // Time zone. + TimeZone time_zone = 9; + } +} + +// Represents a time zone from the +// [IANA Time Zone Database](https://www.iana.org/time-zones). +message TimeZone { + // IANA Time Zone Database time zone, e.g. "America/New_York". + string id = 1; + + // Optional. IANA Time Zone Database version number, e.g. "2019a". + string version = 2; +} \ No newline at end of file From bdb2c043016812e13159331403c2a4443093184d Mon Sep 17 00:00:00 2001 From: siloneco Date: Fri, 23 Feb 2024 12:28:01 +0000 Subject: [PATCH 3/3] update swagger file --- openapi/api_definition.swagger.yaml | 114 ++++++++++++++++++++++++---- 1 file changed, 100 insertions(+), 14 deletions(-) diff --git a/openapi/api_definition.swagger.yaml b/openapi/api_definition.swagger.yaml index 4b29c14..a6eca2a 100644 --- a/openapi/api_definition.swagger.yaml +++ b/openapi/api_definition.swagger.yaml @@ -1,4 +1,4 @@ -swagger: '2.0' +swagger: "2.0" info: title: proto/schema/auth/discord/callback/callback.proto version: version not set @@ -15,11 +15,11 @@ paths: get: operationId: DiscordCallbackService_GetDiscordCallback responses: - '200': + "200": description: A successful response. schema: $ref: '#/definitions/resourcesDiscordToken' - '422': + "422": description: Validation Error schema: {} examples: @@ -41,11 +41,11 @@ paths: post: operationId: SignUpService_PostSignUp responses: - '200': + "200": description: A successful response. schema: $ref: '#/definitions/resourcesAccount' - '422': + "422": description: Validation Error schema: {} examples: @@ -83,11 +83,11 @@ paths: get: operationId: TagsService_GetTags responses: - '200': + "200": description: A successful response. schema: $ref: '#/definitions/rpcGetTagsResponse' - '422': + "422": description: Validation Error schema: {} examples: @@ -123,14 +123,14 @@ definitions: type: object example: avatar_url: https://example.com/ - created_at: '2024-01-11T07:56:02.206Z' + created_at: "2024-01-11T07:56:02.206Z" display_name: string github_id: string id: string name: string profile: string twitter_id: string - updated_at: '2024-01-11T07:56:02.206Z' + updated_at: "2024-01-11T07:56:02.206Z" properties: id: type: string @@ -147,11 +147,9 @@ definitions: github_id: type: string created_at: - type: string - title: google.type.Date ? + $ref: '#/definitions/typeDateTime' updated_at: - type: string - title: google.type.Date ? + $ref: '#/definitions/typeDateTime' resourcesDiscordToken: type: object example: @@ -177,7 +175,7 @@ definitions: type: object example: color: '#000000' - id: '1' + id: "1" name: tag1 properties: id: @@ -186,3 +184,91 @@ definitions: type: string color: type: string + typeDateTime: + type: object + properties: + year: + type: integer + format: int32 + description: |- + Optional. Year of date. Must be from 1 to 9999, or 0 if specifying a + datetime without a year. + month: + type: integer + format: int32 + description: Required. Month of year. Must be from 1 to 12. + day: + type: integer + format: int32 + description: |- + Required. Day of month. Must be from 1 to 31 and valid for the year and + month. + hours: + type: integer + format: int32 + description: |- + Required. Hours of day in 24 hour format. Should be from 0 to 23. An API + may choose to allow the value "24:00:00" for scenarios like business + closing time. + minutes: + type: integer + format: int32 + description: Required. Minutes of hour of day. Must be from 0 to 59. + seconds: + type: integer + format: int32 + description: |- + Required. Seconds of minutes of the time. Must normally be from 0 to 59. An + API may allow the value 60 if it allows leap-seconds. + nanos: + type: integer + format: int32 + description: |- + Required. Fractions of seconds in nanoseconds. Must be from 0 to + 999,999,999. + utc_offset: + type: string + description: |- + UTC offset. Must be whole seconds, between -18 hours and +18 hours. + For example, a UTC offset of -4:00 would be represented as + { seconds: -14400 }. + time_zone: + $ref: '#/definitions/typeTimeZone' + description: Time zone. + description: |- + Represents civil time (or occasionally physical time). + + This type can represent a civil time in one of a few possible ways: + + * When utc_offset is set and time_zone is unset: a civil time on a calendar + day with a particular offset from UTC. + * When time_zone is set and utc_offset is unset: a civil time on a calendar + day in a particular time zone. + * When neither time_zone nor utc_offset is set: a civil time on a calendar + day in local time. + + The date is relative to the Proleptic Gregorian Calendar. + + If year is 0, the DateTime is considered not to have a specific year. month + and day must have valid, non-zero values. + + This type may also be used to represent a physical time if all the date and + time fields are set and either case of the `time_offset` oneof is set. + Consider using `Timestamp` message for physical time instead. If your use + case also would like to store the user's timezone, that can be done in + another field. + + This type is more flexible than some applications may want. Make sure to + document and validate your application's limitations. + typeTimeZone: + type: object + properties: + id: + type: string + description: IANA Time Zone Database time zone, e.g. "America/New_York". + version: + type: string + description: Optional. IANA Time Zone Database version number, e.g. "2019a". + description: |- + Represents a time zone from the + [IANA Time Zone Database](https://www.iana.org/time-zones).