trainingpeaks-sdk
Version:
TypeScript SDK for TrainingPeaks API integration
76 lines (75 loc) • 2.12 kB
JavaScript
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;
}
};