UNPKG

trainingpeaks-sdk

Version:
76 lines (75 loc) 2.12 kB
import { ValidationError } from '../../domain/errors/domain-errors.js'; const FIELD_KEY_MAP = { 'user id': 'id', 'user name': 'name', username: 'username', }; export const createUser = (id, name, username, avatar, preferences) => { validateStringField(id, 'User ID'); validateStringField(name, 'User name'); validateStringField(username, 'Username'); if (avatar) { validateAvatarUrl(avatar); } return { id: id.trim(), name: name.trim(), username: username.trim(), avatar, preferences, }; }; export const updateUserName = (user, newName) => { validateStringField(newName, 'User name'); return { ...user, name: newName.trim(), }; }; export const updateUserPreferences = (user, preferences) => ({ ...user, preferences, }); export const updateUserAvatar = (user, avatar) => { if (avatar) { validateAvatarUrl(avatar); } return { ...user, avatar, }; }; export const hasUserPreference = (user, key) => { return user.preferences ? key in user.preferences : false; }; export const getUserPreference = (user, key, defaultValue) => { if (!user.preferences || !(key in user.preferences)) { return defaultValue; } return user.preferences[key]; }; const validateStringField = (value, fieldName, maxLength = 100) => { const normalizedFieldName = fieldName.trim().toLowerCase(); const fieldKey = FIELD_KEY_MAP[normalizedFieldName] || normalizedFieldName; const trimmed = value?.trim() || ''; if (trimmed.length === 0) { throw new ValidationError(`${fieldName} cannot be empty`, fieldKey); } if (trimmed.length > maxLength) { throw new ValidationError(`${fieldName} cannot exceed ${maxLength} characters`, fieldKey); } }; const validateAvatarUrl = (avatar) => { if (!isValidUrl(avatar)) { throw new ValidationError('Avatar must be a valid URL', 'avatar'); } }; const isValidUrl = (url) => { try { new URL(url); return true; } catch { return false; } };