feat: oapi gen

This commit is contained in:
gelik 2023-05-17 06:39:29 +03:00
parent 35541bb9a3
commit 8bfd447d46
9 changed files with 601 additions and 324 deletions

@ -4,6 +4,7 @@ run:
- \.pb\.go$
- \.pb\.validate\.go$
- \.pb\.gw\.go$
- \.gen\.go$
skip-dirs:
- mocks

@ -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(), &params.P)
err = runtime.BindQueryParameter("form", false, false, "page", ctx.QueryParams(), &params.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(), &params.S)
err = runtime.BindQueryParameter("form", false, false, "limit", ctx.QueryParams(), &params.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(), &params.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

4
internal/swagger/api.go Normal file

@ -0,0 +1,4 @@
package swagger
//go:generate oapi-codegen --config api.yaml ../../openapi.yaml
//go:generate oapi-codegen --config models.yaml ../../openapi.yaml

@ -0,0 +1,6 @@
output: api.gen.go
package: swagger
generate:
echo-server: true
models: false
embedded-spec: true

@ -1,3 +0,0 @@
package swagger
//go:generate oapi-codegen --config oapi-codegen.yaml ../../openapi.yaml

@ -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

@ -0,0 +1,4 @@
output: models.gen.go
package: swagger
generate:
models: true

@ -1,7 +0,0 @@
output: server.gen.go
package: swagger
generate:
# other servers are available!
echo-server: true
models: true
embedded-spec: true

@ -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".