Compare commits

...

2 Commits

Author SHA1 Message Date
daniel.w b8b64302d6 golint 2024-09-05 03:09:48 +08:00
daniel.w 8478442979 add code third party code 2024-08-27 22:24:56 +08:00
17 changed files with 163 additions and 88 deletions

View File

@ -117,6 +117,14 @@ issues:
- gocognit - gocognit
- contextcheck - contextcheck
exclude-dirs:
- internal/model
exclude-files:
- .*_test.go
linters-settings: linters-settings:
gci: gci:
sections: sections:

View File

@ -18,6 +18,7 @@ test: # 進行測試
fmt: # 格式優化 fmt: # 格式優化
$(GOFMT) -w $(GOFILES) $(GOFMT) -w $(GOFILES)
goimports -w ./ goimports -w ./
golangci-lint run
.PHONY: gen-rpc .PHONY: gen-rpc
gen-rpc: # 建立 rpc code gen-rpc: # 建立 rpc code

View File

@ -32,7 +32,7 @@ RUN --mount=type=ssh go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
-ldflags "$FLAG" \ -ldflags "$FLAG" \
-o service -o notification
########## ##########
## FINAL # ## FINAL #
@ -44,4 +44,4 @@ WORKDIR /app
COPY --from=builder /app/service /app/service COPY --from=builder /app/service /app/service
COPY --from=builder /app/etc/service.yaml /app/etc/service.yaml COPY --from=builder /app/etc/service.yaml /app/etc/service.yaml
EXPOSE 8080 EXPOSE 8080
CMD ["/app/service"] CMD ["/app/notification"]

View File

@ -24,10 +24,10 @@ type (
SendMail(ctx context.Context, in *SendMailReq, opts ...grpc.CallOption) (*OKResp, error) SendMail(ctx context.Context, in *SendMailReq, opts ...grpc.CallOption) (*OKResp, error)
// SendSms 寄簡訊 // SendSms 寄簡訊
SendSms(ctx context.Context, in *SendSMSReq, opts ...grpc.CallOption) (*OKResp, error) SendSms(ctx context.Context, in *SendSMSReq, opts ...grpc.CallOption) (*OKResp, error)
// SendMailByTemplateId 寄送模板信件 // SendMailByTemplateID 寄送模板信件
SendMailByTemplateId(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) SendMailByTemplateID(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error)
// SendSmsByTemplateId 寄送模板簡訊 // SendSmsByTemplateID 寄送模板簡訊
SendSmsByTemplateId(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) SendSmsByTemplateID(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error)
} }
defaultSenderService struct { defaultSenderService struct {
@ -53,14 +53,14 @@ func (m *defaultSenderService) SendSms(ctx context.Context, in *SendSMSReq, opts
return client.SendSms(ctx, in, opts...) return client.SendSms(ctx, in, opts...)
} }
// SendMailByTemplateId 寄送模板信件 // SendMailByTemplateID 寄送模板信件
func (m *defaultSenderService) SendMailByTemplateId(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) { func (m *defaultSenderService) SendMailByTemplateID(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) {
client := notification.NewSenderServiceClient(m.cli.Conn()) client := notification.NewSenderServiceClient(m.cli.Conn())
return client.SendMailByTemplateId(ctx, in, opts...) return client.SendMailByTemplateID(ctx, in, opts...)
} }
// SendSmsByTemplateId 寄送模板簡訊 // SendSmsByTemplateID 寄送模板簡訊
func (m *defaultSenderService) SendSmsByTemplateId(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) { func (m *defaultSenderService) SendSmsByTemplateID(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) {
client := notification.NewSenderServiceClient(m.cli.Conn()) client := notification.NewSenderServiceClient(m.cli.Conn())
return client.SendSmsByTemplateId(ctx, in, opts...) return client.SendSmsByTemplateID(ctx, in, opts...)
} }

View File

@ -5,12 +5,12 @@ Etcd:
- 127.0.0.1:2379 - 127.0.0.1:2379
Key: notification.rpc Key: notification.rpc
SMTP: SMTP:
Host: smtp.mailgun.org Host: smtp.mail.host
Port: 25 Port: 25
User: postmaster@abc123@30.com User: smtp@user.net
Password: gg88g88 Password: smtp_password
SMSSender: SMSSender:
User: daniel@30cm.net User: sms@user.net
Password : test123 Password : sms_password

View File

@ -35,10 +35,10 @@ service SenderService {
rpc SendMail(SendMailReq) returns(OKResp); rpc SendMail(SendMailReq) returns(OKResp);
// SendSms // SendSms
rpc SendSms(SendSMSReq) returns(OKResp); rpc SendSms(SendSMSReq) returns(OKResp);
// SendMailByTemplateId // SendMailByTemplateID
rpc SendMailByTemplateId(SendByTemplateIDReq) returns(OKResp); rpc SendMailByTemplateID(SendByTemplateIDReq) returns(OKResp);
// SendSmsByTemplateId // SendSmsByTemplateID
rpc SendSmsByTemplateId(SendByTemplateIDReq) returns(OKResp); rpc SendSmsByTemplateID(SendByTemplateIDReq) returns(OKResp);
} }

2
go.mod
View File

@ -3,7 +3,7 @@ module app-cloudep-notification-service
go 1.22.3 go 1.22.3
require ( require (
code.30cm.net/digimon/library-go/errors v1.0.0 code.30cm.net/digimon/library-go/errs v1.2.3
code.30cm.net/digimon/library-go/validator v1.0.0 code.30cm.net/digimon/library-go/validator v1.0.0
code.30cm.net/digimon/library-go/worker_pool v0.0.0-20240820153352-f9c90a90f5e2 code.30cm.net/digimon/library-go/worker_pool v0.0.0-20240820153352-f9c90a90f5e2
github.com/minchao/go-mitake v1.0.0 github.com/minchao/go-mitake v1.0.0

55
internal/domain/errors.go Normal file
View File

@ -0,0 +1,55 @@
package domain
import (
"strings"
"code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code"
"github.com/zeromicro/go-zero/core/logx"
)
type ErrorCode uint32
func (e ErrorCode) ToUint32() uint32 {
return uint32(e)
}
const (
_ = iota
SendMailErrorCode ErrorCode = iota
SendSMSErrorCode
)
// SendMailError ...
func SendMailError(s ...string) *errs.LibError {
return errs.NewError(code.CloudEPNotification, code.ThirdParty,
SendMailErrorCode.ToUint32(), strings.Join(s, " "))
}
// SendMailErrorL logs error message and returns Err
func SendMailErrorL(l logx.Logger, filed []logx.LogField, s ...string) *errs.LibError {
e := SendMailError(s...)
if filed != nil || len(filed) > 0 {
l.WithCallerSkip(1).WithFields(filed...).Error(e.Error())
}
l.WithCallerSkip(1).Error(e.Error())
return e
}
// SendSMSError ...
func SendSMSError(s ...string) *errs.LibError {
return errs.NewError(code.CloudEPNotification, code.ThirdParty,
SendSMSErrorCode.ToUint32(), strings.Join(s, " "))
}
// SendSMSErrorL logs error message and returns Err
func SendSMSErrorL(l logx.Logger, filed []logx.LogField, s ...string) *errs.LibError {
e := SendSMSError(s...)
if filed != nil || len(filed) > 0 {
l.WithCallerSkip(1).WithFields(filed...).Error(e.Error())
}
l.WithCallerSkip(1).Error(e.Error())
return e
}

View File

@ -0,0 +1,31 @@
package senderservicelogic
import (
"context"
"app-cloudep-notification-service/gen_result/pb/notification"
"app-cloudep-notification-service/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type SendMailByTemplateIDLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewSendMailByTemplateIDLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendMailByTemplateIDLogic {
return &SendMailByTemplateIDLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// SendMailByTemplateID 寄送模板信件
func (l *SendMailByTemplateIDLogic) SendMailByTemplateID(_ *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
// todo: add your logic here and delete this line
return &notification.OKResp{}, nil
}

View File

@ -1,32 +0,0 @@
package senderservicelogic
import (
"app-cloudep-notification-service/gen_result/pb/notification"
"app-cloudep-notification-service/internal/svc"
"context"
"fmt"
ers "code.30cm.net/digimon/library-go/errors"
"github.com/zeromicro/go-zero/core/logx"
)
type SendMailByTemplateIdLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewSendMailByTemplateIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendMailByTemplateIdLogic {
return &SendMailByTemplateIdLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// SendMailByTemplateId 寄送模板信件
func (l *SendMailByTemplateIdLogic) SendMailByTemplateId(in *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
fmt.Println(ers.ResourceNotFound("testing"))
return &notification.OKResp{}, nil
}

View File

@ -1,10 +1,11 @@
package senderservicelogic package senderservicelogic
import ( import (
"app-cloudep-notification-service/internal/domain"
"app-cloudep-notification-service/internal/domain/usecase" "app-cloudep-notification-service/internal/domain/usecase"
"context" "context"
ers "code.30cm.net/digimon/library-go/errors" ers "code.30cm.net/digimon/library-go/errs"
"app-cloudep-notification-service/gen_result/pb/notification" "app-cloudep-notification-service/gen_result/pb/notification"
"app-cloudep-notification-service/internal/svc" "app-cloudep-notification-service/internal/svc"
@ -45,7 +46,7 @@ func (l *SendMailLogic) SendMail(in *notification.SendMailReq) (*notification.OK
Body: in.GetBody(), Body: in.GetBody(),
From: in.GetFrom(), From: in.GetFrom(),
}); err != nil { }); err != nil {
return nil, ers.InvalidFormat(err.Error()) return nil, ers.InvalidFormat("invalid format")
} }
// TODO 以後可以做換線 // TODO 以後可以做換線
@ -56,12 +57,15 @@ func (l *SendMailLogic) SendMail(in *notification.SendMailReq) (*notification.OK
Body: in.GetBody(), Body: in.GetBody(),
}) })
if err != nil { if err != nil {
logx.WithCallerSkip(1).WithFields( return nil, domain.SendMailErrorL(
logx.Field("func", "MailSender.SendMail"), logx.WithContext(l.ctx),
logx.Field("in", in), []logx.LogField{
logx.Field("err", err), logx.Field("func", "MailSender.SendMail"),
).Error(err.Error()) logx.Field("in", in),
return nil, ers.ArkInternal("MailSender.SendMail failed to send mail") logx.Field("err", err),
},
"MailSender.SendMail failed to send mail",
)
} }
return &notification.OKResp{}, nil return &notification.OKResp{}, nil

View File

@ -9,22 +9,22 @@ import (
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
type SendSmsByTemplateIdLogic struct { type SendSmsByTemplateIDLogic struct {
ctx context.Context ctx context.Context
svcCtx *svc.ServiceContext svcCtx *svc.ServiceContext
logx.Logger logx.Logger
} }
func NewSendSmsByTemplateIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendSmsByTemplateIdLogic { func NewSendSmsByTemplateIDLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendSmsByTemplateIDLogic {
return &SendSmsByTemplateIdLogic{ return &SendSmsByTemplateIDLogic{
ctx: ctx, ctx: ctx,
svcCtx: svcCtx, svcCtx: svcCtx,
Logger: logx.WithContext(ctx), Logger: logx.WithContext(ctx),
} }
} }
// SendSMSByTemplateID 寄送模板簡訊 // SendSmsByTemplateID 寄送模板簡訊
func (l *SendSmsByTemplateIdLogic) SendSmsByTemplateId(in *notification.SendByTemplateIDReq) (*notification.OKResp, error) { func (l *SendSmsByTemplateIDLogic) SendSmsByTemplateID(_ *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
// todo: add your logic here and delete this line // todo: add your logic here and delete this line
return &notification.OKResp{}, nil return &notification.OKResp{}, nil

View File

@ -1,10 +1,11 @@
package senderservicelogic package senderservicelogic
import ( import (
"app-cloudep-notification-service/internal/domain"
"app-cloudep-notification-service/internal/domain/usecase" "app-cloudep-notification-service/internal/domain/usecase"
"context" "context"
ers "code.30cm.net/digimon/library-go/errors" "code.30cm.net/digimon/library-go/errs"
"app-cloudep-notification-service/gen_result/pb/notification" "app-cloudep-notification-service/gen_result/pb/notification"
"app-cloudep-notification-service/internal/svc" "app-cloudep-notification-service/internal/svc"
@ -42,7 +43,7 @@ func (l *SendSmsLogic) SendSms(in *notification.SendSMSReq) (*notification.OKRes
Body: in.GetBody(), Body: in.GetBody(),
RecipientAddress: in.GetTo(), RecipientAddress: in.GetTo(),
}); err != nil { }); err != nil {
return nil, ers.InvalidFormat(err.Error()) return nil, errs.InvalidFormat(err.Error())
} }
// TODO 以後可以做換線 // TODO 以後可以做換線
@ -52,12 +53,15 @@ func (l *SendSmsLogic) SendSms(in *notification.SendSMSReq) (*notification.OKRes
Body: in.GetBody(), Body: in.GetBody(),
}) })
if err != nil { if err != nil {
logx.WithCallerSkip(1).WithFields( return nil, domain.SendSMSErrorL(
logx.Field("func", "SMSSender.SendSMS"), logx.WithContext(l.ctx),
logx.Field("in", in), []logx.LogField{
logx.Field("err", err), logx.Field("func", "SMSSender.SendSMS"),
).Error(err.Error()) logx.Field("in", in),
return nil, ers.ArkInternal("SMSSender.SendSMS failed to send sms") logx.Field("err", err),
},
"SMSSender.SendSMS failed to send sms",
)
} }
return &notification.OKResp{}, nil return &notification.OKResp{}, nil

View File

@ -8,7 +8,6 @@ import (
"app-cloudep-notification-service/gen_result/pb/notification" "app-cloudep-notification-service/gen_result/pb/notification"
senderservicelogic "app-cloudep-notification-service/internal/logic/senderservice" senderservicelogic "app-cloudep-notification-service/internal/logic/senderservice"
"app-cloudep-notification-service/internal/svc" "app-cloudep-notification-service/internal/svc"
) )
@ -35,14 +34,14 @@ func (s *SenderServiceServer) SendSms(ctx context.Context, in *notification.Send
return l.SendSms(in) return l.SendSms(in)
} }
// SendMailByTemplateId 寄送模板信件 // SendMailByTemplateID 寄送模板信件
func (s *SenderServiceServer) SendMailByTemplateId(ctx context.Context, in *notification.SendByTemplateIDReq) (*notification.OKResp, error) { func (s *SenderServiceServer) SendMailByTemplateID(ctx context.Context, in *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
l := senderservicelogic.NewSendMailByTemplateIdLogic(ctx, s.svcCtx) l := senderservicelogic.NewSendMailByTemplateIDLogic(ctx, s.svcCtx)
return l.SendMailByTemplateId(in) return l.SendMailByTemplateID(in)
} }
// SendSmsByTemplateId 寄送模板簡訊 // SendSmsByTemplateID 寄送模板簡訊
func (s *SenderServiceServer) SendSmsByTemplateId(ctx context.Context, in *notification.SendByTemplateIDReq) (*notification.OKResp, error) { func (s *SenderServiceServer) SendSmsByTemplateID(ctx context.Context, in *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
l := senderservicelogic.NewSendSmsByTemplateIdLogic(ctx, s.svcCtx) l := senderservicelogic.NewSendSmsByTemplateIDLogic(ctx, s.svcCtx)
return l.SendSmsByTemplateId(in) return l.SendSmsByTemplateID(in)
} }

View File

@ -5,6 +5,9 @@ import (
domainUC "app-cloudep-notification-service/internal/domain/usecase" domainUC "app-cloudep-notification-service/internal/domain/usecase"
"app-cloudep-notification-service/internal/usecase" "app-cloudep-notification-service/internal/usecase"
"code.30cm.net/digimon/library-go/errs"
"code.30cm.net/digimon/library-go/errs/code"
v "code.30cm.net/digimon/library-go/validator" v "code.30cm.net/digimon/library-go/validator"
) )
@ -17,6 +20,8 @@ type ServiceContext struct {
} }
func NewServiceContext(c config.Config) *ServiceContext { func NewServiceContext(c config.Config) *ServiceContext {
errs.Scope = code.CloudEPNotification
return &ServiceContext{ return &ServiceContext{
Config: c, Config: c,
MailSender: usecase.MustMailgunUseCase(usecase.MailUseCaseParam{Conf: c}), MailSender: usecase.MustMailgunUseCase(usecase.MailUseCaseParam{Conf: c}),

View File

@ -26,6 +26,7 @@ func (s *SMSUseCase) SendSMS(_ context.Context, req usecase.SMSReq) error {
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }

View File

@ -1,13 +1,12 @@
package main package main
import ( import (
"flag"
"fmt"
"app-cloudep-notification-service/gen_result/pb/notification" "app-cloudep-notification-service/gen_result/pb/notification"
"app-cloudep-notification-service/internal/config" "app-cloudep-notification-service/internal/config"
senderserviceServer "app-cloudep-notification-service/internal/server/senderservice" senderserviceServer "app-cloudep-notification-service/internal/server/senderservice"
"app-cloudep-notification-service/internal/svc" "app-cloudep-notification-service/internal/svc"
"flag"
"log"
"github.com/zeromicro/go-zero/core/conf" "github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/core/service" "github.com/zeromicro/go-zero/core/service"
@ -34,6 +33,6 @@ func main() {
}) })
defer s.Stop() defer s.Stop()
fmt.Printf("Starting rpc server at %s...\n", c.ListenOn) log.Printf("Starting rpc server at %s...\n", c.ListenOn)
s.Start() s.Start()
} }