Skip to content

Usuarios

Endpoints para gestionar perfiles de usuario y avatares.

El siguiente modelo de Prisma pertenece al schema users:

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

Subir una nueva foto de perfil para el usuario autenticado.

  • URL: /api/v1/users/profile/avatar
  • Método: PATCH
  • Autenticación Requerida:

Este endpoint realiza las siguientes operaciones:

  1. Valida el archivo recibido para asegurar que sea una imagen (JPEG, PNG, WEBP).
  2. Genera una ruta de archivo única basada en el ID del usuario y un timestamp: uploads/avatars/{userId}/{timestamp}.{ext}.
  3. Guarda el archivo en el sistema de archivos local, creando los directorios necesarios si no existen.
  4. Actualiza la URL del avatar (avatar_url) en el perfil del usuario (UserProfile) en la base de datos.
  5. 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).
{
"message": "Foto de perfil actualizada correctamente",
"data": {
"photoUrl": "http://localhost:3000/uploads/avatars/cm.../2023-10-27T10-00-00-000Z.jpg"
}
}
import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
// Asumiendo que 'file' es un objeto File obtenido de un input
const 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)
}