Compare commits
2 Commits
main
...
feature/ma
Author | SHA1 | Date |
---|---|---|
daniel.w | b8b64302d6 | |
daniel.w | 8478442979 |
|
@ -117,6 +117,14 @@ issues:
|
|||
- gocognit
|
||||
- contextcheck
|
||||
|
||||
exclude-dirs:
|
||||
- internal/model
|
||||
|
||||
exclude-files:
|
||||
- .*_test.go
|
||||
|
||||
|
||||
|
||||
linters-settings:
|
||||
gci:
|
||||
sections:
|
||||
|
|
1
Makefile
1
Makefile
|
@ -18,6 +18,7 @@ test: # 進行測試
|
|||
fmt: # 格式優化
|
||||
$(GOFMT) -w $(GOFILES)
|
||||
goimports -w ./
|
||||
golangci-lint run
|
||||
|
||||
.PHONY: gen-rpc
|
||||
gen-rpc: # 建立 rpc code
|
||||
|
|
90
README.md
90
README.md
|
@ -1,90 +0,0 @@
|
|||
# 專案說明
|
||||
|
||||
通知服務
|
||||
|
||||
# 專案架構
|
||||
|
||||
```
|
||||
$tree -L 3 --gitignore
|
||||
|
||||
.
|
||||
├── Makefile
|
||||
├── build
|
||||
│ └── Dockerfile
|
||||
├── chart
|
||||
│ └── readme.md
|
||||
├── etc
|
||||
│ └── service.example.yaml # 設定檔範例
|
||||
├── generate # 這個資料夾會用來自動生成一些程式
|
||||
│ ├── database ## 資料庫生成檔案或紀錄遷移版本
|
||||
│ │ ├── mongodb
|
||||
│ │ ├── mysql
|
||||
│ │ ├── readme.md
|
||||
│ │ └── seeder
|
||||
│ └── protobuf ## gRPC 的定義,用來生成 gRPC 檔案
|
||||
│ └── notification.proto
|
||||
├── go.mod
|
||||
├── internal
|
||||
│ ├── config # 設定的結構
|
||||
│ │ └── config.go
|
||||
│ ├── domain # 此服務下的一些常數定義
|
||||
│ │ ├── errors.go ## 錯誤定義
|
||||
│ │ └── usecase ## usecase 內的常數定義
|
||||
│ │ ├── mail.go
|
||||
│ │ └── sms.go
|
||||
│ ├── logic # 主要的程式邏輯都在這,每個功能用一個資料夾開發
|
||||
│ │ └── senderservice
|
||||
│ ├── server
|
||||
│ │ └── senderservice # gRPC 自動產生的檔案
|
||||
│ ├── svc # 此服務下會共用的功能,例如 API context, db 連線等
|
||||
│ │ └── service_context.go ## API context
|
||||
│ └── usecase
|
||||
│ ├── mitake.go
|
||||
│ └── smtp.go
|
||||
└── notification.go # 服務主入口
|
||||
```
|
||||
|
||||
# 啟動說明
|
||||
|
||||
此文件會介紹以下兩種啟動方式:
|
||||
|
||||
1. Docker 啟動 (Production 時使用)
|
||||
2. 本地端 go compiler 啟動 (開發、測試時使用)
|
||||
|
||||
## Docker 啟動 (Production)
|
||||
|
||||
```bash
|
||||
make build-docker
|
||||
make run-docker
|
||||
```
|
||||
|
||||
## 本地端啟動(測試用)
|
||||
|
||||
```bash
|
||||
go mod tidy
|
||||
# 進入 etc/notification.yml 設定各依賴的 config
|
||||
go run notification.go
|
||||
```
|
||||
|
||||
### 本地啟動需要依賴套件或工具
|
||||
|
||||
以下已 macOS 為例,若已安裝或有其他可用服務則可跳過
|
||||
|
||||
- go-zero goctl (https://go-zero.dev/docs/tasks/installation/goctl)
|
||||
```bash
|
||||
$ go install github.com/zeromicro/go-zero/tools/goctl@latest
|
||||
```
|
||||
- protobuf (https://protobuf.dev/)
|
||||
```bash
|
||||
brew install protobuf
|
||||
```
|
||||
- etcd (https://etcd.io/)
|
||||
```bash
|
||||
brew install etcd
|
||||
brew services start etcd
|
||||
```
|
||||
- SMTP 服務(以 mailhog 為例) (https://github.com/mailhog/MailHog)
|
||||
```bash
|
||||
brew install mailhog
|
||||
brew services start mailhog
|
||||
```
|
|
@ -24,10 +24,10 @@ type (
|
|||
SendMail(ctx context.Context, in *SendMailReq, opts ...grpc.CallOption) (*OKResp, error)
|
||||
// SendSms 寄簡訊
|
||||
SendSms(ctx context.Context, in *SendSMSReq, opts ...grpc.CallOption) (*OKResp, error)
|
||||
// SendMailByTemplateId 寄送模板信件
|
||||
SendMailByTemplateId(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error)
|
||||
// SendSmsByTemplateId 寄送模板簡訊
|
||||
SendSmsByTemplateId(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error)
|
||||
// SendMailByTemplateID 寄送模板信件
|
||||
SendMailByTemplateID(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error)
|
||||
// SendSmsByTemplateID 寄送模板簡訊
|
||||
SendSmsByTemplateID(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error)
|
||||
}
|
||||
|
||||
defaultSenderService struct {
|
||||
|
@ -53,14 +53,14 @@ func (m *defaultSenderService) SendSms(ctx context.Context, in *SendSMSReq, opts
|
|||
return client.SendSms(ctx, in, opts...)
|
||||
}
|
||||
|
||||
// SendMailByTemplateId 寄送模板信件
|
||||
func (m *defaultSenderService) SendMailByTemplateId(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) {
|
||||
// SendMailByTemplateID 寄送模板信件
|
||||
func (m *defaultSenderService) SendMailByTemplateID(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) {
|
||||
client := notification.NewSenderServiceClient(m.cli.Conn())
|
||||
return client.SendMailByTemplateId(ctx, in, opts...)
|
||||
return client.SendMailByTemplateID(ctx, in, opts...)
|
||||
}
|
||||
|
||||
// SendSmsByTemplateId 寄送模板簡訊
|
||||
func (m *defaultSenderService) SendSmsByTemplateId(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) {
|
||||
// SendSmsByTemplateID 寄送模板簡訊
|
||||
func (m *defaultSenderService) SendSmsByTemplateID(ctx context.Context, in *SendByTemplateIDReq, opts ...grpc.CallOption) (*OKResp, error) {
|
||||
client := notification.NewSenderServiceClient(m.cli.Conn())
|
||||
return client.SendSmsByTemplateId(ctx, in, opts...)
|
||||
return client.SendSmsByTemplateID(ctx, in, opts...)
|
||||
}
|
||||
|
|
|
@ -35,10 +35,10 @@ service SenderService {
|
|||
rpc SendMail(SendMailReq) returns(OKResp);
|
||||
// SendSms 寄簡訊
|
||||
rpc SendSms(SendSMSReq) returns(OKResp);
|
||||
// SendMailByTemplateId 寄送模板信件
|
||||
rpc SendMailByTemplateId(SendByTemplateIDReq) returns(OKResp);
|
||||
// SendSmsByTemplateId 寄送模板簡訊
|
||||
rpc SendSmsByTemplateId(SendByTemplateIDReq) returns(OKResp);
|
||||
// SendMailByTemplateID 寄送模板信件
|
||||
rpc SendMailByTemplateID(SendByTemplateIDReq) returns(OKResp);
|
||||
// SendSmsByTemplateID 寄送模板簡訊
|
||||
rpc SendSmsByTemplateID(SendByTemplateIDReq) returns(OKResp);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package domain
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"code.30cm.net/digimon/library-go/errs"
|
||||
|
@ -24,14 +23,13 @@ const (
|
|||
// SendMailError ...
|
||||
func SendMailError(s ...string) *errs.LibError {
|
||||
return errs.NewError(code.CloudEPNotification, code.ThirdParty,
|
||||
SendMailErrorCode.ToUint32(),
|
||||
fmt.Sprintf("%s", strings.Join(s, " ")))
|
||||
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 {
|
||||
if filed != nil || len(filed) > 0 {
|
||||
l.WithCallerSkip(1).WithFields(filed...).Error(e.Error())
|
||||
}
|
||||
l.WithCallerSkip(1).Error(e.Error())
|
||||
|
@ -42,14 +40,13 @@ func SendMailErrorL(l logx.Logger, filed []logx.LogField, s ...string) *errs.Lib
|
|||
// SendSMSError ...
|
||||
func SendSMSError(s ...string) *errs.LibError {
|
||||
return errs.NewError(code.CloudEPNotification, code.ThirdParty,
|
||||
SendSMSErrorCode.ToUint32(),
|
||||
fmt.Sprintf("%s", strings.Join(s, " ")))
|
||||
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 {
|
||||
if filed != nil || len(filed) > 0 {
|
||||
l.WithCallerSkip(1).WithFields(filed...).Error(e.Error())
|
||||
}
|
||||
l.WithCallerSkip(1).Error(e.Error())
|
||||
|
|
|
@ -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 ¬ification.OKResp{}, nil
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
package senderservicelogic
|
||||
|
||||
import (
|
||||
"app-cloudep-notification-service/gen_result/pb/notification"
|
||||
"app-cloudep-notification-service/internal/svc"
|
||||
"context"
|
||||
|
||||
"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) {
|
||||
|
||||
return ¬ification.OKResp{}, nil
|
||||
}
|
|
@ -9,22 +9,22 @@ import (
|
|||
"github.com/zeromicro/go-zero/core/logx"
|
||||
)
|
||||
|
||||
type SendSmsByTemplateIdLogic struct {
|
||||
type SendSmsByTemplateIDLogic struct {
|
||||
ctx context.Context
|
||||
svcCtx *svc.ServiceContext
|
||||
logx.Logger
|
||||
}
|
||||
|
||||
func NewSendSmsByTemplateIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendSmsByTemplateIdLogic {
|
||||
return &SendSmsByTemplateIdLogic{
|
||||
func NewSendSmsByTemplateIDLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendSmsByTemplateIDLogic {
|
||||
return &SendSmsByTemplateIDLogic{
|
||||
ctx: ctx,
|
||||
svcCtx: svcCtx,
|
||||
Logger: logx.WithContext(ctx),
|
||||
}
|
||||
}
|
||||
|
||||
// SendSmsByTemplateId 寄送模板簡訊
|
||||
func (l *SendSmsByTemplateIdLogic) SendSmsByTemplateId(in *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
|
||||
// SendSmsByTemplateID 寄送模板簡訊
|
||||
func (l *SendSmsByTemplateIDLogic) SendSmsByTemplateID(_ *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
|
||||
// todo: add your logic here and delete this line
|
||||
|
||||
return ¬ification.OKResp{}, nil
|
|
@ -8,7 +8,6 @@ import (
|
|||
|
||||
"app-cloudep-notification-service/gen_result/pb/notification"
|
||||
senderservicelogic "app-cloudep-notification-service/internal/logic/senderservice"
|
||||
|
||||
"app-cloudep-notification-service/internal/svc"
|
||||
)
|
||||
|
||||
|
@ -35,14 +34,14 @@ func (s *SenderServiceServer) SendSms(ctx context.Context, in *notification.Send
|
|||
return l.SendSms(in)
|
||||
}
|
||||
|
||||
// SendMailByTemplateId 寄送模板信件
|
||||
func (s *SenderServiceServer) SendMailByTemplateId(ctx context.Context, in *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
|
||||
l := senderservicelogic.NewSendMailByTemplateIdLogic(ctx, s.svcCtx)
|
||||
return l.SendMailByTemplateId(in)
|
||||
// SendMailByTemplateID 寄送模板信件
|
||||
func (s *SenderServiceServer) SendMailByTemplateID(ctx context.Context, in *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
|
||||
l := senderservicelogic.NewSendMailByTemplateIDLogic(ctx, s.svcCtx)
|
||||
return l.SendMailByTemplateID(in)
|
||||
}
|
||||
|
||||
// SendSmsByTemplateId 寄送模板簡訊
|
||||
func (s *SenderServiceServer) SendSmsByTemplateId(ctx context.Context, in *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
|
||||
l := senderservicelogic.NewSendSmsByTemplateIdLogic(ctx, s.svcCtx)
|
||||
return l.SendSmsByTemplateId(in)
|
||||
// SendSmsByTemplateID 寄送模板簡訊
|
||||
func (s *SenderServiceServer) SendSmsByTemplateID(ctx context.Context, in *notification.SendByTemplateIDReq) (*notification.OKResp, error) {
|
||||
l := senderservicelogic.NewSendSmsByTemplateIDLogic(ctx, s.svcCtx)
|
||||
return l.SendSmsByTemplateID(in)
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ type ServiceContext struct {
|
|||
|
||||
func NewServiceContext(c config.Config) *ServiceContext {
|
||||
errs.Scope = code.CloudEPNotification
|
||||
|
||||
return &ServiceContext{
|
||||
Config: c,
|
||||
MailSender: usecase.MustMailgunUseCase(usecase.MailUseCaseParam{Conf: c}),
|
||||
|
|
|
@ -26,6 +26,7 @@ func (s *SMSUseCase) SendSMS(_ context.Context, req usecase.SMSReq) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
|
||||
"app-cloudep-notification-service/gen_result/pb/notification"
|
||||
"app-cloudep-notification-service/internal/config"
|
||||
senderserviceServer "app-cloudep-notification-service/internal/server/senderservice"
|
||||
"app-cloudep-notification-service/internal/svc"
|
||||
"flag"
|
||||
"log"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/conf"
|
||||
"github.com/zeromicro/go-zero/core/service"
|
||||
|
@ -34,6 +33,6 @@ func main() {
|
|||
})
|
||||
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()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue