forked from ebhomengo/niki
1
0
Fork 0

feat(niki): partially implemented kind box req accepted notification

This commit is contained in:
Ruhollah 2024-07-27 19:47:13 +03:30 committed by Iman Mirazimi
parent 7cfd9b31e0
commit feee5c43ff
15 changed files with 125 additions and 15 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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),
}

View File

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

View File

@ -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()
}

View File

@ -0,0 +1,10 @@
package adminbenefactoreparam
import "git.gocasts.ir/ebhomengo/niki/entity"
type GetBenefactorByIDRequest struct {
BenefactorID uint
}
type GetBenefactorByIDResponse struct {
entity.Benefactor
}

5
param/notification.go Normal file
View File

@ -0,0 +1,5 @@
package param
type NotificationKindBoxReqAccepted struct {
KindBoxReqID uint
}

5
pkg/sms_msg/message.go Normal file
View File

@ -0,0 +1,5 @@
package smsmsg
const (
SmsMsgKindBoxReqAccepted = "%s عزیز درخواست قلک شما پذیرفته شد"
)

View File

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

View File

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

View File

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

View File

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

View File

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