forked from ebhomengo/niki
				
			feat(niki): partially implemented kind box req accepted notification
This commit is contained in:
		
							parent
							
								
									7cfd9b31e0
								
							
						
					
					
						commit
						feee5c43ff
					
				| 
						 | 
				
			
			@ -6,6 +6,6 @@ type Adapter struct {
 | 
			
		|||
	adapter *kavenegar.Adapter
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func New(adapter *kavenegar.Adapter) Adapter {
 | 
			
		||||
	return Adapter{adapter: adapter}
 | 
			
		||||
func New(adapter *kavenegar.Adapter) *Adapter {
 | 
			
		||||
	return &Adapter{adapter: adapter}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ benefactor_service:
 | 
			
		|||
  length_of_otp_code: 5
 | 
			
		||||
 | 
			
		||||
kavenegar_sms_provider:
 | 
			
		||||
  api_key: insert_your_api_key
 | 
			
		||||
  api_key: 68556765576F785033342F774C336A7A5A574C7863497457706656364B6848534E63373661736A676B65553D
 | 
			
		||||
  sender: ""
 | 
			
		||||
  otp_template_new_user: ebhomeverify
 | 
			
		||||
  otp_template_registered_user: ebhomeverify
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@ import (
 | 
			
		|||
	"net/http"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	params "git.gocasts.ir/ebhomengo/niki/param"
 | 
			
		||||
	param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req"
 | 
			
		||||
	errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
 | 
			
		||||
	httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg"
 | 
			
		||||
| 
						 | 
				
			
			@ -46,6 +47,6 @@ func (h Handler) Accept(c echo.Context) error {
 | 
			
		|||
 | 
			
		||||
		return echo.NewHTTPError(code, msg)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	go h.notificationSvc.KindBoxReqAccepted(params.NotificationKindBoxReqAccepted{KindBoxReqID: req.ID})
 | 
			
		||||
	return c.JSON(http.StatusOK, resp)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@ import (
 | 
			
		|||
	adminauthorizationservice "git.gocasts.ir/ebhomengo/niki/service/admin/authorization"
 | 
			
		||||
	adminkindboxreqservice "git.gocasts.ir/ebhomengo/niki/service/admin/kind_box_req"
 | 
			
		||||
	authservice "git.gocasts.ir/ebhomengo/niki/service/auth"
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/service/notification"
 | 
			
		||||
	adminkindboxreqvalidator "git.gocasts.ir/ebhomengo/niki/validator/admin/kind_box_req"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -13,11 +14,12 @@ type Handler struct {
 | 
			
		|||
	adminKindBoxReqSvc adminkindboxreqservice.Service
 | 
			
		||||
	adminKindBoxReqVld adminkindboxreqvalidator.Validator
 | 
			
		||||
	adminAuthorizeSvc  adminauthorizationservice.Service
 | 
			
		||||
	notificationSvc    notification.Service
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func New(authConfig authservice.Config, authSvc authservice.Service,
 | 
			
		||||
	adminKindBoxReqSvc adminkindboxreqservice.Service, adminKindBoxReqVld adminkindboxreqvalidator.Validator,
 | 
			
		||||
	adminAuthorizeSvc adminauthorizationservice.Service,
 | 
			
		||||
	adminAuthorizeSvc adminauthorizationservice.Service, notificationSvc notification.Service,
 | 
			
		||||
) Handler {
 | 
			
		||||
	return Handler{
 | 
			
		||||
		authConfig:         authConfig,
 | 
			
		||||
| 
						 | 
				
			
			@ -25,5 +27,6 @@ func New(authConfig authservice.Config, authSvc authservice.Service,
 | 
			
		|||
		adminKindBoxReqSvc: adminKindBoxReqSvc,
 | 
			
		||||
		adminKindBoxReqVld: adminKindBoxReqVld,
 | 
			
		||||
		adminAuthorizeSvc:  adminAuthorizeSvc,
 | 
			
		||||
		notificationSvc:    notificationSvc,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@ package httpserver
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/service/notification"
 | 
			
		||||
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/config"
 | 
			
		||||
	adminhandler "git.gocasts.ir/ebhomengo/niki/delivery/http_server/admin/admin"
 | 
			
		||||
| 
						 | 
				
			
			@ -70,6 +71,7 @@ func New(
 | 
			
		|||
	adminKindBoxVld adminkindboxvalidator.Validator,
 | 
			
		||||
	agentKindBoxSvc agentkindboxservice.Service,
 | 
			
		||||
	agentKindBoxVld agentkindboxvalidator.Validator,
 | 
			
		||||
	notificationSvc notification.Service,
 | 
			
		||||
) Server {
 | 
			
		||||
	return Server{
 | 
			
		||||
		Router:                      echo.New(),
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +81,7 @@ func New(
 | 
			
		|||
		benefactorAddressHandler:    benefactoraddresshandler.New(cfg.Auth, benefactorAuthSvc, benefactorAddressSvc, benefactorAddressVld),
 | 
			
		||||
		benefactorKindBoxHandler:    benefactorkindboxhandler.New(cfg.Auth, benefactorAuthSvc, benefactorKindBoxSvc, benefactorKindBoxVld),
 | 
			
		||||
		adminHandler:                adminhandler.New(cfg.AdminAuth, adminAuthSvc, adminSvc, adminVld, adminAuthorizeSvc),
 | 
			
		||||
		adminKindBoxReqHandler:      adminkindboxreqhandler.New(cfg.Auth, adminAuthSvc, adminKinBoxReqSvc, adminKinBoxReqVld, adminAuthorizeSvc),
 | 
			
		||||
		adminKindBoxReqHandler:      adminkindboxreqhandler.New(cfg.Auth, adminAuthSvc, adminKinBoxReqSvc, adminKinBoxReqVld, adminAuthorizeSvc, notificationSvc),
 | 
			
		||||
		adminKindBoxHandler:         adminKindBoxHandler.New(cfg.Auth, adminAuthSvc, adminKindBoxSvc, adminKindBoxVld, adminAuthorizeSvc),
 | 
			
		||||
		agentKindBoxHandler:         agentkindboxhandler.New(cfg.AdminAuth, adminAuthSvc, agentKindBoxSvc, agentKindBoxVld, adminAuthorizeSvc),
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ package initial
 | 
			
		|||
import (
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/adapter/redis"
 | 
			
		||||
	smsprovider "git.gocasts.ir/ebhomengo/niki/adapter/sms_provider/kavenegar"
 | 
			
		||||
	kavenegarnotification "git.gocasts.ir/ebhomengo/niki/adapter/sms_provider/kavenegar/notification"
 | 
			
		||||
	kavenegarotp "git.gocasts.ir/ebhomengo/niki/adapter/sms_provider/kavenegar/otp"
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/config"
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/repository/mysql"
 | 
			
		||||
| 
						 | 
				
			
			@ -21,6 +22,7 @@ import (
 | 
			
		|||
	benefactorservice "git.gocasts.ir/ebhomengo/niki/service/benefactor/benefactor"
 | 
			
		||||
	benefactorkindboxservice "git.gocasts.ir/ebhomengo/niki/service/benefactor/kind_box"
 | 
			
		||||
	benefactorkindboxreqservice "git.gocasts.ir/ebhomengo/niki/service/benefactor/kind_box_req"
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/service/notification"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Services struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -33,11 +35,15 @@ type Services struct {
 | 
			
		|||
	AdminSvc                adminservice.Service
 | 
			
		||||
	AdminKindBoxReqSvc      adminkindboxreqservice.Service
 | 
			
		||||
	AdminReferTimeSvc       adminrefertimeservice.Service
 | 
			
		||||
	NotificationSvc         notification.Service
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func initSms(cfg config.Config) *kavenegarotp.Adapter {
 | 
			
		||||
func initSmsOtp(cfg config.Config) *kavenegarotp.Adapter {
 | 
			
		||||
	return kavenegarotp.New(smsprovider.New(cfg.KavenegarSmsProvider))
 | 
			
		||||
}
 | 
			
		||||
func initSmsNotification(cfg config.Config) *kavenegarnotification.Adapter {
 | 
			
		||||
	return kavenegarnotification.New(smsprovider.New(cfg.KavenegarSmsProvider))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InitAdminService(cfg config.Config, db *mysql.DB) adminservice.Service {
 | 
			
		||||
	return adminservice.New(InitAdminMysql(db), InitAdminAuthService(cfg))
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +57,7 @@ func InitBenefactorService(cfg config.Config, redisAdapter redis.Adapter, db *my
 | 
			
		|||
	return benefactorservice.New(
 | 
			
		||||
		cfg.BenefactorSvc,
 | 
			
		||||
		redisotp.New(redisAdapter),
 | 
			
		||||
		initSms(cfg),
 | 
			
		||||
		initSmsOtp(cfg),
 | 
			
		||||
		InitBenefactorAuthService(cfg),
 | 
			
		||||
		mysqlbenefactor.New(db),
 | 
			
		||||
	)
 | 
			
		||||
| 
						 | 
				
			
			@ -86,3 +92,7 @@ func InitAdminReferTimeService(db *mysql.DB) adminrefertimeservice.Service {
 | 
			
		|||
func InitBenefactorKindBoxService(db *mysql.DB) benefactorkindboxservice.Service {
 | 
			
		||||
	return benefactorkindboxservice.New(mysqlkindbox.New(db))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InitNotificationService(cfg config.Config, db *mysql.DB) notification.Service {
 | 
			
		||||
	return notification.New(initSmsNotification(cfg), InitAdminKindBoxReqService(db), InitBenefactorForAdminService(db))
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										8
									
								
								main.go
								
								
								
								
							
							
						
						
									
										8
									
								
								main.go
								
								
								
								
							| 
						 | 
				
			
			@ -3,8 +3,9 @@ package main
 | 
			
		|||
import (
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/adapter/redis"
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/adapter/sms_provider/kavenegar"
 | 
			
		||||
	kavenegarnotification "git.gocasts.ir/ebhomengo/niki/adapter/sms_provider/kavenegar/notification"
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/config"
 | 
			
		||||
	httpserver "git.gocasts.ir/ebhomengo/niki/delivery/http_server"
 | 
			
		||||
	"git.gocasts.ir/ebhomengo/niki/internal/initial"
 | 
			
		||||
| 
						 | 
				
			
			@ -40,6 +41,8 @@ func main() {
 | 
			
		|||
	migrate := parseFlags()
 | 
			
		||||
 | 
			
		||||
	cfg := config.C()
 | 
			
		||||
	sms := kavenegarnotification.New(kavenegar.New(cfg.KavenegarSmsProvider))
 | 
			
		||||
	sms.Send("09915436059", "salam")
 | 
			
		||||
	db := initDatabase(cfg, migrate)
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if err := db.CloseStatements(); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -85,6 +88,7 @@ func initDependencies(cfg config.Config, redisAdapter redis.Adapter, db *mysql.D
 | 
			
		|||
			AdminKindBoxReqSvc:      initial.InitAdminKindBoxReqService(db),
 | 
			
		||||
			AdminSvc:                initial.InitAdminService(cfg, db),
 | 
			
		||||
			AdminReferTimeSvc:       initial.InitAdminReferTimeService(db),
 | 
			
		||||
			NotificationSvc:         initial.InitNotificationService(cfg, db),
 | 
			
		||||
		},
 | 
			
		||||
		initial.AdminAuthorization{
 | 
			
		||||
			AdminAuthorizationSvc: initial.InitAdminAuthorizationService(db),
 | 
			
		||||
| 
						 | 
				
			
			@ -101,7 +105,7 @@ func initAndRunServer(cfg config.Config, dependencies *Dependencies) {
 | 
			
		|||
		dependencies.AdminSvc, dependencies.AdminVld, dependencies.AdminAuthSvc,
 | 
			
		||||
		dependencies.AdminKindBoxReqSvc, dependencies.AdminKindBoxReqVld, dependencies.AdminAuthorizationSvc,
 | 
			
		||||
		dependencies.AdminKindBoxSvc, dependencies.AdminKindBoxVld,
 | 
			
		||||
		dependencies.AgentKindBoxSvc, dependencies.AgentKindBoxVld)
 | 
			
		||||
		dependencies.AgentKindBoxSvc, dependencies.AgentKindBoxVld, dependencies.NotificationSvc)
 | 
			
		||||
 | 
			
		||||
	server.Serve()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
package adminbenefactoreparam
 | 
			
		||||
 | 
			
		||||
import "git.gocasts.ir/ebhomengo/niki/entity"
 | 
			
		||||
 | 
			
		||||
type GetBenefactorByIDRequest struct {
 | 
			
		||||
	BenefactorID uint
 | 
			
		||||
}
 | 
			
		||||
type GetBenefactorByIDResponse struct {
 | 
			
		||||
	entity.Benefactor
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
package param
 | 
			
		||||
 | 
			
		||||
type NotificationKindBoxReqAccepted struct {
 | 
			
		||||
	KindBoxReqID uint
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
package smsmsg
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	SmsMsgKindBoxReqAccepted = "%s عزیز درخواست قلک شما پذیرفته شد"
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -105,3 +105,25 @@ func mapNotNullToBenefactor(data nullableFields, benefactor *entity.Benefactor)
 | 
			
		|||
		benefactor.BirthDate = data.birthdate.Time
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *DB) GetByID(ctx context.Context, benefactorID uint) (entity.Benefactor, error) {
 | 
			
		||||
	const op = "mysqlbenefactor.IsExistBenefactorByID"
 | 
			
		||||
 | 
			
		||||
	row := d.conn.Conn().QueryRowContext(ctx, `select * from benefactors where id = ?`, benefactorID)
 | 
			
		||||
 | 
			
		||||
	bnf, err := scanBenefactor(row)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		sErr := sql.ErrNoRows
 | 
			
		||||
		//TODO-errorsas: second argument to errors.As should not be *error
 | 
			
		||||
		//nolint
 | 
			
		||||
		if errors.As(err, &sErr) {
 | 
			
		||||
			return bnf, nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// TODO - log unexpected error for better observability
 | 
			
		||||
		return bnf, richerror.New(op).WithErr(err).
 | 
			
		||||
			WithMessage(errmsg.ErrorMsgCantScanQueryResult).WithKind(richerror.KindUnexpected)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return bnf, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,11 +2,21 @@ package benefactor
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	param "git.gocasts.ir/ebhomengo/niki/param/admin/admin"
 | 
			
		||||
	params "git.gocasts.ir/ebhomengo/niki/param/admin/benefactor"
 | 
			
		||||
 | 
			
		||||
	richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (s Service) GetByID(ctx context.Context, req params.GetBenefactorByIDRequest) (params.GetBenefactorByIDResponse, error) {
 | 
			
		||||
	const op = "benefactorservice.Get"
 | 
			
		||||
	bnf, gErr := s.repo.GetByID(ctx, req.BenefactorID)
 | 
			
		||||
	if gErr != nil {
 | 
			
		||||
		return params.GetBenefactorByIDResponse{}, richerror.New(op).WithErr(gErr)
 | 
			
		||||
	}
 | 
			
		||||
	return params.GetBenefactorByIDResponse{bnf}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s Service) BenefactorExistByID(ctx context.Context, req param.BenefactorExistByIDRequest) (param.BenefactorExistByIDResponse, error) {
 | 
			
		||||
	const op = "adminservice.BenefactorExistByID"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
type Repository interface {
 | 
			
		||||
	GetByID(ctx context.Context, benefactorID uint) (entity.Benefactor, error)
 | 
			
		||||
	IsExistBenefactorByID(ctx context.Context, id uint) (bool, error)
 | 
			
		||||
	GetAddressByID(ctx context.Context, id uint) (*entity.Address, error)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
package notification
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	params "git.gocasts.ir/ebhomengo/niki/param"
 | 
			
		||||
	bnfparam "git.gocasts.ir/ebhomengo/niki/param/admin/benefactor"
 | 
			
		||||
	kbparam "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req"
 | 
			
		||||
	smsmsg "git.gocasts.ir/ebhomengo/niki/pkg/sms_msg"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (s Service) KindBoxReqAccepted(req params.NotificationKindBoxReqAccepted) {
 | 
			
		||||
	ctx := context.Background()
 | 
			
		||||
	kb, _ := s.KindBoxReqSvc.Get(ctx, kbparam.GetKindBoxReqRequest{
 | 
			
		||||
		KindBoxID: req.KindBoxReqID,
 | 
			
		||||
	})
 | 
			
		||||
	bnf, _ := s.BenefactorSvc.GetByID(ctx, bnfparam.GetBenefactorByIDRequest{BenefactorID: kb.BenefactorID})
 | 
			
		||||
	s.smsAdapter.Send(bnf.PhoneNumber, fmt.Sprintf(smsmsg.SmsMsgKindBoxReqAccepted, bnf.FirstName))
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,15 +1,33 @@
 | 
			
		|||
package notification
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	params "git.gocasts.ir/ebhomengo/niki/param/admin/benefactor"
 | 
			
		||||
	param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SmsAdapter interface {
 | 
			
		||||
	Send(phoneNumber string, message string)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Service struct {
 | 
			
		||||
	smsAdapter SmsAdapter
 | 
			
		||||
type KindBoxReqSvc interface {
 | 
			
		||||
	Get(ctx context.Context, request param.GetKindBoxReqRequest) (param.GetKindBoxReqResponse, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func New(smsAdapter SmsAdapter) Service {
 | 
			
		||||
type BenefactorSvc interface {
 | 
			
		||||
	GetByID(ctx context.Context, req params.GetBenefactorByIDRequest) (params.GetBenefactorByIDResponse, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Service struct {
 | 
			
		||||
	smsAdapter    SmsAdapter
 | 
			
		||||
	KindBoxReqSvc KindBoxReqSvc
 | 
			
		||||
	BenefactorSvc BenefactorSvc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func New(smsAdapter SmsAdapter, kindBoxReqSvc KindBoxReqSvc, benefactorSvc BenefactorSvc) Service {
 | 
			
		||||
	return Service{
 | 
			
		||||
		smsAdapter: smsAdapter,
 | 
			
		||||
		smsAdapter:    smsAdapter,
 | 
			
		||||
		KindBoxReqSvc: kindBoxReqSvc,
 | 
			
		||||
		BenefactorSvc: benefactorSvc,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue