Taobin-Recipe-Manager/server/services/user/user.go
2023-12-06 20:21:25 +07:00

112 lines
3.2 KiB
Go

package user
import (
"context"
"github.com/google/uuid"
"github.com/jmoiron/sqlx"
"go.uber.org/zap"
"recipe-manager/config"
"recipe-manager/enums/permissions"
"recipe-manager/models"
"recipe-manager/services/logger"
"recipe-manager/services/user/queries"
)
type UserService interface {
CreateNewUser(ctx context.Context, name, email, picture string, permissions permissions.Permission) error
UpdateName(ctx context.Context, userID, name string) error
UpdatePermissions(ctx context.Context, userID string, permissions permissions.Permission) error
GetUserByID(ctx context.Context, userID string) (*models.User, error)
GetUserByEmail(ctx context.Context, email string) (*models.User, error)
}
type userService struct {
cft *config.ServerConfig
db *sqlx.DB
taoLogger *logger.TaoLogger
}
func (u *userService) CreateNewUser(ctx context.Context, name, email, picture string, permissions permissions.Permission) error {
user := ctx.Value("user").(*models.User)
u.taoLogger.Log.Info("User.CreateNewUser", zap.Reflect("user", map[string]interface{}{
"name": name,
"email": email,
"picture": picture,
"permissions": permissions,
}), zap.String("by", user.Email))
userID := uuid.New()
_, err := u.db.ExecContext(ctx, queries.CreateUser, userID, name, email, picture, permissions)
if err != nil {
u.taoLogger.Log.Error("User.CreateNewUser", zap.Error(err), zap.String("by", user.Email))
return err
}
return nil
}
func (u *userService) UpdateName(ctx context.Context, userID, name string) error {
user := ctx.Value("user").(*models.User)
u.taoLogger.Log.Info("User.UpdateName", zap.String("userID", userID), zap.String("name", name), zap.String("by", user.Email))
_, err := u.db.ExecContext(ctx, queries.SetNameUser, name, userID)
if err != nil {
u.taoLogger.Log.Error("User.UpdateName", zap.Error(err), zap.String("by", user.Email))
return err
}
return nil
}
func (u *userService) UpdatePermissions(ctx context.Context, userID string, perms permissions.Permission) error {
user := ctx.Value("user").(*models.User)
u.taoLogger.Log.Info("User.UpdatePermissions", zap.String("userID", userID), zap.Uint("permissions", uint(perms)), zap.String("by", user.Email))
_, err := u.db.ExecContext(ctx, queries.SetPermissionsUser, perms, userID)
if err != nil {
u.taoLogger.Log.Error("User.UpdatePermissions", zap.Error(err), zap.String("by", user.Email))
return err
}
return nil
}
func (u *userService) GetUserByID(ctx context.Context, userID string) (*models.User, error) {
userResult := &models.User{}
if err := u.db.GetContext(ctx, userResult, queries.GetUserByID, userID); err != nil {
u.taoLogger.Log.Error("User.GetUserByID", zap.Error(err))
return nil, err
}
return userResult, nil
}
func (u *userService) GetUserByEmail(ctx context.Context, email string) (*models.User, error) {
userResult := &models.User{}
if err := u.db.GetContext(ctx, userResult, queries.GetUserByEmail, email); err != nil {
u.taoLogger.Log.Error("User.GetUserByEmail", zap.Error(err))
return nil, err
}
return userResult, nil
}
func NewUserService(cfg *config.ServerConfig, db *sqlx.DB, taoLogger *logger.TaoLogger) UserService {
return &userService{cfg, db, taoLogger}
}