-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathopenapi.json
More file actions
1 lines (1 loc) · 35.8 KB
/
Copy pathopenapi.json
File metadata and controls
1 lines (1 loc) · 35.8 KB
1
{"openapi":"3.0.0","paths":{"/api/auth/register":{"post":{"operationId":"AuthProxyController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":"Registration successful","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponseBody"}}}},"400":{"description":"Invalid input data"},"409":{"description":"User already exists"}},"tags":["Auth"]}},"/api/auth/login":{"post":{"operationId":"AuthProxyController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"201":{"description":"Login successful","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponseBody"}}}},"401":{"description":"Invalid credentials"}},"tags":["Auth"]}},"/api/auth/refresh":{"post":{"operationId":"AuthProxyController_refresh","parameters":[],"responses":{"201":{"description":"Token refreshed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponseBody"}}}},"401":{"description":"Invalid refresh token"}},"tags":["Auth"]}},"/api/auth/logout":{"post":{"operationId":"AuthProxyController_logout","parameters":[],"responses":{"201":{"description":"Logout successful","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoutResponseBody"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/me":{"get":{"operationId":"AuthProxyController_getProfile","parameters":[],"responses":{"200":{"description":"User profile retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"User not found"}},"security":[{"bearer":[]}],"tags":["Auth"]},"patch":{"operationId":"AuthProxyController_updateProfile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":"Profile updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"},"404":{"description":"User not found"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/balance":{"get":{"operationId":"AuthProxyController_getBalance","parameters":[],"responses":{"200":{"description":"Balance retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/balance/deposit":{"post":{"operationId":"AuthProxyController_deposit","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBalanceDto"}}}},"responses":{"201":{"description":"Deposit successful","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionResponseDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/balance/reserve":{"post":{"operationId":"AuthProxyController_reserve","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBalanceDto"}}}},"responses":{"201":{"description":"Funds reserved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionResponseDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"},"403":{"description":"Insufficient balance"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/balance/release":{"post":{"operationId":"AuthProxyController_release","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBalanceDto"}}}},"responses":{"201":{"description":"Funds released successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionResponseDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/balance/refund":{"post":{"operationId":"AuthProxyController_refund","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBalanceDto"}}}},"responses":{"201":{"description":"Refund processed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionResponseDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/transactions":{"get":{"operationId":"AuthProxyController_getTransactions","parameters":[],"responses":{"200":{"description":"Transactions retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionListResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/users":{"get":{"operationId":"AuthProxyController_listUsers","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"example":10,"type":"number"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["active","blocked"]}},{"name":"role","required":false,"in":"query","schema":{"type":"string","enum":["client","admin"]}},{"name":"ids","required":false,"in":"query","schema":{"example":"uuid1,uuid2","type":"string"}}],"responses":{"200":{"description":"List all users (admin only)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserListResponseDto"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/users/{id}":{"get":{"operationId":"AuthProxyController_getUserById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Get user details by ID (admin only)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDto"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"User not found"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/auth/users/{id}/status":{"patch":{"operationId":"AuthProxyController_updateUserStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserStatusDto"}}}},"responses":{"200":{"description":"Block/unblock user (admin only)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDto"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"User not found"}},"security":[{"bearer":[]}],"tags":["Auth"]}},"/api/trainers":{"get":{"operationId":"TrainingProxyController_getTrainers","parameters":[],"responses":{"200":{"description":"Trainers retrieved","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TrainerResponseDto"}}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Trainings"]},"post":{"operationId":"TrainingProxyController_createTrainer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTrainerDto"}}}},"responses":{"201":{"description":"Trainer created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainerResponseDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden - Admin only"}},"security":[{"bearer":[]}],"tags":["Trainings"]}},"/api/trainers/{id}":{"get":{"operationId":"TrainingProxyController_getTrainerById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Trainer retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainerResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Trainer not found"}},"security":[{"bearer":[]}],"tags":["Trainings"]},"patch":{"operationId":"TrainingProxyController_updateTrainer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTrainerDto"}}}},"responses":{"200":{"description":"Trainer updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainerResponseDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden - Admin only"},"404":{"description":"Trainer not found"}},"security":[{"bearer":[]}],"tags":["Trainings"]},"delete":{"operationId":"TrainingProxyController_deleteTrainer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Trainer deactivated"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden - Admin only"},"404":{"description":"Trainer not found"}},"security":[{"bearer":[]}],"tags":["Trainings"]}},"/api/trainings":{"get":{"operationId":"TrainingProxyController_getTrainings","parameters":[],"responses":{"200":{"description":"Trainings retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingListResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Trainings"]},"post":{"operationId":"TrainingProxyController_createTraining","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTrainingDto"}}}},"responses":{"201":{"description":"Training created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingResponseDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden - Admin only"}},"security":[{"bearer":[]}],"tags":["Trainings"]}},"/api/trainings/{id}":{"get":{"operationId":"TrainingProxyController_getTrainingById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Training retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Training not found"}},"security":[{"bearer":[]}],"tags":["Trainings"]},"patch":{"operationId":"TrainingProxyController_updateTraining","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTrainingDto"}}}},"responses":{"200":{"description":"Training updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingResponseDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden - Admin only"},"404":{"description":"Training not found"}},"security":[{"bearer":[]}],"tags":["Trainings"]},"delete":{"operationId":"TrainingProxyController_deleteTraining","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Training cancelled"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden - Admin only"},"404":{"description":"Training not found"}},"security":[{"bearer":[]}],"tags":["Trainings"]}},"/api/schedule":{"get":{"operationId":"TrainingProxyController_getSchedule","parameters":[],"responses":{"200":{"description":"Weekly schedule retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeekScheduleResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Trainings"]}},"/api/schedule/trainer/{id}":{"get":{"operationId":"TrainingProxyController_getTrainerSchedule","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Trainer schedule retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainerScheduleResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Trainings"]}},"/api/bookings":{"get":{"operationId":"BookingProxyController_getBookings","parameters":[],"responses":{"200":{"description":"Bookings retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingListResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Booking"]},"post":{"operationId":"BookingProxyController_createBooking","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBookingDto"}}}},"responses":{"201":{"description":"Booking created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"},"404":{"description":"Training not found"},"409":{"description":"Booking already exists or no available slots"}},"security":[{"bearer":[]}],"tags":["Booking"]}},"/api/bookings/{id}":{"get":{"operationId":"BookingProxyController_getBookingById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Booking retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Booking not found"}},"security":[{"bearer":[]}],"tags":["Booking"]}},"/api/bookings/{id}/cancel":{"post":{"operationId":"BookingProxyController_cancelBooking","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelBookingDto"}}}},"responses":{"200":{"description":"Booking cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Booking not found"},"409":{"description":"Booking already cancelled or past training"}},"security":[{"bearer":[]}],"tags":["Booking"]}},"/api/waitlist":{"get":{"operationId":"BookingProxyController_getWaitlist","parameters":[],"responses":{"200":{"description":"Waitlist retrieved","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WaitlistResponseDto"}}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Booking"]},"post":{"operationId":"BookingProxyController_joinWaitlist","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinWaitlistDto"}}}},"responses":{"201":{"description":"Added to waitlist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistDto"}}}},"400":{"description":"Invalid input data"},"401":{"description":"Unauthorized"},"404":{"description":"Training not found"},"409":{"description":"Already on waitlist or has active booking"}},"security":[{"bearer":[]}],"tags":["Booking"]},"delete":{"operationId":"BookingProxyController_leaveWaitlist","parameters":[],"responses":{"200":{"description":"Left waitlist","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Removed from waitlist"}}}}}},"401":{"description":"Unauthorized"},"404":{"description":"Not on waitlist"}},"security":[{"bearer":[]}],"tags":["Booking"]}},"/api/waitlist/position":{"get":{"operationId":"BookingProxyController_getWaitlistPosition","parameters":[],"responses":{"200":{"description":"Waitlist position retrieved. Position -1 indicates user is not on the waitlist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Booking"]}},"/api/bookings/training/{trainingId}/count":{"get":{"operationId":"BookingProxyController_getTrainingBookingCount","parameters":[{"name":"trainingId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Booking count for training retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingBookingCountDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Booking"]}},"/api/bookings/training/{trainingId}/participants":{"get":{"operationId":"BookingProxyController_getTrainingParticipants","parameters":[{"name":"trainingId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Training participants retrieved","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserDto"}}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Booking"]}},"/api/notifications":{"get":{"operationId":"NotificationProxyController_getNotifications","parameters":[],"responses":{"200":{"description":"Notifications retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationListResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Notifications"]},"delete":{"operationId":"NotificationProxyController_deleteAllNotifications","parameters":[],"responses":{"200":{"description":"All notifications deleted","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"number"}}}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Notifications"]}},"/api/notifications/unread-count":{"get":{"operationId":"NotificationProxyController_getUnreadCount","parameters":[],"responses":{"200":{"description":"Unread count retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCountResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Notifications"]}},"/api/notifications/{id}/read":{"patch":{"operationId":"NotificationProxyController_markAsRead","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Notification marked as read","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Notification not found"}},"security":[{"bearer":[]}],"tags":["Notifications"]}},"/api/notifications/read-all":{"patch":{"operationId":"NotificationProxyController_markAllAsRead","parameters":[],"responses":{"200":{"description":"All notifications marked as read","content":{"application/json":{"schema":{"type":"object","properties":{"updated":{"type":"number"}}}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"tags":["Notifications"]}},"/api/notifications/{id}":{"delete":{"operationId":"NotificationProxyController_deleteNotification","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Notification deleted","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}}}}}},"401":{"description":"Unauthorized"},"404":{"description":"Notification not found"}},"security":[{"bearer":[]}],"tags":["Notifications"]}},"/api/payments/webhook":{"post":{"operationId":"PaymentProxyController_handleWebhook","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TinkoffWebhookDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TinkoffWebhookResponseDto"}}}}},"summary":"Handle Tinkoff Kassa webhook","tags":["Payments"]}},"/api/payments/init":{"post":{"operationId":"PaymentProxyController_initPayment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitPaymentDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitPaymentResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Initialize a new payment","tags":["Payments"]}},"/api/payments/{id}/status":{"get":{"operationId":"PaymentProxyController_getPaymentStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentStatusResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get payment status by ID","tags":["Payments"]}},"/api/payments":{"get":{"operationId":"PaymentProxyController_getPaymentHistory","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"example":10,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentHistoryResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get user payment history","tags":["Payments"]}},"/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":""}},"tags":["Health"]}}},"info":{"title":"DreamFitness API","description":"Fitness club management system API","version":"1.0","contact":{}},"tags":[],"servers":[{"url":"http://localhost:3000"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"RegisterDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com"},"password":{"type":"string","example":"password123","minLength":8,"maxLength":50},"name":{"type":"string","example":"John Doe","minLength":2},"phone":{"type":"string","example":"+1234567890"},"birthDate":{"type":"string","example":"1990-01-01"},"gender":{"type":"string","enum":["male","female"]}},"required":["email","password","name"]},"UserResponseDto":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"},"phone":{"type":"string"},"birthDate":{"type":"string"},"gender":{"type":"string","enum":["male","female"]},"role":{"type":"string","enum":["client","admin"]},"balance":{"type":"number"},"status":{"type":"string","enum":["active","blocked"]},"createdAt":{"type":"string"}},"required":["id","email","name","role","balance","status","createdAt"]},"RegisterResponseBody":{"type":"object","properties":{"accessToken":{"type":"string"},"user":{"$ref":"#/components/schemas/UserResponseDto"}},"required":["accessToken","user"]},"LoginDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com"},"password":{"type":"string","example":"password123","minLength":8,"maxLength":50}},"required":["email","password"]},"LoginResponseBody":{"type":"object","properties":{"accessToken":{"type":"string","example":"jwt-access-token"}},"required":["accessToken"]},"LogoutResponseBody":{"type":"object","properties":{"message":{"type":"string","example":"Logged out successfully"}},"required":["message"]},"UserProfileDto":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"},"phone":{"type":"string"},"birthDate":{"type":"string"},"gender":{"type":"string","enum":["male","female"]},"role":{"type":"string","enum":["client","admin"]},"balance":{"type":"number"},"status":{"type":"string","enum":["active","blocked"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","email","name","role","balance","status","createdAt","updatedAt"]},"UpdateUserDto":{"type":"object","properties":{"name":{"type":"string","example":"John Doe","minLength":2},"phone":{"type":"string","example":"+1234567890"},"birthDate":{"type":"string","example":"1990-01-01"},"gender":{"type":"string","enum":["male","female"]}}},"BalanceResponseDto":{"type":"object","properties":{"balance":{"type":"number","example":1500}},"required":["balance"]},"UpdateBalanceDto":{"type":"object","properties":{"userId":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"amount":{"type":"number","example":100,"minimum":0},"description":{"type":"string","example":"Deposit for training"}},"required":["userId","amount"]},"TransactionResponseDto":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["deposit","withdraw","refund","reserve","release"]},"amount":{"type":"number"},"bookingId":{"type":"object"},"description":{"type":"object"},"createdAt":{"type":"string"}},"required":["id","type","amount","createdAt"]},"TransactionListResponseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TransactionResponseDto"}},"total":{"type":"number","example":25},"page":{"type":"number","example":1},"limit":{"type":"number","example":10}},"required":["items","total","page","limit"]},"UserDto":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"},"phone":{"type":"string"},"birthDate":{"type":"string"},"gender":{"type":"string","enum":["male","female"]},"role":{"type":"string","enum":["client","admin"]},"balance":{"type":"number"},"status":{"type":"string","enum":["active","blocked"]},"createdAt":{"type":"string"}},"required":["id","email","name","role","balance","status","createdAt"]},"UserListResponseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/UserDto"}},"total":{"type":"number","example":25},"page":{"type":"number","example":1},"limit":{"type":"number","example":10}},"required":["items","total","page","limit"]},"UpdateUserStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["active","blocked"]}},"required":["status"]},"TrainerResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"bio":{"type":"object"},"avatarUrl":{"type":"object"},"isActive":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","isActive","createdAt","updatedAt"]},"CreateTrainerDto":{"type":"object","properties":{"name":{"type":"string","example":"John Smith","minLength":2,"maxLength":255},"bio":{"type":"string","example":"Experienced fitness trainer"},"avatarUrl":{"type":"string","example":"https://example.com/avatar.jpg"}},"required":["name"]},"UpdateTrainerDto":{"type":"object","properties":{"name":{"type":"string","example":"John Smith","minLength":2,"maxLength":255},"bio":{"type":"string","example":"Experienced fitness trainer"},"avatarUrl":{"type":"string","example":"https://example.com/avatar.jpg"},"isActive":{"type":"boolean"}}},"TrainingResponseDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"object"},"type":{"type":"string","enum":["yoga","pilates","crossfit","boxing","strength","cardio","dance","stretching"]},"trainerId":{"type":"string"},"trainerName":{"type":"string"},"scheduledAt":{"type":"string"},"durationMinutes":{"type":"number"},"capacity":{"type":"number"},"currentParticipants":{"type":"number"},"availableSlots":{"type":"number"},"waitlistCount":{"type":"number","description":"Number of users on the waitlist"},"price":{"type":"number"},"status":{"type":"string","enum":["scheduled","cancelled","completed"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","title","type","trainerId","scheduledAt","durationMinutes","capacity","currentParticipants","availableSlots","waitlistCount","price","status","createdAt","updatedAt"]},"TrainingListResponseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TrainingResponseDto"}},"count":{"type":"number","example":25}},"required":["items","count"]},"CreateTrainingDto":{"type":"object","properties":{"title":{"type":"string","example":"Morning Yoga","minLength":2,"maxLength":255},"description":{"type":"string","example":"A relaxing yoga session"},"type":{"type":"string","enum":["yoga","pilates","crossfit","boxing","strength","cardio","dance","stretching"]},"trainerId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"scheduledAt":{"type":"string","example":"2024-01-15T10:00:00Z"},"durationMinutes":{"type":"number","example":60,"minimum":15,"maximum":480},"capacity":{"type":"number","example":20,"minimum":1,"maximum":100},"price":{"type":"number","example":500,"minimum":0}},"required":["title","type","trainerId","scheduledAt","durationMinutes","capacity","price"]},"UpdateTrainingDto":{"type":"object","properties":{"title":{"type":"string","example":"Morning Yoga","minLength":2,"maxLength":255},"description":{"type":"string","example":"A relaxing yoga session"},"type":{"type":"string","enum":["yoga","pilates","crossfit","boxing","strength","cardio","dance","stretching"]},"trainerId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"scheduledAt":{"type":"string","example":"2024-01-15T10:00:00Z"},"durationMinutes":{"type":"number","example":60,"minimum":15,"maximum":480},"capacity":{"type":"number","example":20,"minimum":1,"maximum":100},"price":{"type":"number","example":500,"minimum":0},"status":{"type":"string","enum":["scheduled","cancelled","completed"]}}},"ScheduleTrainingDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"},"scheduledAt":{"type":"string"},"durationMinutes":{"type":"number"}},"required":["id","title","type","scheduledAt","durationMinutes"]},"WeekScheduleDayDto":{"type":"object","properties":{"date":{"type":"string"},"trainings":{"type":"array","items":{"$ref":"#/components/schemas/ScheduleTrainingDto"}}},"required":["date","trainings"]},"WeekScheduleResponseDto":{"type":"object","properties":{"weekStart":{"type":"string"},"weekEnd":{"type":"string"},"days":{"type":"array","items":{"$ref":"#/components/schemas/WeekScheduleDayDto"}}},"required":["weekStart","weekEnd","days"]},"TrainerScheduleResponseDto":{"type":"object","properties":{"trainer":{"type":"object"},"trainings":{"type":"array","items":{"$ref":"#/components/schemas/ScheduleTrainingDto"}}},"required":["trainer","trainings"]},"BookingResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"userId":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"trainingId":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"status":{"type":"string","enum":["confirmed","cancelled"]},"createdAt":{"type":"string","example":"2024-01-15T10:00:00Z"},"updatedAt":{"type":"string","example":"2024-01-15T10:00:00Z"}},"required":["id","userId","trainingId","status","createdAt","updatedAt"]},"BookingListResponseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BookingResponseDto"}},"total":{"type":"number","example":25},"page":{"type":"number","example":1},"limit":{"type":"number","example":10}},"required":["items","total","page","limit"]},"BookingDto":{"type":"object","properties":{"id":{"type":"string"},"trainingId":{"type":"string"},"userId":{"type":"string"},"status":{"type":"string","enum":["confirmed","cancelled","completed"]},"bookedAt":{"format":"date-time","type":"string"},"cancelledAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","trainingId","userId","status","bookedAt","updatedAt"]},"CreateBookingDto":{"type":"object","properties":{"trainingId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"}},"required":["trainingId"]},"CancelBookingDto":{"type":"object","properties":{"reason":{"type":"string","example":"Unable to attend"}}},"WaitlistResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"userId":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"trainingId":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"position":{"type":"number","example":3},"joinedAt":{"type":"string","example":"2024-01-15T10:00:00Z"}},"required":["id","userId","trainingId","position","joinedAt"]},"WaitlistDto":{"type":"object","properties":{"id":{"type":"string"},"trainingId":{"type":"string"},"userId":{"type":"string"},"position":{"type":"number"},"joinedAt":{"format":"date-time","type":"string"}},"required":["id","trainingId","userId","position","joinedAt"]},"TrainingBookingCountDto":{"type":"object","properties":{"confirmedCount":{"type":"number","example":5},"waitlistCount":{"type":"number","example":2}},"required":["confirmedCount","waitlistCount"]},"JoinWaitlistDto":{"type":"object","properties":{"trainingId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"}},"required":["trainingId"]},"NotificationResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"userId":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"type":{"type":"string","enum":["booking_confirmation","booking_cancellation","balance_change","training_reminder","waitlist_joined","waitlist_promoted"]},"title":{"type":"string","example":"Training Reminder"},"content":{"type":"string","example":"Your training starts in 30 minutes"},"isRead":{"type":"boolean","example":false},"createdAt":{"format":"date-time","type":"string","example":"2024-01-15T10:00:00Z"}},"required":["id","userId","type","title","content","isRead","createdAt"]},"NotificationListResponseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/NotificationResponseDto"}},"total":{"type":"number","example":25},"page":{"type":"number","example":1},"limit":{"type":"number","example":10}},"required":["items","total","page","limit"]},"UnreadCountResponseDto":{"type":"object","properties":{"count":{"type":"number","example":5}},"required":["count"]},"NotificationDto":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"type":{"type":"string","enum":["booking_confirmation","booking_cancellation","balance_change","training_reminder","waitlist_joined","waitlist_promoted"]},"title":{"type":"string"},"content":{"type":"string"},"isRead":{"type":"boolean"},"metadata":{"type":"object"},"createdAt":{"format":"date-time","type":"string"},"readAt":{"format":"date-time","type":"string"}},"required":["id","userId","type","title","content","isRead","createdAt"]},"TinkoffWebhookDto":{"type":"object","properties":{"TerminalKey":{"type":"string","description":"Terminal identifier"},"PaymentId":{"type":"string","description":"Payment ID in Tinkoff"},"Status":{"type":"string","description":"Payment status","example":"CONFIRMED","enum":["AUTHORIZED","CONFIRMED","REJECTED"]},"Amount":{"type":"number","description":"Amount in kopeks"},"OrderId":{"type":"string","description":"Our payment UUID"},"Token":{"type":"string","description":"SHA256 signature"},"Success":{"type":"boolean","description":"Success flag"},"ErrorCode":{"type":"string","description":"Error code if failed"},"Message":{"type":"string","description":"Error message"},"Details":{"type":"string","description":"Error details"}},"required":["TerminalKey","PaymentId","Status","Amount","OrderId","Token","Success"]},"TinkoffWebhookResponseDto":{"type":"object","properties":{"status":{"type":"string","example":"OK","description":"Must return OK to Tinkoff"}},"required":["status"]},"InitPaymentDto":{"type":"object","properties":{"amount":{"type":"number","example":100,"minimum":1,"description":"Amount in points (integer)"}},"required":["amount"]},"InitPaymentResponseDto":{"type":"object","properties":{"paymentId":{"type":"string","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"paymentUrl":{"type":"string","example":"https://securepay.tinkoff.ru/..."}},"required":["paymentId","paymentUrl"]},"PaymentStatusResponseDto":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"number","example":100},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CONFIRMED","CANCELED","REJECTED"]},"createdAt":{"type":"string"}},"required":["id","amount","status","createdAt"]},"PaymentHistoryResponseDto":{"type":"object","properties":{"payments":{"type":"array","items":{"$ref":"#/components/schemas/PaymentStatusResponseDto"}},"total":{"type":"number","example":25}},"required":["payments","total"]}}}}