{"openapi":"3.0.0","info":{"version":"0.0.0","title":"API"},"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","name":"session","in":"cookie"}},"schemas":{},"parameters":{}},"paths":{"/api/v1/auth/register":{"post":{"tags":["Auth"],"summary":"Register","description":"Register","requestBody":{"description":"User register","content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","pattern":"^(?!.*\\.\\.)(?!.*\\.$)[^\\W][\\w.]{0,29}$"},"password":{"type":"string","pattern":"^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["username","password","firstName","lastName"]}}}},"responses":{"201":{"description":"User registered","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["id","username","firstName","lastName"]},"session":{"type":"object","properties":{"userId":{"type":"number"},"expiresAt":{"type":"string"},"token":{"type":"string"}},"required":["userId","expiresAt","token"]}},"required":["user","session"]}},"required":["success","data"]}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Auth"],"summary":"Login","description":"Login","requestBody":{"description":"User login","content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","pattern":"^(?!.*\\.\\.)(?!.*\\.$)[^\\W][\\w.]{0,29}$"},"password":{"type":"string","pattern":"^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$"}},"required":["username","password"]}}}},"responses":{"200":{"description":"User logged in","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["id","username","firstName","lastName"]},"session":{"type":"object","properties":{"userId":{"type":"number"},"expiresAt":{"type":"string"},"token":{"type":"string"}},"required":["userId","expiresAt","token"]}},"required":["user","session"]}},"required":["success","data"]}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}}}}},"/api/v1/auth/logout":{"get":{"tags":["Auth"],"summary":"Logout","description":"Logout","responses":{"200":{"description":"User logged out","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"nullable":true}},"required":["success","data"]}}}}}}},"/api/v1/users/me":{"get":{"tags":["Users"],"summary":"Get current user","description":"Get the current user","responses":{"200":{"description":"Get user","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["id","username","firstName","lastName"]}},"required":["user"]}},"required":["success","data"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}}}}},"/api/v1/users":{"post":{"tags":["Users"],"summary":"Create user","description":"Create a new user","requestBody":{"description":"User data","content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","pattern":"^(?!.*\\.\\.)(?!.*\\.$)[^\\W][\\w.]{0,29}$"},"password":{"type":"string","pattern":"^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["username","password","firstName","lastName"]}}}},"responses":{"201":{"description":"User created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["id","username","firstName","lastName"]}},"required":["user"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}}}},"get":{"tags":["Users"],"summary":"Get all users","description":"Get all users","parameters":[{"schema":{"type":"number","nullable":true},"required":false,"name":"user_id","in":"query"},{"schema":{"type":"string"},"required":false,"name":"first_name","in":"query"},{"schema":{"type":"string"},"required":false,"name":"last_name","in":"query"},{"schema":{"type":"number","minimum":1,"default":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"number","minimum":1,"maximum":100,"default":10},"required":false,"name":"page_size","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"default":"asc"},"required":false,"name":"sorting_order","in":"query"},{"schema":{"type":"string","enum":["id","username","firstName","lastName"],"default":"id"},"required":false,"name":"sorting_field","in":"query"}],"responses":{"200":{"description":"Get all users","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["id","username","firstName","lastName"]}},"pagination":{"type":"object","properties":{"currentPage":{"type":"number"},"itemsPerPage":{"type":"number"},"totalPagesCount":{"type":"number"},"totalItemsCount":{"type":"number"}},"required":["currentPage","itemsPerPage","totalPagesCount","totalItemsCount"]}},"required":["users","pagination"]}},"required":["success","data"]}}}},"404":{"description":"No users found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}}}}},"/api/v1/users/{user_id}":{"delete":{"tags":["Users"],"summary":"Delete user","description":"Delete user by id","parameters":[{"schema":{"type":"number","nullable":true},"required":false,"name":"user_id","in":"path"}],"responses":{"200":{"description":"Delete user","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["id","username","firstName","lastName"]}},"required":["user"]}},"required":["success","data"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}}}},"get":{"tags":["Users"],"summary":"Get user","description":"Get user by id","parameters":[{"schema":{"type":"number","nullable":true},"required":false,"name":"user_id","in":"path"}],"responses":{"200":{"description":"Get user","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["id","username","firstName","lastName"]}},"required":["user"]}},"required":["success","data"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}}}},"patch":{"tags":["Users"],"summary":"Update user","description":"Update user by id","parameters":[{"schema":{"type":"number","nullable":true},"required":false,"name":"user_id","in":"path"}],"requestBody":{"description":"User data","content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","pattern":"^(?!.*\\.\\.)(?!.*\\.$)[^\\W][\\w.]{0,29}$"},"password":{"type":"string","pattern":"^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["username","password","firstName","lastName"]}}}},"responses":{"200":{"description":"User updated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["id","username","firstName","lastName"]}},"required":["user"]}},"required":["success","data"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","error"]}}}}}}}}}