diff --git a/.golangci.yaml b/.golangci.yaml index 11fa4af..13cf4aa 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -4,6 +4,7 @@ run: - \.pb\.go$ - \.pb\.validate\.go$ - \.pb\.gw\.go$ + - \.gen\.go$ skip-dirs: - mocks diff --git a/internal/swagger/server.gen.go b/internal/swagger/api.gen.go similarity index 55% rename from internal/swagger/server.gen.go rename to internal/swagger/api.gen.go index fecef07..68d03f5 100644 --- a/internal/swagger/server.gen.go +++ b/internal/swagger/api.gen.go @@ -1,4 +1,4 @@ -// Package api provides primitives to interact with the openapi HTTP API. +// Package swagger provides primitives to interact with the openapi HTTP API. // // Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT. package swagger @@ -12,133 +12,12 @@ import ( "net/url" "path" "strings" - "time" "github.com/deepmap/oapi-codegen/pkg/runtime" "github.com/getkin/kin-openapi/openapi3" "github.com/labstack/echo/v4" ) -// Defines values for RecordType. -const ( - BuyCart RecordType = "buyCart" - DeclinedPayment RecordType = "declinedPayment" - SubsriptionEnd RecordType = "subsriptionEnd" - SuccessfulPayment RecordType = "successfulPayment" - TimeoutPayment RecordType = "timeoutPayment" -) - -// Account defines model for Account. -type Account struct { - Id *string `json:"_id,omitempty"` - Cart *Cart `json:"cart,omitempty"` - IsDeleted *bool `json:"isDeleted,omitempty"` - UserId *string `json:"userId,omitempty"` - Wallet *Wallet `json:"wallet,omitempty"` -} - -// Cart defines model for Cart. -type Cart = []string - -// Record defines model for Record. -type Record struct { - Comment *string `json:"comment,omitempty"` - CreatedAt *time.Time `json:"createdAt,omitempty"` - Id *string `json:"id,omitempty"` - - // Subject я пока не могу предположить, какие будут фильтры по истории, поэтому предлагаю в это поле просто класть строку с json. ибо для каждого типа записи она своя. - Subject *string `json:"subject,omitempty"` - Type *RecordType `json:"type,omitempty"` - UserId *string `json:"userId,omitempty"` -} - -// RecordType defines model for Record.Type. -type RecordType string - -// Wallet defines model for Wallet. -type Wallet struct { - Cash *int64 `json:"cash,omitempty"` - Currency *string `json:"currency,omitempty"` - - // Money деньги на счету в копейках. Чтобы при перессчётах не возникало денег изниоткуда. фиксируемся к одной валюте, она будет внутренней, никому её не покажем - Money *int64 `json:"money,omitempty"` -} - -// PaginationAccountsParams defines parameters for PaginationAccounts. -type PaginationAccountsParams struct { - // P Номер страницы, начиная с 0 - P *int `form:"p,omitempty" json:"p,omitempty"` - - // S размер страницы - S *int `form:"s,omitempty" json:"s,omitempty"` -} - -// RemoveFromCartParams defines parameters for RemoveFromCart. -type RemoveFromCartParams struct { - Id string `form:"id" json:"id"` -} - -// Add2cartJSONBody defines parameters for Add2cart. -type Add2cartJSONBody struct { - Id *string `json:"id,omitempty"` -} - -// PayCartJSONBody defines parameters for PayCart. -type PayCartJSONBody struct { - // Id айдишник для того, чтобы указать сервису оплаты, какой юзер оплатил - Id *string `json:"id,omitempty"` -} - -// UpdateCurrenciesJSONBody defines parameters for UpdateCurrencies. -type UpdateCurrenciesJSONBody = []string - -// GetHistoryParams defines parameters for GetHistory. -type GetHistoryParams struct { - // P Номер страницы, начиная с 0 - P *int `form:"p,omitempty" json:"p,omitempty"` - - // S размер страницы - S *int `form:"s,omitempty" json:"s,omitempty"` -} - -// ChangeCurrencyJSONBody defines parameters for ChangeCurrency. -type ChangeCurrencyJSONBody struct { - Currency *string `json:"currency,omitempty"` -} - -// RequestMoneyJSONBody defines parameters for RequestMoney. -type RequestMoneyJSONBody struct { - Cash *int `json:"cash,omitempty"` -} - -// PutMoneyJSONBody defines parameters for PutMoney. -type PutMoneyJSONBody struct { - Cash *int `json:"cash,omitempty"` - Currency *string `json:"currency,omitempty"` - Id *string `json:"id,omitempty"` -} - -// Add2cartJSONRequestBody defines body for Add2cart for application/json ContentType. -type Add2cartJSONRequestBody Add2cartJSONBody - -// PayCartJSONRequestBody defines body for PayCart for application/json ContentType. -type PayCartJSONRequestBody PayCartJSONBody - -// UpdateCurrenciesJSONRequestBody defines body for UpdateCurrencies for application/json ContentType. -type UpdateCurrenciesJSONRequestBody = UpdateCurrenciesJSONBody - -// Add2historyJSONRequestBody defines body for Add2history for application/json ContentType. -type Add2historyJSONRequestBody = Record - -// ChangeCurrencyJSONRequestBody defines body for ChangeCurrency for application/json ContentType. -type ChangeCurrencyJSONRequestBody ChangeCurrencyJSONBody - -// RequestMoneyJSONRequestBody defines body for RequestMoney for application/json ContentType. -type RequestMoneyJSONRequestBody RequestMoneyJSONBody - -// PutMoneyJSONRequestBody defines body for PutMoney for application/json ContentType. -type PutMoneyJSONRequestBody PutMoneyJSONBody - // ServerInterface represents all server handlers. type ServerInterface interface { // удалить собственный аккаунт @@ -147,23 +26,23 @@ type ServerInterface interface { // Получение текущего аккаунта юзера // (GET /account) GetAccount(ctx echo.Context) error - // создать новый аккаунт + // Создать новый аккаунт // (POST /account) AddAccount(ctx echo.Context) error - // удалить аккаунт по айди + // Удалить аккаунт по айди // (DELETE /account/{accountId}) DeleteDirectAccount(ctx echo.Context, accountId string) error - // получить аккаунт по айди + // Получить аккаунт по ID // (GET /account/{accountId}) GetDirectAccount(ctx echo.Context, accountId string) error // списко аккаунтов с пагинацией // (GET /accounts) PaginationAccounts(ctx echo.Context, params PaginationAccountsParams) error - // удаляем из корзины тариф + // Удаляем из корзины тариф // (DELETE /cart) RemoveFromCart(ctx echo.Context, params RemoveFromCartParams) error - // добавляем в корзину тариф - // (PUT /cart) + // Добавляем в корзину тариф + // (PATCH /cart) Add2cart(ctx echo.Context) error // оплатить козину // (POST /cart/pay) @@ -172,22 +51,22 @@ type ServerInterface interface { // (GET /currencies) GetCurrencies(ctx echo.Context) error // обновляет список одобренных валют - // (PATCH /currencies) + // (PUT /currencies) UpdateCurrencies(ctx echo.Context) error - // получение лога событий связанных с аккаунтом + // Получение лога событий связанных с аккаунтом // (GET /history) GetHistory(ctx echo.Context, params GetHistoryParams) error - // публикация лога в истории + // Публикация лога в истории // (POST /history) Add2history(ctx echo.Context) error - // изменить валюту кошелька + // Запрос на получение ссылки на оплату + // (GET /wallet) + RequestMoney(ctx echo.Context, params RequestMoneyParams) error + // Изменить валюту кошелька // (PATCH /wallet) ChangeCurrency(ctx echo.Context) error - // запрос на получение ссылки на оплату + // Зачислить деньги на кошелёк // (POST /wallet) - RequestMoney(ctx echo.Context) error - // зачислить деньги на кошелёк - // (PUT /wallet) PutMoney(ctx echo.Context) error } @@ -200,6 +79,8 @@ type ServerInterfaceWrapper struct { func (w *ServerInterfaceWrapper) DeleteAccount(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + // Invoke the callback with all the unmarshalled arguments err = w.Handler.DeleteAccount(ctx) return err @@ -209,6 +90,8 @@ func (w *ServerInterfaceWrapper) DeleteAccount(ctx echo.Context) error { func (w *ServerInterfaceWrapper) GetAccount(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + // Invoke the callback with all the unmarshalled arguments err = w.Handler.GetAccount(ctx) return err @@ -218,6 +101,8 @@ func (w *ServerInterfaceWrapper) GetAccount(ctx echo.Context) error { func (w *ServerInterfaceWrapper) AddAccount(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + // Invoke the callback with all the unmarshalled arguments err = w.Handler.AddAccount(ctx) return err @@ -234,6 +119,8 @@ func (w *ServerInterfaceWrapper) DeleteDirectAccount(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter accountId: %s", err)) } + ctx.Set(BearerScopes, []string{""}) + // Invoke the callback with all the unmarshalled arguments err = w.Handler.DeleteDirectAccount(ctx, accountId) return err @@ -250,6 +137,8 @@ func (w *ServerInterfaceWrapper) GetDirectAccount(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter accountId: %s", err)) } + ctx.Set(BearerScopes, []string{""}) + // Invoke the callback with all the unmarshalled arguments err = w.Handler.GetDirectAccount(ctx, accountId) return err @@ -261,18 +150,18 @@ func (w *ServerInterfaceWrapper) PaginationAccounts(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params PaginationAccountsParams - // ------------- Optional query parameter "p" ------------- + // ------------- Optional query parameter "page" ------------- - err = runtime.BindQueryParameter("form", false, false, "p", ctx.QueryParams(), ¶ms.P) + err = runtime.BindQueryParameter("form", false, false, "page", ctx.QueryParams(), ¶ms.Page) if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter p: %s", err)) + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter page: %s", err)) } - // ------------- Optional query parameter "s" ------------- + // ------------- Optional query parameter "limit" ------------- - err = runtime.BindQueryParameter("form", false, false, "s", ctx.QueryParams(), ¶ms.S) + err = runtime.BindQueryParameter("form", false, false, "limit", ctx.QueryParams(), ¶ms.Limit) if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter s: %s", err)) + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter limit: %s", err)) } // Invoke the callback with all the unmarshalled arguments @@ -284,6 +173,8 @@ func (w *ServerInterfaceWrapper) PaginationAccounts(ctx echo.Context) error { func (w *ServerInterfaceWrapper) RemoveFromCart(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + // Parameter object where we will unmarshal all parameters from the context var params RemoveFromCartParams // ------------- Required query parameter "id" ------------- @@ -302,6 +193,8 @@ func (w *ServerInterfaceWrapper) RemoveFromCart(ctx echo.Context) error { func (w *ServerInterfaceWrapper) Add2cart(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + // Invoke the callback with all the unmarshalled arguments err = w.Handler.Add2cart(ctx) return err @@ -311,6 +204,8 @@ func (w *ServerInterfaceWrapper) Add2cart(ctx echo.Context) error { func (w *ServerInterfaceWrapper) PayCart(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + // Invoke the callback with all the unmarshalled arguments err = w.Handler.PayCart(ctx) return err @@ -338,6 +233,8 @@ func (w *ServerInterfaceWrapper) UpdateCurrencies(ctx echo.Context) error { func (w *ServerInterfaceWrapper) GetHistory(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + // Parameter object where we will unmarshal all parameters from the context var params GetHistoryParams // ------------- Optional query parameter "p" ------------- @@ -363,26 +260,41 @@ func (w *ServerInterfaceWrapper) GetHistory(ctx echo.Context) error { func (w *ServerInterfaceWrapper) Add2history(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + // Invoke the callback with all the unmarshalled arguments err = w.Handler.Add2history(ctx) return err } -// ChangeCurrency converts echo context to params. -func (w *ServerInterfaceWrapper) ChangeCurrency(ctx echo.Context) error { - var err error - - // Invoke the callback with all the unmarshalled arguments - err = w.Handler.ChangeCurrency(ctx) - return err -} - // RequestMoney converts echo context to params. func (w *ServerInterfaceWrapper) RequestMoney(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + + // Parameter object where we will unmarshal all parameters from the context + var params RequestMoneyParams + // ------------- Required query parameter "cash" ------------- + + err = runtime.BindQueryParameter("form", true, true, "cash", ctx.QueryParams(), ¶ms.Cash) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter cash: %s", err)) + } + // Invoke the callback with all the unmarshalled arguments - err = w.Handler.RequestMoney(ctx) + err = w.Handler.RequestMoney(ctx, params) + return err +} + +// ChangeCurrency converts echo context to params. +func (w *ServerInterfaceWrapper) ChangeCurrency(ctx echo.Context) error { + var err error + + ctx.Set(BearerScopes, []string{""}) + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.ChangeCurrency(ctx) return err } @@ -390,6 +302,8 @@ func (w *ServerInterfaceWrapper) RequestMoney(ctx echo.Context) error { func (w *ServerInterfaceWrapper) PutMoney(ctx echo.Context) error { var err error + ctx.Set(BearerScopes, []string{""}) + // Invoke the callback with all the unmarshalled arguments err = w.Handler.PutMoney(ctx) return err @@ -430,73 +344,79 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/account/:accountId", wrapper.GetDirectAccount) router.GET(baseURL+"/accounts", wrapper.PaginationAccounts) router.DELETE(baseURL+"/cart", wrapper.RemoveFromCart) - router.PUT(baseURL+"/cart", wrapper.Add2cart) + router.PATCH(baseURL+"/cart", wrapper.Add2cart) router.POST(baseURL+"/cart/pay", wrapper.PayCart) router.GET(baseURL+"/currencies", wrapper.GetCurrencies) - router.PATCH(baseURL+"/currencies", wrapper.UpdateCurrencies) + router.PUT(baseURL+"/currencies", wrapper.UpdateCurrencies) router.GET(baseURL+"/history", wrapper.GetHistory) router.POST(baseURL+"/history", wrapper.Add2history) + router.GET(baseURL+"/wallet", wrapper.RequestMoney) router.PATCH(baseURL+"/wallet", wrapper.ChangeCurrency) - router.POST(baseURL+"/wallet", wrapper.RequestMoney) - router.PUT(baseURL+"/wallet", wrapper.PutMoney) + router.POST(baseURL+"/wallet", wrapper.PutMoney) } // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "pr/3eO8/AQAA//8nG+8kJDMAAA==", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/swagger/api.go b/internal/swagger/api.go new file mode 100644 index 0000000..d618a22 --- /dev/null +++ b/internal/swagger/api.go @@ -0,0 +1,4 @@ +package swagger + +//go:generate oapi-codegen --config api.yaml ../../openapi.yaml +//go:generate oapi-codegen --config models.yaml ../../openapi.yaml diff --git a/internal/swagger/api.yaml b/internal/swagger/api.yaml new file mode 100644 index 0000000..a2634dd --- /dev/null +++ b/internal/swagger/api.yaml @@ -0,0 +1,6 @@ +output: api.gen.go +package: swagger +generate: + echo-server: true + models: false + embedded-spec: true diff --git a/internal/swagger/generate.go b/internal/swagger/generate.go deleted file mode 100644 index fd2e9ee..0000000 --- a/internal/swagger/generate.go +++ /dev/null @@ -1,3 +0,0 @@ -package swagger - -//go:generate oapi-codegen --config oapi-codegen.yaml ../../openapi.yaml diff --git a/internal/swagger/models.gen.go b/internal/swagger/models.gen.go new file mode 100644 index 0000000..70b953b --- /dev/null +++ b/internal/swagger/models.gen.go @@ -0,0 +1,139 @@ +// Package swagger provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT. +package swagger + +import ( + "time" +) + +const ( + BearerScopes = "Bearer.Scopes" +) + +// Defines values for HistoryType. +const ( + BuyCart HistoryType = "buyCart" + DeclinedPayment HistoryType = "declinedPayment" + SubsriptionEnd HistoryType = "subsriptionEnd" + SuccessfulPayment HistoryType = "successfulPayment" + TimeoutPayment HistoryType = "timeoutPayment" +) + +// Account defines model for Account. +type Account struct { + Id string `json:"_id"` + Cart []string `json:"cart"` + CreatedAt time.Time `json:"createdAt"` + Deleted bool `json:"deleted"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` + UpdatedAt time.Time `json:"updatedAt"` + UserId string `json:"userId"` + Wallet Wallet `json:"wallet"` +} + +// Error defines model for Error. +type Error struct { + Message string `json:"message"` + StatusCode *int64 `json:"statusCode,omitempty"` +} + +// History defines model for History. +type History struct { + Comment *string `json:"comment,omitempty"` + CreatedAt *time.Time `json:"createdAt,omitempty"` + Deleted *bool `json:"deleted,omitempty"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` + Id *string `json:"id,omitempty"` + + // Subject Я пока не могу предположить, какие будут фильтры по истории, поэтому предлагаю в это поле просто класть строку с json. ибо для каждого типа записи она своя. + Subject *string `json:"subject,omitempty"` + Type *HistoryType `json:"type,omitempty"` + UpdatedAt *time.Time `json:"updatedAt,omitempty"` + UserId *string `json:"userId,omitempty"` +} + +// HistoryType defines model for History.Type. +type HistoryType string + +// Wallet defines model for Wallet. +type Wallet struct { + Cash *int64 `json:"cash,omitempty"` + Currency *string `json:"currency,omitempty"` + + // Money деньги на счету в копейках. Чтобы при перессчётах не возникало денег изниоткуда. фиксируемся к одной валюте, она будет внутренней, никому её не покажем + Money *int64 `json:"money,omitempty"` +} + +// PaginationAccountsParams defines parameters for PaginationAccounts. +type PaginationAccountsParams struct { + // Page Номер страницы, начиная с 1 + Page *int `form:"page,omitempty" json:"page,omitempty"` + + // Limit размер страницы + Limit *int `form:"limit,omitempty" json:"limit,omitempty"` +} + +// RemoveFromCartParams defines parameters for RemoveFromCart. +type RemoveFromCartParams struct { + Id string `form:"id" json:"id"` +} + +// Add2cartJSONBody defines parameters for Add2cart. +type Add2cartJSONBody struct { + Id *string `json:"id,omitempty"` +} + +// PayCartJSONBody defines parameters for PayCart. +type PayCartJSONBody struct { + // UserId ID для того, чтобы указать сервису оплаты, какой юзер оплатил + UserId *string `json:"userId,omitempty"` +} + +// UpdateCurrenciesJSONBody defines parameters for UpdateCurrencies. +type UpdateCurrenciesJSONBody = []string + +// GetHistoryParams defines parameters for GetHistory. +type GetHistoryParams struct { + // P Номер страницы, начиная с 1 + P *int `form:"p,omitempty" json:"p,omitempty"` + + // S Размер страницы + S *int `form:"s,omitempty" json:"s,omitempty"` +} + +// RequestMoneyParams defines parameters for RequestMoney. +type RequestMoneyParams struct { + // Cash Номер страницы, начиная с 1 + Cash int `form:"cash" json:"cash"` +} + +// ChangeCurrencyJSONBody defines parameters for ChangeCurrency. +type ChangeCurrencyJSONBody struct { + Currency *string `json:"currency,omitempty"` +} + +// PutMoneyJSONBody defines parameters for PutMoney. +type PutMoneyJSONBody struct { + Cash *int `json:"cash,omitempty"` + Currency *string `json:"currency,omitempty"` + UserId *string `json:"userId,omitempty"` +} + +// Add2cartJSONRequestBody defines body for Add2cart for application/json ContentType. +type Add2cartJSONRequestBody Add2cartJSONBody + +// PayCartJSONRequestBody defines body for PayCart for application/json ContentType. +type PayCartJSONRequestBody PayCartJSONBody + +// UpdateCurrenciesJSONRequestBody defines body for UpdateCurrencies for application/json ContentType. +type UpdateCurrenciesJSONRequestBody = UpdateCurrenciesJSONBody + +// Add2historyJSONRequestBody defines body for Add2history for application/json ContentType. +type Add2historyJSONRequestBody = History + +// ChangeCurrencyJSONRequestBody defines body for ChangeCurrency for application/json ContentType. +type ChangeCurrencyJSONRequestBody ChangeCurrencyJSONBody + +// PutMoneyJSONRequestBody defines body for PutMoney for application/json ContentType. +type PutMoneyJSONRequestBody PutMoneyJSONBody diff --git a/internal/swagger/models.yaml b/internal/swagger/models.yaml new file mode 100644 index 0000000..9ef06be --- /dev/null +++ b/internal/swagger/models.yaml @@ -0,0 +1,4 @@ +output: models.gen.go +package: swagger +generate: + models: true diff --git a/internal/swagger/oapi-codegen.yaml b/internal/swagger/oapi-codegen.yaml deleted file mode 100644 index faa6c6c..0000000 --- a/internal/swagger/oapi-codegen.yaml +++ /dev/null @@ -1,7 +0,0 @@ -output: server.gen.go -package: swagger -generate: - # other servers are available! - echo-server: true - models: true - embedded-spec: true \ No newline at end of file diff --git a/openapi.yaml b/openapi.yaml index f8a99da..a0cd63d 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -4,6 +4,7 @@ info: description: |- Область ответственности сервиса - предоставление пользователю функционала корзины и кошелька. version: 1.0.0 + tags: - name: account description: аккаунт @@ -15,14 +16,17 @@ tags: description: кошелёк - name: history description: история + paths: /account: get: tags: - account summary: Получение текущего аккаунта юзера - description: используется при заходе юзера в систему. Айдишник юзера получает из токена, который передаётся в заголовке authorization + description: Используется при заходе юзера в систему. Айдишник юзера получает из токена, который передаётся в заголовке authorization operationId: getAccount + security: + - Bearer: [] responses: '200': description: успешное получение @@ -32,34 +36,59 @@ paths: $ref: '#/components/schemas/Account' '401': description: Неавторизован + content: + application/json: + schema: + $ref: '#/components/schemas/Error' '404': description: Такого пользователя нет + content: + application/json: + schema: + $ref: '#/components/schemas/Error' post: tags: - account - summary: создать новый аккаунт - description: создаёт новый аккаунт для юзера, если такого ещё не было + summary: Создать новый аккаунт + description: Создаёт новый аккаунт для юзера, если такого ещё не было operationId: addAccount + security: + - Bearer: [] responses: - '201': - description: успешное созание аккаунта + '200': + description: успешное создание аккаунта content: application/json: schema: $ref: '#/components/schemas/Account' '401': description: Неавторизован + content: + application/json: + schema: + $ref: '#/components/schemas/Error' delete: tags: - account summary: удалить собственный аккаунт description: помечает аккаунт удалённым operationId: deleteAccount + security: + - Bearer: [] responses: '200': description: успешное удаление аккаунта + content: + application/json: + schema: + $ref: '#/components/schemas/Account' '401': description: Неавторизован + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /accounts: get: tags: @@ -68,22 +97,22 @@ paths: description: получает список аккаунтов на указанной странице + общее количество аккаунтов operationId: paginationAccounts parameters: - - name: p + - name: page in: query - description: Номер страницы, начиная с 0 + description: Номер страницы, начиная с 1 required: false explode: false schema: type: integer - default: 0 - - name: s + default: 1 + - name: limit in: query description: размер страницы required: false explode: false schema: type: integer - default: 10 + default: 100 responses: '200': description: успешное получение страницы аккаунтов @@ -92,60 +121,84 @@ paths: schema: type: object properties: - count: + totalPages: type: integer example: 11 - items: + accounts: type: array items: $ref: "#/components/schemas/Account" - '401': - description: Неавторизован + /account/{accountId}: get: tags: - account - summary: получить аккаунт по айди - description: метод необходимый в основном только менеджерам, для получения данных о клиенте + summary: Получить аккаунт по ID + description: Метод необходимый в основном только менеджерам, для получения данных о клиенте + security: + - Bearer: [] operationId: getDirectAccount parameters: - name: accountId in: path - description: айдишник аккаунта + description: id аккаунта required: true schema: type: string responses: '200': - description: успешное получение аккаунта + description: Успешное получение аккаунта + content: + application/json: + schema: + $ref: '#/components/schemas/Account' + '401': + description: Неавторизован + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Нет такого пользователя + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - account + summary: Удалить аккаунт по айди + description: Метод необходимый в основном только менеджерам, для удаления клиента + operationId: deleteDirectAccount + security: + - Bearer: [] + parameters: + - name: accountId + in: path + description: ID аккаунта + required: true + schema: + type: string + responses: + '200': + description: Успешное удаление аккаунта content: application/json: schema: $ref: '#/components/schemas/Account' '401': description: Неавторизован + content: + application/json: + schema: + $ref: '#/components/schemas/Error' '404': description: Нет такого пользователя - delete: - tags: - - account - summary: удалить аккаунт по айди - description: метод необходимый в основном только менеджерам, для удаления клиента - operationId: deleteDirectAccount - parameters: - - name: accountId - in: path - description: айдишник аккаунта - required: true - schema: - type: string - responses: - '200': - description: успешное удаление аккаунта - '401': - description: Неавторизован - '404': - description: Нет такого пользователя + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /currencies: get: tags: @@ -165,7 +218,7 @@ paths: - "CAD" items: type: string - patch: + put: tags: - currency summary: обновляет список одобренных валют @@ -182,15 +235,30 @@ paths: items: type: string responses: + '200': + description: успешное обновление списка валют + content: + application/json: + schema: + type: array + example: + - "RUB" + - "USD" + - "CAD" + items: + type: string '401': description: Uanuthorized + /cart: - put: + patch: tags: - cart - summary: добавляем в корзину тариф - description: 'необходимо проверить, что такой тариф существует' + summary: Добавляем в корзину тариф + description: Необходимо проверить, что такой тариф существует operationId: add2cart + security: + - Bearer: [] requestBody: content: application/json: @@ -202,16 +270,30 @@ paths: example: "807f1f77bcf81cd799439011" responses: '200': - description: добавлено в корзину + description: Добавлено в корзину + content: + application/json: + schema: + $ref: '#/components/schemas/Account' '401': - description: неавторизован + description: Неавторизован + content: + application/json: + schema: + $ref: '#/components/schemas/Error' '404': - description: не найден такой тариф + description: Не найден такой тариф + content: + application/json: + schema: + $ref: '#/components/schemas/Error' delete: tags: - cart - summary: удаляем из корзины тариф + summary: Удаляем из корзины тариф operationId: removeFromCart + security: + - Bearer: [] parameters: - name: id in: query @@ -221,30 +303,50 @@ paths: example: "807f1f77bcf81cd799439011" responses: '200': - description: удалено из корзины + description: Удалено из корзины + content: + application/json: + schema: + $ref: '#/components/schemas/Account' '401': - description: неавторизован + description: Неавторизован + content: + application/json: + schema: + $ref: '#/components/schemas/Error' '404': - description: не найден такой тариф + description: Не найден такой тариф + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /cart/pay: post: tags: - cart summary: оплатить козину - description: "- очевидно нужен воркер или очередь(место где можно потрогать кафку), которая будет слать запросы в конечные сервисы для добавления привилегий в аккаунт пользователя\n - - в случае если денег в кошельке достаточно - отправить в воркер или очередь задачи на разослать конкретным сервисам добавление привилегий\n - - если денег недостаточно, получить ссылку на оплату у сервиса платёжки и вернуть её. в случае оплаты, повторить вызов этого метода\n - - очистить корзину" operationId: payCart + security: + - Bearer: [] + description: >- + - Очевидно нужен воркер или очередь(место где можно потрогать кафку), которая будет слать запросы в конечные сервисы для добавления привилегий в аккаунт пользователя + + - В случае если денег в кошельке достаточно - отправить в воркер или очередь задачи на разослать конкретным сервисам добавление привилегий + + - Если денег недостаточно, получить ссылку на оплату у сервиса платёжки и вернуть её. в случае оплаты, повторить вызов этого метода + + - Очистить корзину + requestBody: content: application/json: schema: type: object properties: - id: + userId: type: string - description: айдишник для того, чтобы указать сервису оплаты, какой юзер оплатил + description: ID для того, чтобы указать сервису оплаты, какой юзер оплатил example: "807f1f77bcf81cd799439011" responses: '200': @@ -252,19 +354,31 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Account' + $ref: '#/components/schemas/Account' '401': description: Неавторизован + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /wallet: patch: tags: - wallet - summary: изменить валюту кошелька - description: "при запросе:\n - - отвалидировать, что такая валюта одобрена \n - - получить данные из сервиса cbrf(выдам задачу на него чуть позднее)\n - - перевести валюту кошелька в нвоую валюту. кошелёк нарочно целочисленный, чтобы не было претензий к точности с плавающей точкой, поэтому, например долларовый счёт считается в центах" + summary: Изменить валюту кошелька operationId: changeCurrency + description: >- + При запросе необходимо: + + - Отвалидировать, что такая валюта одобрена + + - Получить данные из сервиса cbrf(выдам задачу на него чуть позднее) + + - Перевести валюту кошелька в нвоую валюту. кошелёк нарочно целочисленный, чтобы не было претензий к точности с плавающей точкой, поэтому, например долларовый счёт считается в центах + + security: + - Bearer: [] requestBody: content: application/json: @@ -276,21 +390,37 @@ paths: example: "USD" responses: '200': - description: успешная смена валюты кошелька + description: Успешная смена валюты кошелька content: application/json: schema: $ref: "#/components/schemas/Account" '401': description: Неавторизован + content: + application/json: + schema: + $ref: "#/components/schemas/Error" '400': description: Такая валюта не одобрена - put: + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + '404': + description: Пользователь не найден + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + post: tags: - wallet - summary: зачислить деньги на кошелёк - description: "прибавляем полученное значение к cash и при необходимости приводим к валюте кошелька" + summary: Зачислить деньги на кошелёк + description: "Прибавляем полученное значение к cash и при необходимости приводим к валюте кошелька" operationId: putMoney + security: + - Bearer: [] requestBody: content: application/json: @@ -303,7 +433,7 @@ paths: currency: type: string example: "USD" - id: + userId: type: string example: "807f1f77bcf81cd799439011" responses: @@ -315,25 +445,39 @@ paths: $ref: "#/components/schemas/Account" '400': description: Такая валюта не одобрена - post: + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + '404': + description: Аккаунт не найден + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + get: tags: - wallet - summary: запрос на получение ссылки на оплату - description: "- формируем запрос к сервису оплаты, с необходимыми постбэками\n - - получаем ответ от сервиса оплаты с ссылкой на оплату, которую надо передать пользователю" + summary: Запрос на получение ссылки на оплату operationId: requestMoney - requestBody: - content: - application/json: - schema: - type: object - properties: - cash: - type: integer - example: 10000 + description: >- + - Формируем запрос к сервису оплаты, с необходимыми постбэками + + - Получаем ответ от сервиса оплаты с ссылкой на оплату, которую надо передать пользователю + + security: + - Bearer: [] + parameters: + - name: cash + in: query + description: Номер страницы, начиная с 1 + required: true + schema: + type: integer + default: 10000 responses: '200': - description: успешный зпрос денег + description: Успешный запрос денег content: application/json: schema: @@ -343,17 +487,24 @@ paths: type: string example: "https://google.ru" '500': - description: сервис оплаты вернул ошибку + description: Сервис оплаты вернул ошибку + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /history: get: tags: - history - summary: получение лога событий связанных с аккаунтом + summary: Получение лога событий связанных с аккаунтом operationId: getHistory + security: + - Bearer: [] parameters: - name: p in: query - description: Номер страницы, начиная с 0 + description: Номер страницы, начиная с 1 required: false explode: false schema: @@ -361,46 +512,66 @@ paths: default: 0 - name: s in: query - description: размер страницы + description: Размер страницы required: false explode: false schema: type: integer - default: 10 + default: 100 responses: '200': - description: successful operation + description: Успешное получение событий content: application/json: schema: type: object properties: - count: + totalPages: type: integer example: 11 - items: + records: type: array items: - $ref: '#/components/schemas/Record' + $ref: '#/components/schemas/History' '401': description: Неавторизован + content: + application/json: + schema: + $ref: '#/components/schemas/Error' post: tags: - history - summary: публикация лога в истории + summary: Публикация лога в истории operationId: add2history + security: + - Bearer: [] requestBody: content: application/json: schema: - $ref: "#/components/schemas/Record" + $ref: "#/components/schemas/History" responses: '200': - description: successful operation + description: Успешная публикация лога + content: + application/json: + schema: + $ref: "#/components/schemas/History" + '500': + description: Ошибка при публикации + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + components: schemas: + Account: type: object + required: [_id, userId, cart, wallet, deleted, createdAt, updatedAt] properties: _id: type: string @@ -409,12 +580,27 @@ components: type: string example: "807f1f77bcf81cd799439011" cart: - $ref: "#/components/schemas/Cart" + type: array + items: + type: string + example: + - "807f1f77bcf81cd799439011" + - "807f1f77bcf81cd799439012" wallet: $ref: "#/components/schemas/Wallet" - isDeleted: + deleted: type: boolean example: false + createdAt: + type: string + format: "date-time" + updatedAt: + type: string + format: "date-time" + deletedAt: + type: string + format: "date-time" + Wallet: type: object properties: @@ -429,16 +615,9 @@ components: type: integer format: int64 description: деньги на счету в копейках. Чтобы при перессчётах не возникало денег изниоткуда. фиксируемся к одной валюте, она будет внутренней, никому её не покажем - example: 10701 - Cart: - type: array - items: - type: string - example: - - "807f1f77bcf81cd799439011" - - "807f1f77bcf81cd799439011" - - "807f1f77bcf81cd799439011" - Record: + example: 10701.60 + + History: type: object properties: id: @@ -451,13 +630,47 @@ components: type: string enum: ["successfulPayment", "declinedPayment", "timeoutPayment", "buyCart", "subsriptionEnd"] example: "successfulPayment" + deleted: + type: boolean + example: false createdAt: type: string - format: date-time + format: "date-time" + updatedAt: + type: string + format: "date-time" + deletedAt: + type: string + format: "date-time" comment: type: string example: "я это сделал потому что 42" subject: type: string - description: я пока не могу предположить, какие будут фильтры по истории, поэтому предлагаю в это поле просто класть строку с json. ибо для каждого типа записи она своя. + description: >- + Я пока не могу предположить, какие будут фильтры по истории, поэтому + предлагаю в это поле просто класть строку с json. ибо для каждого типа + записи она своя. example: {"tariffs":["807f1f77bcf81cd799439011","807f1f77bcf81cd799439011"]} + + Error: + type: object + required: + - code + - message + properties: + statusCode: + type: integer + format: int64 + example: 404 + message: + type: string + example: user not found + + securitySchemes: + Bearer: # arbitrary name for the security scheme + type: http + scheme: bearer + bearerFormat: JWT + description: >- + Enter the token with the `Bearer: ` prefix, e.g. "Bearer abcde12345".