fix(auth): 修复设备首次登录时空指针崩溃问题
Build docker and publish / build (20.15.1) (push) Failing after 1m21s

在设备不存在分支注册后立即查询设备信息并赋值,避免后续操作解引用空指针
同时增加设备信息空指针保护并完善错误处理
This commit is contained in:
2025-11-16 23:10:35 -08:00
parent 004acd03d2
commit 70561876d6
2 changed files with 91 additions and 3 deletions
+24 -3
View File
@@ -68,6 +68,7 @@ func (l *DeviceLoginLogic) DeviceLogin(req *types.DeviceLoginRequest) (resp *typ
}()
// Check if device exists by identifier
createdNewDevice := false
deviceInfo, err := l.svcCtx.UserModel.FindOneDeviceByIdentifier(l.ctx, req.Identifier)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
@@ -76,6 +77,7 @@ func (l *DeviceLoginLogic) DeviceLogin(req *types.DeviceLoginRequest) (resp *typ
if err != nil {
return nil, err
}
createdNewDevice = true
} else {
l.Errorw("query device failed",
logger.Field("identifier", req.Identifier),
@@ -95,9 +97,28 @@ func (l *DeviceLoginLogic) DeviceLogin(req *types.DeviceLoginRequest) (resp *typ
}
}
// 根据 req 中的UA 更新UA
deviceInfo.UserAgent = req.UserAgent
_ = l.svcCtx.UserModel.UpdateDevice(l.ctx, deviceInfo)
if createdNewDevice {
deviceInfo, err = l.svcCtx.UserModel.FindOneDeviceByIdentifier(l.ctx, req.Identifier)
if err != nil {
l.Errorw("query device after register failed",
logger.Field("identifier", req.Identifier),
logger.Field("error", err.Error()),
)
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query device after register failed: %v", err.Error())
}
}
if deviceInfo != nil {
deviceInfo.UserAgent = req.UserAgent
if err := l.svcCtx.UserModel.UpdateDevice(l.ctx, deviceInfo); err != nil {
l.Errorw("update device failed",
logger.Field("user_id", userInfo.Id),
logger.Field("identifier", req.Identifier),
logger.Field("error", err.Error()),
)
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "update device failed: %v", err.Error())
}
}
// Generate session id
sessionId := uuidx.NewUUID().String()