forked from ebhomengo/niki
fix-pkgs
This commit is contained in:
parent
bd38121fb6
commit
8dce8278ee
|
|
@ -2,7 +2,7 @@ package benefactorapp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
benefactorHTTP "git.gocasts.ir/ebhomengo/niki/benefactorapp/delivery/http"
|
benefactorHttp "git.gocasts.ir/ebhomengo/niki/benefactorapp/delivery/http"
|
||||||
repo "git.gocasts.ir/ebhomengo/niki/benefactorapp/repository/database"
|
repo "git.gocasts.ir/ebhomengo/niki/benefactorapp/repository/database"
|
||||||
benefactor "git.gocasts.ir/ebhomengo/niki/benefactorapp/service"
|
benefactor "git.gocasts.ir/ebhomengo/niki/benefactorapp/service"
|
||||||
mySql "git.gocasts.ir/ebhomengo/niki/pkg/database/mysql"
|
mySql "git.gocasts.ir/ebhomengo/niki/pkg/database/mysql"
|
||||||
|
|
@ -12,9 +12,9 @@ import (
|
||||||
|
|
||||||
type Application struct {
|
type Application struct {
|
||||||
Config Config
|
Config Config
|
||||||
HTTPServer benefactorHTTP.Server
|
HTTPServer benefactorHttp.Server
|
||||||
BenefactorService benefactor.Service
|
BenefactorService benefactor.Service
|
||||||
BenefactorHandler benefactorHTTP.Handler
|
BenefactorHandler benefactorHttp.Handler
|
||||||
BenefactorRepo benefactor.Repository
|
BenefactorRepo benefactor.Repository
|
||||||
DBConn mySql.DB
|
DBConn mySql.DB
|
||||||
}
|
}
|
||||||
|
|
@ -36,13 +36,13 @@ func Setup(ctx context.Context, config Config, DB mySql.DB) *Application {
|
||||||
benefactorValidator := benefactor.NewValidator(benefactorRepo)
|
benefactorValidator := benefactor.NewValidator(benefactorRepo)
|
||||||
|
|
||||||
benefactorSvc := benefactor.NewService(benefactorRepo, benefactorValidator)
|
benefactorSvc := benefactor.NewService(benefactorRepo, benefactorValidator)
|
||||||
benefactorHandler := benefactorHTTP.NewHandler(benefactorSvc)
|
benefactorHandler := benefactorHttp.NewHandler(benefactorSvc)
|
||||||
|
|
||||||
hServer, hErr := httpserver.New(config.HTTPServer)
|
hServer, hErr := httpserver.New(config.HTTPServer)
|
||||||
if hErr != nil {
|
if hErr != nil {
|
||||||
log.Error("Http Server error: %v,\n", hErr)
|
log.Error("Http Server error: %v,\n", hErr)
|
||||||
}
|
}
|
||||||
httpServer := benefactorHTTP.NewServer(*hServer, *benefactorHandler)
|
httpServer := benefactorHttp.NewServer(*hServer, *benefactorHandler)
|
||||||
|
|
||||||
return &Application{
|
return &Application{
|
||||||
Config: config,
|
Config: config,
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ type Config struct {
|
||||||
HTTPServer httpserver.Config `koanf:"http_server"`
|
HTTPServer httpserver.Config `koanf:"http_server"`
|
||||||
|
|
||||||
// Database config
|
// Database config
|
||||||
MySQLDB database.Config `koanf:"mysql_db"`
|
MySQLDB database.Config `koanf:"mariadb"`
|
||||||
|
|
||||||
// Logger config
|
// Logger config
|
||||||
Logger logger.Config `koanf:"logger"`
|
Logger logger.Config `koanf:"logger"`
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
-- +migrate Up
|
||||||
|
-- please read this article to understand why we use VARCHAR(191)
|
||||||
|
-- https://www.grouparoo.com/blog/varchar-191#why-varchar-and-not-text
|
||||||
|
CREATE TABLE `benefactors1` (
|
||||||
|
`id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||||
|
`first_name` VARCHAR(191),
|
||||||
|
`last_name` VARCHAR(191),
|
||||||
|
`phone_number` VARCHAR(191) NOT NULL UNIQUE,
|
||||||
|
`description` TEXT,
|
||||||
|
`email` VARCHAR(191),
|
||||||
|
`gender` ENUM('male','female'),
|
||||||
|
`birth_date` TIMESTAMP,
|
||||||
|
`status` ENUM('active','inactive') NOT NULL DEFAULT 'active',
|
||||||
|
|
||||||
|
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- +migrate Down
|
||||||
|
DROP TABLE `benefactors1`;
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
-- +migrate Up
|
||||||
|
CREATE TABLE `addresses1` (
|
||||||
|
`id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||||
|
`postal_code` VARCHAR(191) NOT NULL,
|
||||||
|
`address` TEXT NOT NULL,
|
||||||
|
`lat` FLOAT,
|
||||||
|
`lon` FLOAT,
|
||||||
|
`name` VARCHAR(191) NOT NULL,
|
||||||
|
`city_id` INT NOT NULL,
|
||||||
|
`province_id` INT NOT NULL,
|
||||||
|
`benefactor_id` INT NOT NULL,
|
||||||
|
|
||||||
|
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
`deleted_at` TIMESTAMP,
|
||||||
|
FOREIGN KEY (`province_id`) REFERENCES `provinces` (`id`),
|
||||||
|
FOREIGN KEY (`city_id`) REFERENCES `cities` (`id`),
|
||||||
|
FOREIGN KEY (`benefactor_id`) REFERENCES `benefactors1` (`id`)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- +migrate Down
|
||||||
|
DROP TABLE `addresses1`;
|
||||||
|
|
@ -2,9 +2,10 @@ package command
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
benefactorapp "git.gocasts.ir/ebhomengo/niki/benefactorapp"
|
"git.gocasts.ir/ebhomengo/niki/benefactorapp"
|
||||||
cfgloader "git.gocasts.ir/ebhomengo/niki/pkg/cfg_loader"
|
cfgloader "git.gocasts.ir/ebhomengo/niki/pkg/cfg_loader"
|
||||||
"git.gocasts.ir/ebhomengo/niki/pkg/database/mysql"
|
"git.gocasts.ir/ebhomengo/niki/pkg/database/mysql"
|
||||||
|
database "git.gocasts.ir/ebhomengo/niki/pkg/database/mysql"
|
||||||
serviceConfigMysql "git.gocasts.ir/ebhomengo/niki/pkg/database/mysql"
|
serviceConfigMysql "git.gocasts.ir/ebhomengo/niki/pkg/database/mysql"
|
||||||
"git.gocasts.ir/ebhomengo/niki/pkg/path"
|
"git.gocasts.ir/ebhomengo/niki/pkg/path"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
@ -30,11 +31,13 @@ func getMysqlConfig() mysql.Config {
|
||||||
Host: cfg.MySQLDB.Host,
|
Host: cfg.MySQLDB.Host,
|
||||||
DBName: cfg.MySQLDB.DBName,
|
DBName: cfg.MySQLDB.DBName,
|
||||||
}
|
}
|
||||||
|
|
||||||
return mysqlConfig
|
return mysqlConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDB() *mysql.DB {
|
func getDB(cfg database.Config) *mysql.DB {
|
||||||
db := serviceConfigMysql.New(getMysqlConfig())
|
|
||||||
|
db := serviceConfigMysql.New(cfg)
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := db.CloseStatements(); err != nil {
|
if err := db.CloseStatements(); err != nil {
|
||||||
fmt.Printf("Error closing statements: %v\n", err)
|
fmt.Printf("Error closing statements: %v\n", err)
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ func serve() {
|
||||||
logger.Init(cfg.Logger)
|
logger.Init(cfg.Logger)
|
||||||
log := logger.L()
|
log := logger.L()
|
||||||
|
|
||||||
db := getDB()
|
db := getDB(cfg.MySQLDB)
|
||||||
migrate()
|
migrate()
|
||||||
|
|
||||||
// Start the server
|
// Start the server
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
FROM golang:1.25-alpine
|
||||||
|
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
http_server:
|
||||||
|
host: ""
|
||||||
|
port: 1308
|
||||||
|
shutdown_context_timeout: 10s
|
||||||
|
cors:
|
||||||
|
allow_origins:
|
||||||
|
- "*"
|
||||||
|
|
||||||
|
logger:
|
||||||
|
level: "debug" # Can be `debug`, `info`, `warn`, `error`
|
||||||
|
file_path: "logs/benefactorapp/service.log"
|
||||||
|
use_local_time: true
|
||||||
|
file_max_size_in_mb: 10
|
||||||
|
file_max_age_in_days: 7
|
||||||
|
|
||||||
|
database_retry:
|
||||||
|
max_retries: 3
|
||||||
|
retry_delay: 100ms
|
||||||
|
|
||||||
|
total_shutdown_timeout: 30m
|
||||||
|
|
||||||
|
path_of_migration: "./benefactorapp/repository/migration"
|
||||||
|
|
||||||
|
mariadb:
|
||||||
|
port: 3306
|
||||||
|
host: localhost
|
||||||
|
db_name: niki_db
|
||||||
|
username: niki
|
||||||
|
password: nikiappt0lk2o20
|
||||||
|
|
||||||
1
go.mod
1
go.mod
|
|
@ -11,6 +11,7 @@ require (
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.2
|
github.com/golang-jwt/jwt/v4 v4.5.2
|
||||||
github.com/kavenegar/kavenegar-go v0.0.0-20240205151018-77039f51467d
|
github.com/kavenegar/kavenegar-go v0.0.0-20240205151018-77039f51467d
|
||||||
github.com/knadh/koanf v1.5.0
|
github.com/knadh/koanf v1.5.0
|
||||||
|
github.com/knadh/koanf/v2 v2.3.0
|
||||||
github.com/labstack/echo-jwt/v4 v4.4.0
|
github.com/labstack/echo-jwt/v4 v4.4.0
|
||||||
github.com/labstack/echo/v4 v4.15.1
|
github.com/labstack/echo/v4 v4.15.1
|
||||||
github.com/ory/dockertest/v3 v3.12.0
|
github.com/ory/dockertest/v3 v3.12.0
|
||||||
|
|
|
||||||
2
go.sum
2
go.sum
|
|
@ -224,6 +224,8 @@ github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBF
|
||||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||||
github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs=
|
github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs=
|
||||||
github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs=
|
github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs=
|
||||||
|
github.com/knadh/koanf/v2 v2.3.0 h1:Qg076dDRFHvqnKG97ZEsi9TAg2/nFTa9hCdcSa1lvlM=
|
||||||
|
github.com/knadh/koanf/v2 v2.3.0/go.mod h1:gRb40VRAbd4iJMYYD5IxZ6hfuopFcXBpc9bbQpZwo28=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"github.com/knadh/koanf/parsers/yaml"
|
"github.com/knadh/koanf/parsers/yaml"
|
||||||
"github.com/knadh/koanf/providers/env"
|
"github.com/knadh/koanf/providers/env"
|
||||||
"github.com/knadh/koanf/providers/file"
|
"github.com/knadh/koanf/providers/file"
|
||||||
"github.com/knadh/koanf/v2"
|
//"github.com/knadh/koanf/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Option struct {
|
type Option struct {
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,10 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
querier "git.gocasts.ir/ebhomengo/niki/pkg/query_transaction/sql"
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
querier "git.gocasts.ir/ebhomengo/niki/pkg/query_transaction/sql"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
production:
|
production:
|
||||||
dialect: mysql
|
dialect: mysql
|
||||||
datasource: niki:nikiappt0lk2o20@(localhost:3306)/niki_db?parseTime=true
|
datasource: niki:nikiappt0lk2o20@(localhost:3306)/niki_db?parseTime=true
|
||||||
dir: repository/mysql/migration
|
dir: pkg/database/mysql/migration
|
||||||
table: gorp_migrations
|
table: gorp_migrations
|
||||||
|
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
package redisotp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (d DB) DeleteCodeByPhoneNumber(ctx context.Context, phoneNumber string) (bool, error) {
|
|
||||||
const op = "redisotp.GetCodeByPhoneNumber"
|
|
||||||
|
|
||||||
success, err := d.adapter.Client().Del(ctx, phoneNumber).Result()
|
|
||||||
if err != nil {
|
|
||||||
return false, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected)
|
|
||||||
}
|
|
||||||
if success != 1 {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
package redisotp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (d DB) IsExistPhoneNumber(ctx context.Context, phoneNumber string) (bool, error) {
|
|
||||||
const op = "redisotp.IsExistPhoneNumber"
|
|
||||||
|
|
||||||
isExist, err := d.adapter.Client().Exists(ctx, phoneNumber).Result()
|
|
||||||
if err != nil {
|
|
||||||
return false, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected)
|
|
||||||
}
|
|
||||||
if isExist == 0 {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
package redisotp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
|
|
||||||
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
|
|
||||||
"github.com/redis/go-redis/v9"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (d DB) GetCodeByPhoneNumber(ctx context.Context, phoneNumber string) (string, error) {
|
|
||||||
const op = "redisotp.GetCodeByPhoneNumber"
|
|
||||||
|
|
||||||
value, err := d.adapter.Client().Get(ctx, phoneNumber).Result()
|
|
||||||
if err != nil {
|
|
||||||
rErr := redis.Nil
|
|
||||||
if errors.As(err, &rErr) {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected)
|
|
||||||
}
|
|
||||||
|
|
||||||
return value, nil
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
package redisotp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (d DB) SaveCodeWithPhoneNumber(ctx context.Context, phoneNumber, code string, expireTime time.Duration) error {
|
|
||||||
const op = "redisotp.SaveCodeWithPhoneNumber"
|
|
||||||
|
|
||||||
err := d.adapter.Client().Set(ctx, phoneNumber, code, expireTime).Err()
|
|
||||||
if err != nil {
|
|
||||||
return richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue