{"openapi":"3.0.0","paths":{"/v1/auth/health":{"get":{"operationId":"AuthController_getHealth_v1","parameters":[],"responses":{"200":{"description":""}},"summary":"Auth module health check","tags":["Auth"]}},"/v1/auth/register":{"post":{"operationId":"AuthController_register_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":""}},"summary":"Register a new user and create a session","tags":["Auth"]}},"/v1/auth/login":{"post":{"operationId":"AuthController_login_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"401":{"description":"Invalid credentials."}},"summary":"Login with email and password","tags":["Auth"]}},"/v1/auth/refresh":{"post":{"operationId":"AuthController_refresh_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenDto"}}}},"responses":{"401":{"description":"Invalid refresh token."}},"summary":"Rotate refresh token and get a new access token","tags":["Auth"]}},"/v1/auth/me":{"get":{"operationId":"AuthController_getMe_v1","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get the currently authenticated user","tags":["Auth"]}},"/v1/auth/sessions":{"get":{"operationId":"AuthController_getSessions_v1","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List sessions for the current user","tags":["Auth"]}},"/v1/auth/sessions/{sessionId}":{"delete":{"operationId":"AuthController_revokeSession_v1","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"example":12,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Revoke a specific session","tags":["Auth"]}},"/v1/auth/logout":{"post":{"operationId":"AuthController_logout_v1","parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeSessionDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Logout the current session","tags":["Auth"]}},"/v1/auth/logout-all":{"post":{"operationId":"AuthController_logoutAll_v1","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Logout every active session for the current user","tags":["Auth"]}},"/v1/auth/verify-email/request":{"post":{"operationId":"AuthController_requestEmailVerification_v1","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a new email verification token","tags":["Auth"]}},"/v1/auth/verify-email/confirm":{"post":{"operationId":"AuthController_verifyEmail_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailDto"}}}},"responses":{"201":{"description":""}},"summary":"Verify email with token","tags":["Auth"]}},"/v1/auth/password-reset/request":{"post":{"operationId":"AuthController_requestPasswordReset_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestPasswordResetDto"}}}},"responses":{"201":{"description":""}},"summary":"Request password reset token","tags":["Auth"]}},"/v1/auth/password-reset/confirm":{"post":{"operationId":"AuthController_resetPassword_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordDto"}}}},"responses":{"201":{"description":""}},"summary":"Reset password with token","tags":["Auth"]}},"/v1/users":{"get":{"operationId":"UsersController_findAll_v1","parameters":[],"responses":{"200":{"description":""}},"summary":"List public-safe users","tags":["Users"]}},"/v1/profiles/{username}":{"get":{"operationId":"ProfilesController_getByUsername_v1","parameters":[{"name":"username","required":true,"in":"path","schema":{"example":"alice","type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get a profile by username","tags":["Profiles"]}},"/v1/posts":{"post":{"operationId":"PostsController_list_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPostsFilterDto"}}}},"responses":{"201":{"description":""}},"summary":"List posts with optional filter payload","tags":["Posts"]}},"/v1/posts/gossip-cauldron":{"get":{"operationId":"PostsController_listGossipCauldron_v1","parameters":[],"responses":{"200":{"description":""}},"summary":"List text-only gossip cauldron posts","tags":["Posts"]}},"/v1/posts/create":{"post":{"operationId":"PostsController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a post. Gossip cauldron posts are text-only.","tags":["Posts"]}},"/v1/posts/{id}":{"get":{"operationId":"PostsController_getById_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Get a post by ID","tags":["Posts"]}},"/v1/comments/post/{postId}":{"get":{"operationId":"CommentsController_listByPost_v1","parameters":[{"name":"postId","required":true,"in":"path","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List comments for a post","tags":["Comments"]}},"/v1/likes/posts/{postId}":{"get":{"operationId":"LikesController_listPostLikes_v1","parameters":[{"name":"postId","required":true,"in":"path","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List likes for a post","tags":["Likes"]}},"/v1/likes/comments/{commentId}":{"get":{"operationId":"LikesController_listCommentLikes_v1","parameters":[{"name":"commentId","required":true,"in":"path","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List likes for a comment","tags":["Likes"]}},"/v1/follows/{userId}/followers":{"get":{"operationId":"FollowsController_listFollowers_v1","parameters":[{"name":"userId","required":true,"in":"path","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List followers for a user","tags":["Follows"]}},"/v1/follows/{userId}/following":{"get":{"operationId":"FollowsController_listFollowing_v1","parameters":[{"name":"userId","required":true,"in":"path","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List accounts a user follows","tags":["Follows"]}},"/v1/follows/requests/received":{"get":{"operationId":"FollowsController_listReceivedRequests_v1","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List follow requests received by the current user","tags":["Follows"]}},"/v1/feed":{"get":{"operationId":"FeedController_getHomeFeed_v1","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get the authenticated user home feed","tags":["Feed"]}},"/v1/media/posts/{postId}":{"get":{"operationId":"MediaController_listForPost_v1","parameters":[{"name":"postId","required":true,"in":"path","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List media items for a post","tags":["Media"]}},"/v1/notifications":{"get":{"operationId":"NotificationsController_listForCurrentUser_v1","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List notifications for the current user","tags":["Notifications"]}},"/v1/notifications/{id}/read":{"post":{"operationId":"NotificationsController_markAsRead_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"example":1,"type":"number"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Mark one notification as read","tags":["Notifications"]}},"/v1/chat/conversations":{"get":{"operationId":"ChatController_listConversations_v1","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List conversations for the current user","tags":["Chat"]}},"/v1/chat/conversations/{id}/messages":{"get":{"operationId":"ChatController_listMessages_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"example":1,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List messages for a conversation","tags":["Chat"]}},"/v1/search":{"post":{"operationId":"SearchController_search_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchQueryDto"}}}},"responses":{"201":{"description":""}},"summary":"Search across supported entities with payload","tags":["Search"]}},"/":{"get":{"operationId":"SiteController_home","parameters":[],"responses":{"200":{"description":""}},"tags":["Site"]}},"/docs":{"get":{"operationId":"SiteController_docs","parameters":[],"responses":{"200":{"description":""}},"tags":["Site"]}},"/postman/gifello-v1.postman_collection.json":{"get":{"operationId":"SiteController_downloadPostmanCollection","parameters":[],"responses":{"200":{"description":""}},"tags":["Site"]}}},"info":{"title":"Gifello API","description":"Gifello mobile and frontend integrations for the current versioned REST API.","version":"1.0","contact":{}},"tags":[],"servers":[{"url":"http://localhost:3000","description":"Local development"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Paste the access token returned by /v1/auth/login."}},"schemas":{"RegisterDto":{"type":"object","properties":{"deviceId":{"type":"string","example":"device-ios-001","description":"Stable device identifier from the mobile client."},"deviceName":{"type":"string","example":"iPhone 15 Pro","description":"User-friendly device name."},"deviceOs":{"type":"string","example":"iOS 18.1","description":"Operating system reported by the client."},"platform":{"type":"string","example":"ios","description":"Platform identifier such as ios, android, or web."},"appVersion":{"type":"string","example":"1.0.0","description":"Application version sent by the client."},"email":{"type":"string","example":"new.user@example.com"},"username":{"type":"string","example":"new_user","minLength":3,"maxLength":30},"password":{"type":"string","example":"Password123!","minLength":8},"displayName":{"type":"string","example":"New User"}},"required":["email","username","password"]},"LoginDto":{"type":"object","properties":{"deviceId":{"type":"string","example":"device-ios-001","description":"Stable device identifier from the mobile client."},"deviceName":{"type":"string","example":"iPhone 15 Pro","description":"User-friendly device name."},"deviceOs":{"type":"string","example":"iOS 18.1","description":"Operating system reported by the client."},"platform":{"type":"string","example":"ios","description":"Platform identifier such as ios, android, or web."},"appVersion":{"type":"string","example":"1.0.0","description":"Application version sent by the client."},"email":{"type":"string","example":"alice@example.com"},"password":{"type":"string","example":"Password123!","minLength":8}},"required":["email","password"]},"RefreshTokenDto":{"type":"object","properties":{"refreshToken":{"type":"string","example":"2ee18f9db4f143f8bf3bb2a8b82f4ce0d4f8deab","minLength":20}},"required":["refreshToken"]},"RevokeSessionDto":{"type":"object","properties":{"refreshToken":{"type":"string","example":"2ee18f9db4f143f8bf3bb2a8b82f4ce0d4f8deab","minLength":20}}},"VerifyEmailDto":{"type":"object","properties":{"token":{"type":"string","example":"email-verification-token"}},"required":["token"]},"RequestPasswordResetDto":{"type":"object","properties":{"email":{"type":"string","example":"alice@example.com"}},"required":["email"]},"ResetPasswordDto":{"type":"object","properties":{"token":{"type":"string","example":"reset-token-from-email"},"newPassword":{"type":"string","example":"NewPassword123!","minLength":8}},"required":["token","newPassword"]},"ListPostsFilterDto":{"type":"object","properties":{"type":{"type":"string","enum":["STANDARD","GOSSIP_CAULDRON"],"description":"Filter posts by type."}}},"CreatePostMediaDto":{"type":"object","properties":{"mediaType":{"type":"string","enum":["IMAGE","VIDEO","CAROUSEL_ITEM"],"example":"IMAGE"},"storageKey":{"type":"string","example":"posts/alice-2.jpg"},"mediaUrl":{"type":"string","example":"https://cdn.example.com/posts/alice-2.jpg"},"thumbnailUrl":{"type":"string","example":"https://cdn.example.com/posts/alice-2-thumb.jpg"},"mimeType":{"type":"string","example":"image/jpeg"},"width":{"type":"number","example":1080},"height":{"type":"number","example":1350},"durationMs":{"type":"number","example":15000},"fileSizeBytes":{"type":"number","example":248000}},"required":["mediaType","storageKey","mediaUrl"]},"CreatePostDto":{"type":"object","properties":{"type":{"type":"string","enum":["STANDARD","GOSSIP_CAULDRON"],"default":"STANDARD","example":"STANDARD"},"caption":{"type":"string","example":"Bugun ofiste olanlari anlatsam olay olur.","description":"Required for gossip cauldron posts. Optional for standard posts."},"visibility":{"type":"string","enum":["PUBLIC","FOLLOWERS_ONLY","PRIVATE"],"default":"PUBLIC"},"commentsDisabled":{"type":"boolean","default":false},"hasScent":{"type":"boolean","default":false,"description":"When true, nearby users inside the configured app radius receive a notification."},"mediaItems":{"description":"Allowed only for standard posts. Gossip cauldron posts must not include media.","type":"array","items":{"$ref":"#/components/schemas/CreatePostMediaDto"}}},"required":["caption"]},"SearchQueryDto":{"type":"object","properties":{"text":{"type":"string","example":"alice","description":"Search text used across supported entities."}}}}}}