From 09611857c9c4853fb520cbc3cf2b4dbe2b542c00 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 3 Jan 2024 00:54:15 +0800 Subject: [PATCH] feat: user: allow to query profile and create if not exists (transaction) --- internal/service/user/profile.go | 19 +++++++++++++++++++ internal/service/user/service.go | 1 + 2 files changed, 20 insertions(+) diff --git a/internal/service/user/profile.go b/internal/service/user/profile.go index 1d9554e..4c84e64 100644 --- a/internal/service/user/profile.go +++ b/internal/service/user/profile.go @@ -22,3 +22,22 @@ func (s *service) Profile(uid uint) (*model.User, e.Status) { return user, e.Success } + +func (s *service) ProfileOrCreate(data *CreateData) (*model.User, e.Status) { + user := &model.User{ + UserName: data.UserName, + NickName: data.NickName, + Role: model.RoleGeneral, + IsEnabled: true, + } + + // Notice: FirstOrCreate will not update the record if it exists, and also we should not update the record + // Notice: OAuth2 created user will not have password + err := s.db.Get().Where(model.User{UserName: data.UserName}).FirstOrCreate(&user, data).Error + if err != nil { + s.log.Warn("DatabaseError", zap.Error(err), zap.Any("user", user)) + return nil, e.DatabaseError + } + + return user, e.Success +} diff --git a/internal/service/user/service.go b/internal/service/user/service.go index cb62e24..42ce859 100644 --- a/internal/service/user/service.go +++ b/internal/service/user/service.go @@ -17,6 +17,7 @@ type Service interface { Login(data *LoginData) (*model.User, e.Status) IncrVersion(uid uint) (int64, e.Status) Profile(uid uint) (*model.User, e.Status) + ProfileOrCreate(data *CreateData) (*model.User, e.Status) HealthCheck() error }