{"openapi":"3.0.0","info":{"title":"Hoffman Haircuts REST API","version":"1.0.0","description":"API contract generated from the Express routes in this repository."},"servers":[{"url":"/","description":"Current host"}],"tags":[{"name":"Ads","description":"Promotional content"},{"name":"Bookings","description":"Booking lifecycle and work evidence"},{"name":"Bookmarks","description":"Saved technicians"},{"name":"Locations","description":"Technician discovery and distance settings"},{"name":"Mobile","description":"Supported mobile application versions"},{"name":"Payments","description":"ChillPay provider callbacks"},{"name":"Reports","description":"Withholding tax reports and exports"},{"name":"Reviews","description":"Customer reviews and rating summaries"},{"name":"Schools","description":"Hairdressing school directory"},{"name":"Technicians","description":"Technician profiles, availability and authentication"},{"name":"Uploads","description":"Technician image uploads"},{"name":"Users","description":"Authenticated customer profile"},{"name":"Wallets","description":"Technician wallet, withdrawals and statements"}],"paths":{"/api/ads":{"get":{"tags":["Ads"],"summary":"List advertisements","operationId":"getAds","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/payments/chillpay/background":{"post":{"tags":["Payments"],"summary":"Receive a ChillPay background notification","operationId":"postPaymentsChillpayBackground","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ChillPayBackgroundRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}},"description":"Provider-to-server webhook. The request checksum and trusted booking amount are verified before an idempotent payment transition."}},"/api/bookings":{"get":{"tags":["Bookings"],"summary":"List bookings for the authenticated customer","operationId":"getBookings","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/bookings/{bookingId}":{"get":{"tags":["Bookings"],"summary":"Get a booking","operationId":"getBookingsBookingId","security":[{"bearerAuth":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/bookings/{bookingId}/payment-start":{"post":{"tags":["Bookings"],"summary":"Start the booking payment window","operationId":"postBookingsBookingIdPaymentStart","security":[{"bearerAuth":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/bookings/{bookingId}/payment-session":{"post":{"tags":["Payments"],"summary":"Create or reuse a ChillPay Direct QR image","operationId":"postBookingsBookingIdPaymentSession","security":[{"bearerAuth":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/bookings/{bookingId}/status":{"post":{"tags":["Bookings"],"summary":"Update booking status","operationId":"postBookingsBookingIdStatus","security":[{"bearerAuth":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"statusId":{"type":"integer"}},"required":["statusId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/bookings/{bookingId}/special-request":{"put":{"tags":["Bookings"],"summary":"Update booking special request","operationId":"putBookingsBookingIdSpecialRequest","security":[{"bearerAuth":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"specialRequest":{"type":"string"}},"required":["specialRequest"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/bookings/{bookingId}/check-start-working":{"get":{"tags":["Bookings"],"summary":"Check whether work may start","operationId":"getBookingsBookingIdCheckStartWorking","security":[{"bearerAuth":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/bookings/{bookingId}/photos":{"post":{"tags":["Bookings"],"summary":"Add booking photos","operationId":"postBookingsBookingIdPhotos","security":[{"bearerAuth":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"urls":{"type":"array","items":{"type":"string"}}},"required":["type","urls"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}},"get":{"tags":["Bookings"],"summary":"List booking photos","operationId":"getBookingsBookingIdPhotos","security":[{"bearerAuth":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/send-email/{fcmToken}":{"get":{"tags":["Bookings"],"summary":"Send the legacy email notification","operationId":"getSendEmailFcmToken","security":[{"bearerAuth":[]}],"parameters":[{"name":"fcmToken","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/bookmarks/users/{userId}":{"get":{"tags":["Bookmarks"],"summary":"List a customer's bookmarks","operationId":"getBookmarksUsersUserId","security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/bookmarks":{"post":{"tags":["Bookmarks"],"summary":"Create or remove a bookmark","operationId":"postBookmarks","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"technicianId":{"type":"integer"},"userId":{"type":"integer"},"bookmark":{"type":"boolean"}},"required":["technicianId","userId","bookmark"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/locations":{"post":{"tags":["Locations"],"summary":"Search technicians by location","operationId":"postLocations","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"}},{"name":"open","in":"query","required":false,"schema":{"type":"boolean"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"CurrentLong":{"type":"number"},"CurrentLati":{"type":"number"},"Date":{"type":"string"},"TechTypeId":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"open":{"type":"boolean"}},"required":["CurrentLong","CurrentLati","Date","TechTypeId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/locations/technicians/{technicianId}":{"put":{"tags":["Locations"],"summary":"Update a technician's current location","operationId":"putLocationsTechniciansTechnicianId","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"CurrentLong":{"type":"number"},"CurrentLati":{"type":"number"}},"required":["CurrentLong","CurrentLati"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/locations/max-distance":{"get":{"tags":["Locations"],"summary":"Get maximum service distance","operationId":"getLocationsMaxDistance","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"tags":["Locations"],"summary":"Update maximum service distance","operationId":"postLocationsMaxDistance","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"maxDistance":{"type":"number"},"unit":{"type":"string"}},"required":["maxDistance"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/mobile-version":{"get":{"tags":["Mobile"],"summary":"List supported mobile versions","operationId":"getMobileVersion","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}},"put":{"tags":["Mobile"],"summary":"Update a supported mobile version","operationId":"putMobileVersion","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string"},"version":{"type":"string"}},"required":["platform","version"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/reports/withholding":{"get":{"tags":["Reports"],"summary":"Preview a withholding report","operationId":"getReportsWithholding","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"year","in":"query","required":false,"schema":{"type":"integer"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"tags":["Reports"],"summary":"Create a withholding report","operationId":"postReportsWithholding","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"technicianId":{"type":"integer"},"year":{"type":"integer"},"month":{"type":"integer"}},"required":["technicianId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/reports/withholding/{id}":{"get":{"tags":["Reports"],"summary":"Get a withholding report","operationId":"getReportsWithholdingId","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/reports/withholding/list":{"get":{"tags":["Reports"],"summary":"List withholding reports","operationId":"getReportsWithholdingList","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"year","in":"query","required":false,"schema":{"type":"integer"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/reports/withholding/{id}/renumber":{"post":{"tags":["Reports"],"summary":"Renumber a withholding report","operationId":"postReportsWithholdingIdRenumber","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/reports/withholding/{id}/download.csv":{"get":{"tags":["Reports"],"summary":"Download a withholding report as CSV","operationId":"getReportsWithholdingIdDownload.csv","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Generated report file","content":{"text/csv":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/reports/withholding/{id}/excel":{"get":{"tags":["Reports"],"summary":"Download a withholding report as Excel","operationId":"getReportsWithholdingIdExcel","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Generated report file","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/reviews":{"get":{"tags":["Reviews"],"summary":"List reviews","operationId":"getReviews","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"tags":["Reviews"],"summary":"Create a review","operationId":"postReviews","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"integer"},"technicianId":{"type":"integer"},"bookingId":{"type":"string"},"reviewText":{"type":"string"},"service":{"type":"integer"},"timeliness":{"type":"integer"},"performance":{"type":"integer"},"satisfaction":{"type":"integer"}},"required":["userId","technicianId","bookingId","service","timeliness","performance","satisfaction"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/reviews/technicians/{technicianId}":{"get":{"tags":["Reviews"],"summary":"List reviews for a technician","operationId":"getReviewsTechniciansTechnicianId","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/reviews/technicians/{technicianId}/summary":{"get":{"tags":["Reviews"],"summary":"Get a technician's review summary","operationId":"getReviewsTechniciansTechnicianIdSummary","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/schools":{"get":{"tags":["Schools"],"summary":"Search schools","operationId":"getSchools","security":[{"bearerAuth":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/leaderboard/technicians":{"get":{"tags":["Technicians"],"summary":"Get the technician leaderboard","operationId":"getLeaderboardTechnicians","security":[{"bearerAuth":[]}],"parameters":[{"name":"month","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"includeSelf","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"technicianId","in":"query","required":false,"schema":{"type":"integer"}},{"name":"minReviews","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians":{"get":{"tags":["Technicians"],"summary":"List technicians","operationId":"getTechnicians","security":[{"bearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"tags":["Technicians"],"summary":"Create a technician profile","operationId":"postTechnicians","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TechnicianCreateRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}":{"get":{"tags":["Technicians"],"summary":"Get a technician","operationId":"getTechniciansTechnicianId","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/update-profile-url":{"post":{"tags":["Technicians"],"summary":"Update technician profile image","operationId":"postTechniciansTechnicianIdUpdateProfileUrl","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"profileUrl":{"type":"string"}},"required":["profileUrl"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/validate-username":{"post":{"tags":["Technicians"],"summary":"Validate technician username availability","operationId":"postTechniciansValidateUsername","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"}},"required":["username"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/validate-displayname":{"post":{"tags":["Technicians"],"summary":"Validate technician display name availability","operationId":"postTechniciansValidateDisplayname","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"displayName":{"type":"string"}},"required":["displayName"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/state":{"put":{"tags":["Technicians"],"summary":"Update technician state","operationId":"putTechniciansTechnicianIdState","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string"}},"required":["state"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/level":{"put":{"tags":["Technicians"],"summary":"Update technician level","operationId":"putTechniciansTechnicianIdLevel","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"levelId":{"type":"integer"}},"required":["levelId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/availables":{"get":{"tags":["Technicians"],"summary":"List technician availability","operationId":"getTechniciansTechnicianIdAvailables","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"tags":["Technicians"],"summary":"Replace technician availability","operationId":"postTechniciansTechnicianIdAvailables","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TechnicianAvailabilityRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/check-availables":{"post":{"tags":["Technicians"],"summary":"Check availability and create a booking","operationId":"postTechniciansCheckAvailables","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingAvailabilityRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/work-history":{"get":{"tags":["Technicians"],"summary":"List technician work history","operationId":"getTechniciansTechnicianIdWorkHistory","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/work-notifications":{"get":{"tags":["Technicians"],"summary":"Get technician work notification count","operationId":"getTechniciansTechnicianIdWorkNotifications","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/auth/login":{"post":{"tags":["Technicians"],"summary":"Authenticate a technician","operationId":"postTechniciansAuthLogin","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"password":{"type":"string"}},"required":["username","password"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/auth/refresh-token":{"get":{"tags":["Technicians"],"summary":"Refresh technician authentication","operationId":"getTechniciansAuthRefreshToken","security":[],"parameters":[{"name":"accessToken","in":"query","required":true,"schema":{"type":"string"},"description":"Legacy access token query parameter; avoid logging or sharing this URL."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technician-profile":{"get":{"tags":["Technicians"],"summary":"Get technician profile from access token","operationId":"getTechnicianProfile","security":[],"parameters":[{"name":"accessToken","in":"query","required":true,"schema":{"type":"string"},"description":"Legacy access token query parameter; avoid logging or sharing this URL."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/auth/forgot-password":{"post":{"tags":["Technicians"],"summary":"Request a password reset OTP","operationId":"postTechniciansAuthForgotPassword","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/auth/check-mail-otp":{"post":{"tags":["Technicians"],"summary":"Validate a password reset OTP","operationId":"postTechniciansAuthCheckMailOtp","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"otp":{"type":"string"},"ref_code":{"type":"string"}},"required":["otp","ref_code"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/auth/reset-password":{"post":{"tags":["Technicians"],"summary":"Reset technician password","operationId":"postTechniciansAuthResetPassword","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"otp":{"type":"string"},"ref_code":{"type":"string"},"pass":{"type":"string"}},"required":["otp","ref_code","pass"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/change-password":{"post":{"tags":["Technicians"],"summary":"Change technician password","operationId":"postTechniciansTechnicianIdChangePassword","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"oldPassword":{"type":"string"},"newPassword":{"type":"string"}},"required":["username","oldPassword","newPassword"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/income-today":{"get":{"tags":["Technicians"],"summary":"Get technician income for today","operationId":"getTechniciansTechnicianIdIncomeToday","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/update-location":{"post":{"tags":["Technicians"],"summary":"Update technician live location","operationId":"postTechniciansTechnicianIdUpdateLocation","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/update-info":{"put":{"tags":["Technicians"],"summary":"Update technician contact and bank information","operationId":"putTechniciansTechnicianIdUpdateInfo","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"displayName":{"type":"string"},"bankName":{"type":"string"},"bankNumber":{"type":"string"},"contactInfo":{"type":"string"},"workingUrls":{"type":"array","items":{"type":"string"}}},"required":["displayName","bankName","bankNumber","contactInfo"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/create-noti-token":{"post":{"tags":["Technicians"],"summary":"Save technician notification token","operationId":"postTechniciansTechnicianIdCreateNotiToken","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"notiToken":{"type":"string"}},"required":["notiToken"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/open-shop":{"post":{"tags":["Technicians"],"summary":"Open technician shop","operationId":"postTechniciansTechnicianIdOpenShop","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/close-shop":{"post":{"tags":["Technicians"],"summary":"Close technician shop","operationId":"postTechniciansTechnicianIdCloseShop","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/technicians/{technicianId}/delete-account":{"delete":{"tags":["Technicians"],"summary":"Delete technician account","operationId":"deleteTechniciansTechnicianIdDeleteAccount","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/upload":{"post":{"tags":["Uploads"],"summary":"Upload a technician image","operationId":"postUpload","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["image"],"properties":{"image":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/users/profile":{"get":{"tags":["Users"],"summary":"Get authenticated customer profile","operationId":"getUsersProfile","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/users/update-mobile":{"put":{"tags":["Users"],"summary":"Update customer mobile details","operationId":"putUsersUpdateMobile","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mobileNumber":{"type":"string"},"isConsent":{"type":"boolean"},"displayName":{"type":"string"}},"required":["mobileNumber"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/users/{userId}/create-noti-token":{"post":{"tags":["Users"],"summary":"Save customer notification token","operationId":"postUsersUserIdCreateNotiToken","security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"notiToken":{"type":"string"}},"required":["notiToken"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/users/delete-account":{"delete":{"tags":["Users"],"summary":"Delete authenticated customer account","operationId":"deleteUsersDeleteAccount","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/wallets/technicians/{technicianId}":{"get":{"tags":["Wallets"],"summary":"Get technician wallet balance","operationId":"getWalletsTechniciansTechnicianId","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/wallets/technicians":{"get":{"tags":["Wallets"],"summary":"List technician wallet entries","operationId":"getWalletsTechnicians","security":[{"bearerAuth":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/wallets/technicians/{technicianId}/history":{"get":{"tags":["Wallets"],"summary":"Get technician wallet history","operationId":"getWalletsTechniciansTechnicianIdHistory","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/wallets/{walletId}/update-status":{"put":{"tags":["Wallets"],"summary":"Update wallet entry status","operationId":"putWalletsWalletIdUpdateStatus","security":[{"bearerAuth":[]}],"parameters":[{"name":"walletId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/wallets/technicians/{technicianId}/withdraw":{"post":{"tags":["Wallets"],"summary":"Request a technician withdrawal","operationId":"postWalletsTechniciansTechnicianIdWithdraw","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number"}},"required":["amount"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/wallets/technicians/{technicianId}/report":{"get":{"tags":["Wallets"],"summary":"Get technician wallet report","operationId":"getWalletsTechniciansTechnicianIdReport","security":[{"bearerAuth":[]}],"parameters":[{"name":"technicianId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnyJson"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"opaque token"}},"schemas":{"AnyJson":{"oneOf":[{"type":"object","additionalProperties":true},{"type":"array","items":{}},{"type":"string"}]},"Error":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean","example":false},"message":{"type":"string"}}},"ChillPayBackgroundRequest":{"type":"object","required":["TransactionId","Amount","OrderNo","PaymentStatus","Currency","MerchantCode","RouteNo","CheckSum"],"properties":{"TransactionId":{"type":"string"},"Amount":{"type":"string"},"OrderNo":{"type":"string"},"CustomerId":{"type":"string"},"BankCode":{"type":"string"},"PaymentDate":{"type":"string"},"PaymentStatus":{"type":"string"},"BankRefCode":{"type":"string"},"CurrentDate":{"type":"string"},"CurrentTime":{"type":"string"},"PaymentDescription":{"type":"string"},"CreditCardToken":{"type":"string"},"Currency":{"type":"string"},"CustomerName":{"type":"string"},"MerchantCode":{"type":"string"},"RouteNo":{"type":"string"},"RefundedAmount":{"type":"string"},"Remarks":{"type":"string"},"CheckSum":{"type":"string"}}},"TechnicianCreateRequest":{"type":"object","required":["username","password","displayName","titleName","firstName","lastName","email","idCard","nationality","typeId","levelId","documents"],"properties":{"username":{"type":"string"},"password":{"type":"string","format":"password","writeOnly":true},"displayName":{"type":"string"},"titleName":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email"},"idCard":{"type":"string"},"nationality":{"type":"string"},"typeId":{"type":"integer"},"levelId":{"type":"integer"},"documents":{"type":"object","required":["certificateUrl","workingUrls","profileUrl"],"properties":{"idCardUrl":{"type":"string","format":"uri"},"certificateUrl":{"type":"string","format":"uri"},"workingUrls":{"type":"array","items":{"type":"string","format":"uri"}},"profileUrl":{"type":"string","format":"uri"}}},"bank":{"type":"object","properties":{"name":{"type":"string"},"number":{"type":"string"}}},"facilities":{"type":"array","items":{"type":"integer"}},"additionals":{"type":"array","items":{"type":"integer"}}}},"TechnicianAvailabilityRequest":{"type":"array","items":{"type":"object","required":["date","all"],"properties":{"date":{"type":"string","format":"date"},"all":{"type":"array","items":{"type":"object","properties":{"isShop":{"type":"boolean"},"available":{"type":"boolean"},"time":{"type":"string"}}}}}}},"BookingAvailabilityRequest":{"type":"object","required":["technicianId","userId","userAddress","userLatitude","userLongitude","userPhone","serviceOption","time","date","price","tax","total"],"properties":{"technicianId":{"type":"integer"},"userId":{"type":"integer"},"userAddress":{"type":"string"},"userLatitude":{"type":"number"},"userLongitude":{"type":"number"},"userPhone":{"type":"string"},"serviceOption":{"type":"string","enum":["store","delivery"]},"time":{"type":"string"},"date":{"type":"string","format":"date"},"price":{"type":"number"},"tax":{"type":"number"},"total":{"type":"number"}}}},"responses":{"BadRequest":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Missing or invalid authentication","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Conflict":{"description":"Request conflicts with current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Server or dependency error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}