diff --git a/docs/docs.go b/docs/docs.go index 63eae4caa..a1462a5e7 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -274,6 +274,56 @@ const docTemplate = `{ } } }, + "/banks": { + "get": { + "description": "Get all bank by given filter params", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Metadata" + ], + "summary": "Get all banks", + "operationId": "getBanksList", + "parameters": [ + { + "type": "string", + "description": "Bank ID", + "name": "id", + "in": "query" + }, + { + "type": "string", + "description": "Bin", + "name": "bin", + "in": "query" + }, + { + "type": "string", + "description": "Swift SwiftCode", + "name": "swiftCode", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ListBankResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, "/brainery-logs": { "post": { "security": [ @@ -7064,6 +7114,32 @@ const docTemplate = `{ } } }, + "Bank": { + "type": "object", + "properties": { + "bin": { + "type": "string" + }, + "code": { + "type": "string" + }, + "id": { + "type": "string" + }, + "logo": { + "type": "string" + }, + "name": { + "type": "string" + }, + "shortName": { + "type": "string" + }, + "swiftCode": { + "type": "string" + } + } + }, "BankAccount": { "type": "object", "properties": { @@ -9378,6 +9454,17 @@ const docTemplate = `{ } } }, + "ListBankResponse": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/Bank" + } + } + } + }, "ListFeedbackResponse": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index fc09407c3..89fcd88cc 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -267,6 +267,56 @@ } } }, + "/banks": { + "get": { + "description": "Get all bank by given filter params", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Metadata" + ], + "summary": "Get all banks", + "operationId": "getBanksList", + "parameters": [ + { + "type": "string", + "description": "Bank ID", + "name": "id", + "in": "query" + }, + { + "type": "string", + "description": "Bin", + "name": "bin", + "in": "query" + }, + { + "type": "string", + "description": "Swift SwiftCode", + "name": "swiftCode", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ListBankResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, "/brainery-logs": { "post": { "security": [ @@ -7057,6 +7107,32 @@ } } }, + "Bank": { + "type": "object", + "properties": { + "bin": { + "type": "string" + }, + "code": { + "type": "string" + }, + "id": { + "type": "string" + }, + "logo": { + "type": "string" + }, + "name": { + "type": "string" + }, + "shortName": { + "type": "string" + }, + "swiftCode": { + "type": "string" + } + } + }, "BankAccount": { "type": "object", "properties": { @@ -9371,6 +9447,17 @@ } } }, + "ListBankResponse": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/Bank" + } + } + } + }, "ListFeedbackResponse": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index becc677bf..26e839f00 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -324,6 +324,23 @@ definitions: type: type: string type: object + Bank: + properties: + bin: + type: string + code: + type: string + id: + type: string + logo: + type: string + name: + type: string + shortName: + type: string + swiftCode: + type: string + type: object BankAccount: properties: accountNumber: @@ -1847,6 +1864,13 @@ definitions: $ref: '#/definitions/BankAccount' type: array type: object + ListBankResponse: + properties: + data: + items: + $ref: '#/definitions/Bank' + type: array + type: object ListFeedbackResponse: properties: data: @@ -4302,6 +4326,39 @@ paths: summary: Get all bank accounts tags: - Bank + /banks: + get: + consumes: + - application/json + description: Get all bank by given filter params + operationId: getBanksList + parameters: + - description: Bank ID + in: query + name: id + type: string + - description: Bin + in: query + name: bin + type: string + - description: Swift SwiftCode + in: query + name: swiftCode + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/ListBankResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/ErrorResponse' + summary: Get all banks + tags: + - Metadata /brainery-logs: post: consumes: diff --git a/pkg/handler/bankaccount/bank_account.go b/pkg/handler/bankaccount/bank_account.go index de629d2d5..fd6886a71 100644 --- a/pkg/handler/bankaccount/bank_account.go +++ b/pkg/handler/bankaccount/bank_account.go @@ -43,7 +43,7 @@ func New(store *store.Store, repo store.DBRepo, service *service.Service, logger // @Router /bank-accounts [get] func (h *handler) List(c *gin.Context) { l := h.logger.Fields(logger.Fields{ - "handler": "bank", + "handler": "bankaccount", "method": "List", }) diff --git a/pkg/handler/metadata/interface.go b/pkg/handler/metadata/interface.go index a424e654d..3ffe6c2c6 100644 --- a/pkg/handler/metadata/interface.go +++ b/pkg/handler/metadata/interface.go @@ -3,6 +3,7 @@ package metadata import "github.com/gin-gonic/gin" type IHandler interface { + Banks(c *gin.Context) Chapters(c *gin.Context) CreatePosition(c *gin.Context) CreateStack(c *gin.Context) diff --git a/pkg/handler/metadata/metadata.go b/pkg/handler/metadata/metadata.go index 4b0757e56..f1674a236 100644 --- a/pkg/handler/metadata/metadata.go +++ b/pkg/handler/metadata/metadata.go @@ -11,10 +11,12 @@ import ( "github.com/dwarvesf/fortress-api/pkg/config" "github.com/dwarvesf/fortress-api/pkg/handler/metadata/errs" "github.com/dwarvesf/fortress-api/pkg/handler/metadata/request" + "github.com/dwarvesf/fortress-api/pkg/logger" "github.com/dwarvesf/fortress-api/pkg/model" "github.com/dwarvesf/fortress-api/pkg/service" "github.com/dwarvesf/fortress-api/pkg/store" + bankRepo "github.com/dwarvesf/fortress-api/pkg/store/bank" "github.com/dwarvesf/fortress-api/pkg/view" ) @@ -721,3 +723,42 @@ func (h *handler) GetCurrencies(c *gin.Context) { c.JSON(http.StatusOK, view.CreateResponse[any](view.ToCurrencies(rs), nil, nil, nil, "")) } + +// Banks godoc +// @Summary Get all banks +// @Description Get all bank by given filter params +// @id getBanksList +// @Tags Metadata +// @Accept json +// @Produce json +// @Param id query string false "Bank ID" +// @Param bin query string false "Bin" +// @Param swiftCode query string false "Swift SwiftCode" +// @Success 200 {object} ListBankResponse +// @Failure 500 {object} ErrorResponse +// @Router /banks [get] +func (h *handler) Banks(c *gin.Context) { + l := h.logger.Fields(logger.Fields{ + "handler": "bank", + "method": "List", + }) + + query := request.GetBankRequest{} + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(http.StatusBadRequest, view.CreateResponse[any](nil, nil, err, query, "")) + return + } + + res, err := h.store.Bank.All(h.repo.DB(), bankRepo.GetBanksInput{ + ID: query.ID, + Bin: query.Bin, + SwiftCode: query.SwiftCode, + }) + if err != nil { + l.Error(err, "failed to get all banks") + c.JSON(http.StatusInternalServerError, view.CreateResponse[any](nil, nil, err, nil, "")) + return + } + + c.JSON(http.StatusOK, view.CreateResponse[any](view.ToListBank(res), nil, nil, nil, "")) +} diff --git a/pkg/handler/metadata/request/request.go b/pkg/handler/metadata/request/request.go index 5e21a55e4..a1d14450a 100644 --- a/pkg/handler/metadata/request/request.go +++ b/pkg/handler/metadata/request/request.go @@ -57,3 +57,9 @@ type GetStacksInput struct { model.Pagination Keyword string `json:"keyword" form:"keyword"` } + +type GetBankRequest struct { + ID string `json:"id" form:"id" ` + Bin string `json:"bin" form:"bin"` + SwiftCode string `json:"swiftCode" form:"swiftCode"` +} diff --git a/pkg/routes/v1.go b/pkg/routes/v1.go index b1703df8d..a9b107187 100644 --- a/pkg/routes/v1.go +++ b/pkg/routes/v1.go @@ -114,6 +114,7 @@ func loadV1Routes(r *gin.Engine, h *handler.Handler, repo store.DBRepo, s *store metadataRoute := v1.Group("/metadata") { metadataRoute.GET("/working-status", h.Metadata.WorkingStatuses) + metadataRoute.GET("/banks", h.Metadata.Banks) metadataRoute.GET("/stacks", h.Metadata.Stacks) metadataRoute.GET("/seniorities", h.Metadata.Seniorities) metadataRoute.GET("/chapters", h.Metadata.Chapters) diff --git a/pkg/routes/v1_test.go b/pkg/routes/v1_test.go index 1bd2d66bb..92a5c4e1a 100644 --- a/pkg/routes/v1_test.go +++ b/pkg/routes/v1_test.go @@ -71,6 +71,12 @@ func Test_loadV1Routes(t *testing.T) { Handler: "github.com/dwarvesf/fortress-api/pkg/handler/employee.IHandler.GetLineManagers-fm", }, }, + "/api/v1/metadata/banks": { + "GET": { + Method: "GET", + Handler: "github.com/dwarvesf/fortress-api/pkg/handler/metadata.IHandler.Banks-fm", + }, + }, "/api/v1/metadata/working-status": { "GET": { Method: "GET", diff --git a/pkg/store/bank/bank.go b/pkg/store/bank/bank.go new file mode 100644 index 000000000..a37807aa0 --- /dev/null +++ b/pkg/store/bank/bank.go @@ -0,0 +1,67 @@ +package bank + +import ( + "gorm.io/gorm" + + "github.com/dwarvesf/fortress-api/pkg/model" +) + +type store struct{} + +func New() IStore { + return &store{} +} + +// One get bank account by id +func (s *store) One(db *gorm.DB, id string) (*model.Bank, error) { + var bankAccount *model.Bank + return bankAccount, db.Where("id = ?", id).First(&bankAccount).Error +} + +type GetBanksInput struct { + ID string + Bin string + SwiftCode string +} + +// All get all bank account +func (s *store) All(db *gorm.DB, in GetBanksInput) ([]*model.Bank, error) { + var banks []*model.Bank + + query := db.Where("deleted_at IS NULL") + if in.ID != "" { + query = query.Where("id = ?", in.ID) + } + if in.Bin != "" { + query = query.Where("bin = ?", in.Bin) + } + if in.SwiftCode != "" { + query = query.Where("swift_code = ?", in.SwiftCode) + } + + return banks, query.Find(&banks).Error +} + +// IsExist check bank account existence +func (s *store) IsExist(db *gorm.DB, id string) (bool, error) { + type res struct { + Result bool + } + + result := res{} + query := db.Raw("SELECT EXISTS (SELECT * FROM banks WHERE id = ?) as result", id) + + return result.Result, query.Scan(&result).Error +} + +// OneByBin get bank account by bin +func (s *store) OneByBin(db *gorm.DB, bin string) (bank *model.Bank, err error) { + var bankAccount *model.Bank + return bankAccount, db.Where("bin = ?", bin).First(&bankAccount).Error +} + +// OneBySwiftCode get bank account by swift code +func (s *store) OneBySwiftCode(db *gorm.DB, code string) (bank *model.Bank, err error) { + var bankAccount *model.Bank + return bankAccount, db.Where("swift_code = ?", code).First(&bankAccount).Error +} diff --git a/pkg/store/bank/interface.go b/pkg/store/bank/interface.go new file mode 100644 index 000000000..0e7ce134e --- /dev/null +++ b/pkg/store/bank/interface.go @@ -0,0 +1,15 @@ +package bank + +import ( + "gorm.io/gorm" + + "github.com/dwarvesf/fortress-api/pkg/model" +) + +type IStore interface { + One(db *gorm.DB, id string) (bank *model.Bank, err error) + OneByBin(db *gorm.DB, bin string) (bank *model.Bank, err error) + OneBySwiftCode(db *gorm.DB, code string) (bank *model.Bank, err error) + All(db *gorm.DB, in GetBanksInput) ([]*model.Bank, error) + IsExist(db *gorm.DB, id string) (exists bool, err error) +} diff --git a/pkg/store/store.go b/pkg/store/store.go index 759ce3afa..003fb688b 100644 --- a/pkg/store/store.go +++ b/pkg/store/store.go @@ -11,6 +11,7 @@ import ( "github.com/dwarvesf/fortress-api/pkg/store/auditcycle" "github.com/dwarvesf/fortress-api/pkg/store/audititem" "github.com/dwarvesf/fortress-api/pkg/store/auditparticipant" + "github.com/dwarvesf/fortress-api/pkg/store/bank" "github.com/dwarvesf/fortress-api/pkg/store/bankaccount" "github.com/dwarvesf/fortress-api/pkg/store/basesalary" "github.com/dwarvesf/fortress-api/pkg/store/brainerylog" @@ -89,6 +90,7 @@ type Store struct { AuditItem audititem.IStore AuditParticipant auditparticipant.IStore SalaryAdvance salaryadvance.IStore + Bank bank.IStore BankAccount bankaccount.IStore BaseSalary basesalary.IStore Bonus employeebonus.IStore @@ -167,6 +169,7 @@ func New() *Store { AuditItem: audititem.New(), AuditParticipant: auditparticipant.New(), SalaryAdvance: salaryadvance.New(), + Bank: bank.New(), BankAccount: bankaccount.New(), BaseSalary: basesalary.New(), Bonus: employeebonus.New(), diff --git a/pkg/view/bank.go b/pkg/view/bank.go index 88b55f34b..56ef0220a 100644 --- a/pkg/view/bank.go +++ b/pkg/view/bank.go @@ -2,63 +2,37 @@ package view import "github.com/dwarvesf/fortress-api/pkg/model" -type ListBankAccountResponse struct { - Data []BankAccount `json:"data"` -} // @name ListBankAccountResponse +type ListBankResponse struct { + Data []Bank `json:"data"` +} // @name ListBankResponse -type BankAccount struct { - ID string `json:"id"` - AccountNumber string `json:"accountNumber"` - BankName string `json:"bankName"` - OwnerName string `json:"ownerName"` - Address *string `json:"address"` - SwiftCode string `json:"swiftCode"` - IntermediaryBankAddress string `json:"intermediaryBankAddress"` - IntermediaryBankName string `json:"intermediaryBankName"` - RoutingNumber string `json:"routingNumber"` - Name string `json:"name"` - UKSortCode string `json:"ukSortCode"` - CurrencyID string `json:"currencyID"` - Currency Currency `json:"currency"` -} // @name BankAccount +type Bank struct { + ID string `json:"id"` + Name string `json:"name"` + Code string `json:"code"` + Bin string `json:"bin"` + ShortName string `json:"shortName"` + Logo string `json:"logo"` + SwiftCode string `json:"swiftCode"` +} // @name Bank -func ToBankAccount(account *model.BankAccount) *BankAccount { - return &BankAccount{ - ID: account.ID.String(), - AccountNumber: account.AccountNumber, - BankName: account.BankName, - OwnerName: account.OwnerName, - Address: account.Address, - SwiftCode: account.SwiftCode, - RoutingNumber: account.RoutingNumber, - Name: account.Name, - UKSortCode: account.UKSortCode, - IntermediaryBankName: account.IntermediaryBankName, - IntermediaryBankAddress: account.IntermediaryBankAddress, - CurrencyID: account.CurrencyID.String(), - Currency: *toCurrency(account.Currency), +func ToBank(in *model.Bank) *Bank { + return &Bank{ + ID: in.ID.String(), + Name: in.Name, + Code: in.Code, + Bin: in.Bin, + ShortName: in.ShortName, + Logo: in.Logo, + SwiftCode: in.SwiftCode, } } -func ToListBankAccount(accounts []*model.BankAccount) []BankAccount { - res := make([]BankAccount, 0) - - for _, acc := range accounts { - res = append(res, BankAccount{ - ID: acc.ID.String(), - AccountNumber: acc.AccountNumber, - BankName: acc.BankName, - OwnerName: acc.OwnerName, - Address: acc.Address, - SwiftCode: acc.SwiftCode, - RoutingNumber: acc.RoutingNumber, - Name: acc.Name, - UKSortCode: acc.UKSortCode, - IntermediaryBankName: acc.IntermediaryBankName, - IntermediaryBankAddress: acc.IntermediaryBankAddress, - CurrencyID: acc.CurrencyID.String(), - Currency: *toCurrency(acc.Currency), - }) +func ToListBank(banks []*model.Bank) []Bank { + res := make([]Bank, 0) + for _, bank := range banks { + b := ToBank(bank) + res = append(res, *b) } return res diff --git a/pkg/view/bank_account.go b/pkg/view/bank_account.go new file mode 100644 index 000000000..88b55f34b --- /dev/null +++ b/pkg/view/bank_account.go @@ -0,0 +1,65 @@ +package view + +import "github.com/dwarvesf/fortress-api/pkg/model" + +type ListBankAccountResponse struct { + Data []BankAccount `json:"data"` +} // @name ListBankAccountResponse + +type BankAccount struct { + ID string `json:"id"` + AccountNumber string `json:"accountNumber"` + BankName string `json:"bankName"` + OwnerName string `json:"ownerName"` + Address *string `json:"address"` + SwiftCode string `json:"swiftCode"` + IntermediaryBankAddress string `json:"intermediaryBankAddress"` + IntermediaryBankName string `json:"intermediaryBankName"` + RoutingNumber string `json:"routingNumber"` + Name string `json:"name"` + UKSortCode string `json:"ukSortCode"` + CurrencyID string `json:"currencyID"` + Currency Currency `json:"currency"` +} // @name BankAccount + +func ToBankAccount(account *model.BankAccount) *BankAccount { + return &BankAccount{ + ID: account.ID.String(), + AccountNumber: account.AccountNumber, + BankName: account.BankName, + OwnerName: account.OwnerName, + Address: account.Address, + SwiftCode: account.SwiftCode, + RoutingNumber: account.RoutingNumber, + Name: account.Name, + UKSortCode: account.UKSortCode, + IntermediaryBankName: account.IntermediaryBankName, + IntermediaryBankAddress: account.IntermediaryBankAddress, + CurrencyID: account.CurrencyID.String(), + Currency: *toCurrency(account.Currency), + } +} + +func ToListBankAccount(accounts []*model.BankAccount) []BankAccount { + res := make([]BankAccount, 0) + + for _, acc := range accounts { + res = append(res, BankAccount{ + ID: acc.ID.String(), + AccountNumber: acc.AccountNumber, + BankName: acc.BankName, + OwnerName: acc.OwnerName, + Address: acc.Address, + SwiftCode: acc.SwiftCode, + RoutingNumber: acc.RoutingNumber, + Name: acc.Name, + UKSortCode: acc.UKSortCode, + IntermediaryBankName: acc.IntermediaryBankName, + IntermediaryBankAddress: acc.IntermediaryBankAddress, + CurrencyID: acc.CurrencyID.String(), + Currency: *toCurrency(acc.Currency), + }) + } + + return res +}