Usuarios
Endpoints para gestionar perfiles de usuario y avatares.
Modelos de Datos
Section titled “Modelos de Datos”El siguiente modelo de Prisma pertenece al schema users:
UserProfile
Section titled “UserProfile”model UserProfile { id String @id @default(cuid()) userId String @unique @map("user_id") role UserRole @default(MEMBER) avatar_url String? @map("avatar_url")
// Required fields name String documentType String? @map("identification_type") document String?
// Información adicional phone String? dateOfBirth DateTime? @map("date_of_birth") gender String? address String? profileComplete Boolean @default(false) @map("profile_complete")
// Sistema de gamificación totalXp Int @default(0) @map("total_xp") level Int @default(1) currentLevelXp Int @default(0) @map("current_level_xp")
// Relaciones user User @relation(fields: [userId], references: [id], onDelete: Cascade) membership Membership? trainer Trainer? trainingSessions TrainingSession[] reservations Reservation[] payments Payment[] workoutLogs WorkoutLog[] goals Goal[] posts Post[] likes Like[] comments Comment[] follows Follow[] @relation("UserFollows") followers Follow[] @relation("UserFollowers")
// Sistema de gamificación y rachas streaks Streak[] dailyActivities DailyActivity[] userAchievements UserAchievement[]
// Sistema de notificaciones pushSubscriptions PushSubscription[] notifications Notification[]
// Sistema de valoraciones trainerReviews TrainerReview[]
// Sistema de rutinas createdRoutines WorkoutRoutine[] @relation("CreatedRoutines") assignedRoutines RoutineAssignment[] @relation("AssignedRoutines") assignedRoutinesByMe RoutineAssignment[] @relation("AssignedRoutinesByMe")
// Sistema de nutrición createdNutritionPlans NutritionPlan[] @relation("CreatedNutritionPlans") assignedNutritionPlans PlanAssignment[] @relation("AssignedNutritionPlans") assignedNutritionPlansByMe PlanAssignment[] @relation("AssignedNutritionPlansByMe") mealLogs MealLog[] waterIntake WaterIntake[] nutritionGoal NutritionGoal? classesAttended Class[] @relation("ClassAttendees")
// Medidas antropométricas bodyMeasurements BodyMeasurement[]
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
@@map("user_profiles") @@schema("users")}Endpoints
Section titled “Endpoints”Subir Avatar
Section titled “Subir Avatar”Subir una nueva foto de perfil para el usuario autenticado.
- URL:
/api/v1/users/profile/avatar - Método:
PATCH - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint realiza las siguientes operaciones:
- Valida el archivo recibido para asegurar que sea una imagen (JPEG, PNG, WEBP).
- Genera una ruta de archivo única basada en el ID del usuario y un timestamp:
uploads/avatars/{userId}/{timestamp}.{ext}. - Guarda el archivo en el sistema de archivos local, creando los directorios necesarios si no existen.
- Actualiza la URL del avatar (
avatar_url) en el perfil del usuario (UserProfile) en la base de datos. - Retorna la URL pública del nuevo avatar.
Cuerpo de Solicitud (Formulario Multipart)
Section titled “Cuerpo de Solicitud (Formulario Multipart)”photo: Archivo de imagen (JPEG, PNG, WEBP).
Respuesta
Section titled “Respuesta”{ "message": "Foto de perfil actualizada correctamente", "data": { "photoUrl": "http://localhost:3000/uploads/avatars/cm.../2023-10-27T10-00-00-000Z.jpg" }}Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
// Asumiendo que 'file' es un objeto File obtenido de un inputconst formData = new FormData();formData.append('photo', file);
const res = await client.api.v1.users.profile.avatar.$patch({ form: { photo: file }})
if (res.ok) { const data = await res.json() console.log(data.data.photoUrl)}