From 2f30162add9d06acb0a2256cd0a0fa064067f722 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 22 Nov 2023 20:16:26 +0800 Subject: [PATCH] chore: migrate auth service --- api/v2/acl_config.go | 3 + api/v2/auth_service.go | 125 ++++ api/v2/v2.go | 5 + frontend/web/package.json | 1 - frontend/web/pnpm-lock.yaml | 64 -- frontend/web/src/components/Header.tsx | 5 +- frontend/web/src/grpcweb.ts | 5 +- frontend/web/src/helpers/api.ts | 20 - frontend/web/src/pages/SignIn.tsx | 5 +- frontend/web/src/pages/SignUp.tsx | 9 +- frontend/web/src/types/modules/user.d.ts | 5 - proto/api/v2/auth_service.proto | 45 ++ proto/gen/api/v2/README.md | 801 +++++++++++++---------- proto/gen/api/v2/auth_service.pb.go | 530 +++++++++++++++ proto/gen/api/v2/auth_service.pb.gw.go | 329 ++++++++++ proto/gen/api/v2/auth_service_grpc.pb.go | 183 ++++++ 16 files changed, 1699 insertions(+), 436 deletions(-) create mode 100644 api/v2/auth_service.go delete mode 100644 frontend/web/src/helpers/api.ts delete mode 100644 frontend/web/src/types/modules/user.d.ts create mode 100644 proto/api/v2/auth_service.proto create mode 100644 proto/gen/api/v2/auth_service.pb.go create mode 100644 proto/gen/api/v2/auth_service.pb.gw.go create mode 100644 proto/gen/api/v2/auth_service_grpc.pb.go diff --git a/api/v2/acl_config.go b/api/v2/acl_config.go index a49176e..aaade1c 100644 --- a/api/v2/acl_config.go +++ b/api/v2/acl_config.go @@ -5,6 +5,9 @@ import "strings" var allowedMethodsWhenUnauthorized = map[string]bool{ "/slash.api.v2.WorkspaceService/GetWorkspaceProfile": true, "/slash.api.v2.WorkspaceService/GetWorkspaceSetting": true, + "/slash.api.v2.AuthService/SignIn": true, + "/slash.api.v2.AuthService/SignUp": true, + "/slash.api.v2.AuthService/SignOut": true, "/slash.api.v2.ShortcutService/GetShortcut": true, "/slash.api.v2.CollectionService/GetCollectionByName": true, } diff --git a/api/v2/auth_service.go b/api/v2/auth_service.go new file mode 100644 index 0000000..a4005ed --- /dev/null +++ b/api/v2/auth_service.go @@ -0,0 +1,125 @@ +package v2 + +import ( + "context" + "fmt" + "net/http" + "time" + + "golang.org/x/crypto/bcrypt" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + + "github.com/boojack/slash/api/auth" + apiv2pb "github.com/boojack/slash/proto/gen/api/v2" + storepb "github.com/boojack/slash/proto/gen/store" + "github.com/boojack/slash/server/metric" + "github.com/boojack/slash/server/service/license" + "github.com/boojack/slash/store" +) + +func (s *APIV2Service) SignIn(ctx context.Context, request *apiv2pb.SignInRequest) (*apiv2pb.SignInResponse, error) { + user, err := s.Store.GetUser(ctx, &store.FindUser{ + Email: &request.Email, + }) + if err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to find user by email %s", request.Email)) + } + if user == nil { + return nil, status.Errorf(http.StatusUnauthorized, fmt.Sprintf("user not found with email %s", request.Email)) + } else if user.RowStatus == store.Archived { + return nil, status.Errorf(http.StatusForbidden, fmt.Sprintf("user has been archived with email %s", request.Email)) + } + + // Compare the stored hashed password, with the hashed version of the password that was received. + if err := bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(request.Password)); err != nil { + return nil, status.Errorf(http.StatusUnauthorized, "unmatched email and password") + } + + accessToken, err := auth.GenerateAccessToken(user.Email, user.ID, time.Now().Add(auth.AccessTokenDuration), []byte(s.Secret)) + if err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to generate tokens, err: %s", err)) + } + if err := s.UpsertAccessTokenToStore(ctx, user, accessToken, "user login"); err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to upsert access token to store, err: %s", err)) + } + + metric.Enqueue("user sign in") + return &apiv2pb.SignInResponse{ + User: convertUserFromStore(user), + AccessToken: accessToken, + }, nil +} + +func (s *APIV2Service) SignUp(ctx context.Context, request *apiv2pb.SignUpRequest) (*apiv2pb.SignUpResponse, error) { + enableSignUpSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{ + Key: storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP, + }) + if err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to get workspace setting, err: %s", err)) + } + if enableSignUpSetting != nil && !enableSignUpSetting.GetEnableSignup() { + return nil, status.Errorf(http.StatusForbidden, "sign up is not allowed") + } + + if !s.LicenseService.IsFeatureEnabled(license.FeatureTypeUnlimitedAccounts) { + userList, err := s.Store.ListUsers(ctx, &store.FindUser{}) + if err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to list users, err: %s", err)) + } + if len(userList) >= 5 { + return nil, status.Errorf(http.StatusBadRequest, "maximum number of users reached") + } + } + + passwordHash, err := bcrypt.GenerateFromPassword([]byte(request.Password), bcrypt.DefaultCost) + if err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to generate password hash, err: %s", err)) + } + + create := &store.User{ + Email: request.Email, + Nickname: request.Nickname, + PasswordHash: string(passwordHash), + } + existingUsers, err := s.Store.ListUsers(ctx, &store.FindUser{}) + if err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to list users, err: %s", err)) + } + // The first user to sign up is an admin by default. + if len(existingUsers) == 0 { + create.Role = store.RoleAdmin + } else { + create.Role = store.RoleUser + } + + user, err := s.Store.CreateUser(ctx, create) + if err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to create user, err: %s", err)) + } + + accessToken, err := auth.GenerateAccessToken(user.Email, user.ID, time.Now().Add(auth.AccessTokenDuration), []byte(s.Secret)) + if err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to generate tokens, err: %s", err)) + } + if err := s.UpsertAccessTokenToStore(ctx, user, accessToken, "user login"); err != nil { + return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to upsert access token to store, err: %s", err)) + } + + metric.Enqueue("user sign up") + return &apiv2pb.SignUpResponse{ + User: convertUserFromStore(user), + AccessToken: accessToken, + }, nil +} + +func (*APIV2Service) SignOut(ctx context.Context, _ *apiv2pb.SignOutRequest) (*apiv2pb.SignOutResponse, error) { + if err := grpc.SetHeader(ctx, metadata.New(map[string]string{ + auth.AccessTokenCookieName: "", + })); err != nil { + return nil, status.Errorf(codes.Internal, "failed to set grpc header, error: %v", err) + } + return &apiv2pb.SignOutResponse{}, nil +} diff --git a/api/v2/v2.go b/api/v2/v2.go index bb8cf3c..9c6c6c4 100644 --- a/api/v2/v2.go +++ b/api/v2/v2.go @@ -20,6 +20,7 @@ import ( type APIV2Service struct { apiv2pb.UnimplementedWorkspaceServiceServer apiv2pb.UnimplementedSubscriptionServiceServer + apiv2pb.UnimplementedAuthServiceServer apiv2pb.UnimplementedUserServiceServer apiv2pb.UnimplementedUserSettingServiceServer apiv2pb.UnimplementedShortcutServiceServer @@ -52,6 +53,7 @@ func NewAPIV2Service(secret string, profile *profile.Profile, store *store.Store apiv2pb.RegisterSubscriptionServiceServer(grpcServer, apiV2Service) apiv2pb.RegisterWorkspaceServiceServer(grpcServer, apiV2Service) + apiv2pb.RegisterAuthServiceServer(grpcServer, apiV2Service) apiv2pb.RegisterUserServiceServer(grpcServer, apiV2Service) apiv2pb.RegisterUserSettingServiceServer(grpcServer, apiV2Service) apiv2pb.RegisterShortcutServiceServer(grpcServer, apiV2Service) @@ -85,6 +87,9 @@ func (s *APIV2Service) RegisterGateway(ctx context.Context, e *echo.Echo) error if err := apiv2pb.RegisterWorkspaceServiceHandler(context.Background(), gwMux, conn); err != nil { return err } + if err := apiv2pb.RegisterAuthServiceHandler(context.Background(), gwMux, conn); err != nil { + return err + } if err := apiv2pb.RegisterUserServiceHandler(context.Background(), gwMux, conn); err != nil { return err } diff --git a/frontend/web/package.json b/frontend/web/package.json index 5f32d89..3d96a57 100644 --- a/frontend/web/package.json +++ b/frontend/web/package.json @@ -13,7 +13,6 @@ "@emotion/styled": "^11.11.0", "@mui/joy": "5.0.0-beta.14", "@reduxjs/toolkit": "^1.9.7", - "axios": "^1.6.2", "classnames": "^2.3.2", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.10", diff --git a/frontend/web/pnpm-lock.yaml b/frontend/web/pnpm-lock.yaml index 4b5b56f..1268bb7 100644 --- a/frontend/web/pnpm-lock.yaml +++ b/frontend/web/pnpm-lock.yaml @@ -17,9 +17,6 @@ dependencies: '@reduxjs/toolkit': specifier: ^1.9.7 version: 1.9.7(react@18.2.0) - axios: - specifier: ^1.6.2 - version: 1.6.2 classnames: specifier: ^2.3.2 version: 2.3.2 @@ -1482,10 +1479,6 @@ packages: has-symbols: 1.0.3 dev: true - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - /autoprefixer@10.4.16(postcss@8.4.31): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} @@ -1507,16 +1500,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /axios@1.6.2: - resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} - dependencies: - follow-redirects: 1.15.3 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -1637,13 +1620,6 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1743,11 +1719,6 @@ packages: object-keys: 1.1.1 dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: false @@ -2148,31 +2119,12 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /follow-redirects@1.15.3: - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true @@ -2747,18 +2699,6 @@ packages: braces: 3.0.2 picomatch: 2.3.1 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -3093,10 +3033,6 @@ packages: long: 5.2.3 dev: true - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false - /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} diff --git a/frontend/web/src/components/Header.tsx b/frontend/web/src/components/Header.tsx index bf40b2a..680c0a3 100644 --- a/frontend/web/src/components/Header.tsx +++ b/frontend/web/src/components/Header.tsx @@ -2,10 +2,10 @@ import { Avatar } from "@mui/joy"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useLocation } from "react-router-dom"; +import { authServiceClient } from "@/grpcweb"; import useWorkspaceStore from "@/stores/v1/workspace"; import { PlanType } from "@/types/proto/api/v2/subscription_service"; import { Role } from "@/types/proto/api/v2/user_service"; -import * as api from "../helpers/api"; import useUserStore from "../stores/v1/user"; import AboutDialog from "./AboutDialog"; import Icon from "./Icon"; @@ -22,7 +22,8 @@ const Header: React.FC = () => { const shouldShowRouterSwitch = location.pathname === "/" || location.pathname === "/collections"; const handleSignOutButtonClick = async () => { - await api.signout(); + await authServiceClient.signOut({}); + document.cookie = "slash.access-token=; path=/;"; localStorage.removeItem("userId"); window.location.href = "/auth"; }; diff --git a/frontend/web/src/grpcweb.ts b/frontend/web/src/grpcweb.ts index cb60a36..aa2d477 100644 --- a/frontend/web/src/grpcweb.ts +++ b/frontend/web/src/grpcweb.ts @@ -1,4 +1,5 @@ import { createChannel, createClientFactory, FetchTransport } from "nice-grpc-web"; +import { AuthServiceDefinition } from "./types/proto/api/v2/auth_service"; import { CollectionServiceDefinition } from "./types/proto/api/v2/collection_service"; import { ShortcutServiceDefinition } from "./types/proto/api/v2/shortcut_service"; import { SubscriptionServiceDefinition } from "./types/proto/api/v2/subscription_service"; @@ -17,9 +18,11 @@ const channel = createChannel( const clientFactory = createClientFactory(); +export const workspaceServiceClient = clientFactory.create(WorkspaceServiceDefinition, channel); + export const subscriptionServiceClient = clientFactory.create(SubscriptionServiceDefinition, channel); -export const workspaceServiceClient = clientFactory.create(WorkspaceServiceDefinition, channel); +export const authServiceClient = clientFactory.create(AuthServiceDefinition, channel); export const userServiceClient = clientFactory.create(UserServiceDefinition, channel); diff --git a/frontend/web/src/helpers/api.ts b/frontend/web/src/helpers/api.ts deleted file mode 100644 index ca97b20..0000000 --- a/frontend/web/src/helpers/api.ts +++ /dev/null @@ -1,20 +0,0 @@ -import axios from "axios"; - -export function signin(email: string, password: string) { - return axios.post("/api/v1/auth/signin", { - email, - password, - }); -} - -export function signup(email: string, nickname: string, password: string) { - return axios.post("/api/v1/auth/signup", { - email, - nickname, - password, - }); -} - -export function signout() { - return axios.post("/api/v1/auth/logout"); -} diff --git a/frontend/web/src/pages/SignIn.tsx b/frontend/web/src/pages/SignIn.tsx index 1d02819..742fcd2 100644 --- a/frontend/web/src/pages/SignIn.tsx +++ b/frontend/web/src/pages/SignIn.tsx @@ -3,10 +3,10 @@ import React, { FormEvent, useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; +import { authServiceClient } from "@/grpcweb"; import useNavigateTo from "@/hooks/useNavigateTo"; import useUserStore from "@/stores/v1/user"; import useWorkspaceStore from "@/stores/v1/workspace"; -import * as api from "../helpers/api"; import useLoading from "../hooks/useLoading"; const SignIn: React.FC = () => { @@ -44,9 +44,10 @@ const SignIn: React.FC = () => { try { actionBtnLoadingState.setLoading(); - const { data: user } = await api.signin(email, password); + const { user, accessToken } = await authServiceClient.signIn({ email, password }); if (user) { userStore.setCurrentUserId(user.id); + document.cookie = `slash.access-token=${accessToken}; path=/;`; await userStore.fetchCurrentUser(); navigateTo("/"); } else { diff --git a/frontend/web/src/pages/SignUp.tsx b/frontend/web/src/pages/SignUp.tsx index 2982a73..99c30e5 100644 --- a/frontend/web/src/pages/SignUp.tsx +++ b/frontend/web/src/pages/SignUp.tsx @@ -3,10 +3,10 @@ import React, { FormEvent, useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; +import { authServiceClient } from "@/grpcweb"; import useNavigateTo from "@/hooks/useNavigateTo"; import useUserStore from "@/stores/v1/user"; import useWorkspaceStore from "@/stores/v1/workspace"; -import * as api from "../helpers/api"; import useLoading from "../hooks/useLoading"; const SignUp: React.FC = () => { @@ -51,9 +51,14 @@ const SignUp: React.FC = () => { try { actionBtnLoadingState.setLoading(); - const { data: user } = await api.signup(email, nickname, password); + const { user, accessToken } = await authServiceClient.signUp({ + email, + nickname, + password, + }); if (user) { userStore.setCurrentUserId(user.id); + document.cookie = `slash.access-token=${accessToken}; path=/;`; await userStore.fetchCurrentUser(); navigateTo("/"); } else { diff --git a/frontend/web/src/types/modules/user.d.ts b/frontend/web/src/types/modules/user.d.ts deleted file mode 100644 index 3f1dff6..0000000 --- a/frontend/web/src/types/modules/user.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -interface User { - id: number; - email: string; - nickname: string; -} diff --git a/proto/api/v2/auth_service.proto b/proto/api/v2/auth_service.proto new file mode 100644 index 0000000..392f533 --- /dev/null +++ b/proto/api/v2/auth_service.proto @@ -0,0 +1,45 @@ +syntax = "proto3"; + +package slash.api.v2; + +import "api/v2/user_service.proto"; +import "google/api/annotations.proto"; + +option go_package = "gen/api/v2"; + +service AuthService { + rpc SignIn(SignInRequest) returns (SignInResponse) { + option (google.api.http) = {post: "/api/v2/auth/signin"}; + } + rpc SignUp(SignUpRequest) returns (SignUpResponse) { + option (google.api.http) = {post: "/api/v2/auth/signup"}; + } + rpc SignOut(SignOutRequest) returns (SignOutResponse) { + option (google.api.http) = {post: "/api/v2/auth/signout"}; + } +} + +message SignInRequest { + string email = 1; + string password = 2; +} + +message SignInResponse { + User user = 1; + string access_token = 2; +} + +message SignUpRequest { + string email = 1; + string nickname = 2; + string password = 3; +} + +message SignUpResponse { + User user = 1; + string access_token = 2; +} + +message SignOutRequest {} + +message SignOutResponse {} diff --git a/proto/gen/api/v2/README.md b/proto/gen/api/v2/README.md index 5d38c6c..b9b9e0b 100644 --- a/proto/gen/api/v2/README.md +++ b/proto/gen/api/v2/README.md @@ -7,6 +7,40 @@ - [RowStatus](#slash-api-v2-RowStatus) - [Visibility](#slash-api-v2-Visibility) +- [api/v2/user_service.proto](#api_v2_user_service-proto) + - [CreateUserAccessTokenRequest](#slash-api-v2-CreateUserAccessTokenRequest) + - [CreateUserAccessTokenResponse](#slash-api-v2-CreateUserAccessTokenResponse) + - [CreateUserRequest](#slash-api-v2-CreateUserRequest) + - [CreateUserResponse](#slash-api-v2-CreateUserResponse) + - [DeleteUserAccessTokenRequest](#slash-api-v2-DeleteUserAccessTokenRequest) + - [DeleteUserAccessTokenResponse](#slash-api-v2-DeleteUserAccessTokenResponse) + - [DeleteUserRequest](#slash-api-v2-DeleteUserRequest) + - [DeleteUserResponse](#slash-api-v2-DeleteUserResponse) + - [GetUserRequest](#slash-api-v2-GetUserRequest) + - [GetUserResponse](#slash-api-v2-GetUserResponse) + - [ListUserAccessTokensRequest](#slash-api-v2-ListUserAccessTokensRequest) + - [ListUserAccessTokensResponse](#slash-api-v2-ListUserAccessTokensResponse) + - [ListUsersRequest](#slash-api-v2-ListUsersRequest) + - [ListUsersResponse](#slash-api-v2-ListUsersResponse) + - [UpdateUserRequest](#slash-api-v2-UpdateUserRequest) + - [UpdateUserResponse](#slash-api-v2-UpdateUserResponse) + - [User](#slash-api-v2-User) + - [UserAccessToken](#slash-api-v2-UserAccessToken) + + - [Role](#slash-api-v2-Role) + + - [UserService](#slash-api-v2-UserService) + +- [api/v2/auth_service.proto](#api_v2_auth_service-proto) + - [SignInRequest](#slash-api-v2-SignInRequest) + - [SignInResponse](#slash-api-v2-SignInResponse) + - [SignOutRequest](#slash-api-v2-SignOutRequest) + - [SignOutResponse](#slash-api-v2-SignOutResponse) + - [SignUpRequest](#slash-api-v2-SignUpRequest) + - [SignUpResponse](#slash-api-v2-SignUpResponse) + + - [AuthService](#slash-api-v2-AuthService) + - [api/v2/collection_service.proto](#api_v2_collection_service-proto) - [Collection](#slash-api-v2-Collection) - [CreateCollectionRequest](#slash-api-v2-CreateCollectionRequest) @@ -54,30 +88,6 @@ - [SubscriptionService](#slash-api-v2-SubscriptionService) -- [api/v2/user_service.proto](#api_v2_user_service-proto) - - [CreateUserAccessTokenRequest](#slash-api-v2-CreateUserAccessTokenRequest) - - [CreateUserAccessTokenResponse](#slash-api-v2-CreateUserAccessTokenResponse) - - [CreateUserRequest](#slash-api-v2-CreateUserRequest) - - [CreateUserResponse](#slash-api-v2-CreateUserResponse) - - [DeleteUserAccessTokenRequest](#slash-api-v2-DeleteUserAccessTokenRequest) - - [DeleteUserAccessTokenResponse](#slash-api-v2-DeleteUserAccessTokenResponse) - - [DeleteUserRequest](#slash-api-v2-DeleteUserRequest) - - [DeleteUserResponse](#slash-api-v2-DeleteUserResponse) - - [GetUserRequest](#slash-api-v2-GetUserRequest) - - [GetUserResponse](#slash-api-v2-GetUserResponse) - - [ListUserAccessTokensRequest](#slash-api-v2-ListUserAccessTokensRequest) - - [ListUserAccessTokensResponse](#slash-api-v2-ListUserAccessTokensResponse) - - [ListUsersRequest](#slash-api-v2-ListUsersRequest) - - [ListUsersResponse](#slash-api-v2-ListUsersResponse) - - [UpdateUserRequest](#slash-api-v2-UpdateUserRequest) - - [UpdateUserResponse](#slash-api-v2-UpdateUserResponse) - - [User](#slash-api-v2-User) - - [UserAccessToken](#slash-api-v2-UserAccessToken) - - - [Role](#slash-api-v2-Role) - - - [UserService](#slash-api-v2-UserService) - - [api/v2/user_setting_service.proto](#api_v2_user_setting_service-proto) - [GetUserSettingRequest](#slash-api-v2-GetUserSettingRequest) - [GetUserSettingResponse](#slash-api-v2-GetUserSettingResponse) @@ -150,6 +160,434 @@ + +

Top

+ +## api/v2/user_service.proto + + + + + +### CreateUserAccessTokenRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [int32](#int32) | | id is the user id. | +| description | [string](#string) | | description is the description of the access token. | +| expires_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | optional | expires_at is the expiration time of the access token. If expires_at is not set, the access token will never expire. | + + + + + + + + +### CreateUserAccessTokenResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| access_token | [UserAccessToken](#slash-api-v2-UserAccessToken) | | | + + + + + + + + +### CreateUserRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| user | [User](#slash-api-v2-User) | | | + + + + + + + + +### CreateUserResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| user | [User](#slash-api-v2-User) | | | + + + + + + + + +### DeleteUserAccessTokenRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [int32](#int32) | | id is the user id. | +| access_token | [string](#string) | | access_token is the access token to delete. | + + + + + + + + +### DeleteUserAccessTokenResponse + + + + + + + + + +### DeleteUserRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [int32](#int32) | | | + + + + + + + + +### DeleteUserResponse + + + + + + + + + +### GetUserRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [int32](#int32) | | | + + + + + + + + +### GetUserResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| user | [User](#slash-api-v2-User) | | | + + + + + + + + +### ListUserAccessTokensRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [int32](#int32) | | id is the user id. | + + + + + + + + +### ListUserAccessTokensResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| access_tokens | [UserAccessToken](#slash-api-v2-UserAccessToken) | repeated | | + + + + + + + + +### ListUsersRequest + + + + + + + + + +### ListUsersResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| users | [User](#slash-api-v2-User) | repeated | | + + + + + + + + +### UpdateUserRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| user | [User](#slash-api-v2-User) | | | +| update_mask | [google.protobuf.FieldMask](#google-protobuf-FieldMask) | | | + + + + + + + + +### UpdateUserResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| user | [User](#slash-api-v2-User) | | | + + + + + + + + +### User + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [int32](#int32) | | | +| row_status | [RowStatus](#slash-api-v2-RowStatus) | | | +| created_time | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | +| updated_time | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | +| role | [Role](#slash-api-v2-Role) | | | +| email | [string](#string) | | | +| nickname | [string](#string) | | | +| password | [string](#string) | | | + + + + + + + + +### UserAccessToken + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| access_token | [string](#string) | | | +| description | [string](#string) | | | +| issued_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | +| expires_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | + + + + + + + + + + +### Role + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| ROLE_UNSPECIFIED | 0 | | +| ADMIN | 1 | | +| USER | 2 | | + + + + + + + + + +### UserService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| ListUsers | [ListUsersRequest](#slash-api-v2-ListUsersRequest) | [ListUsersResponse](#slash-api-v2-ListUsersResponse) | ListUsers returns a list of users. | +| GetUser | [GetUserRequest](#slash-api-v2-GetUserRequest) | [GetUserResponse](#slash-api-v2-GetUserResponse) | GetUser returns a user by id. | +| CreateUser | [CreateUserRequest](#slash-api-v2-CreateUserRequest) | [CreateUserResponse](#slash-api-v2-CreateUserResponse) | CreateUser creates a new user. | +| UpdateUser | [UpdateUserRequest](#slash-api-v2-UpdateUserRequest) | [UpdateUserResponse](#slash-api-v2-UpdateUserResponse) | | +| DeleteUser | [DeleteUserRequest](#slash-api-v2-DeleteUserRequest) | [DeleteUserResponse](#slash-api-v2-DeleteUserResponse) | DeleteUser deletes a user by id. | +| ListUserAccessTokens | [ListUserAccessTokensRequest](#slash-api-v2-ListUserAccessTokensRequest) | [ListUserAccessTokensResponse](#slash-api-v2-ListUserAccessTokensResponse) | ListUserAccessTokens returns a list of access tokens for a user. | +| CreateUserAccessToken | [CreateUserAccessTokenRequest](#slash-api-v2-CreateUserAccessTokenRequest) | [CreateUserAccessTokenResponse](#slash-api-v2-CreateUserAccessTokenResponse) | CreateUserAccessToken creates a new access token for a user. | +| DeleteUserAccessToken | [DeleteUserAccessTokenRequest](#slash-api-v2-DeleteUserAccessTokenRequest) | [DeleteUserAccessTokenResponse](#slash-api-v2-DeleteUserAccessTokenResponse) | DeleteUserAccessToken deletes an access token for a user. | + + + + + + +

Top

+ +## api/v2/auth_service.proto + + + + + +### SignInRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| email | [string](#string) | | | +| password | [string](#string) | | | + + + + + + + + +### SignInResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| user | [User](#slash-api-v2-User) | | | +| access_token | [string](#string) | | | + + + + + + + + +### SignOutRequest + + + + + + + + + +### SignOutResponse + + + + + + + + + +### SignUpRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| email | [string](#string) | | | +| nickname | [string](#string) | | | +| password | [string](#string) | | | + + + + + + + + +### SignUpResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| user | [User](#slash-api-v2-User) | | | +| access_token | [string](#string) | | | + + + + + + + + + + + + + + +### AuthService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| SignIn | [SignInRequest](#slash-api-v2-SignInRequest) | [SignInResponse](#slash-api-v2-SignInResponse) | | +| SignUp | [SignUpRequest](#slash-api-v2-SignUpRequest) | [SignUpResponse](#slash-api-v2-SignUpResponse) | | +| SignOut | [SignOutRequest](#slash-api-v2-SignOutRequest) | [SignOutResponse](#slash-api-v2-SignOutResponse) | | + + + + +

Top

@@ -751,321 +1189,6 @@ - -

Top

- -## api/v2/user_service.proto - - - - - -### CreateUserAccessTokenRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [int32](#int32) | | id is the user id. | -| description | [string](#string) | | description is the description of the access token. | -| expires_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | optional | expires_at is the expiration time of the access token. If expires_at is not set, the access token will never expire. | - - - - - - - - -### CreateUserAccessTokenResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| access_token | [UserAccessToken](#slash-api-v2-UserAccessToken) | | | - - - - - - - - -### CreateUserRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| user | [User](#slash-api-v2-User) | | | - - - - - - - - -### CreateUserResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| user | [User](#slash-api-v2-User) | | | - - - - - - - - -### DeleteUserAccessTokenRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [int32](#int32) | | id is the user id. | -| access_token | [string](#string) | | access_token is the access token to delete. | - - - - - - - - -### DeleteUserAccessTokenResponse - - - - - - - - - -### DeleteUserRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [int32](#int32) | | | - - - - - - - - -### DeleteUserResponse - - - - - - - - - -### GetUserRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [int32](#int32) | | | - - - - - - - - -### GetUserResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| user | [User](#slash-api-v2-User) | | | - - - - - - - - -### ListUserAccessTokensRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [int32](#int32) | | id is the user id. | - - - - - - - - -### ListUserAccessTokensResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| access_tokens | [UserAccessToken](#slash-api-v2-UserAccessToken) | repeated | | - - - - - - - - -### ListUsersRequest - - - - - - - - - -### ListUsersResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| users | [User](#slash-api-v2-User) | repeated | | - - - - - - - - -### UpdateUserRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| user | [User](#slash-api-v2-User) | | | -| update_mask | [google.protobuf.FieldMask](#google-protobuf-FieldMask) | | | - - - - - - - - -### UpdateUserResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| user | [User](#slash-api-v2-User) | | | - - - - - - - - -### User - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [int32](#int32) | | | -| row_status | [RowStatus](#slash-api-v2-RowStatus) | | | -| created_time | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | -| updated_time | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | -| role | [Role](#slash-api-v2-Role) | | | -| email | [string](#string) | | | -| nickname | [string](#string) | | | -| password | [string](#string) | | | - - - - - - - - -### UserAccessToken - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| access_token | [string](#string) | | | -| description | [string](#string) | | | -| issued_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | -| expires_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | - - - - - - - - - - -### Role - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| ROLE_UNSPECIFIED | 0 | | -| ADMIN | 1 | | -| USER | 2 | | - - - - - - - - - -### UserService - - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| ListUsers | [ListUsersRequest](#slash-api-v2-ListUsersRequest) | [ListUsersResponse](#slash-api-v2-ListUsersResponse) | ListUsers returns a list of users. | -| GetUser | [GetUserRequest](#slash-api-v2-GetUserRequest) | [GetUserResponse](#slash-api-v2-GetUserResponse) | GetUser returns a user by id. | -| CreateUser | [CreateUserRequest](#slash-api-v2-CreateUserRequest) | [CreateUserResponse](#slash-api-v2-CreateUserResponse) | CreateUser creates a new user. | -| UpdateUser | [UpdateUserRequest](#slash-api-v2-UpdateUserRequest) | [UpdateUserResponse](#slash-api-v2-UpdateUserResponse) | | -| DeleteUser | [DeleteUserRequest](#slash-api-v2-DeleteUserRequest) | [DeleteUserResponse](#slash-api-v2-DeleteUserResponse) | DeleteUser deletes a user by id. | -| ListUserAccessTokens | [ListUserAccessTokensRequest](#slash-api-v2-ListUserAccessTokensRequest) | [ListUserAccessTokensResponse](#slash-api-v2-ListUserAccessTokensResponse) | ListUserAccessTokens returns a list of access tokens for a user. | -| CreateUserAccessToken | [CreateUserAccessTokenRequest](#slash-api-v2-CreateUserAccessTokenRequest) | [CreateUserAccessTokenResponse](#slash-api-v2-CreateUserAccessTokenResponse) | CreateUserAccessToken creates a new access token for a user. | -| DeleteUserAccessToken | [DeleteUserAccessTokenRequest](#slash-api-v2-DeleteUserAccessTokenRequest) | [DeleteUserAccessTokenResponse](#slash-api-v2-DeleteUserAccessTokenResponse) | DeleteUserAccessToken deletes an access token for a user. | - - - - -

Top

diff --git a/proto/gen/api/v2/auth_service.pb.go b/proto/gen/api/v2/auth_service.pb.go new file mode 100644 index 0000000..08df251 --- /dev/null +++ b/proto/gen/api/v2/auth_service.pb.go @@ -0,0 +1,530 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: api/v2/auth_service.proto + +package apiv2 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type SignInRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` +} + +func (x *SignInRequest) Reset() { + *x = SignInRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_auth_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignInRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignInRequest) ProtoMessage() {} + +func (x *SignInRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_auth_service_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignInRequest.ProtoReflect.Descriptor instead. +func (*SignInRequest) Descriptor() ([]byte, []int) { + return file_api_v2_auth_service_proto_rawDescGZIP(), []int{0} +} + +func (x *SignInRequest) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *SignInRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +type SignInResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + AccessToken string `protobuf:"bytes,2,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` +} + +func (x *SignInResponse) Reset() { + *x = SignInResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_auth_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignInResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignInResponse) ProtoMessage() {} + +func (x *SignInResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_auth_service_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignInResponse.ProtoReflect.Descriptor instead. +func (*SignInResponse) Descriptor() ([]byte, []int) { + return file_api_v2_auth_service_proto_rawDescGZIP(), []int{1} +} + +func (x *SignInResponse) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *SignInResponse) GetAccessToken() string { + if x != nil { + return x.AccessToken + } + return "" +} + +type SignUpRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` + Nickname string `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"` + Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` +} + +func (x *SignUpRequest) Reset() { + *x = SignUpRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_auth_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignUpRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignUpRequest) ProtoMessage() {} + +func (x *SignUpRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_auth_service_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignUpRequest.ProtoReflect.Descriptor instead. +func (*SignUpRequest) Descriptor() ([]byte, []int) { + return file_api_v2_auth_service_proto_rawDescGZIP(), []int{2} +} + +func (x *SignUpRequest) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *SignUpRequest) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *SignUpRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +type SignUpResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + AccessToken string `protobuf:"bytes,2,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` +} + +func (x *SignUpResponse) Reset() { + *x = SignUpResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_auth_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignUpResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignUpResponse) ProtoMessage() {} + +func (x *SignUpResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_auth_service_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignUpResponse.ProtoReflect.Descriptor instead. +func (*SignUpResponse) Descriptor() ([]byte, []int) { + return file_api_v2_auth_service_proto_rawDescGZIP(), []int{3} +} + +func (x *SignUpResponse) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *SignUpResponse) GetAccessToken() string { + if x != nil { + return x.AccessToken + } + return "" +} + +type SignOutRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SignOutRequest) Reset() { + *x = SignOutRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_auth_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignOutRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignOutRequest) ProtoMessage() {} + +func (x *SignOutRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_auth_service_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignOutRequest.ProtoReflect.Descriptor instead. +func (*SignOutRequest) Descriptor() ([]byte, []int) { + return file_api_v2_auth_service_proto_rawDescGZIP(), []int{4} +} + +type SignOutResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SignOutResponse) Reset() { + *x = SignOutResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_auth_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignOutResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignOutResponse) ProtoMessage() {} + +func (x *SignOutResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_auth_service_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignOutResponse.ProtoReflect.Descriptor instead. +func (*SignOutResponse) Descriptor() ([]byte, []int) { + return file_api_v2_auth_service_proto_rawDescGZIP(), []int{5} +} + +var File_api_v2_auth_service_proto protoreflect.FileDescriptor + +var file_api_v2_auth_service_proto_rawDesc = []byte{ + 0x0a, 0x19, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x1a, 0x19, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x32, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x41, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x5b, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x5d, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, + 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, + 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x22, 0x5b, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x10, + 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x4f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x4f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x32, 0xb7, 0x02, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x60, 0x0a, 0x06, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x12, 0x1b, 0x2e, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, + 0x6e, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x22, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, + 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x12, 0x60, 0x0a, 0x06, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x70, 0x12, + 0x1b, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, + 0x69, 0x67, 0x6e, 0x55, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x55, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x75, 0x74, 0x68, + 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x12, 0x64, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x4f, + 0x75, 0x74, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x4f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x4f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, + 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x6f, 0x75, 0x74, 0x42, 0xa7, 0x01, + 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x42, 0x10, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x62, 0x6f, 0x6f, 0x6a, 0x61, 0x63, 0x6b, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x32, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x32, 0xa2, 0x02, 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0c, + 0x53, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0c, 0x53, + 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0xe2, 0x02, 0x18, 0x53, 0x6c, + 0x61, 0x73, 0x68, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, + 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_api_v2_auth_service_proto_rawDescOnce sync.Once + file_api_v2_auth_service_proto_rawDescData = file_api_v2_auth_service_proto_rawDesc +) + +func file_api_v2_auth_service_proto_rawDescGZIP() []byte { + file_api_v2_auth_service_proto_rawDescOnce.Do(func() { + file_api_v2_auth_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_v2_auth_service_proto_rawDescData) + }) + return file_api_v2_auth_service_proto_rawDescData +} + +var file_api_v2_auth_service_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_api_v2_auth_service_proto_goTypes = []interface{}{ + (*SignInRequest)(nil), // 0: slash.api.v2.SignInRequest + (*SignInResponse)(nil), // 1: slash.api.v2.SignInResponse + (*SignUpRequest)(nil), // 2: slash.api.v2.SignUpRequest + (*SignUpResponse)(nil), // 3: slash.api.v2.SignUpResponse + (*SignOutRequest)(nil), // 4: slash.api.v2.SignOutRequest + (*SignOutResponse)(nil), // 5: slash.api.v2.SignOutResponse + (*User)(nil), // 6: slash.api.v2.User +} +var file_api_v2_auth_service_proto_depIdxs = []int32{ + 6, // 0: slash.api.v2.SignInResponse.user:type_name -> slash.api.v2.User + 6, // 1: slash.api.v2.SignUpResponse.user:type_name -> slash.api.v2.User + 0, // 2: slash.api.v2.AuthService.SignIn:input_type -> slash.api.v2.SignInRequest + 2, // 3: slash.api.v2.AuthService.SignUp:input_type -> slash.api.v2.SignUpRequest + 4, // 4: slash.api.v2.AuthService.SignOut:input_type -> slash.api.v2.SignOutRequest + 1, // 5: slash.api.v2.AuthService.SignIn:output_type -> slash.api.v2.SignInResponse + 3, // 6: slash.api.v2.AuthService.SignUp:output_type -> slash.api.v2.SignUpResponse + 5, // 7: slash.api.v2.AuthService.SignOut:output_type -> slash.api.v2.SignOutResponse + 5, // [5:8] is the sub-list for method output_type + 2, // [2:5] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_api_v2_auth_service_proto_init() } +func file_api_v2_auth_service_proto_init() { + if File_api_v2_auth_service_proto != nil { + return + } + file_api_v2_user_service_proto_init() + if !protoimpl.UnsafeEnabled { + file_api_v2_auth_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignInRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_auth_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignInResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_auth_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignUpRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_auth_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignUpResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_auth_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignOutRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_auth_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignOutResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_api_v2_auth_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_api_v2_auth_service_proto_goTypes, + DependencyIndexes: file_api_v2_auth_service_proto_depIdxs, + MessageInfos: file_api_v2_auth_service_proto_msgTypes, + }.Build() + File_api_v2_auth_service_proto = out.File + file_api_v2_auth_service_proto_rawDesc = nil + file_api_v2_auth_service_proto_goTypes = nil + file_api_v2_auth_service_proto_depIdxs = nil +} diff --git a/proto/gen/api/v2/auth_service.pb.gw.go b/proto/gen/api/v2/auth_service.pb.gw.go new file mode 100644 index 0000000..5f6d947 --- /dev/null +++ b/proto/gen/api/v2/auth_service.pb.gw.go @@ -0,0 +1,329 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: api/v2/auth_service.proto + +/* +Package apiv2 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package apiv2 + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +var ( + filter_AuthService_SignIn_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_AuthService_SignIn_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignInRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_SignIn_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SignIn(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AuthService_SignIn_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignInRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_SignIn_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SignIn(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_AuthService_SignUp_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_AuthService_SignUp_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignUpRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_SignUp_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SignUp(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AuthService_SignUp_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignUpRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_SignUp_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SignUp(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AuthService_SignOut_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignOutRequest + var metadata runtime.ServerMetadata + + msg, err := client.SignOut(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AuthService_SignOut_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignOutRequest + var metadata runtime.ServerMetadata + + msg, err := server.SignOut(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterAuthServiceHandlerServer registers the http handlers for service AuthService to "mux". +// UnaryRPC :call AuthServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAuthServiceHandlerFromEndpoint instead. +func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AuthServiceServer) error { + + mux.Handle("POST", pattern_AuthService_SignIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.AuthService/SignIn", runtime.WithHTTPPathPattern("/api/v2/auth/signin")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_SignIn_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthService_SignIn_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AuthService_SignUp_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.AuthService/SignUp", runtime.WithHTTPPathPattern("/api/v2/auth/signup")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_SignUp_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthService_SignUp_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AuthService_SignOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.AuthService/SignOut", runtime.WithHTTPPathPattern("/api/v2/auth/signout")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthService_SignOut_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthService_SignOut_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterAuthServiceHandlerFromEndpoint is same as RegisterAuthServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterAuthServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.DialContext(ctx, endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterAuthServiceHandler(ctx, mux, conn) +} + +// RegisterAuthServiceHandler registers the http handlers for service AuthService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterAuthServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterAuthServiceHandlerClient(ctx, mux, NewAuthServiceClient(conn)) +} + +// RegisterAuthServiceHandlerClient registers the http handlers for service AuthService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AuthServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AuthServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "AuthServiceClient" to call the correct interceptors. +func RegisterAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AuthServiceClient) error { + + mux.Handle("POST", pattern_AuthService_SignIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.AuthService/SignIn", runtime.WithHTTPPathPattern("/api/v2/auth/signin")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_SignIn_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthService_SignIn_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AuthService_SignUp_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.AuthService/SignUp", runtime.WithHTTPPathPattern("/api/v2/auth/signup")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_SignUp_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthService_SignUp_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AuthService_SignOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.AuthService/SignOut", runtime.WithHTTPPathPattern("/api/v2/auth/signout")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthService_SignOut_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthService_SignOut_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_AuthService_SignIn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "auth", "signin"}, "")) + + pattern_AuthService_SignUp_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "auth", "signup"}, "")) + + pattern_AuthService_SignOut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "auth", "signout"}, "")) +) + +var ( + forward_AuthService_SignIn_0 = runtime.ForwardResponseMessage + + forward_AuthService_SignUp_0 = runtime.ForwardResponseMessage + + forward_AuthService_SignOut_0 = runtime.ForwardResponseMessage +) diff --git a/proto/gen/api/v2/auth_service_grpc.pb.go b/proto/gen/api/v2/auth_service_grpc.pb.go new file mode 100644 index 0000000..9e6d8cb --- /dev/null +++ b/proto/gen/api/v2/auth_service_grpc.pb.go @@ -0,0 +1,183 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc (unknown) +// source: api/v2/auth_service.proto + +package apiv2 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + AuthService_SignIn_FullMethodName = "/slash.api.v2.AuthService/SignIn" + AuthService_SignUp_FullMethodName = "/slash.api.v2.AuthService/SignUp" + AuthService_SignOut_FullMethodName = "/slash.api.v2.AuthService/SignOut" +) + +// AuthServiceClient is the client API for AuthService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type AuthServiceClient interface { + SignIn(ctx context.Context, in *SignInRequest, opts ...grpc.CallOption) (*SignInResponse, error) + SignUp(ctx context.Context, in *SignUpRequest, opts ...grpc.CallOption) (*SignUpResponse, error) + SignOut(ctx context.Context, in *SignOutRequest, opts ...grpc.CallOption) (*SignOutResponse, error) +} + +type authServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAuthServiceClient(cc grpc.ClientConnInterface) AuthServiceClient { + return &authServiceClient{cc} +} + +func (c *authServiceClient) SignIn(ctx context.Context, in *SignInRequest, opts ...grpc.CallOption) (*SignInResponse, error) { + out := new(SignInResponse) + err := c.cc.Invoke(ctx, AuthService_SignIn_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) SignUp(ctx context.Context, in *SignUpRequest, opts ...grpc.CallOption) (*SignUpResponse, error) { + out := new(SignUpResponse) + err := c.cc.Invoke(ctx, AuthService_SignUp_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) SignOut(ctx context.Context, in *SignOutRequest, opts ...grpc.CallOption) (*SignOutResponse, error) { + out := new(SignOutResponse) + err := c.cc.Invoke(ctx, AuthService_SignOut_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AuthServiceServer is the server API for AuthService service. +// All implementations must embed UnimplementedAuthServiceServer +// for forward compatibility +type AuthServiceServer interface { + SignIn(context.Context, *SignInRequest) (*SignInResponse, error) + SignUp(context.Context, *SignUpRequest) (*SignUpResponse, error) + SignOut(context.Context, *SignOutRequest) (*SignOutResponse, error) + mustEmbedUnimplementedAuthServiceServer() +} + +// UnimplementedAuthServiceServer must be embedded to have forward compatible implementations. +type UnimplementedAuthServiceServer struct { +} + +func (UnimplementedAuthServiceServer) SignIn(context.Context, *SignInRequest) (*SignInResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignIn not implemented") +} +func (UnimplementedAuthServiceServer) SignUp(context.Context, *SignUpRequest) (*SignUpResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignUp not implemented") +} +func (UnimplementedAuthServiceServer) SignOut(context.Context, *SignOutRequest) (*SignOutResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignOut not implemented") +} +func (UnimplementedAuthServiceServer) mustEmbedUnimplementedAuthServiceServer() {} + +// UnsafeAuthServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AuthServiceServer will +// result in compilation errors. +type UnsafeAuthServiceServer interface { + mustEmbedUnimplementedAuthServiceServer() +} + +func RegisterAuthServiceServer(s grpc.ServiceRegistrar, srv AuthServiceServer) { + s.RegisterService(&AuthService_ServiceDesc, srv) +} + +func _AuthService_SignIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignInRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).SignIn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_SignIn_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).SignIn(ctx, req.(*SignInRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_SignUp_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignUpRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).SignUp(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_SignUp_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).SignUp(ctx, req.(*SignUpRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_SignOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignOutRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).SignOut(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AuthService_SignOut_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).SignOut(ctx, req.(*SignOutRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AuthService_ServiceDesc is the grpc.ServiceDesc for AuthService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AuthService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "slash.api.v2.AuthService", + HandlerType: (*AuthServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SignIn", + Handler: _AuthService_SignIn_Handler, + }, + { + MethodName: "SignUp", + Handler: _AuthService_SignUp_Handler, + }, + { + MethodName: "SignOut", + Handler: _AuthService_SignOut_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "api/v2/auth_service.proto", +}