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} }