123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package service
- import (
- "context"
- "errors"
- "github.com/jinzhu/gorm"
- "github.com/longjoy/micro-go-course/section08/user/dao"
- "github.com/longjoy/micro-go-course/section08/user/redis"
- "log"
- "time"
- )
- type UserInfoDTO struct {
- ID int64 `json:"id"`
- Username string `json:"username"`
- Email string `json:"email"`
- }
- type RegisterUserVO struct {
- Username string
- Password string
- Email string
- }
- var (
- ErrUserExisted = errors.New("user is existed")
- ErrPassword = errors.New("email and password are not match")
- ErrRegistering = errors.New("email is registering")
- )
- type UserService interface {
- // 登录接口
- Login(ctx context.Context, email, password string) (*UserInfoDTO, error)
- // 注册接口
- Register(ctx context.Context, vo *RegisterUserVO) (*UserInfoDTO, error)
- }
- type UserServiceImpl struct {
- userDAO dao.UserDAO
- }
- func MakeUserServiceImpl(userDAO dao.UserDAO) UserService {
- return &UserServiceImpl{
- userDAO: userDAO,
- }
- }
- func (userService *UserServiceImpl) Login(ctx context.Context, email, password string) (*UserInfoDTO, error) {
- user, err := userService.userDAO.SelectByEmail(email)
- if err == nil {
- if user.Password == password {
- return &UserInfoDTO{
- ID: user.ID,
- Username: user.Username,
- Email: user.Email,
- }, nil
- } else {
- return nil, ErrPassword
- }
- } else {
- log.Printf("err : %s", err)
- }
- return nil, err
- }
- func (userService UserServiceImpl) Register(ctx context.Context, vo *RegisterUserVO) (*UserInfoDTO, error) {
- lock := redis.GetRedisLock(vo.Email, time.Duration(5)*time.Second)
- err := lock.Lock()
- if err != nil {
- log.Printf("err : %s", err)
- return nil, ErrRegistering
- }
- defer lock.Unlock()
- existUser, err := userService.userDAO.SelectByEmail(vo.Email)
- if (err == nil && existUser == nil) || err == gorm.ErrRecordNotFound {
- newUser := &dao.UserEntity{
- Username: vo.Username,
- Password: vo.Password,
- Email: vo.Email,
- }
- err = userService.userDAO.Save(newUser)
- if err == nil {
- return &UserInfoDTO{
- ID: newUser.ID,
- Username: newUser.Username,
- Email: newUser.Email,
- }, nil
- }
- }
- if err == nil {
- err = ErrUserExisted
- }
- return nil, err
- }
|