{"openapi":"3.0.0","info":{"title":"Nkuzi Igbo Admin Backend API","version":"1.0.0","description":"API documentation for Nkuzi Igbo learning platform - Admin and Mobile endpoints"},"servers":[{"url":"http://localhost:5001","description":"Local Backend API Server (Port 5001)"},{"url":"http://localhost:5000","description":"Local Backend API Server (Port 5000)"},{"url":"http://localhost:3000","description":"Local Admin Server (Port 3000)"},{"url":"https://nkuziigbo-admin-backend.onrender.com","description":"Production Server"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"User":{"type":"object","properties":{"id":{"type":"string","description":"MongoDB ObjectId"},"email":{"type":"string","format":"email"},"fullName":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true},"role":{"type":"string","enum":["admin","user"],"default":"user"},"isVerified":{"type":"boolean","default":false},"cowries":{"type":"integer","default":0,"description":"Virtual currency balance"},"kolanuts":{"type":"integer","default":5,"description":"Lives/hearts system"},"kolanutRate":{"type":"integer","default":400,"description":"Currency conversion rate"},"streak":{"type":"integer","default":0,"description":"Learning streak in days"},"correctPractices":{"type":"integer","default":0,"description":"Practice accuracy counter"},"profilePhoto":{"type":"string","nullable":true,"description":"Cloudinary URL"},"deviceToken":{"type":"string","nullable":true,"description":"FCM push notification token"},"deviceType":{"type":"string","enum":["android","ios"],"nullable":true},"preferences":{"type":"array","items":{"type":"string"},"default":[]},"unReadNotifications":{"type":"array","items":{"type":"string"},"default":[]},"purchasedCourses":{"type":"array","items":{"type":"string"},"default":[]},"completedCourses":{"type":"array","items":{"type":"string"},"default":[]},"lastLearningDate":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Course":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string","description":"Course title in Igbo"},"englishTitle":{"type":"string","description":"Course title in English"},"description":{"type":"string"},"level":{"type":"integer","minimum":1,"maximum":4,"default":1},"imageUrl":{"type":"string","nullable":true},"cowrieCost":{"type":"integer","default":0},"isPublished":{"type":"boolean","default":false},"orderSequence":{"type":"integer","default":0},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Lesson":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string","description":"Lesson title in Igbo"},"englishTitle":{"type":"string","description":"Lesson title in English"},"description":{"type":"string"},"courses":{"type":"array","items":{"type":"object","properties":{"$oid":{"type":"string"}}}},"orderSequence":{"type":"integer","default":0},"isPublished":{"type":"boolean","default":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Notification":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string","nullable":true},"title":{"type":"string"},"message":{"type":"string"},"type":{"type":"string","enum":["achievement","reminder","update","system"],"nullable":true},"isRead":{"type":"boolean","default":false},"isGlobal":{"type":"boolean","default":false},"data":{"type":"object","nullable":true,"description":"Additional metadata"},"createdAt":{"type":"string","format":"date-time"}}},"Order":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string","default":"NGN"},"status":{"type":"string","description":"successful, pending, failed"},"cowries":{"type":"integer"},"kolanuts":{"type":"integer"},"narration":{"type":"string","nullable":true},"isSubscription":{"type":"boolean"},"subscriptionId":{"type":"string","nullable":true},"planId":{"type":"string","nullable":true},"reference":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UserSupportMessage":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"subject":{"type":"string"},"message":{"type":"string"},"status":{"type":"string","enum":["open","in_progress","resolved"],"default":"open"},"priority":{"type":"string","enum":["low","normal","high"],"default":"normal"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"ActivityLog":{"type":"object","properties":{"id":{"type":"string"},"adminId":{"type":"string","nullable":true},"action":{"type":"string"},"entity":{"type":"string"},"entityId":{"type":"string","nullable":true},"details":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"SubscriptionPlan":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string","default":"USD"},"interval":{"type":"string"},"cowries":{"type":"integer"},"kolanuts":{"type":"integer"},"marketId":{"type":"string","nullable":true},"paymentPlanId":{"type":"string","nullable":true},"orderSequence":{"type":"integer","default":0},"isPublished":{"type":"boolean","default":true},"createdAt":{"type":"string","format":"date-time"}}},"CowriePlan":{"type":"object","properties":{"_id":{"type":"object","properties":{"$oid":{"type":"string"}}},"title":{"type":"string"},"description":{"type":"string"},"amount":{"type":"object","properties":{"$numberDecimal":{"type":"string"}}},"dollarAmount":{"type":"object","properties":{"$numberDecimal":{"type":"string"}}},"currency":{"type":"string","default":"NGN"},"cowries":{"type":"integer"},"marketId":{"type":"string","nullable":true},"isPublished":{"type":"boolean","default":true},"orderSequence":{"type":"integer","default":0},"createdAt":{"type":"string","format":"date-time"}}},"CustomQuiz":{"type":"object","properties":{"_id":{"type":"object","properties":{"$oid":{"type":"string"}}},"courseId":{"type":"object","properties":{"$oid":{"type":"string"}}},"question":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"audioUrl":{"type":"string"},"imageUrl":{"type":"string"},"_id":{"type":"object","properties":{"$oid":{"type":"string"}}}}},"questionType":{"type":"integer"},"optionList":{"type":"array","items":{"type":"string"}},"orderSequence":{"type":"integer","default":0},"isPublished":{"type":"boolean","default":true},"__v":{"type":"integer"}}},"Slide":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string","nullable":true},"content":{"type":"string","nullable":true},"type":{"type":"string"},"imageUrl":{"type":"string","nullable":true},"audioUrl":{"type":"string","nullable":true},"orderSequence":{"type":"integer","default":0},"lessonId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Quiz":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"question":{"type":"string"},"options":{"type":"array","items":{"type":"string"},"nullable":true},"answer":{"type":"string","nullable":true},"orderSequence":{"type":"integer","default":0},"lessonId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"string"}}}}},"tags":[{"name":"Auth","description":"Authentication endpoints"},{"name":"Profile","description":"User profile management"},{"name":"Mobile","description":"Mobile app endpoints"},{"name":"Admin - Users","description":"Admin user management"},{"name":"Admin - Courses","description":"Admin course management"},{"name":"Admin - Lessons","description":"Admin lesson management"},{"name":"Admin - Quizzes","description":"Admin quiz management"},{"name":"Admin - slides","description":"Admin slide management"},{"name":"Cowrie Plans","description":"Cowrie purchase plans"},{"name":"Custom Quizzes","description":"User-facing custom quiz system"},{"name":"Courses","description":"Course browsing and access"},{"name":"Notifications","description":"System notifications and broadcasts"},{"name":"Support","description":"User support and ticket management"},{"name":"Activity Log","description":"System audit logs for Super Admins"},{"name":"Uploads","description":"Media upload management (Cloudinary)"}],"paths":{"/api/v1/activity-log":{"get":{"summary":"List all activity logs","description":"Retrieve a paginated list of administrative activities. Restricted to Super Admins.","tags":["Activity Log"],"parameters":[{"in":"query","name":"adminId","schema":{"type":"string"},"description":"Filter by admin user ID"},{"in":"query","name":"action","schema":{"type":"string"},"description":"Filter by specific action (e.g., DELETE_USER)"},{"in":"query","name":"limit","schema":{"type":"integer","default":50}}],"responses":{"200":{"description":"Activity logs retrieved successfully"},"500":{"description":"Server error"}}}},"/api/v1/admin/email/test":{"post":{"tags":["Admin"],"summary":"Send test email using Resend / SMTP","description":"Allows admins to verify Resend API or SMTP configuration with stunning templates.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["to"],"properties":{"to":{"type":"string","format":"email","example":"admin@nkuziigbo.com"},"template":{"type":"string","enum":["verification","reset","welcome","receipt","alert","raw"],"default":"verification"}}}}}},"responses":{"200":{"description":"Email sent status and provider info"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"}}}},"/api/v1/admin/me":{"get":{"tags":["Admin - Users"],"summary":"Get currently authenticated admin user details","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Current admin details","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/User"}}}}}},"401":{"description":"Unauthorized"}}}},"/api/v1/auth/change-password":{"post":{"tags":["Auth"],"summary":"Change password for authenticated user","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["currentPassword","newPassword"],"properties":{"currentPassword":{"type":"string"},"newPassword":{"type":"string","minLength":6}}}}}},"responses":{"200":{"description":"Password changed successfully"},"400":{"description":"Validation error or incorrect current password"},"401":{"description":"Unauthorized"}}}},"/api/v1/auth/delete-user":{"delete":{"tags":["Authentication"],"summary":"Delete the currently authenticated user account","description":"Permanently deletes the user account and all associated data.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Account deleted successfully"},"401":{"description":"Unauthorized"},"500":{"description":"Internal server error"}}}},"/api/v1/auth/forgot-password":{"post":{"tags":["Auth"],"summary":"Request password reset","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"Password reset email sent (always returns success for security)","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"400":{"description":"Validation error"}}}},"/api/v1/auth/login":{"post":{"tags":["Auth"],"summary":"User login","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string"},"password":{"type":"string"},"adminOnly":{"type":"boolean","description":"Set to true when authenticating for Admin portal"}}}}}},"responses":{"200":{"description":"Login successful","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"fullName":{"type":"string"},"role":{"type":"string"}}},"token":{"type":"string"}}}}}},"400":{"description":"Bad request (Validation error)"},"401":{"description":"Invalid credentials"},"403":{"description":"Access denied (Admin privilege required)"},"500":{"description":"Internal server error"}}}},"/api/v1/auth/logout":{"post":{"tags":["Auth"],"summary":"Logout user (client-side token invalidation)","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Logout successful"}}}},"/api/v1/auth/register":{"post":{"tags":["Auth"],"summary":"Register a new user","description":"Creates a new user account and returns an auth token.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password","fullName"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":6},"fullName":{"type":"string"},"phone":{"type":"string"}}}}}},"responses":{"201":{"description":"User created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"fullName":{"type":"string"},"phone":{"type":"string"}}},"token":{"type":"string"}}}}}},"400":{"description":"Invalid input (Validation error)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"array","items":{"type":"object"}}}}}}},"409":{"description":"User already exists","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"User already exists"}}}}}},"500":{"description":"Internal server error"}}}},"/api/v1/auth/reset-password":{"post":{"tags":["Auth"],"summary":"Reset password with token","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["token","password"],"properties":{"token":{"type":"string"},"password":{"type":"string","minLength":6}}}}}},"responses":{"200":{"description":"Password reset successful"},"400":{"description":"Invalid or expired token"}}}},"/api/v1/cowrieplans/{id}":{"get":{"summary":"Get a specific cowrie plan","tags":["Cowrie Plans"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Cowrie plan details"}}},"put":{"summary":"Update a cowrie plan","tags":["Cowrie Plans"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Updated"}}},"delete":{"summary":"Delete a cowrie plan","tags":["Cowrie Plans"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted"}}}},"/api/v1/cowrieplans":{"get":{"summary":"List all cowrie plans","tags":["Cowrie Plans"],"responses":{"200":{"description":"List of cowrie plans"}}},"post":{"summary":"Create a new cowrie plan","tags":["Cowrie Plans"],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Created"}}}},"/api/v1/customquizzes/{id}":{"get":{"summary":"Get a specific custom quiz","tags":["Custom Quizzes"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Custom quiz details"}}},"put":{"summary":"Update a custom quiz","tags":["Custom Quizzes"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Updated"}}},"delete":{"summary":"Delete a custom quiz","tags":["Custom Quizzes"],"security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted"}}}},"/api/v1/customquizzes":{"get":{"summary":"List all custom quizzes","tags":["Custom Quizzes"],"responses":{"200":{"description":"List of custom quizzes"}}},"post":{"summary":"Create a new custom quiz","tags":["Custom Quizzes"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["courseId","question"],"properties":{"courseId":{"type":"object","properties":{"$oid":{"type":"string"}}},"question":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"audioUrl":{"type":"string"},"imageUrl":{"type":"string"}}},"questionType":{"type":"integer"},"optionList":{"type":"array","items":{"type":"string"}},"orderSequence":{"type":"integer"},"isPublished":{"type":"boolean"}}}}}},"responses":{"201":{"description":"Created"}}}},"/api/v1/lessons/{id}":{"get":{"tags":["Admin - Lessons"],"summary":"Get lesson detail","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Lesson object"}}},"put":{"tags":["Admin - Lessons"],"summary":"Update a lesson","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Updated"}}},"delete":{"tags":["Admin - Lessons"],"summary":"Delete a lesson","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted"}}}},"/api/v1/lessons":{"get":{"tags":["Admin - Lessons"],"summary":"List all lessons","responses":{"200":{"description":"Array of lessons"}}},"post":{"tags":["Admin - Lessons"],"summary":"Create a new lesson","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","englishTitle","description","courses"],"properties":{"title":{"type":"string"},"englishTitle":{"type":"string"},"description":{"type":"string"},"courses":{"type":"array","items":{"type":"object","properties":{"$oid":{"type":"string"}}}}}}}}},"responses":{"201":{"description":"Created"}}}},"/api/v1/notifications/{id}":{"get":{"summary":"Get notification details","description":"Retrieve detailed information about a specific notification.","tags":["Notifications"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Notification ID"}],"responses":{"200":{"description":"Notification details retrieved successfully"},"404":{"description":"Notification not found"},"500":{"description":"Server error"}}},"patch":{"summary":"Update a notification","description":"Update specific fields of a notification (e.g., mark as read).","tags":["Notifications"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Notification ID"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"message":{"type":"string"},"isRead":{"type":"boolean"},"data":{"type":"object"}}}}}},"responses":{"200":{"description":"Notification updated successfully"},"400":{"description":"Invalid request data"},"404":{"description":"Notification not found"},"500":{"description":"Server error"}}},"delete":{"summary":"Delete a notification","description":"Remove a specific notification from the database.","tags":["Notifications"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Notification ID"}],"responses":{"204":{"description":"Notification deleted successfully"},"404":{"description":"Notification not found"},"500":{"description":"Server error"}}}},"/api/v1/notifications/all":{"get":{"summary":"List all system notifications (Admin only)","description":"Retrieve all notifications across all users. Restricted to administrators.","tags":["Notifications"],"security":[{"BearerAuth":[]}],"parameters":[{"in":"query","name":"limit","schema":{"type":"integer","default":50}}],"responses":{"200":{"description":"All notifications retrieved successfully"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden (Admin only)"}}}},"/api/v1/notifications":{"get":{"summary":"List all notifications","description":"Retrieve a paginated list of notifications with optional filters for user or global status. Handle legacy data with missing messages.","tags":["Notifications"],"parameters":[{"in":"query","name":"userId","schema":{"type":"string"},"description":"Filter by specific user ID"},{"in":"query","name":"isGlobal","schema":{"type":"boolean"},"description":"Filter by global/broadcast status"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Number of records to return"}],"responses":{"200":{"description":"List of notifications retrieved successfully"},"500":{"description":"Server error"}}},"post":{"summary":"Create or Broadcast a notification","description":"Create a targeted notification for a user or a global broadcast to all users.","tags":["Notifications"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","message"],"properties":{"userId":{"type":"string"},"title":{"type":"string"},"message":{"type":"string"},"type":{"type":"string","enum":["achievement","reminder","update","system"]},"isGlobal":{"type":"boolean"},"data":{"type":"object"}}}}}},"responses":{"201":{"description":"Notification created successfully"},"400":{"description":"Invalid request data"},"500":{"description":"Server error"}}}},"/api/v1/payments/verify":{"post":{"summary":"Verify a payment and grant benefits","description":"Validates a payment reference with the gateway and grants the associated subscription or cowrie plan benefits.","tags":["Payments"],"security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reference","planId"],"properties":{"reference":{"type":"string"},"planId":{"type":"string"},"gateway":{"type":"string","enum":["paystack","apple","google","mock"],"default":"mock"}}}}}},"responses":{"200":{"description":"Success"},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"},"500":{"description":"Internal server error"}}}},"/api/v1/quizzes":{"post":{"tags":["Admin - Quizzes"],"summary":"Add a quiz to a lesson","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lessonId","question"],"properties":{"lessonId":{"type":"string"},"type":{"type":"string"},"question":{"type":"string"},"answer":{"type":"string"},"options":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"201":{"description":"Quiz created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"quiz":{"type":"object","properties":{"id":{"type":"string"},"question":{"type":"string"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"array","items":{"type":"object"}}}}}}},"500":{"description":"Internal server error"}}}},"/api/v1/slides":{"post":{"tags":["Admin - Slides"],"summary":"Add a slide to a lesson","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lessonId","type"],"properties":{"lessonId":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"},"type":{"type":"string","enum":["standard","image","audio","text"]}}}}}},"responses":{"201":{"description":"Slide created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"slide":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"array","items":{"type":"object"}}}}}}},"500":{"description":"Internal server error"}}}},"/api/v1/subscriptions/purchase":{"post":{"summary":"Initiate or complete a subscription/cowrie purchase","description":"Handles both mock payments and initialization for third-party gateways like Paystack.","tags":["Subscriptions"],"security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["planId"],"properties":{"planId":{"type":"string"},"gateway":{"type":"string","enum":["paystack","apple","google","mock"],"default":"mock"},"paymentReference":{"type":"string"}}}}}},"responses":{"200":{"description":"Success"},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"}}}},"/api/v1/support/{id}":{"get":{"summary":"Get support message details","description":"Retrieve full details of a specific support request.","tags":["Support"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Message details retrieved successfully"},"404":{"description":"Message not found"}}},"patch":{"summary":"Update support request","description":"Update the status or priority of a support ticket.","tags":["Support"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["open","in_progress","resolved"]},"priority":{"type":"string","enum":["low","normal","high"]}}}}}},"responses":{"200":{"description":"Request updated successfully"},"400":{"description":"Invalid input"},"404":{"description":"Request not found"}}},"delete":{"summary":"Delete support request","description":"Permanently remove a support message.","tags":["Support"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Message deleted successfully"}}}},"/api/v1/support":{"get":{"summary":"List all support messages","description":"Retrieve all user support requests with status and priority filters.","tags":["Support"],"parameters":[{"in":"query","name":"status","schema":{"type":"string","enum":["open","in_progress","resolved"]}},{"in":"query","name":"priority","schema":{"type":"string","enum":["low","normal","high"]}}],"responses":{"200":{"description":"List of support messages retrieved successfully"},"500":{"description":"Server error"}}},"post":{"summary":"Submit a support message","description":"Create a new support ticket from a user.","tags":["Support"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["userId","subject","message"],"properties":{"userId":{"type":"string"},"subject":{"type":"string"},"message":{"type":"string"},"priority":{"type":"string","enum":["low","normal","high"]}}}}}},"responses":{"201":{"description":"Message submitted successfully"},"400":{"description":"Invalid input"},"500":{"description":"Server error"}}}},"/api/v1/upload/profile-picture":{"post":{"summary":"Upload profile picture to Cloudinary","description":"Uploads an image file and returns the secure Cloudinary URL.","tags":["Profile"],"security":[{"BearerAuth":[]}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Upload successful","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}}}}}},"400":{"description":"Bad request"},"401":{"description":"Unauthorized"}}}},"/api/v1/users/{id}":{"get":{"tags":["Admin - Users"],"summary":"Get user details","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"User details"},"401":{"description":"Unauthorized"},"404":{"description":"User not found"}}},"put":{"tags":["Admin - Users"],"summary":"Update user (Role, Verified Status, Inventory)","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"fullName":{"type":"string"},"role":{"type":"string"},"isVerified":{"type":"boolean"},"cowries":{"type":"integer"},"kolanuts":{"type":"integer"}}}}}},"responses":{"200":{"description":"User updated"}}},"delete":{"tags":["Admin - Users"],"summary":"Delete user","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"User deleted"}}}},"/api/v1/users/me":{"get":{"tags":["Profile","Mobile"],"summary":"Get current user profile","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"User profile retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object"}}}}}},"401":{"description":"Unauthorized"}}},"put":{"tags":["Profile","Mobile"],"summary":"Update current user profile","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"fullName":{"type":"string"},"profilePhoto":{"type":"string"},"deviceToken":{"type":"string"},"deviceType":{"type":"string","enum":["android","ios"]},"preferences":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Profile updated successfully"},"401":{"description":"Unauthorized"}}}},"/api/v1/users":{"get":{"tags":["Admin - Users"],"summary":"List all users","responses":{"200":{"description":"List of users"}}}}}}