{"openapi":"3.0.0","info":{"title":"Rheba API","version":"1.0.0","description":"OpenAPI documentation for Rheba API"},"paths":{"/api/auth/confirmEmail":{"post":{"summary":"Confirm a user's email using a token","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"}}}}}},"responses":{"200":{"description":"Email confirmation result"},"500":{"description":"Server error"}}}},"/api/auth/confirmEmailToken":{"post":{"summary":"Validate an email confirmation token","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"}}}}}},"responses":{"200":{"description":"Token validation result"},"400":{"description":"Invalid token"},"500":{"description":"Server error"}}}},"/api/auth/newUser":{"post":{"summary":"Create a new user account","tags":["Auth"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized"},"500":{"description":"Server error"}}}},"/api/auth/resendConfirmEmail":{"post":{"summary":"Resend the email confirmation link","tags":["Auth"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized"},"500":{"description":"Server error"}}}},"/api/docs":{"get":{"summary":"Return the OpenAPI specification JSON","tags":["Docs"],"responses":{"200":{"description":"OpenAPI specification"}}}},"/api/getByCityId":{"get":{"summary":"Get city info by city ID","tags":["City"],"parameters":[{"in":"query","name":"cityId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"City data returned"},"500":{"description":"Server error"}}}},"/api/getInfoAboutUserPublic":{"get":{"summary":"Get public info about a user by name","tags":["User"],"parameters":[{"in":"query","name":"userName","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"User info returned"},"404":{"description":"User not found"},"500":{"description":"Server error"}}}},"/api/login":{"post":{"summary":"Authenticate a user and return an access token","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"type":"string","description":"User email address"},"password":{"type":"string"}}}}}},"responses":{"200":{"description":"Authentication result (false if credentials invalid)"},"500":{"description":"Server error"}}}},"/api/notifications/register":{"post":{"summary":"Register an Expo push token for a user's device","tags":["Notifications"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["userId","expoPushToken","platform"],"properties":{"userId":{"type":"string"},"expoPushToken":{"type":"string","description":"Expo push token (e.g. ExponentPushToken[xxx])"},"platform":{"type":"string","enum":["ios","android"]}}}}}},"responses":{"200":{"description":"Token registered"},"400":{"description":"Missing or invalid fields"},"401":{"description":"Unauthorized"},"500":{"description":"Server error"}}}},"/api/notifications/send":{"post":{"summary":"Send email and/or SMS notifications for a given notification type","tags":["Notifications"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type","channel"],"properties":{"type":{"type":"string","enum":["verification","reminder","complete","completeWeekly","review","comment"]},"channel":{"type":"string","enum":["email","sms","both"]}}}}}},"responses":{"200":{"description":"Notifications sent"},"400":{"description":"Invalid type or channel"},"401":{"description":"Unauthorized"},"500":{"description":"Server error"}}}},"/api/notifications/unregister":{"post":{"summary":"Remove an Expo push token (called on sign-out)","tags":["Notifications"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["userId","expoPushToken"],"properties":{"userId":{"type":"string"},"expoPushToken":{"type":"string"}}}}}},"responses":{"200":{"description":"Token removed"},"401":{"description":"Unauthorized"},"500":{"description":"Server error"}}}},"/api/passwordReset":{"post":{"summary":"Reset a user's password using a reset token","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string"},"passwordResetToken":{"type":"string"}}}}}},"responses":{"200":{"description":"Password reset successfully"},"500":{"description":"Server error"}}}},"/api/spatial/addressSearch":{"get":{"summary":"Search for addresses using Photon geocoding service","tags":["Spatial"],"parameters":[{"in":"query","name":"q","required":true,"schema":{"type":"string"},"description":"Address search query (minimum 3 characters)"}],"responses":{"200":{"description":"List of matching addresses"},"400":{"description":"Query too short"},"500":{"description":"Server error"},"503":{"description":"Address search not configured"},"504":{"description":"Address search timed out"}}}},"/api/spatial/getCityByZip":{"post":{"summary":"Get city data by zip code","tags":["Spatial"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized"},"500":{"description":"Server error"}}}},"/api/user":{"post":{"summary":"Create a new user account","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password","firstName","lastName","signUpDateString","signUpDateTimeString"],"properties":{"email":{"type":"string"},"password":{"type":"string","minLength":8},"firstName":{"type":"string"},"lastName":{"type":"string"},"signUpDateString":{"type":"string"},"signUpDateTimeString":{"type":"string"}}}}}},"responses":{"200":{"description":"User created successfully"},"400":{"description":"Validation error"},"409":{"description":"User already exists"},"429":{"description":"Rate limited"},"500":{"description":"Server error"}}}},"/api/validateToken":{"post":{"summary":"Validate a password reset token","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["token"],"properties":{"token":{"type":"string"}}}}}},"responses":{"200":{"description":"Token validation result"},"500":{"description":"Server error"}}}}},"components":{"schemas":{"InvoiceEditProps":{"type":"object","required":["RetirementCommunity","Entertainer","DueDate","DateForInvoice","ContactID","InvoiceID","LineItemID","BookingID","Price"],"properties":{"RetirementCommunity":{"type":"string"},"Entertainer":{"type":"string"},"DueDate":{"type":"string","format":"date"},"DateForInvoice":{"type":"string"},"ContactID":{"type":"string"},"InvoiceID":{"type":"string"},"LineItemID":{"type":"string"},"BookingID":{"type":"string"},"RProcessing":{"type":"boolean"},"Price":{"type":"number"}}}}},"tags":[]}