Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions cmd/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"

Expand Down Expand Up @@ -71,7 +70,7 @@ func main() {
go func() {
fmt.Printf("Listening and serving PProf HTTP on %s\n", cfg.PprofPort)
if err := http.ListenAndServe(cfg.PprofPort, http.DefaultServeMux); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen ListenAndServe for PProf, err: %s", err.Error())
panic(fmt.Sprintf("listen ListenAndServe for PProf, err: %+v", err))
}
}()

Expand Down
5 changes: 4 additions & 1 deletion config/dev/database.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ default:
Addr: localhost:3306 # 如果是 docker,可以替换为 对应的服务名称,eg: db:3306
UserName: root
Password: 12345678
ShowLog: true # 是否打印所有SQL日志
MaxIdleConn: 10 # 最大闲置的连接数,0意味着使用默认的大小2, 小于0表示不使用连接池
MaxOpenConn: 60 # 最大打开的连接数, 需要小于数据库配置中的max_connections数
Timeout: 3s # 数据库连接超时时间, 如果是 PostgreSQL 不需要加入单位
ReadTimeout: 3s # 数据库去读超时时间, 0代表不限制,如果是PostgreSQL, 3000代表3s
WriteTimeout: 3s # 数据库写入超时时间, 0代表不限制,如果是PostgreSQL, 不会使用该字段的值
ConnMaxLifeTime: 4h # 单个连接最大存活时间,建议设置比数据库超时时长(wait_timeout)稍小一些
SlowThreshold: 1ms # 慢查询阈值,设置后只打印慢查询日志,默认为200ms
LogLevel: info # 日志级别,info, warn, error, silent
Colorful: true # 是否彩色打印日志
IgnoreRecordNotFoundError: false # 是否忽略 record not found 错误日志
EnableTrace: false # 是否开启 SQL 语句跟踪
4 changes: 2 additions & 2 deletions config/dev/redis.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ default:
Addr: 127.0.0.1:6379
Password: ""
DB: 0
MinIdleConn: 200
MinIdleConn: 10
DialTimeout: 60s
ReadTimeout: 500ms
WriteTimeout: 500ms
PoolSize: 100
PoolSize: 50
PoolTimeout: 240s
EnableTrace: true
4 changes: 4 additions & 0 deletions config/prod/database.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@ default:
WriteTimeout: 3s # 数据库写入超时时间, 0代表不限制,如果是PostgreSQL, 不会使用该字段的值
ConnMaxLifeTime: 4h # 单个连接最大存活时间,建议设置比数据库超时时长(wait_timeout)稍小一些
SlowThreshold: 200ms # 慢查询阈值,设置后只打印慢查询日志,默认为200ms
LogLevel: warn # 日志级别,info, warn, error, silent
Colorful: false # 是否彩色打印日志
IgnoreRecordNotFoundError: false # 是否忽略 record not found 错误日志
EnableTrace: false # 是否开启 SQL 语句跟踪
4 changes: 4 additions & 0 deletions config/test/database.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@ default:
WriteTimeout: 3s # 数据库写入超时时间, 0代表不限制,如果是PostgreSQL, 不会使用该字段的值
ConnMaxLifeTime: 4h # 单个连接最大存活时间,建议设置比数据库超时时长(wait_timeout)稍小一些
SlowThreshold: 1ms # 慢查询阈值,设置后只打印慢查询日志,默认为200ms
LogLevel: info # 日志级别,info, warn, error, silent
Colorful: false # 是否彩色打印日志
IgnoreRecordNotFoundError: false # 是否忽略 record not found 错误日志
EnableTrace: false # 是否开启 SQL 语句跟踪
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.22.3
require (
github.com/envoyproxy/protoc-gen-validate v1.0.2
github.com/gin-gonic/gin v1.9.1
github.com/go-eagle/eagle v1.11.0
github.com/go-eagle/eagle v1.11.1-0.20251027143617-eb478428fa25
github.com/gogo/protobuf v1.3.2
github.com/google/wire v0.5.0
github.com/hibiken/asynq v0.23.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,8 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/
github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-eagle/eagle v1.11.0 h1:cjHgWRQhDHx2DMMI4I+9PunyIWO/UkX9fmL2e4X0/Hc=
github.com/go-eagle/eagle v1.11.0/go.mod h1:1y6DQIUWP3V8aeHKSrqCA/pKpVnmUiVT8HqfLH1uK/k=
github.com/go-eagle/eagle v1.11.1-0.20251027143617-eb478428fa25 h1:B303KziR8rRfmiwNYsm0hcstpnYUjuQSrBg54yLU2YU=
github.com/go-eagle/eagle v1.11.1-0.20251027143617-eb478428fa25/go.mod h1:1y6DQIUWP3V8aeHKSrqCA/pKpVnmUiVT8HqfLH1uK/k=
github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw=
github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw=
github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg=
Expand Down
8 changes: 5 additions & 3 deletions internal/dal/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package dal
import (
"context"

"github.com/go-eagle/eagle-layout/internal/dal/db/dao"
"github.com/go-eagle/eagle/pkg/log"
"github.com/go-eagle/eagle/pkg/storage/orm"
"gorm.io/gorm"

"github.com/go-eagle/eagle-layout/internal/dal/db/dao"
)

var (
Expand All @@ -19,8 +21,8 @@ type DBClient struct {

// Init init db
func Init() (*DBClient, func(), error) {
// new gorm logger writer with custom filename for sql
// orm.LogWriter = orm.NewLogWriter(log.New(log.WithFilename("mysql")))
// new gorm logger writer with custom filename
orm.Logger = log.New(log.WithFilename("mysql"))

// new db
// 支持多个数据库,配置在 config/{env}/database.yaml 中
Expand Down
28 changes: 18 additions & 10 deletions internal/repository/user_repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,19 +78,13 @@ func (r *userRepo) UpdateUser(ctx context.Context, id int64, data model.UserInfo
func (r *userRepo) GetUser(ctx context.Context, id int64) (ret *model.UserInfoModel, err error) {
// get data from local cache
err = r.localCache.Get(ctx, cast.ToString(id), &ret)
if err != nil {
return nil, err
}
if ret != nil && ret.ID > 0 {
if err == nil && ret != nil && ret.ID > 0 {
return ret, nil
}

// read redis cache
ret, err = r.cache.GetUserCache(ctx, id)
if err != nil {
return nil, err
}
if ret != nil && ret.ID > 0 {
if err == nil && ret != nil && ret.ID > 0 {
return ret, nil
}

Expand Down Expand Up @@ -128,7 +122,12 @@ func (r *userRepo) GetUser(ctx context.Context, id int64) (ret *model.UserInfoMo
return nil, err
}

return val.(*model.UserInfoModel), nil
user, ok := val.(*model.UserInfoModel)
if !ok {
return nil, errors.New("[repo] GetUser type assert error")
}

return user, nil
}

// BatchGetUser batch get items
Expand Down Expand Up @@ -170,6 +169,9 @@ func (r *userRepo) BatchGetUsers(ctx context.Context, ids []int64) (ret []*model
func (r *userRepo) GetUserByUsername(ctx context.Context, username string) (ret *model.UserInfoModel, err error) {
ret, err = dao.UserInfoModel.WithContext(ctx).GetUserByUsername(username)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}

Expand All @@ -179,6 +181,9 @@ func (r *userRepo) GetUserByUsername(ctx context.Context, username string) (ret
func (r *userRepo) GetUserByEmail(ctx context.Context, email string) (ret *model.UserInfoModel, err error) {
ret, err = dao.UserInfoModel.WithContext(ctx).GetUserByEmail(email)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}

Expand All @@ -188,7 +193,10 @@ func (r *userRepo) GetUserByEmail(ctx context.Context, email string) (ret *model
func (r *userRepo) GetUserByPhone(ctx context.Context, phone string) (ret *model.UserInfoModel, err error) {
ret, err = dao.UserInfoModel.WithContext(ctx).GetUserByPhone(phone)
if err != nil {
return
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}

return ret, nil
Expand Down
14 changes: 12 additions & 2 deletions internal/service/user_grpc_svc.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/go-eagle/eagle/pkg/app"
"github.com/go-eagle/eagle/pkg/auth"
"github.com/go-eagle/eagle/pkg/errcode"
"github.com/go-eagle/eagle/pkg/log"
)

var (
Expand Down Expand Up @@ -46,7 +47,8 @@ func (s *UserServiceServer) Register(ctx context.Context, req *pb.RegisterReques
}

var userBase *model.UserInfoModel
// check user is existed

// check user is existed by email
userBase, err = s.repo.GetUserByEmail(ctx, req.Email)
if err != nil {
return nil, ecode.ErrInternalError.WithDetails(errcode.NewDetails(map[string]interface{}{
Expand All @@ -56,6 +58,8 @@ func (s *UserServiceServer) Register(ctx context.Context, req *pb.RegisterReques
if userBase != nil && userBase.ID > 0 {
return nil, ecode.ErrUserIsExist.Status(req).Err()
}

// check user is existed by username
userBase, err = s.repo.GetUserByUsername(ctx, req.Username)
if err != nil {
return nil, ecode.ErrInternalError.WithDetails(errcode.NewDetails(map[string]interface{}{
Expand Down Expand Up @@ -120,6 +124,8 @@ func (s *UserServiceServer) Login(ctx context.Context, req *pb.LoginRequest) (*p
user *model.UserInfoModel
err error
)

// try to get user by email first
if req.Email != "" {
user, err = s.repo.GetUserByEmail(ctx, req.Email)
if err != nil {
Expand All @@ -128,6 +134,8 @@ func (s *UserServiceServer) Login(ctx context.Context, req *pb.LoginRequest) (*p
})).Status(req).Err()
}
}

// if not found by email, try username
if user == nil && len(req.Username) > 0 {
user, err = s.repo.GetUserByUsername(ctx, req.Username)
if err != nil {
Expand All @@ -136,6 +144,8 @@ func (s *UserServiceServer) Login(ctx context.Context, req *pb.LoginRequest) (*p
})).Status(req).Err()
}
}

// user not found, return password incorrect error (security best practice)
if user == nil || user.ID == 0 {
return nil, ecode.ErrPasswordIncorrect.Status(req).Err()
}
Expand Down Expand Up @@ -354,7 +364,7 @@ func (s *UserServiceServer) BatchGetUsers(ctx context.Context, req *pb.BatchGetU
}
u, err := convertUser(user)
if err != nil {
// record log
log.Errorf("[BatchGetUsers] convertUser error: %v", err)
continue
}
users = append(users, u)
Expand Down
9 changes: 6 additions & 3 deletions internal/tasks/email_welcome.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,13 @@ type EmailWelcomePayload struct {

// NewEmailWelcomeTask create a task
func NewEmailWelcomeTask(data EmailWelcomePayload) error {
payload, _ := json.Marshal(data)
payload, err := json.Marshal(data)
if err != nil {
return errors.Wrapf(err, "[tasks] Marshal payload error, name: %s", TypeEmailWelcome)
}

task := asynq.NewTask(TypeEmailWelcome, payload)
_, err := GetClient().Enqueue(task)
_, err = GetClient().Enqueue(task)

// // 即时消息
// _, err := GetClient().Enqueue(task)
Expand All @@ -52,7 +55,7 @@ func NewEmailWelcomeTask(data EmailWelcomePayload) error {
return errors.Wrapf(err, "[tasks] Enqueue task error, name: %s", TypeEmailWelcome)
}

return err
return nil
}

//---------------------------------------------------------------
Expand Down
Loading