diff --git a/app/(dashboard)/manage-events/new/layout.tsx b/app/(dashboard)/manage-events/new/layout.tsx new file mode 100644 index 0000000..16ea666 --- /dev/null +++ b/app/(dashboard)/manage-events/new/layout.tsx @@ -0,0 +1,12 @@ +import type { Metadata } from 'next' +import type { ReactNode } from 'react' + +import { ADMIN_PAGE_TITLES } from '@/constants/adminPageTitles' + +export const metadata: Metadata = { + title: ADMIN_PAGE_TITLES.manageEventNew, +} + +export default function Layout({ children }: { children: ReactNode }) { + return children +} diff --git a/app/(dashboard)/manage-events/new/page.tsx b/app/(dashboard)/manage-events/new/page.tsx new file mode 100644 index 0000000..c2757fb --- /dev/null +++ b/app/(dashboard)/manage-events/new/page.tsx @@ -0,0 +1,41 @@ +'use client' + +import dynamic from 'next/dynamic' +import { useSearchParams } from 'next/navigation' +import { Suspense } from 'react' + +import PageNavbar from '@/components/layouts/PageNavbar' +import { DetailSkeleton } from '@/components/feedback/LoadingState' +import { APP_ROUTES } from '@/constants/routes' +import { texts } from '@/texts' + +const EventCreateForm = dynamic(() => import('@/features/events/create/EventCreateForm'), { + ssr: false, + loading: () => , +}) + +const AdminEventCreatePageInner = () => { + const searchParams = useSearchParams() + const initialOrganizerId = searchParams.get('organizerId') + + return ( +
+ +
+ +
+
+ ) +} + +const AdminEventCreatePage = () => ( + }> + + +) + +export default AdminEventCreatePage diff --git a/app/(dashboard)/manage-events/page.tsx b/app/(dashboard)/manage-events/page.tsx index 0f80527..1cc2137 100644 --- a/app/(dashboard)/manage-events/page.tsx +++ b/app/(dashboard)/manage-events/page.tsx @@ -1,6 +1,7 @@ 'use client' import { useEffect, useMemo, useState } from 'react' +import { useRouter } from 'next/navigation' import type { PaginationListColumnType } from '@/types' import PaginatedList from '@/components/PaginatedList' @@ -77,6 +78,7 @@ const getOrganizer = (row: EventRow): EventOrganizer => { } const EventsPage = () => { + const router = useRouter() const [categoryFilterItems, setCategoryFilterItems] = useState([]) const [cityFilterItems, setCityFilterItems] = useState([]) @@ -185,8 +187,13 @@ const EventsPage = () => {
{ + router.push(APP_ROUTES.MANAGE_EVENT_NEW) + }} > {{ status: (_row, cellValue) => , diff --git a/app/(dashboard)/users/[id]/page.tsx b/app/(dashboard)/users/[id]/page.tsx index 22a4a68..9cb624b 100644 --- a/app/(dashboard)/users/[id]/page.tsx +++ b/app/(dashboard)/users/[id]/page.tsx @@ -215,7 +215,15 @@ const UserDetailPage = () => { key="hosted-events" title="رویدادهای میزبانی‌شده" > -
+
+ {detail.identityStatus === 'verified' ? ( + + ) : null} + + + + + ) +} + +export default EventCreateForm diff --git a/features/events/create/VerifiedHostPicker.tsx b/features/events/create/VerifiedHostPicker.tsx new file mode 100644 index 0000000..915f4aa --- /dev/null +++ b/features/events/create/VerifiedHostPicker.tsx @@ -0,0 +1,172 @@ +'use client' + +import { useCallback, useEffect, useState } from 'react' + +import Button from '@/components/formElements/Button' +import Input from '@/components/formElements/Input' +import Modal from '@/components/modals/Modal' +import { formatPersonName } from '@/helpers' +import { formatIranianMobile } from '@/lib/formatters' +import { getAdminUsers } from '@/api/generated/admin-users/admin-users' +import type { AdminUserListItemDto } from '@/api/generated/models' +import { unwrapApiPayload } from '@/helpers/listResponse' +import { texts } from '@/texts' + +export interface VerifiedHostOption { + id: string + firstName: string | null + lastName: string | null + mobile: string +} + +interface VerifiedHostPickerProps { + selected: VerifiedHostOption | null + onSelect: (host: VerifiedHostOption) => void +} + +const adminUsersApi = getAdminUsers() + +function toHostOption(row: AdminUserListItemDto): VerifiedHostOption { + return { + id: row.id, + firstName: row.firstName, + lastName: row.lastName, + mobile: row.mobile, + } +} + +async function searchVerifiedHosts(query: string): Promise { + const trimmed = query.trim() + const filters: Record = { userType: 'host', identityStatus: 'verified' } + + if (trimmed) { + if (/^\d+$/.test(trimmed)) { + filters.mobile = trimmed + } else if (trimmed.includes(' ')) { + const [first, ...rest] = trimmed.split(/\s+/) + + filters.firstName = first + filters.lastName = rest.join(' ') + } else { + filters.firstName = trimmed + } + } + + const response = await adminUsersApi.adminUsersControllerList({ + page: 1, + pageSize: 20, + sort: '-createdAt', + filters, + }) + const payload = unwrapApiPayload<{ items?: AdminUserListItemDto[] }>(response.data) + const items = Array.isArray(payload.items) ? payload.items : [] + + return items.map(toHostOption) +} + +const VerifiedHostPicker = ({ selected, onSelect }: VerifiedHostPickerProps) => { + const [isOpen, setIsOpen] = useState(false) + const [query, setQuery] = useState('') + const [results, setResults] = useState([]) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + + const load = useCallback(async (nextQuery: string) => { + try { + setIsLoading(true) + setError(null) + setResults(await searchVerifiedHosts(nextQuery)) + } catch { + setResults([]) + setError(texts.events.createEventHostSearchFailed) + } finally { + setIsLoading(false) + } + }, []) + + useEffect(() => { + if (!isOpen) return + + const timer = window.setTimeout(() => { + void load(query) + }, 250) + + return () => { + window.clearTimeout(timer) + } + }, [isOpen, load, query]) + + const selectedLabel = selected + ? `${formatPersonName(selected.firstName, selected.lastName)} · ${formatIranianMobile(selected.mobile)}` + : texts.events.createEventHostPickerPlaceholder + + return ( + <> + + + { + setIsOpen(false) + }} + onOpenChange={setIsOpen} + > +
+ { + setQuery(typeof value === 'string' ? value : '') + }} + /> + + {error ?

{error}

: null} + {isLoading ?

{texts.common.loadingList}

: null} + + {!isLoading && !error && results.length === 0 ? ( +

{texts.events.createEventHostSearchEmpty}

+ ) : null} + +
    + {results.map((host) => ( +
  • + +
  • + ))} +
+
+
+ + ) +} + +export default VerifiedHostPicker diff --git a/openapi.json b/openapi.json index 9b6dd1f..25513fe 100644 --- a/openapi.json +++ b/openapi.json @@ -50,9 +50,7 @@ } }, "summary": "Request SMS OTP", - "tags": [ - "Auth" - ] + "tags": ["Auth"] } }, "/api/v1/auth/verify-otp": { @@ -114,9 +112,7 @@ } }, "summary": "Verify OTP", - "tags": [ - "Auth" - ] + "tags": ["Auth"] } }, "/api/v1/auth/refresh": { @@ -157,9 +153,7 @@ } }, "summary": "Refresh JWT tokens", - "tags": [ - "Auth" - ] + "tags": ["Auth"] } }, "/api/v1/auth/logout": { @@ -225,9 +219,7 @@ } ], "summary": "Logout current session", - "tags": [ - "Auth" - ] + "tags": ["Auth"] } }, "/api/v1/auth/logout-all": { @@ -293,9 +285,7 @@ } ], "summary": "Logout all sessions", - "tags": [ - "Auth" - ] + "tags": ["Auth"] } }, "/api/v1/auth/sessions": { @@ -364,9 +354,7 @@ } ], "summary": "List active sessions", - "tags": [ - "Auth" - ] + "tags": ["Auth"] } }, "/api/v1/auth/sessions/{id}": { @@ -454,9 +442,7 @@ } ], "summary": "Revoke a session", - "tags": [ - "Auth" - ] + "tags": ["Auth"] } }, "/api/v1/internal/sentry-webhook": { @@ -492,9 +478,7 @@ } }, "summary": "Sentry → Telegram alert relay", - "tags": [ - "Ops" - ] + "tags": ["Ops"] } }, "/api/v1/internal/jibit-transaction-webhook": { @@ -539,9 +523,7 @@ } }, "summary": "Jibit account-transaction → Telegram relay", - "tags": [ - "Ops" - ] + "tags": ["Ops"] } }, "/api/v1/users/public/{id}": { @@ -575,9 +557,7 @@ } ], "summary": "Get a public user profile; host stats are included only for verified hosts", - "tags": [ - "Users" - ] + "tags": ["Users"] } }, "/api/v1/users/public/{id}/events": { @@ -645,10 +625,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -658,10 +635,7 @@ "schema": { "default": "upcoming", "type": "string", - "enum": [ - "upcoming", - "held" - ] + "enum": ["upcoming", "held"] } } ], @@ -685,10 +659,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -700,9 +671,7 @@ } ], "summary": "List discoverable events for a verified public host", - "tags": [ - "Users" - ] + "tags": ["Users"] } }, "/api/v1/users/public/{id}/viewer-state": { @@ -736,9 +705,7 @@ } ], "summary": "Get private organizer state for the current viewer", - "tags": [ - "Users" - ] + "tags": ["Users"] } }, "/api/v1/users/me": { @@ -804,9 +771,7 @@ } ], "summary": "Get current user profile", - "tags": [ - "Users" - ] + "tags": ["Users"] }, "patch": { "description": "Updates editable profile fields for the authenticated user only.", @@ -881,9 +846,7 @@ } ], "summary": "Update current user profile", - "tags": [ - "Users" - ] + "tags": ["Users"] } }, "/api/v1/users/me/profile-summary": { @@ -959,9 +922,7 @@ } ], "summary": "Get current user profile hub summary", - "tags": [ - "Users" - ] + "tags": ["Users"] } }, "/api/v1/users/{id}/attendee-contact-links": { @@ -999,9 +960,7 @@ } ], "summary": "Get attendee-only contact links for an organizer", - "tags": [ - "Users" - ] + "tags": ["Users"] } }, "/api/v1/users/me/complete-profile": { @@ -1088,9 +1047,7 @@ } ], "summary": "Complete user profile after OTP verification", - "tags": [ - "Users" - ] + "tags": ["Users"] } }, "/api/v1/admin/users": { @@ -1159,10 +1116,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -1286,10 +1240,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -1361,9 +1312,7 @@ } ], "summary": "Paginated admin users list", - "tags": [ - "Admin - Users" - ] + "tags": ["Admin - Users"] } }, "/api/v1/admin/users/{id}/mobile": { @@ -1469,9 +1418,7 @@ } ], "summary": "Change a user's login mobile (admin)", - "tags": [ - "Admin - Users" - ] + "tags": ["Admin - Users"] } }, "/api/v1/admin/users/{id}": { @@ -1578,9 +1525,7 @@ } ], "summary": "Edit a user (admin)", - "tags": [ - "Admin - Users" - ] + "tags": ["Admin - Users"] }, "get": { "description": "Staff-only: full profile, identity status, wallet balance, and a summary count for every category (hosted events, bookings, payments, reviews, follows, reports, blocks). See the dedicated sub-endpoints (hosted-events, bookings, payments, reviews, follows, reports, blocks) for the paginated lists themselves.", @@ -1673,9 +1618,7 @@ } ], "summary": "Full user detail for admin", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/users/me/contact-links": { @@ -1703,9 +1646,7 @@ } ], "summary": "Current user's contact links (unpaginated)", - "tags": [ - "users" - ] + "tags": ["users"] }, "post": { "operationId": "UserContactLinksController_create", @@ -1738,9 +1679,7 @@ } ], "summary": "Add a contact link for the current user", - "tags": [ - "users" - ] + "tags": ["users"] } }, "/api/v1/users/me/contact-links/{id}": { @@ -1784,9 +1723,7 @@ } ], "summary": "Update a contact link owned by the current user", - "tags": [ - "users" - ] + "tags": ["users"] }, "delete": { "operationId": "UserContactLinksController_remove", @@ -1818,9 +1755,7 @@ } ], "summary": "Remove a contact link owned by the current user", - "tags": [ - "users" - ] + "tags": ["users"] } }, "/api/v1/identity/rejection-reasons": { @@ -1864,9 +1799,7 @@ } }, "summary": "List active identity rejection reasons", - "tags": [ - "Identity" - ] + "tags": ["Identity"] } }, "/api/v1/identity/verifications/request-otp": { @@ -1962,9 +1895,7 @@ } ], "summary": "Request OTP to confirm host cooperation contract", - "tags": [ - "Identity" - ] + "tags": ["Identity"] } }, "/api/v1/identity/verifications/confirm-otp": { @@ -2050,9 +1981,7 @@ } ], "summary": "Confirm host-contract OTP and submit identity verification", - "tags": [ - "Identity" - ] + "tags": ["Identity"] } }, "/api/v1/identity/verifications/me": { @@ -2121,9 +2050,7 @@ } ], "summary": "List my identity verification submissions", - "tags": [ - "Identity" - ] + "tags": ["Identity"] } }, "/api/v1/admin/identity/verifications": { @@ -2185,10 +2112,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -2232,10 +2156,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -2307,9 +2228,7 @@ } ], "summary": "List identity verification review queue", - "tags": [ - "Admin - Identity" - ] + "tags": ["Admin - Identity"] } }, "/api/v1/admin/identity/verifications/{id}/jibit-inquiry": { @@ -2407,9 +2326,7 @@ } ], "summary": "Run Jibit national-code/mobile matching inquiry", - "tags": [ - "Admin - Identity" - ] + "tags": ["Admin - Identity"] } }, "/api/v1/admin/identity/verifications/{id}/approve": { @@ -2507,9 +2424,7 @@ } ], "summary": "Approve identity verification", - "tags": [ - "Admin - Identity" - ] + "tags": ["Admin - Identity"] } }, "/api/v1/admin/identity/verifications/{id}/reject": { @@ -2618,9 +2533,7 @@ } ], "summary": "Reject identity verification", - "tags": [ - "Admin - Identity" - ] + "tags": ["Admin - Identity"] } }, "/api/v1/notifications/me": { @@ -2682,10 +2595,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -2719,10 +2629,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -2774,9 +2681,7 @@ } ], "summary": "List my in-app notifications", - "tags": [ - "Notifications" - ] + "tags": ["Notifications"] } }, "/api/v1/notifications/me/unread-count": { @@ -2842,9 +2747,7 @@ } ], "summary": "Get unread in-app notification count", - "tags": [ - "Notifications" - ] + "tags": ["Notifications"] } }, "/api/v1/notifications/me/read-all": { @@ -2910,9 +2813,7 @@ } ], "summary": "Mark all my in-app notifications as read", - "tags": [ - "Notifications" - ] + "tags": ["Notifications"] } }, "/api/v1/notifications/{id}/read": { @@ -2999,9 +2900,7 @@ } ], "summary": "Mark an in-app notification as read", - "tags": [ - "Notifications" - ] + "tags": ["Notifications"] } }, "/api/v1/notifications/push/vapid-public-key": { @@ -3067,9 +2966,7 @@ } ], "summary": "Get VAPID public key for Web Push subscription", - "tags": [ - "Notifications" - ] + "tags": ["Notifications"] } }, "/api/v1/notifications/push/deliveries/receipt": { @@ -3155,9 +3052,7 @@ } ], "summary": "Record a browser Web Push receipt event", - "tags": [ - "Notifications" - ] + "tags": ["Notifications"] } }, "/api/v1/notifications/push/subscribe": { @@ -3246,9 +3141,7 @@ } ], "summary": "Register a browser Web Push subscription", - "tags": [ - "Notifications" - ] + "tags": ["Notifications"] }, "delete": { "description": "Called on logout to stop push delivery to all user devices.", @@ -3315,9 +3208,7 @@ } ], "summary": "Remove all Web Push subscriptions for current user", - "tags": [ - "Notifications" - ] + "tags": ["Notifications"] } }, "/api/v1/notifications/push/subscribe/{id}": { @@ -3405,9 +3296,7 @@ } ], "summary": "Remove a browser Web Push subscription", - "tags": [ - "Notifications" - ] + "tags": ["Notifications"] } }, "/api/v1/admin/sms-messages": { @@ -3469,10 +3358,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -3526,10 +3412,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -3601,9 +3484,7 @@ } ], "summary": "List SMS delivery records", - "tags": [ - "Admin - Notifications" - ] + "tags": ["Admin - Notifications"] } }, "/api/v1/admin/notification-rules": { @@ -3631,9 +3512,7 @@ } ], "summary": "List admin-managed notification rules", - "tags": [ - "Admin - Notification Rules" - ] + "tags": ["Admin - Notification Rules"] } }, "/api/v1/admin/notification-rules/{eventKey}": { @@ -3677,9 +3556,7 @@ } ], "summary": "Update delivery and templates for a notification event", - "tags": [ - "Admin - Notification Rules" - ] + "tags": ["Admin - Notification Rules"] } }, "/api/v1/admin/manual-notifications/request-otp": { @@ -3765,9 +3642,7 @@ } ], "summary": "Request OTP before sending a group SMS", - "tags": [ - "Admin - Notifications" - ] + "tags": ["Admin - Notifications"] } }, "/api/v1/admin/manual-notifications": { @@ -3863,9 +3738,7 @@ } ], "summary": "Send a manual notification to selected users", - "tags": [ - "Admin - Notifications" - ] + "tags": ["Admin - Notifications"] } }, "/api/v1/admin/in-app-notifications": { @@ -3927,10 +3800,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -3994,10 +3864,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -4069,9 +3936,7 @@ } ], "summary": "List in-app notifications", - "tags": [ - "Admin - Notifications" - ] + "tags": ["Admin - Notifications"] } }, "/api/v1/admin/push-deliveries": { @@ -4133,10 +3998,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -4200,10 +4062,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -4275,9 +4134,7 @@ } ], "summary": "List Web Push delivery records", - "tags": [ - "Admin - Notifications" - ] + "tags": ["Admin - Notifications"] } }, "/api/v1/event-categories": { @@ -4300,9 +4157,7 @@ } }, "summary": "Active event categories (flat list, unpaginated)", - "tags": [ - "Event Categories" - ] + "tags": ["Event Categories"] } }, "/api/v1/event-categories/{slug}": { @@ -4331,9 +4186,7 @@ } }, "summary": "Single active category by slug", - "tags": [ - "Event Categories" - ] + "tags": ["Event Categories"] } }, "/api/v1/admin/event-categories/flat": { @@ -4361,9 +4214,7 @@ } ], "summary": "Flat list of all categories for admin filters", - "tags": [ - "Admin - Event Categories" - ] + "tags": ["Admin - Event Categories"] } }, "/api/v1/admin/event-categories": { @@ -4422,10 +4273,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -4449,10 +4297,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -4464,9 +4309,7 @@ } ], "summary": "Paginated category management list", - "tags": [ - "Admin - Event Categories" - ] + "tags": ["Admin - Event Categories"] }, "post": { "operationId": "AdminEventCategoriesController_create", @@ -4499,9 +4342,7 @@ } ], "summary": "Create event category", - "tags": [ - "Admin - Event Categories" - ] + "tags": ["Admin - Event Categories"] } }, "/api/v1/admin/event-categories/{id}": { @@ -4545,9 +4386,7 @@ } ], "summary": "Update event category", - "tags": [ - "Admin - Event Categories" - ] + "tags": ["Admin - Event Categories"] }, "delete": { "operationId": "AdminEventCategoriesController_remove", @@ -4579,9 +4418,7 @@ } ], "summary": "Soft-delete event category", - "tags": [ - "Admin - Event Categories" - ] + "tags": ["Admin - Event Categories"] } }, "/api/v1/geography/provinces": { @@ -4604,9 +4441,7 @@ } }, "summary": "List all provinces (unpaginated)", - "tags": [ - "Geography" - ] + "tags": ["Geography"] } }, "/api/v1/geography/cities": { @@ -4629,9 +4464,7 @@ } }, "summary": "List all cities (unpaginated, flat)", - "tags": [ - "Geography" - ] + "tags": ["Geography"] } }, "/api/v1/geography/provinces/{provinceId}/cities": { @@ -4663,9 +4496,7 @@ } }, "summary": "List cities in a province (unpaginated)", - "tags": [ - "Geography" - ] + "tags": ["Geography"] } }, "/api/v1/geography/cities/{slug}": { @@ -4694,9 +4525,7 @@ } }, "summary": "Single city by slug (SEO city landing pages)", - "tags": [ - "Geography" - ] + "tags": ["Geography"] } }, "/api/v1/my-events": { @@ -4756,10 +4585,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -4769,10 +4595,7 @@ "schema": { "default": "guest", "type": "string", - "enum": [ - "guest", - "host" - ] + "enum": ["guest", "host"] } }, { @@ -4782,14 +4605,7 @@ "schema": { "default": "upcoming", "type": "string", - "enum": [ - "upcoming", - "held", - "cancelled", - "pending_review", - "published", - "rejected" - ] + "enum": ["upcoming", "held", "cancelled", "pending_review", "published", "rejected"] } } ], @@ -4800,32 +4616,15 @@ "application/json": { "schema": { "type": "object", - "required": [ - "role", - "status", - "canHost", - "availableRoles", - "items", - "response" - ], + "required": ["role", "status", "canHost", "availableRoles", "items", "response"], "properties": { "role": { "type": "string", - "enum": [ - "guest", - "host" - ] + "enum": ["guest", "host"] }, "status": { "type": "string", - "enum": [ - "upcoming", - "held", - "cancelled", - "pending_review", - "published", - "rejected" - ] + "enum": ["upcoming", "held", "cancelled", "pending_review", "published", "rejected"] }, "canHost": { "type": "boolean" @@ -4834,10 +4633,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "guest", - "host" - ] + "enum": ["guest", "host"] } }, "items": { @@ -4868,9 +4664,7 @@ } ], "summary": "List the current user’s guest or hosted events by lifecycle", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{eventId}/revisions": { @@ -4914,9 +4708,7 @@ } ], "summary": "Submit a pending revision for a published/full event (admin must re-approve before changes go live)", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{eventId}/revisions/pending": { @@ -4950,9 +4742,7 @@ } ], "summary": "Get the current pending revision for own live event", - "tags": [ - "My Events" - ] + "tags": ["My Events"] }, "delete": { "operationId": "EventRevisionsController_withdraw", @@ -4986,9 +4776,7 @@ } ], "summary": "Withdraw the pending revision for own live event", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events": { @@ -5023,9 +4811,7 @@ } ], "summary": "Create a draft event (verified host)", - "tags": [ - "My Events" - ] + "tags": ["My Events"] }, "get": { "operationId": "EventsController_discovery", @@ -5086,10 +4872,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -5113,19 +4896,14 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } } }, "summary": "Public event discovery list", - "tags": [ - "Events" - ] + "tags": ["Events"] } }, "/api/v1/events/mine": { @@ -5188,10 +4966,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -5215,10 +4990,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -5230,9 +5002,7 @@ } ], "summary": "Organizer's own events", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{id}/for-edit": { @@ -5267,9 +5037,7 @@ } ], "summary": "Full event payload for edit/clone forms", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{id}/owner-insights": { @@ -5303,9 +5071,7 @@ } ], "summary": "Get engagement insights for own event", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{id}/management-bootstrap": { @@ -5339,9 +5105,7 @@ } ], "summary": "Get all initial data for managing an owned event", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{id}/attendees": { @@ -5408,10 +5172,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -5453,10 +5214,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -5468,9 +5226,7 @@ } ], "summary": "Search and list registrations for own event attendance desk", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{id}/reserved-capacity": { @@ -5515,9 +5271,7 @@ } ], "summary": "Set off-platform reserved seat count for own event", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{id}": { @@ -5561,9 +5315,7 @@ } ], "summary": "Update own event", - "tags": [ - "My Events" - ] + "tags": ["My Events"] }, "delete": { "operationId": "MyEventsController_softDelete", @@ -5595,9 +5347,7 @@ } ], "summary": "Soft-delete own event when it has no active bookings (booked_count = 0)", - "tags": [ - "My Events" - ] + "tags": ["My Events"] }, "get": { "operationId": "EventsController_findOne", @@ -5624,9 +5374,7 @@ } }, "summary": "Single event detail", - "tags": [ - "Events" - ] + "tags": ["Events"] } }, "/api/v1/events/{id}/publish": { @@ -5660,9 +5408,7 @@ } ], "summary": "Publish draft event", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{id}/cancel": { @@ -5696,9 +5442,7 @@ } ], "summary": "Cancel published/full event", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{id}/complete": { @@ -5732,9 +5476,7 @@ } ], "summary": "Mark event completed (creates group chat)", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/{id}/clone": { @@ -5768,9 +5510,7 @@ } ], "summary": "Clone event to new draft", - "tags": [ - "My Events" - ] + "tags": ["My Events"] } }, "/api/v1/events/bookmarks": { @@ -5829,10 +5569,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -5856,10 +5593,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -5871,9 +5605,7 @@ } ], "summary": "List events bookmarked by current user", - "tags": [ - "Event Bookmarks" - ] + "tags": ["Event Bookmarks"] } }, "/api/v1/events/bookmarks/status": { @@ -5908,9 +5640,7 @@ } ], "summary": "Get bookmark status for a batch of events", - "tags": [ - "Event Bookmarks" - ] + "tags": ["Event Bookmarks"] } }, "/api/v1/events/{id}/bookmark": { @@ -5944,9 +5674,7 @@ } ], "summary": "Get bookmark status for current user", - "tags": [ - "Event Bookmarks" - ] + "tags": ["Event Bookmarks"] }, "post": { "operationId": "EventBookmarksController_bookmark", @@ -5978,9 +5706,7 @@ } ], "summary": "Bookmark an event", - "tags": [ - "Event Bookmarks" - ] + "tags": ["Event Bookmarks"] }, "delete": { "operationId": "EventBookmarksController_remove", @@ -6012,9 +5738,7 @@ } ], "summary": "Remove an event bookmark", - "tags": [ - "Event Bookmarks" - ] + "tags": ["Event Bookmarks"] } }, "/api/v1/events/by-slug/{slug}/bootstrap": { @@ -6043,9 +5767,7 @@ } }, "summary": "Public event landing bootstrap payload", - "tags": [ - "Events" - ] + "tags": ["Events"] } }, "/api/v1/events/by-slug/{slug}": { @@ -6074,9 +5796,7 @@ } }, "summary": "Single discoverable event by slug (SEO event landing page)", - "tags": [ - "Events" - ] + "tags": ["Events"] } }, "/api/v1/events/{id}/viewer-state": { @@ -6105,9 +5825,7 @@ } }, "summary": "Authenticated viewer state for an event landing", - "tags": [ - "Events" - ] + "tags": ["Events"] } }, "/api/v1/admin/events/{eventId}/revisions/pending": { @@ -6141,9 +5859,7 @@ } ], "summary": "Get pending revision for any live event", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{eventId}/revisions/{revisionId}/approve": { @@ -6185,9 +5901,7 @@ } ], "summary": "Approve a pending revision and apply it to the live event immediately (no host confirm)", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{eventId}/revisions/{revisionId}/reject": { @@ -6239,9 +5953,7 @@ } ], "summary": "Reject a pending revision; live event content stays unchanged", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events": { @@ -6304,10 +6016,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -6331,10 +6040,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -6346,9 +6052,41 @@ } ], "summary": "Paginated admin events list", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] + }, + "post": { + "description": "Requires a verified host `organizerId`. Creates a draft with `admin_approved_at` set so the host can publish immediately; does not publish. Notifies the host (SMS + in-app) via `event_created_by_admin`.", + "operationId": "AdminEventsController_create", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminCreateEventDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EventResponseDto" + } + } + } + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "Create a pre-approved draft event for a verified host", + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{id}": { @@ -6382,9 +6120,7 @@ } ], "summary": "Admin event detail including bookmark count", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] }, "patch": { "operationId": "AdminEventsController_update", @@ -6426,9 +6162,7 @@ } ], "summary": "Update any event as admin (same field locks as host edit)", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] }, "delete": { "operationId": "AdminEventsController_softDelete", @@ -6460,9 +6194,7 @@ } ], "summary": "Soft-delete any event as admin when it has no active bookings (booked_count = 0)", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{id}/reserved-capacity": { @@ -6506,9 +6238,7 @@ } ], "summary": "Set off-platform reserved seat count as admin", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{id}/commission": { @@ -6553,9 +6283,7 @@ } ], "summary": "Set or clear this event’s platform commission override", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{id}/insights": { @@ -6589,9 +6317,7 @@ } ], "summary": "Get engagement insights for any event as admin", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{id}/approve": { @@ -6625,9 +6351,7 @@ } ], "summary": "Approve a draft or pending-review event; publishes once the host has also requested publication", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{id}/publish": { @@ -6661,9 +6385,7 @@ } ], "summary": "Force-publish any organizer’s draft or pending-review event as admin, bypassing the request/approve flow entirely", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{id}/reject": { @@ -6707,9 +6429,7 @@ } ], "summary": "Reject a pending-review event with a reason", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{id}/cancel": { @@ -6743,9 +6463,7 @@ } ], "summary": "Cancel any organizer’s published/full event as admin", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/admin/events/{id}/complete": { @@ -6779,9 +6497,7 @@ } ], "summary": "Mark any organizer’s event completed as admin", - "tags": [ - "Admin - Events" - ] + "tags": ["Admin - Events"] } }, "/api/v1/discovery/cities": { @@ -6804,9 +6520,7 @@ } }, "summary": "Cached city list for discovery/home", - "tags": [ - "Events" - ] + "tags": ["Events"] } }, "/api/v1/discovery/categories": { @@ -6829,9 +6543,7 @@ } }, "summary": "Cached active category tree summary for discovery/home", - "tags": [ - "Events" - ] + "tags": ["Events"] } }, "/api/v1/discovery/home-feed": { @@ -6861,9 +6573,7 @@ } }, "summary": "Home page event sections (popular, category previews, city previews)", - "tags": [ - "Events" - ] + "tags": ["Events"] } }, "/api/v1/discovery/bootstrap": { @@ -6884,9 +6594,7 @@ } }, "summary": "Legacy combined reference data for event discovery", - "tags": [ - "Events" - ] + "tags": ["Events"] } }, "/api/v1/organizers/me/following": { @@ -6947,10 +6655,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -6983,10 +6688,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -6998,9 +6700,7 @@ } ], "summary": "Get organizers followed by current user", - "tags": [ - "Organizer Follows" - ] + "tags": ["Organizer Follows"] } }, "/api/v1/organizers/me/following/events": { @@ -7061,10 +6761,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -7088,10 +6785,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -7103,9 +6797,7 @@ } ], "summary": "Get upcoming events from followed organizers", - "tags": [ - "Organizer Follows" - ] + "tags": ["Organizer Follows"] } }, "/api/v1/organizers/me/followers": { @@ -7166,10 +6858,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -7193,10 +6882,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -7208,9 +6894,7 @@ } ], "summary": "Get followers of the current user (as organizer)", - "tags": [ - "Organizer Follows" - ] + "tags": ["Organizer Follows"] } }, "/api/v1/organizers/{organizerId}/follow": { @@ -7306,9 +6990,7 @@ } ], "summary": "Follow an organizer", - "tags": [ - "Organizer Follows" - ] + "tags": ["Organizer Follows"] }, "delete": { "operationId": "OrganizerFollowsController_unfollow", @@ -7392,9 +7074,7 @@ } ], "summary": "Unfollow an organizer", - "tags": [ - "Organizer Follows" - ] + "tags": ["Organizer Follows"] } }, "/api/v1/organizers/{organizerId}/followers": { @@ -7465,10 +7145,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -7492,19 +7169,14 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } } }, "summary": "Get followers of an organizer", - "tags": [ - "Organizer Follows" - ] + "tags": ["Organizer Follows"] } }, "/api/v1/organizers/{organizerId}/is-following": { @@ -7546,9 +7218,7 @@ } ], "summary": "Check if current user is following an organizer", - "tags": [ - "Organizer Follows" - ] + "tags": ["Organizer Follows"] } }, "/api/v1/organizers/{organizerId}/follow-settings": { @@ -7594,9 +7264,7 @@ } ], "summary": "Update follow notification settings", - "tags": [ - "Organizer Follows" - ] + "tags": ["Organizer Follows"] } }, "/api/v1/events/{eventId}/media": { @@ -7628,9 +7296,7 @@ } }, "summary": "List media for an event (unpaginated)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] }, "post": { "operationId": "EventMediaController_create", @@ -7672,9 +7338,7 @@ } ], "summary": "Add media to own event (or any event as admin)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/media/{id}": { @@ -7726,9 +7390,7 @@ } ], "summary": "Update event media (owner or admin)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] }, "delete": { "operationId": "EventMediaController_remove", @@ -7768,9 +7430,7 @@ } ], "summary": "Remove event media (owner or admin)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/faqs": { @@ -7802,9 +7462,7 @@ } }, "summary": "List FAQs for an event (unpaginated)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] }, "post": { "operationId": "EventFaqsController_create", @@ -7846,9 +7504,7 @@ } ], "summary": "Add FAQ to own event (or any event as admin)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/faqs/page": { @@ -7915,10 +7571,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -7942,19 +7595,14 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } } }, "summary": "Paginated FAQs for an event", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/faqs/{id}": { @@ -8006,9 +7654,7 @@ } ], "summary": "Update event FAQ (owner or admin)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] }, "delete": { "operationId": "EventFaqsController_remove", @@ -8048,9 +7694,7 @@ } ], "summary": "Remove event FAQ (owner or admin)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/organizer-guest-lists/previous-attendees": { @@ -8078,9 +7722,7 @@ } ], "summary": "Organizer's deduplicated checked-in attendees", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/organizer-guest-lists": { @@ -8139,10 +7781,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -8166,10 +7805,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -8181,9 +7817,7 @@ } ], "summary": "Organizer's own guest lists (paginated)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] }, "post": { "operationId": "OrganizerGuestListsController_create", @@ -8216,9 +7850,7 @@ } ], "summary": "Create a guest list", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/organizer-guest-lists/{id}": { @@ -8253,9 +7885,7 @@ } ], "summary": "Soft-delete a whole guest list", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/organizer-guest-lists/{id}/items": { @@ -8324,10 +7954,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -8351,10 +7978,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -8366,9 +7990,7 @@ } ], "summary": "A guest list's contacts (paginated)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] }, "post": { "operationId": "OrganizerGuestListsController_addItem", @@ -8411,9 +8033,7 @@ } ], "summary": "Add a contact to a guest list", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/organizer-guest-lists/{id}/items/{itemId}": { @@ -8457,9 +8077,7 @@ } ], "summary": "Remove a contact from a guest list", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/guest-list-links/invited-guests": { @@ -8504,9 +8122,7 @@ } ], "summary": "Set previous attendees invited to this event", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/guest-list-links/invited-guests/page": { @@ -8573,10 +8189,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -8600,10 +8213,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -8615,9 +8225,7 @@ } ], "summary": "Paginated guests selected to invite to this event", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/guest-list-links/invited-guests/notify": { @@ -8652,9 +8260,7 @@ } ], "summary": "Send invitation notifications for the event invite set", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/guest-list-links/page": { @@ -8721,10 +8327,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -8748,10 +8351,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -8763,9 +8363,7 @@ } ], "summary": "Paginated guest lists linked to this event", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/guest-list-links": { @@ -8810,9 +8408,7 @@ } ], "summary": "Attach a guest list to an event (stores link only — call notify to send invitations)", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/guest-list-links/{listId}/notify": { @@ -8856,9 +8452,7 @@ } ], "summary": "Send invitation notifications for a guest list linked to this event", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/events/{eventId}/guest-list-links/{listId}": { @@ -8902,9 +8496,7 @@ } ], "summary": "Unlink a guest list from an event", - "tags": [ - "Event Extras" - ] + "tags": ["Event Extras"] } }, "/api/v1/admin/guest-lists": { @@ -8964,10 +8556,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -8991,10 +8580,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -9006,9 +8592,7 @@ } ], "summary": "Every organizer's guest lists (paginated)", - "tags": [ - "Admin - Event Extras" - ] + "tags": ["Admin - Event Extras"] } }, "/api/v1/admin/guest-lists/{id}/items": { @@ -9076,10 +8660,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -9103,10 +8684,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -9118,9 +8696,7 @@ } ], "summary": "Any guest list's contacts, admin view (paginated)", - "tags": [ - "Admin - Event Extras" - ] + "tags": ["Admin - Event Extras"] } }, "/api/v1/admin/events/{eventId}/guest-list-links": { @@ -9159,9 +8735,7 @@ } ], "summary": "Guest lists linked to any event, admin view (unpaginated)", - "tags": [ - "Admin - Event Extras" - ] + "tags": ["Admin - Event Extras"] } }, "/api/v1/admin/events/{eventId}/invited-guests": { @@ -9200,9 +8774,7 @@ } ], "summary": "Guests selected to invite to this event (unpaginated)", - "tags": [ - "Admin - Event Extras" - ] + "tags": ["Admin - Event Extras"] }, "put": { "description": "userIds must all be existing platform users. Full replace, not incremental. An empty array clears the invite set. Does not send notifications — use POST .../notify.", @@ -9249,9 +8821,7 @@ } ], "summary": "Replace the invite set for this event", - "tags": [ - "Admin - Event Extras" - ] + "tags": ["Admin - Event Extras"] } }, "/api/v1/admin/events/{eventId}/invited-guests/notify": { @@ -9287,9 +8857,7 @@ } ], "summary": "Send invitation notifications to the event invite set", - "tags": [ - "Admin - Event Extras" - ] + "tags": ["Admin - Event Extras"] } }, "/api/v1/bookings/{bookingId}/payments": { @@ -9333,9 +8901,7 @@ } ], "summary": "Create payment attempt for a booking", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/bookings/{bookingId}/discount-preview": { @@ -9379,9 +8945,7 @@ } ], "summary": "Preview a discount code against a booking", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/payments/me": { @@ -9440,10 +9004,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -9467,10 +9028,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -9482,9 +9040,7 @@ } ], "summary": "Current user's payments", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/payments/{id}/receipt": { @@ -9518,9 +9074,7 @@ } ], "summary": "Payment receipt (owner only)", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/payments": { @@ -9579,10 +9133,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -9606,10 +9157,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -9621,9 +9169,7 @@ } ], "summary": "Paginated admin payment list, all users", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/wallet-deposits": { @@ -9682,10 +9228,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -9709,10 +9252,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -9724,9 +9264,7 @@ } ], "summary": "Paginated admin wallet deposit list (gateway sessions)", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/users/me/wallet": { @@ -9751,9 +9289,7 @@ } ], "summary": "Current user's wallet", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/users/me/wallet/transactions": { @@ -9812,10 +9348,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -9839,10 +9372,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -9854,9 +9384,7 @@ } ], "summary": "Current user's wallet transactions", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/users/me/wallet/deposits": { @@ -9891,9 +9419,7 @@ } ], "summary": "Start a wallet top-up via payment gateway", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/users/me/wallet/deposits/{id}": { @@ -9927,9 +9453,7 @@ } ], "summary": "Get one of the current user wallet deposits", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/wallet/deposits/{id}/gateway-return": { @@ -9960,9 +9484,7 @@ } }, "summary": "Jibit browser return (GET) — verifies payment server-side then redirects to the frontend result page", - "tags": [ - "Financial" - ] + "tags": ["Financial"] }, "post": { "operationId": "WalletController_depositGatewayReturnPost", @@ -9991,9 +9513,7 @@ } }, "summary": "Jibit browser return (form POST from PPG) — verifies payment server-side then redirects to the frontend result page", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/wallet/deposits/{id}/gateway-callback": { @@ -10032,9 +9552,7 @@ } }, "summary": "Console/dev HMAC callback for wallet deposits (disabled when PAYMENT_GATEWAY_PROVIDER=jibit)", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/bank-accounts": { @@ -10069,9 +9587,7 @@ } ], "summary": "Create bank account for withdrawals/settlements", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/bank-accounts/me": { @@ -10099,9 +9615,7 @@ } ], "summary": "Current user's bank accounts", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/bank-accounts": { @@ -10160,10 +9674,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -10187,10 +9698,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -10202,9 +9710,7 @@ } ], "summary": "Paginated admin bank account verification queue", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/bank-accounts/{id}/jibit-inquiry": { @@ -10239,9 +9745,7 @@ } ], "summary": "Run Jibit IBAN/national-code/birth-date matching inquiry", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/bank-accounts/{id}/approve": { @@ -10275,9 +9779,7 @@ } ], "summary": "Approve bank account after a successful Jibit match", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/bank-accounts/{id}/reject": { @@ -10321,9 +9823,7 @@ } ], "summary": "Reject bank account with a reason", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/withdrawal-requests": { @@ -10358,9 +9858,7 @@ } ], "summary": "Create withdrawal request from wallet", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/withdrawal-requests/me": { @@ -10419,10 +9917,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -10446,10 +9941,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -10461,9 +9953,7 @@ } ], "summary": "Current user's withdrawal requests", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/withdrawal-requests": { @@ -10522,10 +10012,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -10549,10 +10036,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -10564,9 +10048,7 @@ } ], "summary": "Paginated admin withdrawal queue", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/withdrawal-requests/{id}/process": { @@ -10600,9 +10082,7 @@ } ], "summary": "Mark withdrawal request as processing", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/withdrawal-requests/{id}/complete": { @@ -10646,9 +10126,7 @@ } ], "summary": "Complete withdrawal with manual payment evidence", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/withdrawal-requests/{id}/reject": { @@ -10692,9 +10170,7 @@ } ], "summary": "Reject withdrawal request and reverse hold", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/organizers/me/earnings": { @@ -10753,10 +10229,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -10780,10 +10253,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -10795,9 +10265,7 @@ } ], "summary": "Current organizer's earnings ledger", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/settlements/me": { @@ -10856,10 +10324,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -10883,10 +10348,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -10898,9 +10360,7 @@ } ], "summary": "Current organizer's settlement batches", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/settlements": { @@ -10935,9 +10395,7 @@ } ], "summary": "Create organizer settlement batch", - "tags": [ - "Financial" - ] + "tags": ["Financial"] }, "get": { "operationId": "AdminSettlementsController_list", @@ -10994,10 +10452,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -11021,10 +10476,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -11036,9 +10488,7 @@ } ], "summary": "Paginated settlement batches", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/settlements/{id}": { @@ -11073,9 +10523,7 @@ } ], "summary": "Settlement batch detail, with items inlined", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/settlements/{id}/process": { @@ -11109,9 +10557,7 @@ } ], "summary": "Mark settlement batch as processing", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/settlements/{id}/complete": { @@ -11155,9 +10601,7 @@ } ], "summary": "Complete settlement with manual payment evidence", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/admin/settlements/{id}/fail": { @@ -11202,9 +10646,7 @@ } ], "summary": "Mark settlement batch as failed and release its earnings", - "tags": [ - "Financial" - ] + "tags": ["Financial"] } }, "/api/v1/events/{eventId}/discount-codes": { @@ -11249,9 +10691,7 @@ } ], "summary": "Bulk-create discount codes for an event (host or admin)", - "tags": [ - "Discount Codes" - ] + "tags": ["Discount Codes"] }, "get": { "operationId": "DiscountCodesController_list", @@ -11317,10 +10757,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -11344,10 +10781,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -11359,9 +10793,7 @@ } ], "summary": "An event's discount codes (paginated)", - "tags": [ - "Discount Codes" - ] + "tags": ["Discount Codes"] } }, "/api/v1/events/{eventId}/discount-codes/management-bootstrap": { @@ -11395,9 +10827,7 @@ } ], "summary": "All initial data for an event's discount management tab", - "tags": [ - "Discount Codes" - ] + "tags": ["Discount Codes"] } }, "/api/v1/events/{eventId}/discount-codes/report": { @@ -11432,9 +10862,7 @@ } ], "summary": "Summary of an event's discount usage", - "tags": [ - "Discount Codes" - ] + "tags": ["Discount Codes"] } }, "/api/v1/events/{eventId}/discount-codes/redemptions": { @@ -11502,10 +10930,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -11529,10 +10954,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -11544,9 +10966,7 @@ } ], "summary": "An event's discount redemptions (paginated)", - "tags": [ - "Discount Codes" - ] + "tags": ["Discount Codes"] } }, "/api/v1/discount-codes/{id}": { @@ -11591,9 +11011,7 @@ } ], "summary": "Enable/disable a discount code (host or admin)", - "tags": [ - "Discount Codes" - ] + "tags": ["Discount Codes"] }, "delete": { "operationId": "DiscountCodesController_remove", @@ -11626,9 +11044,7 @@ } ], "summary": "Delete an unused discount code (host or admin)", - "tags": [ - "Discount Codes" - ] + "tags": ["Discount Codes"] } }, "/api/v1/events/{eventId}/bookings": { @@ -11672,9 +11088,7 @@ } ], "summary": "Create a booking for an event", - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/api/v1/bookings/me": { @@ -11733,10 +11147,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -11760,10 +11171,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -11775,9 +11183,7 @@ } ], "summary": "Current user's booking history", - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/api/v1/bookings/{id}": { @@ -11811,9 +11217,7 @@ } ], "summary": "Single booking detail (owner only)", - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/api/v1/bookings/{id}/cancel": { @@ -11858,9 +11262,7 @@ } ], "summary": "Cancel a booking (guest only)", - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/api/v1/bookings/{id}/check-in": { @@ -11894,9 +11296,7 @@ } ], "summary": "Check in a guest (event organizer only)", - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/api/v1/events/{eventId}/waitlist": { @@ -11940,9 +11340,7 @@ } ], "summary": "Join the waitlist for a full event", - "tags": [ - "Waitlist" - ] + "tags": ["Waitlist"] }, "get": { "operationId": "WaitlistController_listForEvent", @@ -12007,10 +11405,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -12034,10 +11429,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -12049,9 +11441,7 @@ } ], "summary": "Host view of the waiting queue for their own event (used to hand-pick who gets a seat when settings.waitlistAutoOffer is false)", - "tags": [ - "Waitlist" - ] + "tags": ["Waitlist"] } }, "/api/v1/waitlist/me": { @@ -12110,10 +11500,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -12137,10 +11524,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -12152,9 +11536,7 @@ } ], "summary": "Current user's waitlist entries", - "tags": [ - "Waitlist" - ] + "tags": ["Waitlist"] } }, "/api/v1/events/{eventId}/waitlist/{entryId}/offer": { @@ -12196,9 +11578,7 @@ } ], "summary": "Host manually offers an opened seat to a specific waitlist entry", - "tags": [ - "Waitlist" - ] + "tags": ["Waitlist"] } }, "/api/v1/waitlist/{id}/accept": { @@ -12232,9 +11612,7 @@ } ], "summary": "Accept a notified waitlist offer", - "tags": [ - "Waitlist" - ] + "tags": ["Waitlist"] } }, "/api/v1/admin/bookings": { @@ -12293,10 +11671,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -12320,10 +11695,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -12335,9 +11707,7 @@ } ], "summary": "Paginated admin bookings list", - "tags": [ - "Admin - Bookings" - ] + "tags": ["Admin - Bookings"] } }, "/api/v1/admin/bookings/{id}/check-in": { @@ -12371,9 +11741,7 @@ } ], "summary": "Check in a guest for any organizer’s event as admin", - "tags": [ - "Admin - Bookings" - ] + "tags": ["Admin - Bookings"] } }, "/api/v1/events/{eventId}/reviews": { @@ -12445,10 +11813,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -12482,10 +11847,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -12532,9 +11894,7 @@ } }, "summary": "List published reviews for an event", - "tags": [ - "Reviews" - ] + "tags": ["Reviews"] }, "post": { "description": "Authenticated guests with a confirmed booking may review once after the event is completed.", @@ -12639,9 +11999,7 @@ } ], "summary": "Create a review for a completed event", - "tags": [ - "Reviews" - ] + "tags": ["Reviews"] } }, "/api/v1/users/{userId}/reviews": { @@ -12713,10 +12071,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -12740,10 +12095,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -12790,9 +12142,7 @@ } }, "summary": "List published reviews for an organizer", - "tags": [ - "Reviews" - ] + "tags": ["Reviews"] } }, "/api/v1/reviews/{id}": { @@ -12899,9 +12249,7 @@ } ], "summary": "Update own review", - "tags": [ - "Reviews" - ] + "tags": ["Reviews"] } }, "/api/v1/reviews/{id}/host-reply": { @@ -13008,9 +12356,7 @@ } ], "summary": "Reply to a review as organizer", - "tags": [ - "Reviews" - ] + "tags": ["Reviews"] } }, "/api/v1/admin/reviews": { @@ -13072,10 +12418,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -13126,10 +12469,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -13141,9 +12481,7 @@ } ], "summary": "Paginated review moderation list", - "tags": [ - "Admin - Reviews" - ] + "tags": ["Admin - Reviews"] } }, "/api/v1/admin/reviews/{id}/hide": { @@ -13239,9 +12577,7 @@ } ], "summary": "Hide a review from public view", - "tags": [ - "Admin - Reviews" - ] + "tags": ["Admin - Reviews"] } }, "/api/v1/admin/reviews/{id}/restore": { @@ -13337,9 +12673,7 @@ } ], "summary": "Restore a hidden review to published", - "tags": [ - "Admin - Reviews" - ] + "tags": ["Admin - Reviews"] } }, "/api/v1/admin/reviews/{id}": { @@ -13375,9 +12709,7 @@ } ], "summary": "Soft-delete a review", - "tags": [ - "Admin - Reviews" - ] + "tags": ["Admin - Reviews"] } }, "/api/v1/conversations/me/unread-count": { @@ -13453,9 +12785,7 @@ } ], "summary": "Get total unread message count", - "tags": [ - "Chat" - ] + "tags": ["Chat"] } }, "/api/v1/conversations/me": { @@ -13517,10 +12847,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -13554,10 +12881,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -13619,9 +12943,7 @@ } ], "summary": "List my conversations", - "tags": [ - "Chat" - ] + "tags": ["Chat"] } }, "/api/v1/conversations/direct/{otherUserId}": { @@ -13718,9 +13040,7 @@ } ], "summary": "Get or create a direct conversation", - "tags": [ - "Chat" - ] + "tags": ["Chat"] } }, "/api/v1/conversations/direct/{otherUserId}/messages": { @@ -13827,9 +13147,7 @@ } ], "summary": "Send a direct message", - "tags": [ - "Chat" - ] + "tags": ["Chat"] } }, "/api/v1/conversations/{id}": { @@ -13926,9 +13244,7 @@ } ], "summary": "Get a conversation", - "tags": [ - "Chat" - ] + "tags": ["Chat"] } }, "/api/v1/conversations/{id}/participants": { @@ -14000,10 +13316,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -14027,10 +13340,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -14102,9 +13412,7 @@ } ], "summary": "List conversation participants", - "tags": [ - "Chat" - ] + "tags": ["Chat"] } }, "/api/v1/conversations/{id}/read": { @@ -14211,9 +13519,7 @@ } ], "summary": "Mark conversation as read", - "tags": [ - "Chat" - ] + "tags": ["Chat"] } }, "/api/v1/conversations/{id}/messages": { @@ -14295,10 +13601,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -14370,9 +13673,7 @@ } ], "summary": "List messages in a conversation", - "tags": [ - "Chat" - ] + "tags": ["Chat"] }, "post": { "description": "Sends a message in an existing conversation (typically an event group chat).", @@ -14477,9 +13778,7 @@ } ], "summary": "Send a message in a conversation", - "tags": [ - "Chat" - ] + "tags": ["Chat"] } }, "/api/v1/admin/conversations": { @@ -14538,10 +13837,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -14583,10 +13879,7 @@ "required": false, "in": "query", "schema": { - "enum": [ - "direct", - "event_group" - ], + "enum": ["direct", "event_group"], "type": "string" } } @@ -14611,10 +13904,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -14686,9 +13976,7 @@ } ], "summary": "List all conversations for read-only admin oversight", - "tags": [ - "Admin - Chat Oversight" - ] + "tags": ["Admin - Chat Oversight"] } }, "/api/v1/admin/conversations/{id}": { @@ -14783,9 +14071,7 @@ } ], "summary": "Get a conversation without joining or changing read state", - "tags": [ - "Admin - Chat Oversight" - ] + "tags": ["Admin - Chat Oversight"] } }, "/api/v1/admin/conversations/{id}/participants": { @@ -14853,10 +14139,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -14880,10 +14163,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -14955,9 +14235,7 @@ } ], "summary": "List conversation participants for admin oversight", - "tags": [ - "Admin - Chat Oversight" - ] + "tags": ["Admin - Chat Oversight"] } }, "/api/v1/admin/conversations/{id}/messages": { @@ -15036,10 +14314,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -15111,9 +14386,7 @@ } ], "summary": "Read message history without joining or changing read state", - "tags": [ - "Admin - Chat Oversight" - ] + "tags": ["Admin - Chat Oversight"] } }, "/api/v1/contact-messages": { @@ -15164,9 +14437,7 @@ } }, "summary": "Submit a public contact message", - "tags": [ - "Contact Messages" - ] + "tags": ["Contact Messages"] } }, "/api/v1/admin/contact-messages": { @@ -15228,10 +14499,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -15265,10 +14533,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -15340,9 +14605,7 @@ } ], "summary": "List contact form submissions", - "tags": [ - "Admin - Contact Messages" - ] + "tags": ["Admin - Contact Messages"] } }, "/api/v1/admin/contact-messages/{id}": { @@ -15439,9 +14702,7 @@ } ], "summary": "Get one contact message", - "tags": [ - "Admin - Contact Messages" - ] + "tags": ["Admin - Contact Messages"] } }, "/api/v1/admin/contact-messages/{id}/read": { @@ -15538,9 +14799,7 @@ } ], "summary": "Mark contact message as read", - "tags": [ - "Admin - Contact Messages" - ] + "tags": ["Admin - Contact Messages"] } }, "/api/v1/traffic-visits": { @@ -15594,9 +14853,7 @@ } }, "summary": "Record a unique attributed page visit", - "tags": [ - "Traffic Visits" - ] + "tags": ["Traffic Visits"] } }, "/api/v1/user-blocks": { @@ -15693,9 +14950,7 @@ } ], "summary": "Block another user", - "tags": [ - "User Blocks" - ] + "tags": ["User Blocks"] } }, "/api/v1/user-blocks/{blockedId}": { @@ -15783,9 +15038,7 @@ } ], "summary": "Unblock a user", - "tags": [ - "User Blocks" - ] + "tags": ["User Blocks"] } }, "/api/v1/user-blocks/me": { @@ -15847,10 +15100,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -15884,10 +15134,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -15939,9 +15186,7 @@ } ], "summary": "List users I have blocked", - "tags": [ - "User Blocks" - ] + "tags": ["User Blocks"] } }, "/api/v1/report-reasons": { @@ -15985,9 +15230,7 @@ } }, "summary": "List active report reasons", - "tags": [ - "User Reports" - ] + "tags": ["User Reports"] } }, "/api/v1/user-reports": { @@ -16074,9 +15317,7 @@ } ], "summary": "Report another user", - "tags": [ - "User Reports" - ] + "tags": ["User Reports"] } }, "/api/v1/admin/user-reports": { @@ -16138,10 +15379,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -16195,10 +15433,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -16270,9 +15505,7 @@ } ], "summary": "List user report review queue", - "tags": [ - "Admin - User Reports" - ] + "tags": ["Admin - User Reports"] } }, "/api/v1/admin/user-reports/{id}/review": { @@ -16370,9 +15603,7 @@ } ], "summary": "Mark user report as reviewed", - "tags": [ - "Admin - User Reports" - ] + "tags": ["Admin - User Reports"] } }, "/api/v1/admin/user-reports/{id}/dismiss": { @@ -16470,9 +15701,7 @@ } ], "summary": "Dismiss user report", - "tags": [ - "Admin - User Reports" - ] + "tags": ["Admin - User Reports"] } }, "/api/v1/admin/user-reports/{id}/block": { @@ -16570,9 +15799,7 @@ } ], "summary": "Block reported user on the reporter's behalf", - "tags": [ - "Admin - User Reports" - ] + "tags": ["Admin - User Reports"] } }, "/api/v1/support-tickets": { @@ -16667,9 +15894,7 @@ } ], "summary": "Create a support ticket", - "tags": [ - "Support Tickets" - ] + "tags": ["Support Tickets"] } }, "/api/v1/support-tickets/me": { @@ -16728,10 +15953,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -16755,10 +15977,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -16770,9 +15989,7 @@ } ], "summary": "List my support tickets", - "tags": [ - "Support Tickets" - ] + "tags": ["Support Tickets"] } }, "/api/v1/support-tickets/{id}/messages": { @@ -16831,10 +16048,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -16846,9 +16060,7 @@ } ], "summary": "List my support ticket messages", - "tags": [ - "Support Tickets" - ] + "tags": ["Support Tickets"] } }, "/api/v1/support-tickets/{id}": { @@ -16882,9 +16094,7 @@ } ], "summary": "Get my support ticket metadata", - "tags": [ - "Support Tickets" - ] + "tags": ["Support Tickets"] } }, "/api/v1/support-tickets/{id}/replies": { @@ -16928,9 +16138,7 @@ } ], "summary": "Reply to my support ticket", - "tags": [ - "Support Tickets" - ] + "tags": ["Support Tickets"] } }, "/api/v1/admin/support-tickets": { @@ -16989,10 +16197,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -17016,10 +16221,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -17091,9 +16293,7 @@ } ], "summary": "List the support queue", - "tags": [ - "Admin - Support Tickets" - ] + "tags": ["Admin - Support Tickets"] } }, "/api/v1/admin/support-tickets/{id}": { @@ -17127,9 +16327,7 @@ } ], "summary": "Get a support ticket thread", - "tags": [ - "Admin - Support Tickets" - ] + "tags": ["Admin - Support Tickets"] } }, "/api/v1/admin/support-tickets/{id}/replies": { @@ -17173,9 +16371,7 @@ } ], "summary": "Reply as support and send the user an SMS", - "tags": [ - "Admin - Support Tickets" - ] + "tags": ["Admin - Support Tickets"] } }, "/api/v1/admin/support-tickets/{id}/status": { @@ -17219,9 +16415,7 @@ } ], "summary": "Change support ticket status", - "tags": [ - "Admin - Support Tickets" - ] + "tags": ["Admin - Support Tickets"] } }, "/api/v1/admin/reports/overview": { @@ -17307,9 +16501,7 @@ } ], "summary": "Platform-wide overview KPIs", - "tags": [ - "Admin - Reports" - ] + "tags": ["Admin - Reports"] } }, "/api/v1/admin/users/{id}/wallet/credit": { @@ -17414,9 +16606,7 @@ } ], "summary": "Manually credit a user wallet", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/admin/users/{id}/identity/attest": { @@ -17511,9 +16701,7 @@ } ], "summary": "Verify host identity without a user submission", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/admin/users/{id}/hosted-events": { @@ -17580,10 +16768,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -17607,10 +16792,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "events", - "response" - ] + "required": ["events", "response"] } } } @@ -17682,9 +16864,7 @@ } ], "summary": "Events this user has hosted (organizer_id = :id)", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/admin/users/{id}/bookings": { @@ -17751,10 +16931,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -17778,10 +16955,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "bookings", - "response" - ] + "required": ["bookings", "response"] } } } @@ -17853,9 +17027,7 @@ } ], "summary": "Bookings this user made as a guest", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/admin/users/{id}/payments": { @@ -17922,10 +17094,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -17949,10 +17118,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "payments", - "response" - ] + "required": ["payments", "response"] } } } @@ -18024,9 +17190,7 @@ } ], "summary": "Payments this user made", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/admin/users/{id}/reviews": { @@ -18093,10 +17257,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -18105,10 +17266,7 @@ "in": "query", "description": "written (default): authored by this user. received: on events this user organized.", "schema": { - "enum": [ - "written", - "received" - ], + "enum": ["written", "received"], "type": "string" } } @@ -18133,10 +17291,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "reviews", - "response" - ] + "required": ["reviews", "response"] } } } @@ -18208,9 +17363,7 @@ } ], "summary": "Reviews written by this user or received on their events", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/admin/users/{id}/follows": { @@ -18277,10 +17430,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -18289,10 +17439,7 @@ "in": "query", "description": "following (default): organizers this user follows. followers: users following this user.", "schema": { - "enum": [ - "following", - "followers" - ], + "enum": ["following", "followers"], "type": "string" } } @@ -18317,10 +17464,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "follows", - "response" - ] + "required": ["follows", "response"] } } } @@ -18392,9 +17536,7 @@ } ], "summary": "Organizers this user follows, or users following this user", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/admin/users/{id}/reports": { @@ -18461,10 +17603,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -18473,10 +17612,7 @@ "in": "query", "description": "filed (default): reports this user submitted. received: reports submitted about this user.", "schema": { - "enum": [ - "filed", - "received" - ], + "enum": ["filed", "received"], "type": "string" } } @@ -18501,10 +17637,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "reports", - "response" - ] + "required": ["reports", "response"] } } } @@ -18576,9 +17709,7 @@ } ], "summary": "User reports this user filed, or reports filed about them", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/admin/users/{id}/blocks": { @@ -18645,10 +17776,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -18657,10 +17785,7 @@ "in": "query", "description": "blocking (default): users this user blocked. blockedBy: users who blocked this user.", "schema": { - "enum": [ - "blocking", - "blockedBy" - ], + "enum": ["blocking", "blockedBy"], "type": "string" } } @@ -18685,10 +17810,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "blocks", - "response" - ] + "required": ["blocks", "response"] } } } @@ -18760,9 +17882,7 @@ } ], "summary": "Users this user has blocked, or users who blocked this user", - "tags": [ - "Admin - User Detail" - ] + "tags": ["Admin - User Detail"] } }, "/api/v1/admin/audit-logs": { @@ -18824,10 +17944,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -18879,10 +17996,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -18954,9 +18068,7 @@ } ], "summary": "List admin action audit trail", - "tags": [ - "Admin - Audit Logs" - ] + "tags": ["Admin - Audit Logs"] } }, "/api/v1/uploads": { @@ -18970,9 +18082,7 @@ "multipart/form-data": { "schema": { "type": "object", - "required": [ - "file" - ], + "required": ["file"], "properties": { "file": { "type": "string", @@ -19041,9 +18151,7 @@ } ], "summary": "Upload an image file", - "tags": [ - "Uploads" - ] + "tags": ["Uploads"] } }, "/api/v1/uploads/identity": { @@ -19056,9 +18164,7 @@ "multipart/form-data": { "schema": { "type": "object", - "required": [ - "file" - ], + "required": ["file"], "properties": { "file": { "type": "string", @@ -19087,9 +18193,7 @@ } ], "summary": "Upload a private identity document image", - "tags": [ - "Uploads" - ] + "tags": ["Uploads"] } }, "/api/v1/uploads/identity/{ownerId}/{filename}": { @@ -19144,9 +18248,7 @@ } ], "summary": "Read an authorized private identity document", - "tags": [ - "Uploads" - ] + "tags": ["Uploads"] } }, "/api/v1/uploads/internal": { @@ -19185,9 +18287,7 @@ "multipart/form-data": { "schema": { "type": "object", - "required": [ - "file" - ], + "required": ["file"], "properties": { "file": { "type": "string", @@ -19251,9 +18351,7 @@ } }, "summary": "Internal upload from trusted app instances", - "tags": [ - "Uploads" - ] + "tags": ["Uploads"] } }, "/api/v1/blog-articles/page": { @@ -19312,10 +18410,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } }, { @@ -19348,10 +18443,7 @@ "in": "query", "schema": { "type": "string", - "enum": [ - "true", - "false" - ] + "enum": ["true", "false"] } } ], @@ -19375,19 +18467,14 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } } }, "summary": "Paginated published blog articles", - "tags": [ - "Blog Articles" - ] + "tags": ["Blog Articles"] } }, "/api/v1/blog-articles/{slug}/related": { @@ -19428,9 +18515,7 @@ } }, "summary": "Related published articles by slug", - "tags": [ - "Blog Articles" - ] + "tags": ["Blog Articles"] } }, "/api/v1/blog-articles/{slug}": { @@ -19459,9 +18544,7 @@ } }, "summary": "Single published article by slug", - "tags": [ - "Blog Articles" - ] + "tags": ["Blog Articles"] } }, "/api/v1/admin/blog-articles": { @@ -19520,10 +18603,7 @@ "description": "0 = JSON list (default). 1 = Excel export (returns response.fileData).", "schema": { "type": "number", - "enum": [ - 0, - 1 - ] + "enum": [0, 1] } } ], @@ -19547,10 +18627,7 @@ "description": "Pagination metadata for the current query." } }, - "required": [ - "items", - "response" - ] + "required": ["items", "response"] } } } @@ -19562,9 +18639,7 @@ } ], "summary": "Paginated article management list", - "tags": [ - "Admin - Blog Articles" - ] + "tags": ["Admin - Blog Articles"] }, "post": { "operationId": "AdminBlogArticlesController_create", @@ -19597,9 +18672,7 @@ } ], "summary": "Create blog article", - "tags": [ - "Admin - Blog Articles" - ] + "tags": ["Admin - Blog Articles"] } }, "/api/v1/admin/blog-articles/{id}": { @@ -19633,9 +18706,7 @@ } ], "summary": "Single article by id (draft or published)", - "tags": [ - "Admin - Blog Articles" - ] + "tags": ["Admin - Blog Articles"] }, "patch": { "operationId": "AdminBlogArticlesController_update", @@ -19677,9 +18748,7 @@ } ], "summary": "Update blog article", - "tags": [ - "Admin - Blog Articles" - ] + "tags": ["Admin - Blog Articles"] }, "delete": { "operationId": "AdminBlogArticlesController_remove", @@ -19711,9 +18780,7 @@ } ], "summary": "Soft-delete blog article", - "tags": [ - "Admin - Blog Articles" - ] + "tags": ["Admin - Blog Articles"] } }, "/health": { @@ -19734,9 +18801,7 @@ } }, "summary": "Health check", - "tags": [ - "Health" - ] + "tags": ["Health"] } }, "/health/ready": { @@ -19767,9 +18832,7 @@ } }, "summary": "Readiness check", - "tags": [ - "Health" - ] + "tags": ["Health"] } } }, @@ -19905,9 +18968,7 @@ "format": "phone" } }, - "required": [ - "mobile" - ] + "required": ["mobile"] }, "OtpRequestResponseDto": { "type": "object", @@ -19915,10 +18976,7 @@ "purpose": { "type": "string", "description": "Whether this OTP flow is for an existing or new account.", - "enum": [ - "login", - "register" - ], + "enum": ["login", "register"], "example": "login" }, "expiresIn": { @@ -19932,11 +18990,7 @@ "example": false } }, - "required": [ - "purpose", - "expiresIn", - "alreadySent" - ] + "required": ["purpose", "expiresIn", "alreadySent"] }, "ApiErrorCode": { "type": "string", @@ -20019,9 +19073,7 @@ "type": "object", "description": "Optional field-level validation errors keyed by request field name.", "example": { - "mobile": [ - "mobile must be a valid Iranian mobile number" - ] + "mobile": ["mobile must be a valid Iranian mobile number"] }, "additionalProperties": { "type": "array", @@ -20031,11 +19083,7 @@ } } }, - "required": [ - "success", - "code", - "message" - ] + "required": ["success", "code", "message"] }, "VerifyOtpDto": { "type": "object", @@ -20076,19 +19124,11 @@ "deprecated": true } }, - "required": [ - "mobile", - "code" - ] + "required": ["mobile", "code"] }, "UserStatus": { "type": "string", - "enum": [ - "active", - "pending", - "suspended", - "deleted" - ], + "enum": ["active", "pending", "suspended", "deleted"], "description": "Account status after OTP verification; pending users must complete profile." }, "AuthTokensDto": { @@ -20121,12 +19161,7 @@ ] } }, - "required": [ - "accessToken", - "sessionId", - "expiresAt", - "status" - ] + "required": ["accessToken", "sessionId", "expiresAt", "status"] }, "LoggedOutResponseDto": { "type": "object", @@ -20136,9 +19171,7 @@ "example": true } }, - "required": [ - "loggedOut" - ] + "required": ["loggedOut"] }, "SessionResponseDto": { "type": "object", @@ -20173,11 +19206,7 @@ "format": "date-time" } }, - "required": [ - "id", - "createdAt", - "expiresAt" - ] + "required": ["id", "createdAt", "expiresAt"] }, "RevokedResponseDto": { "type": "object", @@ -20187,30 +19216,16 @@ "example": true } }, - "required": [ - "revoked" - ] + "required": ["revoked"] }, "Gender": { "type": "string", - "enum": [ - "male", - "female", - "other" - ], + "enum": ["male", "female", "other"], "description": "Gender for placeholder avatars when no photo is set." }, "ContactChannel": { "type": "string", - "enum": [ - "instagram", - "telegram", - "twitter", - "linkedin", - "youtube", - "website", - "support_phone" - ] + "enum": ["instagram", "telegram", "twitter", "linkedin", "youtube", "website", "support_phone"] }, "PublicOrganizerContactLinkDto": { "type": "object", @@ -20234,12 +19249,7 @@ "description": "Raw stored value (username, URL, or phone digits)." } }, - "required": [ - "channel", - "label", - "url", - "value" - ] + "required": ["channel", "label", "url", "value"] }, "PublicOrganizerResponseDto": { "type": "object", @@ -20376,25 +19386,11 @@ "type": "boolean" } }, - "required": [ - "id", - "slug", - "title", - "posterUrl", - "startsAt", - "endsAt", - "cityName", - "isFree", - "price", - "isPast" - ] + "required": ["id", "slug", "title", "posterUrl", "startsAt", "endsAt", "cityName", "isFree", "price", "isPast"] }, "ListResultType": { "type": "number", - "enum": [ - 0, - 1 - ], + "enum": [0, 1], "description": "Result type requested by the client: 0 for JSON list, 1 for Excel export." }, "PaginationMetaDto": { @@ -20493,14 +19489,7 @@ "description": "True when newer messages exist beyond this page (pass `newerCursor` as `after`)." } }, - "required": [ - "page", - "pageSize", - "totalItemsCount", - "totalPages", - "sort", - "filters" - ] + "required": ["page", "pageSize", "totalItemsCount", "totalPages", "sort", "filters"] }, "OrganizerViewerStateResponseDto": { "type": "object", @@ -20515,27 +19504,16 @@ } } }, - "required": [ - "isFollowing", - "attendeeContactLinks" - ] + "required": ["isFollowing", "attendeeContactLinks"] }, "IdentityVerificationStatus": { "type": "string", - "enum": [ - "none", - "pending", - "verified", - "rejected" - ], + "enum": ["none", "pending", "verified", "rejected"], "description": "Host identity verification status; verified users may create events." }, "UserRole": { "type": "string", - "enum": [ - "user", - "admin" - ], + "enum": ["user", "admin"], "description": "User role. Admin is staff-only and manually assigned." }, "UserProfileResponseDto": { @@ -20709,14 +19687,7 @@ "format": "date-time" } }, - "required": [ - "id", - "subject", - "status", - "category", - "lastMessageAt", - "updatedAt" - ] + "required": ["id", "subject", "status", "category", "lastMessageAt", "updatedAt"] }, "ProfileSummaryEventPreviewDto": { "type": "object", @@ -20749,14 +19720,7 @@ "format": "date-time" } }, - "required": [ - "id", - "title", - "slug", - "posterUrl", - "squarePosterUrl", - "startsAt" - ] + "required": ["id", "title", "slug", "posterUrl", "squarePosterUrl", "startsAt"] }, "ProfileSummaryRegisteredPreviewDto": { "type": "object", @@ -20794,15 +19758,7 @@ "description": "Booking id" } }, - "required": [ - "id", - "title", - "slug", - "posterUrl", - "squarePosterUrl", - "startsAt", - "bookingId" - ] + "required": ["id", "title", "slug", "posterUrl", "squarePosterUrl", "startsAt", "bookingId"] }, "UserProfileSummaryResponseDto": { "type": "object", @@ -20975,13 +19931,7 @@ "minimum": 1 } }, - "required": [ - "firstName", - "lastName", - "gender", - "dateOfBirth", - "cityId" - ] + "required": ["firstName", "lastName", "gender", "dateOfBirth", "cityId"] }, "AdminUserListItemDto": { "type": "object", @@ -21108,11 +20058,7 @@ "userType": { "type": "string", "description": "Derived admin-facing user type: admin staff, verified host, or guest.", - "enum": [ - "guest", - "host", - "admin" - ], + "enum": ["guest", "host", "admin"], "example": "host" }, "walletBalance": { @@ -21156,9 +20102,7 @@ "format": "phone" } }, - "required": [ - "mobile" - ] + "required": ["mobile"] }, "AdminUpdateUserDto": { "type": "object", @@ -21216,19 +20160,13 @@ "status": { "type": "string", "description": "Suspend or reactivate the account. 'pending' and 'deleted' are not settable here — see the field-level note in this DTO.", - "enum": [ - "active", - "suspended" - ], + "enum": ["active", "suspended"], "example": "suspended" }, "hostPlan": { "type": "string", "description": "Free hosts can create 10 events; unlimited removes the quota.", - "enum": [ - "free", - "unlimited" - ] + "enum": ["free", "unlimited"] } } }, @@ -21241,15 +20179,7 @@ }, "channel": { "type": "string", - "enum": [ - "instagram", - "telegram", - "twitter", - "linkedin", - "youtube", - "website", - "support_phone" - ] + "enum": ["instagram", "telegram", "twitter", "linkedin", "youtube", "website", "support_phone"] }, "value": { "type": "string" @@ -21269,30 +20199,14 @@ "type": "string" } }, - "required": [ - "id", - "channel", - "value", - "isPublic", - "displayOrder", - "createdAt", - "updatedAt" - ] + "required": ["id", "channel", "value", "isPublic", "displayOrder", "createdAt", "updatedAt"] }, "CreateUserContactLinkDto": { "type": "object", "properties": { "channel": { "type": "string", - "enum": [ - "instagram", - "telegram", - "twitter", - "linkedin", - "youtube", - "website", - "support_phone" - ], + "enum": ["instagram", "telegram", "twitter", "linkedin", "youtube", "website", "support_phone"], "example": "instagram" }, "value": { @@ -21309,10 +20223,7 @@ "example": 0 } }, - "required": [ - "channel", - "value" - ] + "required": ["channel", "value"] }, "UpdateUserContactLinkDto": { "type": "object", @@ -21340,9 +20251,7 @@ "example": true } }, - "required": [ - "success" - ] + "required": ["success"] }, "IdentityRejectionReasonResponseDto": { "type": "object", @@ -21374,12 +20283,7 @@ "minimum": 0 } }, - "required": [ - "id", - "code", - "label", - "sortOrder" - ] + "required": ["id", "code", "label", "sortOrder"] }, "RequestHostContractOtpDto": { "type": "object", @@ -21403,11 +20307,7 @@ "description": "Must match the currently published host cooperation contract version." } }, - "required": [ - "nationalCode", - "contractAccepted", - "contractVersion" - ] + "required": ["nationalCode", "contractAccepted", "contractVersion"] }, "HostContractOtpRequestedDto": { "type": "object", @@ -21428,11 +20328,7 @@ "example": "2026-08-22" } }, - "required": [ - "purpose", - "expiresIn", - "contractVersion" - ] + "required": ["purpose", "expiresIn", "contractVersion"] }, "ConfirmHostContractOtpDto": { "type": "object", @@ -21445,16 +20341,11 @@ "maxLength": 4 } }, - "required": [ - "code" - ] + "required": ["code"] }, "IdentityVerificationSource": { "type": "string", - "enum": [ - "host_submission", - "admin_attested" - ], + "enum": ["host_submission", "admin_attested"], "description": "host_submission means the user sent KYC fields; admin_attested means staff verified the user without a host request." }, "IdentityVerificationResponseDto": { @@ -21594,14 +20485,7 @@ "format": "date-time" } }, - "required": [ - "id", - "userId", - "status", - "source", - "createdAt", - "updatedAt" - ] + "required": ["id", "userId", "status", "source", "createdAt", "updatedAt"] }, "AdminIdentityVerificationResponseDto": { "type": "object", @@ -21749,15 +20633,7 @@ } } }, - "required": [ - "id", - "userId", - "status", - "source", - "createdAt", - "updatedAt", - "user" - ] + "required": ["id", "userId", "status", "source", "createdAt", "updatedAt", "user"] }, "RejectIdentityVerificationDto": { "type": "object", @@ -21778,12 +20654,7 @@ }, "NotificationStatus": { "type": "string", - "enum": [ - "pending", - "sent", - "failed", - "cancelled" - ], + "enum": ["pending", "sent", "failed", "cancelled"], "description": "Parent notification delivery status." }, "NotificationResponseDto": { @@ -21857,14 +20728,7 @@ "format": "date-time" } }, - "required": [ - "id", - "category", - "title", - "body", - "status", - "createdAt" - ] + "required": ["id", "category", "title", "body", "status", "createdAt"] }, "NotificationUnreadCountResponseDto": { "type": "object", @@ -21875,9 +20739,7 @@ "example": 2 } }, - "required": [ - "totalUnread" - ] + "required": ["totalUnread"] }, "NotificationMarkAllReadResponseDto": { "type": "object", @@ -21891,10 +20753,7 @@ "format": "date-time" } }, - "required": [ - "updatedCount", - "readAt" - ] + "required": ["updatedCount", "readAt"] }, "PushVapidPublicKeyResponseDto": { "type": "object", @@ -21910,10 +20769,7 @@ "example": true } }, - "required": [ - "publicKey", - "enabled" - ] + "required": ["publicKey", "enabled"] }, "PushDeliveryReceiptDto": { "type": "object", @@ -21933,10 +20789,7 @@ "eventType": { "type": "string", "description": "displayed = browser showed the notification, opened = user tapped it.", - "enum": [ - "displayed", - "opened" - ], + "enum": ["displayed", "opened"], "example": "opened" }, "receiptHmac": { @@ -21945,12 +20798,7 @@ "example": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }, - "required": [ - "notificationId", - "subscriptionId", - "eventType", - "receiptHmac" - ] + "required": ["notificationId", "subscriptionId", "eventType", "receiptHmac"] }, "PushDeliveryReceiptResponseDto": { "type": "object", @@ -21987,11 +20835,7 @@ "nullable": true } }, - "required": [ - "recorded", - "notificationId", - "subscriptionId" - ] + "required": ["recorded", "notificationId", "subscriptionId"] }, "PushSubscribeDto": { "type": "object", @@ -22014,11 +20858,7 @@ "description": "Browser user-agent string for debugging multi-device subscriptions." } }, - "required": [ - "endpoint", - "p256dh", - "auth" - ] + "required": ["endpoint", "p256dh", "auth"] }, "PushSubscriptionResponseDto": { "type": "object", @@ -22039,12 +20879,7 @@ "type": "string" } }, - "required": [ - "id", - "userId", - "endpoint", - "createdAt" - ] + "required": ["id", "userId", "endpoint", "createdAt"] }, "DeletedResponseDto": { "type": "object", @@ -22054,9 +20889,7 @@ "example": true } }, - "required": [ - "deleted" - ] + "required": ["deleted"] }, "DeletedCountResponseDto": { "type": "object", @@ -22067,18 +20900,11 @@ "minimum": 0 } }, - "required": [ - "deletedCount" - ] + "required": ["deletedCount"] }, "SmsStatus": { "type": "string", - "enum": [ - "pending", - "sent", - "failed", - "delivered" - ], + "enum": ["pending", "sent", "failed", "delivered"], "description": "SMS delivery status." }, "SmsRecipientDto": { @@ -22097,10 +20923,7 @@ "nullable": true } }, - "required": [ - "firstName", - "lastName" - ] + "required": ["firstName", "lastName"] }, "SmsMessageResponseDto": { "type": "object", @@ -22193,16 +21016,7 @@ ] } }, - "required": [ - "id", - "notificationId", - "userId", - "mobile", - "messageBody", - "status", - "createdAt", - "updatedAt" - ] + "required": ["id", "notificationId", "userId", "mobile", "messageBody", "status", "createdAt", "updatedAt"] }, "NotificationRuleResponseDto": { "type": "object", @@ -22222,11 +21036,7 @@ }, "channel": { "type": "string", - "enum": [ - "in_app", - "sms", - "both" - ] + "enum": ["in_app", "sms", "both"] }, "titleTemplate": { "type": "string" @@ -22280,11 +21090,7 @@ }, "channel": { "type": "string", - "enum": [ - "in_app", - "sms", - "both" - ] + "enum": ["in_app", "sms", "both"] }, "titleTemplate": { "type": "string" @@ -22304,9 +21110,7 @@ "purpose": { "type": "string", "description": "OTP purpose used when confirming a bulk SMS send.", - "enum": [ - "admin_bulk_sms" - ], + "enum": ["admin_bulk_sms"], "example": "admin_bulk_sms" }, "expiresIn": { @@ -22315,18 +21119,11 @@ "example": 300 } }, - "required": [ - "purpose", - "expiresIn" - ] + "required": ["purpose", "expiresIn"] }, "NotificationChannel": { "type": "string", - "enum": [ - "in_app", - "sms", - "both" - ], + "enum": ["in_app", "sms", "both"], "description": "Delivery channel. `in_app` also dispatches Web Push when the user has an active subscription. Defaults to `in_app`." }, "AdminSendManualNotificationDto": { @@ -22362,9 +21159,7 @@ }, "userIds": { "description": "Recipient user ids. At least one of userIds or mobiles must be provided.", - "example": [ - "c3c921d5-4418-42ed-bf39-0f04b1d5123b" - ], + "example": ["c3c921d5-4418-42ed-bf39-0f04b1d5123b"], "type": "array", "items": { "type": "string" @@ -22372,10 +21167,7 @@ }, "mobiles": { "description": "Recipient mobile numbers (0912..., 98912..., or +98912...). At least one of userIds or mobiles must be provided.", - "example": [ - "09153641196", - "989121234567" - ], + "example": ["09153641196", "989121234567"], "type": "array", "items": { "type": "string" @@ -22388,9 +21180,7 @@ "maxLength": 10 } }, - "required": [ - "body" - ] + "required": ["body"] }, "AdminManualNotificationRecipientDto": { "type": "object", @@ -22425,11 +21215,7 @@ "format": "uuid" } }, - "required": [ - "userId", - "mobile", - "notificationId" - ] + "required": ["userId", "mobile", "notificationId"] }, "AdminManualNotificationResponseDto": { "type": "object", @@ -22448,9 +21234,7 @@ }, "missingUserIds": { "description": "Requested user ids that did not resolve to a user row.", - "example": [ - "11111111-1111-1111-1111-111111111111" - ], + "example": ["11111111-1111-1111-1111-111111111111"], "type": "array", "items": { "type": "string" @@ -22458,21 +21242,14 @@ }, "missingMobiles": { "description": "Requested mobile numbers that did not resolve to a user row after normalization.", - "example": [ - "989199999999" - ], + "example": ["989199999999"], "type": "array", "items": { "type": "string" } } }, - "required": [ - "recipientCount", - "recipients", - "missingUserIds", - "missingMobiles" - ] + "required": ["recipientCount", "recipients", "missingUserIds", "missingMobiles"] }, "AdminInAppRecipientDto": { "type": "object", @@ -22490,10 +21267,7 @@ "nullable": true } }, - "required": [ - "firstName", - "lastName" - ] + "required": ["firstName", "lastName"] }, "AdminInAppNotificationResponseDto": { "type": "object", @@ -22567,16 +21341,7 @@ ] } }, - "required": [ - "id", - "userId", - "mobile", - "category", - "title", - "body", - "status", - "createdAt" - ] + "required": ["id", "userId", "mobile", "category", "title", "body", "status", "createdAt"] }, "PushDeliveryRecipientDto": { "type": "object", @@ -22594,10 +21359,7 @@ "nullable": true } }, - "required": [ - "firstName", - "lastName" - ] + "required": ["firstName", "lastName"] }, "PushDeliveryResponseDto": { "type": "object", @@ -22698,18 +21460,7 @@ ] } }, - "required": [ - "id", - "notificationId", - "userId", - "subscriptionId", - "mobile", - "category", - "title", - "body", - "status", - "createdAt" - ] + "required": ["id", "notificationId", "userId", "subscriptionId", "mobile", "category", "title", "body", "status", "createdAt"] }, "EventCategoryResponseDto": { "type": "object", @@ -22830,10 +21581,7 @@ "example": "موسیقی" } }, - "required": [ - "id", - "name" - ] + "required": ["id", "name"] }, "CreateEventCategoryDto": { "type": "object", @@ -22908,10 +21656,7 @@ "nullable": true } }, - "required": [ - "name", - "slug" - ] + "required": ["name", "slug"] }, "UpdateEventCategoryDto": { "type": "object", @@ -23007,12 +21752,7 @@ "example": 51.389 } }, - "required": [ - "id", - "name", - "lat", - "lng" - ] + "required": ["id", "name", "lat", "lng"] }, "CityResponseDto": { "type": "object", @@ -23042,12 +21782,7 @@ "example": 51.389 } }, - "required": [ - "id", - "provinceId", - "name", - "slug" - ] + "required": ["id", "provinceId", "name", "slug"] }, "CityDetailResponseDto": { "type": "object", @@ -23085,26 +21820,11 @@ "example": "tehran-province" } }, - "required": [ - "id", - "provinceId", - "name", - "slug", - "provinceName", - "provinceSlug" - ] + "required": ["id", "provinceId", "name", "slug", "provinceName", "provinceSlug"] }, "EventStatus": { "type": "string", - "enum": [ - "draft", - "pending_review", - "published", - "full", - "rejected", - "cancelled", - "completed" - ] + "enum": ["draft", "pending_review", "published", "full", "rejected", "cancelled", "completed"] }, "MyEventsHostItemDto": { "type": "object", @@ -23190,14 +21910,7 @@ }, "BookingStatus": { "type": "string", - "enum": [ - "pending_payment", - "confirmed", - "cancelled", - "expired", - "refunded", - "no_show" - ] + "enum": ["pending_payment", "confirmed", "cancelled", "expired", "refunded", "no_show"] }, "MyEventsGuestItemDto": { "type": "object", @@ -23301,20 +22014,11 @@ }, "EventGenderRestriction": { "type": "string", - "enum": [ - "open", - "female_only", - "male_only" - ] + "enum": ["open", "female_only", "male_only"] }, "EventAgeRestriction": { "type": "string", - "enum": [ - "open", - "age_15_19", - "age_20_24", - "age_25_plus" - ] + "enum": ["open", "age_15_19", "age_20_24", "age_25_plus"] }, "EventSettingsDto": { "type": "object", @@ -23331,10 +22035,7 @@ }, "addressVisibility": { "type": "string", - "enum": [ - "public", - "attendees_only" - ], + "enum": ["public", "attendees_only"], "default": "public", "description": "When 'attendees_only', only the organizer/admin and guests with a confirmed booking see the exact address/lat/lng; everyone else sees generalArea instead." }, @@ -23360,10 +22061,7 @@ "properties": { "mediaType": { "type": "string", - "enum": [ - "image", - "video" - ], + "enum": ["image", "video"], "example": "image" }, "url": { @@ -23389,10 +22087,7 @@ "description": "Marks the 1:1 square card poster. Exactly one image per event." } }, - "required": [ - "mediaType", - "url" - ] + "required": ["mediaType", "url"] }, "CreateEventFaqDto": { "type": "object", @@ -23413,10 +22108,7 @@ "minimum": 0 } }, - "required": [ - "question", - "answer" - ] + "required": ["question", "answer"] }, "SubmitEventRevisionDto": { "type": "object", @@ -23533,9 +22225,7 @@ } } }, - "required": [ - "media" - ] + "required": ["media"] }, "EventRevisionResponseDto": { "type": "object", @@ -23548,12 +22238,7 @@ }, "status": { "type": "string", - "enum": [ - "pending", - "approved", - "rejected", - "superseded" - ] + "enum": ["pending", "approved", "rejected", "superseded"] }, "payload": { "type": "object", @@ -23576,14 +22261,7 @@ "type": "object" } }, - "required": [ - "id", - "eventId", - "status", - "payload", - "createdBy", - "submittedAt" - ] + "required": ["id", "eventId", "status", "payload", "createdBy", "submittedAt"] }, "CreateEventDto": { "type": "object", @@ -23727,10 +22405,7 @@ }, "addressVisibility": { "type": "string", - "enum": [ - "public", - "attendees_only" - ] + "enum": ["public", "attendees_only"] }, "generalArea": { "type": "string", @@ -23744,14 +22419,7 @@ "description": "When true, review_request after completion is sent as in-app + SMS; otherwise in-app only." } }, - "required": [ - "isDiscoverable", - "autoCreateGroup", - "addressVisibility", - "generalArea", - "waitlistAutoOffer", - "sendReviewRequestSms" - ] + "required": ["isDiscoverable", "autoCreateGroup", "addressVisibility", "generalArea", "waitlistAutoOffer", "sendReviewRequestSms"] }, "EventDiscoveryPlacementDto": { "type": "object", @@ -23764,10 +22432,7 @@ "minimum": 0 } }, - "required": [ - "placement", - "priority" - ] + "required": ["placement", "priority"] }, "EventResponseDto": { "type": "object", @@ -24103,15 +22768,7 @@ "minimum": 0 } }, - "required": [ - "grossAmount", - "commissionAmount", - "guestRefundAmount", - "netAmount", - "heldAmount", - "availableAmount", - "settledAmount" - ] + "required": ["grossAmount", "commissionAmount", "guestRefundAmount", "netAmount", "heldAmount", "availableAmount", "settledAmount"] }, "OwnerEventTrafficChannelInsightsDto": { "type": "object", @@ -24125,10 +22782,7 @@ "minimum": 0 } }, - "required": [ - "uniqueVisits", - "confirmedBookings" - ] + "required": ["uniqueVisits", "confirmedBookings"] }, "OwnerEventTrafficInsightsDto": { "type": "object", @@ -24140,10 +22794,7 @@ "$ref": "#/components/schemas/OwnerEventTrafficChannelInsightsDto" } }, - "required": [ - "instagram", - "telegram" - ] + "required": ["instagram", "telegram"] }, "OwnerEventInsightsResponseDto": { "type": "object", @@ -24162,19 +22813,11 @@ "$ref": "#/components/schemas/OwnerEventTrafficInsightsDto" } }, - "required": [ - "bookmarkCount", - "registrations", - "financial", - "traffic" - ] + "required": ["bookmarkCount", "registrations", "financial", "traffic"] }, "EventMediaType": { "type": "string", - "enum": [ - "image", - "video" - ] + "enum": ["image", "video"] }, "EventMediaResponseDto": { "type": "object", @@ -24217,17 +22860,7 @@ "type": "string" } }, - "required": [ - "id", - "eventId", - "mediaType", - "url", - "thumbnailUrl", - "sortOrder", - "isPoster", - "isSquarePoster", - "createdAt" - ] + "required": ["id", "eventId", "mediaType", "url", "thumbnailUrl", "sortOrder", "isPoster", "isSquarePoster", "createdAt"] }, "EventFaqResponseDto": { "type": "object", @@ -24258,15 +22891,7 @@ "type": "string" } }, - "required": [ - "id", - "eventId", - "question", - "answer", - "sortOrder", - "createdAt", - "updatedAt" - ] + "required": ["id", "eventId", "question", "answer", "sortOrder", "createdAt", "updatedAt"] }, "EventManagementBootstrapResponseDto": { "type": "object", @@ -24299,15 +22924,7 @@ } } }, - "required": [ - "event", - "insights", - "categoryName", - "cityName", - "provinceName", - "media", - "faqs" - ] + "required": ["event", "insights", "categoryName", "cityName", "provinceName", "media", "faqs"] }, "EventAttendeeResponseDto": { "type": "object", @@ -24358,24 +22975,11 @@ "type": "string" } }, - "required": [ - "bookingId", - "userId", - "bookingCode", - "status", - "createdAt" - ] + "required": ["bookingId", "userId", "bookingCode", "status", "createdAt"] }, "EventAttendeeFilter": { "type": "string", - "enum": [ - "all", - "confirmed", - "checked_in", - "not_checked_in", - "pending_payment", - "cancelled" - ] + "enum": ["all", "confirmed", "checked_in", "not_checked_in", "pending_payment", "cancelled"] }, "UpdateEventReservedCapacityDto": { "type": "object", @@ -24387,9 +22991,7 @@ "description": "Absolute off-platform reserved seat count. Occupancy is bookedCount + reservedCapacity and cannot exceed capacity. Pending payments already occupy seats." } }, - "required": [ - "reservedCapacity" - ] + "required": ["reservedCapacity"] }, "UpdateEventDto": { "type": "object", @@ -24504,9 +23106,7 @@ } } }, - "required": [ - "eventIds" - ] + "required": ["eventIds"] }, "BookmarkBatchStatusResponseDto": { "type": "object", @@ -24519,9 +23119,7 @@ } } }, - "required": [ - "bookmarkedEventIds" - ] + "required": ["bookmarkedEventIds"] }, "BookmarkStateResponseDto": { "type": "object", @@ -24530,9 +23128,7 @@ "type": "boolean" } }, - "required": [ - "isBookmarked" - ] + "required": ["isBookmarked"] }, "DiscoveryEventOrganizerDto": { "type": "object", @@ -24546,10 +23142,7 @@ "nullable": true } }, - "required": [ - "firstName", - "lastName" - ] + "required": ["firstName", "lastName"] }, "DiscoveryEventResponseDto": { "type": "object", @@ -24796,11 +23389,7 @@ "type": "string" } }, - "required": [ - "id", - "name", - "slug" - ] + "required": ["id", "name", "slug"] }, "EventLandingCityDto": { "type": "object", @@ -24812,10 +23401,7 @@ "type": "string" } }, - "required": [ - "id", - "name" - ] + "required": ["id", "name"] }, "EventLandingOrganizerContactLinkDto": { "type": "object", @@ -24830,11 +23416,7 @@ "type": "string" } }, - "required": [ - "channel", - "label", - "url" - ] + "required": ["channel", "label", "url"] }, "EventLandingOrganizerDto": { "type": "object", @@ -24855,11 +23437,7 @@ }, "gender": { "type": "string", - "enum": [ - "male", - "female", - "other" - ], + "enum": ["male", "female", "other"], "nullable": true }, "bio": { @@ -24911,11 +23489,7 @@ }, "ReviewStatus": { "type": "string", - "enum": [ - "published", - "hidden", - "deleted" - ], + "enum": ["published", "hidden", "deleted"], "description": "Publication status." }, "ReviewUserSummaryDto": { @@ -24946,12 +23520,7 @@ "nullable": true } }, - "required": [ - "id", - "firstName", - "lastName", - "avatarUrl" - ] + "required": ["id", "firstName", "lastName", "avatarUrl"] }, "ReviewResponseDto": { "type": "object", @@ -25036,18 +23605,7 @@ ] } }, - "required": [ - "id", - "eventId", - "userId", - "bookingId", - "rating", - "body", - "status", - "createdAt", - "updatedAt", - "user" - ] + "required": ["id", "eventId", "userId", "bookingId", "rating", "body", "status", "createdAt", "updatedAt", "user"] }, "EventLandingBootstrapResponseDto": { "type": "object", @@ -25089,17 +23647,7 @@ "type": "number" } }, - "required": [ - "event", - "category", - "city", - "media", - "faqs", - "faqsTotal", - "organizer", - "reviews", - "reviewsTotal" - ] + "required": ["event", "category", "city", "media", "faqs", "faqsTotal", "organizer", "reviews", "reviewsTotal"] }, "EventViewerBookingDto": { "type": "object", @@ -25110,20 +23658,10 @@ }, "status": { "type": "string", - "enum": [ - "pending_payment", - "confirmed", - "cancelled", - "expired", - "refunded", - "no_show" - ] + "enum": ["pending_payment", "confirmed", "cancelled", "expired", "refunded", "no_show"] } }, - "required": [ - "id", - "status" - ] + "required": ["id", "status"] }, "EventViewerWaitlistDto": { "type": "object", @@ -25134,20 +23672,10 @@ }, "status": { "type": "string", - "enum": [ - "waiting", - "notified", - "accepted", - "expired", - "cancelled", - "converted" - ] + "enum": ["waiting", "notified", "accepted", "expired", "cancelled", "converted"] } }, - "required": [ - "id", - "status" - ] + "required": ["id", "status"] }, "EventViewerLocationDto": { "type": "object", @@ -25162,11 +23690,7 @@ "type": "number" } }, - "required": [ - "address", - "lat", - "lng" - ] + "required": ["address", "lat", "lng"] }, "EventViewerStateResponseDto": { "type": "object", @@ -25216,11 +23740,7 @@ "description": "Empty when canJoinAudience is true.", "items": { "type": "string", - "enum": [ - "gender", - "age", - "city" - ] + "enum": ["gender", "age", "city"] } } }, @@ -25244,9 +23764,7 @@ "maxLength": 2000 } }, - "required": [ - "rejectionReason" - ] + "required": ["rejectionReason"] }, "AdminEventRelationSummaryDto": { "type": "object", @@ -25258,10 +23776,7 @@ "type": "string" } }, - "required": [ - "id", - "name" - ] + "required": ["id", "name"] }, "AdminEventOrganizerSummaryDto": { "type": "object", @@ -25283,9 +23798,7 @@ "nullable": true } }, - "required": [ - "id" - ] + "required": ["id"] }, "AdminEventResponseDto": { "type": "object", @@ -25327,17 +23840,143 @@ "$ref": "#/components/schemas/AdminEventOrganizerSummaryDto" } }, + "required": ["id", "title", "startsAt", "status", "isFree", "price", "category", "province", "city", "organizer"] + }, + "AdminCreateEventDto": { + "type": "object", + "properties": { + "title": { + "type": "string", + "example": "کارگاه عکاسی" + }, + "slug": { + "type": "string", + "example": "photography-workshop" + }, + "shortDescription": { + "type": "string" + }, + "description": { + "type": "string" + }, + "categoryId": { + "type": "number", + "example": 1 + }, + "startsAt": { + "type": "string", + "example": "2026-08-01T10:00:00.000Z" + }, + "endsAt": { + "type": "string", + "example": "2026-08-01T14:00:00.000Z" + }, + "provinceId": { + "type": "number", + "example": 1 + }, + "cityId": { + "type": "number", + "example": 1 + }, + "address": { + "type": "string", + "example": "خیابان ولیعصر", + "maxLength": 500 + }, + "lat": { + "type": "number", + "example": 35.7219 + }, + "lng": { + "type": "number", + "example": 51.4084 + }, + "isFree": { + "type": "boolean", + "example": false + }, + "price": { + "type": "number", + "example": 500000 + }, + "capacity": { + "type": "number", + "example": 20 + }, + "reservedCapacity": { + "type": "number", + "example": 0, + "default": 0, + "description": "Off-platform holds (regular guests, Instagram, etc.). Occupies seats with bookedCount. Must be >= 0 and <= capacity." + }, + "genderRestriction": { + "default": "open", + "allOf": [ + { + "$ref": "#/components/schemas/EventGenderRestriction" + } + ] + }, + "ageRestriction": { + "default": "open", + "allOf": [ + { + "$ref": "#/components/schemas/EventAgeRestriction" + } + ] + }, + "cancellationFeePercent": { + "type": "number", + "example": 30, + "default": 30, + "description": "Last-minute cancellation fee when 0 < remaining time <= 12 hours." + }, + "cancellationFeePercent12To24Hours": { + "type": "number", + "example": 20, + "default": 20, + "description": "Cancellation fee when 12 < remaining time <= 24 hours." + }, + "cancellationFeePercentMoreThan24Hours": { + "type": "number", + "example": 10, + "default": 10, + "description": "Early cancellation fee when remaining time > 24 hours." + }, + "settings": { + "$ref": "#/components/schemas/EventSettingsDto" + }, + "media": { + "minItems": 2, + "description": "Requires a vertical poster (isPoster) and a square poster (isSquarePoster). Extra gallery images are allowed with both flags false.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateEventMediaDto" + } + }, + "organizerId": { + "type": "string", + "format": "uuid", + "description": "Verified host who will own the event" + } + }, "required": [ - "id", "title", + "slug", + "categoryId", "startsAt", - "status", + "endsAt", + "provinceId", + "cityId", + "address", + "lat", + "lng", "isFree", "price", - "category", - "province", - "city", - "organizer" + "capacity", + "media", + "organizerId" ] }, "AdminEventDetailResponseDto": { @@ -25601,9 +24240,7 @@ "maxLength": 2000 } }, - "required": [ - "rejectionReason" - ] + "required": ["rejectionReason"] }, "DiscoveryCategorySummaryDto": { "type": "object", @@ -25634,14 +24271,7 @@ "example": true } }, - "required": [ - "id", - "name", - "slug", - "parentId", - "sortOrder", - "isActive" - ] + "required": ["id", "name", "slug", "parentId", "sortOrder", "isActive"] }, "HomeFeedOrganizerDto": { "type": "object", @@ -25683,14 +24313,7 @@ "$ref": "#/components/schemas/HomeFeedOrganizerDto" } }, - "required": [ - "id", - "title", - "slug", - "posterUrl", - "squarePosterUrl", - "organizer" - ] + "required": ["id", "title", "slug", "posterUrl", "squarePosterUrl", "organizer"] }, "HomeCategoryPreviewEventDto": { "type": "object", @@ -25724,15 +24347,7 @@ "nullable": true } }, - "required": [ - "id", - "title", - "slug", - "startsAt", - "endsAt", - "posterUrl", - "squarePosterUrl" - ] + "required": ["id", "title", "slug", "startsAt", "endsAt", "posterUrl", "squarePosterUrl"] }, "HomeFeedCategoryPreviewGroupDto": { "type": "object", @@ -25748,10 +24363,7 @@ } } }, - "required": [ - "categoryId", - "items" - ] + "required": ["categoryId", "items"] }, "HomeCityPreviewEventDto": { "type": "object", @@ -25855,10 +24467,7 @@ } } }, - "required": [ - "cityId", - "items" - ] + "required": ["cityId", "items"] }, "HomeFeedResponseDto": { "type": "object", @@ -25882,11 +24491,7 @@ } } }, - "required": [ - "popular", - "categoryPreviews", - "cityPreviews" - ] + "required": ["popular", "categoryPreviews", "cityPreviews"] }, "DiscoveryBootstrapResponseDto": { "type": "object", @@ -25904,10 +24509,7 @@ } } }, - "required": [ - "categories", - "cities" - ] + "required": ["categories", "cities"] }, "FollowUserSummaryDto": { "type": "object", @@ -25941,10 +24543,7 @@ ] } }, - "required": [ - "firstName", - "lastName" - ] + "required": ["firstName", "lastName"] }, "FollowResponseDto": { "type": "object", @@ -25970,10 +24569,7 @@ "status": { "type": "string", "description": "Follow status.", - "enum": [ - "active", - "muted" - ], + "enum": ["active", "muted"], "example": "active" }, "notifyNewEvents": { @@ -25996,14 +24592,7 @@ ] } }, - "required": [ - "id", - "followerId", - "organizerId", - "status", - "notifyNewEvents", - "createdAt" - ] + "required": ["id", "followerId", "organizerId", "status", "notifyNewEvents", "createdAt"] }, "UpdateFollowSettingsDto": { "type": "object", @@ -26020,10 +24609,7 @@ "properties": { "mediaType": { "type": "string", - "enum": [ - "image", - "video" - ] + "enum": ["image", "video"] }, "url": { "type": "string" @@ -26076,11 +24662,7 @@ "nullable": true } }, - "required": [ - "userId", - "firstName", - "lastName" - ] + "required": ["userId", "firstName", "lastName"] }, "OrganizerGuestListResponseDto": { "type": "object", @@ -26102,10 +24684,7 @@ }, "kind": { "type": "string", - "enum": [ - "manual", - "previous_attendees" - ] + "enum": ["manual", "previous_attendees"] }, "createdAt": { "format": "date-time", @@ -26116,15 +24695,7 @@ "type": "string" } }, - "required": [ - "id", - "organizerId", - "name", - "description", - "kind", - "createdAt", - "updatedAt" - ] + "required": ["id", "organizerId", "name", "description", "kind", "createdAt", "updatedAt"] }, "CreateOrganizerGuestListDto": { "type": "object", @@ -26139,9 +24710,7 @@ "example": "مهمانان رویدادهای قبلی و مخاطبین میزبان" } }, - "required": [ - "name" - ] + "required": ["name"] }, "GuestListItemResponseDto": { "type": "object", @@ -26180,15 +24749,7 @@ "type": "string" } }, - "required": [ - "id", - "listId", - "firstName", - "lastName", - "userId", - "note", - "createdAt" - ] + "required": ["id", "listId", "firstName", "lastName", "userId", "note", "createdAt"] }, "AddGuestListItemDto": { "type": "object", @@ -26213,27 +24774,21 @@ "type": "string" } }, - "required": [ - "mobile" - ] + "required": ["mobile"] }, "SetEventInvitedGuestsDto": { "type": "object", "properties": { "userIds": { "description": "Full replacement set of platform user ids invited to this event from the host guest list. An empty array clears the invite set.", - "example": [ - "b3f1c2a0-1111-4111-8111-b3f1c2a01111" - ], + "example": ["b3f1c2a0-1111-4111-8111-b3f1c2a01111"], "type": "array", "items": { "type": "string" } } }, - "required": [ - "userIds" - ] + "required": ["userIds"] }, "InvitedGuestResponseDto": { "type": "object", @@ -26256,11 +24811,7 @@ "nullable": true } }, - "required": [ - "userId", - "firstName", - "lastName" - ] + "required": ["userId", "firstName", "lastName"] }, "GuestListNotifyResultDto": { "type": "object", @@ -26278,11 +24829,7 @@ "type": "string" } }, - "required": [ - "sent", - "skipped", - "notifiedAt" - ] + "required": ["sent", "skipped", "notifiedAt"] }, "GuestListLinkResponseDto": { "type": "object", @@ -26308,12 +24855,7 @@ "type": "string" } }, - "required": [ - "eventId", - "listId", - "notifiedAt", - "createdAt" - ] + "required": ["eventId", "listId", "notifiedAt", "createdAt"] }, "LinkGuestListToEventDto": { "type": "object", @@ -26323,9 +24865,7 @@ "description": "Guest list to attach to the event" } }, - "required": [ - "listId" - ] + "required": ["listId"] }, "CreatePaymentDto": { "type": "object", @@ -26345,21 +24885,11 @@ }, "PaymentMethod": { "type": "string", - "enum": [ - "gateway", - "wallet", - "mixed" - ] + "enum": ["gateway", "wallet", "mixed"] }, "PaymentStatus": { "type": "string", - "enum": [ - "pending", - "processing", - "succeeded", - "failed", - "cancelled" - ] + "enum": ["pending", "processing", "succeeded", "failed", "cancelled"] }, "PaymentCheckoutResponseDto": { "type": "object", @@ -26372,10 +24902,7 @@ "format": "uri" } }, - "required": [ - "trackingId", - "paymentUrl" - ] + "required": ["trackingId", "paymentUrl"] }, "CreatePaymentResponseDto": { "type": "object", @@ -26519,9 +25046,7 @@ "example": "SAVE20AB" } }, - "required": [ - "code" - ] + "required": ["code"] }, "DiscountPreviewResponseDto": { "type": "object", @@ -26532,10 +25057,7 @@ }, "type": { "type": "string", - "enum": [ - "percent", - "fixed" - ] + "enum": ["percent", "fixed"] }, "value": { "type": "number", @@ -26554,14 +25076,7 @@ "example": 80000 } }, - "required": [ - "code", - "type", - "value", - "listAmount", - "discountAmount", - "payableAmount" - ] + "required": ["code", "type", "value", "listAmount", "discountAmount", "payableAmount"] }, "PaymentResponseDto": { "type": "object", @@ -26699,16 +25214,7 @@ "type": "string" } }, - "required": [ - "id", - "paymentId", - "userId", - "bookingId", - "eventId", - "receiptCode", - "snapshot", - "issuedAt" - ] + "required": ["id", "paymentId", "userId", "bookingId", "eventId", "receiptCode", "snapshot", "issuedAt"] }, "FinancialUserSummaryDto": { "type": "object", @@ -26729,10 +25235,7 @@ "nullable": true } }, - "required": [ - "id", - "mobile" - ] + "required": ["id", "mobile"] }, "AdminPaymentResponseDto": { "type": "object", @@ -26867,10 +25370,7 @@ }, "purpose": { "type": "string", - "enum": [ - "top_up", - "booking_checkout" - ] + "enum": ["top_up", "booking_checkout"] }, "amount": { "type": "number", @@ -26888,13 +25388,7 @@ }, "status": { "type": "string", - "enum": [ - "pending", - "processing", - "succeeded", - "failed", - "cancelled" - ] + "enum": ["pending", "processing", "succeeded", "failed", "cancelled"] }, "gatewayProvider": { "type": "string", @@ -26973,24 +25467,11 @@ "type": "string" } }, - "required": [ - "id", - "userId", - "balance", - "createdAt", - "updatedAt" - ] + "required": ["id", "userId", "balance", "createdAt", "updatedAt"] }, "WalletTransactionType": { "type": "string", - "enum": [ - "booking_payment", - "refund_guest_cancel", - "refund_event_cancel", - "organizer_earning", - "withdrawal", - "deposit" - ] + "enum": ["booking_payment", "refund_guest_cancel", "refund_event_cancel", "organizer_earning", "withdrawal", "deposit"] }, "WalletTransactionResponseDto": { "type": "object", @@ -27043,16 +25524,7 @@ "type": "string" } }, - "required": [ - "id", - "walletId", - "userId", - "transactionCode", - "type", - "amount", - "balanceAfter", - "createdAt" - ] + "required": ["id", "walletId", "userId", "transactionCode", "type", "amount", "balanceAfter", "createdAt"] }, "CreateWalletDepositDto": { "type": "object", @@ -27063,9 +25535,7 @@ "minimum": 10000 } }, - "required": [ - "amount" - ] + "required": ["amount"] }, "CreateWalletDepositResponseDto": { "type": "object", @@ -27087,10 +25557,7 @@ }, "purpose": { "type": "string", - "enum": [ - "top_up", - "booking_checkout" - ] + "enum": ["top_up", "booking_checkout"] }, "amount": { "type": "number", @@ -27108,13 +25575,7 @@ }, "status": { "type": "string", - "enum": [ - "pending", - "processing", - "succeeded", - "failed", - "cancelled" - ] + "enum": ["pending", "processing", "succeeded", "failed", "cancelled"] }, "gatewayProvider": { "type": "string", @@ -27200,10 +25661,7 @@ }, "purpose": { "type": "string", - "enum": [ - "top_up", - "booking_checkout" - ] + "enum": ["top_up", "booking_checkout"] }, "amount": { "type": "number", @@ -27221,13 +25679,7 @@ }, "status": { "type": "string", - "enum": [ - "pending", - "processing", - "succeeded", - "failed", - "cancelled" - ] + "enum": ["pending", "processing", "succeeded", "failed", "cancelled"] }, "gatewayProvider": { "type": "string", @@ -27283,10 +25735,7 @@ "properties": { "status": { "type": "string", - "enum": [ - "succeeded", - "failed" - ] + "enum": ["succeeded", "failed"] }, "signature": { "type": "string" @@ -27311,12 +25760,7 @@ "type": "string" } }, - "required": [ - "status", - "signature", - "timestamp", - "nonce" - ] + "required": ["status", "signature", "timestamp", "nonce"] }, "CreateBankAccountDto": { "type": "object", @@ -27331,24 +25775,15 @@ "example": "0012345678" } }, - "required": [ - "iban" - ] + "required": ["iban"] }, "BankAccountOwnerType": { "type": "string", - "enum": [ - "guest", - "organizer" - ] + "enum": ["guest", "organizer"] }, "BankAccountVerificationStatus": { "type": "string", - "enum": [ - "pending_review", - "approved", - "rejected" - ] + "enum": ["pending_review", "approved", "rejected"] }, "BankAccountResponseDto": { "type": "object", @@ -27445,9 +25880,7 @@ "minLength": 3 } }, - "required": [ - "reason" - ] + "required": ["reason"] }, "CreateWithdrawalRequestDto": { "type": "object", @@ -27461,19 +25894,11 @@ "description": "Amount in Toman" } }, - "required": [ - "bankAccountId", - "amount" - ] + "required": ["bankAccountId", "amount"] }, "WithdrawalStatus": { "type": "string", - "enum": [ - "pending", - "processing", - "completed", - "rejected" - ] + "enum": ["pending", "processing", "completed", "rejected"] }, "WithdrawalUserSummaryDto": { "type": "object", @@ -27490,9 +25915,7 @@ "nullable": true } }, - "required": [ - "mobile" - ] + "required": ["mobile"] }, "WithdrawalBankAccountSummaryDto": { "type": "object", @@ -27501,9 +25924,7 @@ "type": "string" } }, - "required": [ - "iban" - ] + "required": ["iban"] }, "WithdrawalResponseDto": { "type": "object", @@ -27611,10 +26032,7 @@ "description": "Optional admin note shown to the recipient" } }, - "required": [ - "trackingCode", - "receiptUrl" - ] + "required": ["trackingCode", "receiptUrl"] }, "RejectWithdrawalRequestDto": { "type": "object", @@ -27623,18 +26041,11 @@ "type": "string" } }, - "required": [ - "reason" - ] + "required": ["reason"] }, "OrganizerEarningStatus": { "type": "string", - "enum": [ - "held", - "available", - "settled", - "cancelled" - ] + "enum": ["held", "available", "settled", "cancelled"] }, "OrganizerEarningResponseDto": { "type": "object", @@ -27718,12 +26129,7 @@ }, "SettlementBatchStatus": { "type": "string", - "enum": [ - "pending", - "processing", - "completed", - "failed" - ] + "enum": ["pending", "processing", "completed", "failed"] }, "SettlementItemResponseDto": { "type": "object", @@ -27747,13 +26153,7 @@ "type": "string" } }, - "required": [ - "id", - "amount", - "organizerEarningId", - "eventId", - "eventTitle" - ] + "required": ["id", "amount", "organizerEarningId", "eventId", "eventTitle"] }, "SettlementResponseDto": { "type": "object", @@ -27859,12 +26259,7 @@ "example": "2026-07-07" } }, - "required": [ - "organizerId", - "bankAccountId", - "periodStart", - "periodEnd" - ] + "required": ["organizerId", "bankAccountId", "periodStart", "periodEnd"] }, "FailSettlementDto": { "type": "object", @@ -27873,19 +26268,14 @@ "type": "string" } }, - "required": [ - "reason" - ] + "required": ["reason"] }, "CreateDiscountCodesDto": { "type": "object", "properties": { "type": { "type": "string", - "enum": [ - "percent", - "fixed" - ], + "enum": ["percent", "fixed"], "example": "percent" }, "value": { @@ -27925,19 +26315,12 @@ }, "bearer": { "type": "string", - "enum": [ - "organizer", - "platform" - ], + "enum": ["organizer", "platform"], "description": "Who absorbs the discount. Admin-only; host requests are always forced to \"organizer\".", "example": "organizer" } }, - "required": [ - "type", - "value", - "quantity" - ] + "required": ["type", "value", "quantity"] }, "DiscountCodeResponseDto": { "type": "object", @@ -27956,10 +26339,7 @@ }, "type": { "type": "string", - "enum": [ - "percent", - "fixed" - ] + "enum": ["percent", "fixed"] }, "value": { "type": "number", @@ -27967,10 +26347,7 @@ }, "bearer": { "type": "string", - "enum": [ - "organizer", - "platform" - ] + "enum": ["organizer", "platform"] }, "maxUses": { "type": "number", @@ -28041,10 +26418,7 @@ }, "codes": { "description": "The generated codes, ready to share", - "example": [ - "SAVE20AB", - "SAVE20CD" - ], + "example": ["SAVE20AB", "SAVE20CD"], "type": "array", "items": { "type": "string" @@ -28057,12 +26431,7 @@ } } }, - "required": [ - "batchId", - "count", - "codes", - "items" - ] + "required": ["batchId", "count", "codes", "items"] }, "DiscountCodePageDto": { "type": "object", @@ -28074,9 +26443,7 @@ } } }, - "required": [ - "items" - ] + "required": ["items"] }, "DiscountReportSummaryDto": { "type": "object", @@ -28105,13 +26472,7 @@ "example": 70000 } }, - "required": [ - "totalCodes", - "totalRedemptions", - "totalDiscountAmount", - "totalPlatformAbsorbed", - "totalOrganizerAbsorbed" - ] + "required": ["totalCodes", "totalRedemptions", "totalDiscountAmount", "totalPlatformAbsorbed", "totalOrganizerAbsorbed"] }, "DiscountRedemptionResponseDto": { "type": "object", @@ -28162,10 +26523,7 @@ }, "bearer": { "type": "string", - "enum": [ - "organizer", - "platform" - ] + "enum": ["organizer", "platform"] }, "platformAbsorbedAmount": { "type": "number", @@ -28206,9 +26564,7 @@ } } }, - "required": [ - "items" - ] + "required": ["items"] }, "DiscountManagementBootstrapResponseDto": { "type": "object", @@ -28223,11 +26579,7 @@ "$ref": "#/components/schemas/DiscountRedemptionPageDto" } }, - "required": [ - "codes", - "report", - "redemptions" - ] + "required": ["codes", "report", "redemptions"] }, "UpdateDiscountCodeDto": { "type": "object", @@ -28238,16 +26590,11 @@ "example": false } }, - "required": [ - "isActive" - ] + "required": ["isActive"] }, "TrafficSource": { "type": "string", - "enum": [ - "instagram", - "telegram" - ], + "enum": ["instagram", "telegram"], "description": "First-touch attribution from a tagged share link. Ignored if invalid." }, "CreateBookingDto": { @@ -28410,9 +26757,7 @@ "description": "Cancellation reason — mandatory (booking-cancellation-refund.md: required from the product’s point of view, previously only optional in this DTO)." } }, - "required": [ - "cancellationReason" - ] + "required": ["cancellationReason"] }, "JoinWaitlistDto": { "type": "object", @@ -28429,14 +26774,7 @@ }, "WaitlistStatus": { "type": "string", - "enum": [ - "waiting", - "notified", - "accepted", - "expired", - "cancelled", - "converted" - ] + "enum": ["waiting", "notified", "accepted", "expired", "cancelled", "converted"] }, "WaitlistResponseDto": { "type": "object", @@ -28484,14 +26822,7 @@ "type": "string" } }, - "required": [ - "id", - "eventId", - "userId", - "status", - "createdAt", - "updatedAt" - ] + "required": ["id", "eventId", "userId", "status", "createdAt", "updatedAt"] }, "WaitlistAcceptedBookingDto": { "type": "object", @@ -28556,16 +26887,7 @@ "type": "string" } }, - "required": [ - "id", - "eventId", - "userId", - "bookingCode", - "status", - "cancellationReason", - "createdAt", - "updatedAt" - ] + "required": ["id", "eventId", "userId", "bookingCode", "status", "cancellationReason", "createdAt", "updatedAt"] }, "WaitlistAcceptResponseDto": { "type": "object", @@ -28578,10 +26900,7 @@ "$ref": "#/components/schemas/WaitlistAcceptedBookingDto" } }, - "required": [ - "waitlistEntryId", - "booking" - ] + "required": ["waitlistEntryId", "booking"] }, "AdminBookingEventDto": { "type": "object", @@ -28609,13 +26928,7 @@ "format": "uuid" } }, - "required": [ - "id", - "title", - "startsAt", - "status", - "organizerId" - ] + "required": ["id", "title", "startsAt", "status", "organizerId"] }, "AdminBookingUserDto": { "type": "object", @@ -28636,10 +26949,7 @@ "nullable": true } }, - "required": [ - "id", - "mobile" - ] + "required": ["id", "mobile"] }, "AdminBookingResponseDto": { "type": "object", @@ -28918,10 +27228,7 @@ "maxLength": 5000 } }, - "required": [ - "bookingId", - "rating" - ] + "required": ["bookingId", "rating"] }, "UpdateReviewDto": { "type": "object", @@ -28969,10 +27276,7 @@ "example": "Tehran hiking meetup" } }, - "required": [ - "id", - "title" - ] + "required": ["id", "title"] }, "AdminReviewResponseDto": { "type": "object", @@ -29065,19 +27369,7 @@ ] } }, - "required": [ - "id", - "eventId", - "userId", - "bookingId", - "rating", - "body", - "status", - "createdAt", - "updatedAt", - "user", - "event" - ] + "required": ["id", "eventId", "userId", "bookingId", "rating", "body", "status", "createdAt", "updatedAt", "user", "event"] }, "UnreadCountResponseDto": { "type": "object", @@ -29088,16 +27380,11 @@ "example": 3 } }, - "required": [ - "totalUnread" - ] + "required": ["totalUnread"] }, "ConversationType": { "type": "string", - "enum": [ - "event_group", - "direct" - ], + "enum": ["event_group", "direct"], "description": "Conversation type." }, "ConversationResponseDto": { @@ -29192,14 +27479,7 @@ "format": "date-time" } }, - "required": [ - "id", - "type", - "unreadCount", - "memberCount", - "messagingBlocked", - "createdAt" - ] + "required": ["id", "type", "unreadCount", "memberCount", "messagingBlocked", "createdAt"] }, "SendMessageDto": { "type": "object", @@ -29258,13 +27538,7 @@ "description": "True when the parent cannot be jumped to (soft-deleted, missing, or wrong conversation)." } }, - "required": [ - "id", - "senderId", - "senderDisplayName", - "hasImage", - "isUnavailable" - ] + "required": ["id", "senderId", "senderDisplayName", "hasImage", "isUnavailable"] }, "MessageResponseDto": { "type": "object", @@ -29346,12 +27620,7 @@ "format": "date-time" } }, - "required": [ - "id", - "conversationId", - "senderId", - "createdAt" - ] + "required": ["id", "conversationId", "senderId", "createdAt"] }, "ConversationParticipantResponseDto": { "type": "object", @@ -29398,10 +27667,7 @@ "format": "date-time" } }, - "required": [ - "userId", - "joinedAt" - ] + "required": ["userId", "joinedAt"] }, "MarkConversationReadDto": { "type": "object", @@ -29412,9 +27678,7 @@ "format": "uuid" } }, - "required": [ - "lastSeenMessageId" - ] + "required": ["lastSeenMessageId"] }, "AdminChatUserDto": { "type": "object", @@ -29462,12 +27726,7 @@ "format": "date-time" } }, - "required": [ - "userId", - "mobile", - "status", - "joinedAt" - ] + "required": ["userId", "mobile", "status", "joinedAt"] }, "AdminConversationResponseDto": { "type": "object", @@ -29521,13 +27780,7 @@ "format": "date-time" } }, - "required": [ - "id", - "type", - "participantPreview", - "memberCount", - "createdAt" - ] + "required": ["id", "type", "participantPreview", "memberCount", "createdAt"] }, "AdminMessageResponseDto": { "type": "object", @@ -29593,13 +27846,7 @@ "format": "date-time" } }, - "required": [ - "id", - "conversationId", - "senderId", - "senderMobile", - "createdAt" - ] + "required": ["id", "conversationId", "senderId", "senderMobile", "createdAt"] }, "CreateContactMessageDto": { "type": "object", @@ -29638,13 +27885,7 @@ "maxLength": 4096 } }, - "required": [ - "fullName", - "mobile", - "subject", - "message", - "arcaptchaToken" - ] + "required": ["fullName", "mobile", "subject", "message", "arcaptchaToken"] }, "ContactMessageResponseDto": { "type": "object", @@ -29696,24 +27937,14 @@ "format": "date-time" } }, - "required": [ - "id", - "fullName", - "mobile", - "subject", - "message", - "createdAt" - ] + "required": ["id", "fullName", "mobile", "subject", "message", "createdAt"] }, "CreateTrafficVisitDto": { "type": "object", "properties": { "pageKind": { "type": "string", - "enum": [ - "home", - "event" - ] + "enum": ["home", "event"] }, "eventId": { "type": "string", @@ -29733,11 +27964,7 @@ "description": "Durable anonymous visitor id from the browser localStorage." } }, - "required": [ - "pageKind", - "source", - "visitorKey" - ] + "required": ["pageKind", "source", "visitorKey"] }, "CreateUserBlockDto": { "type": "object", @@ -29749,9 +27976,7 @@ "format": "uuid" } }, - "required": [ - "blockedId" - ] + "required": ["blockedId"] }, "UserBlockUserSummaryDto": { "type": "object", @@ -29769,10 +27994,7 @@ "nullable": true } }, - "required": [ - "firstName", - "lastName" - ] + "required": ["firstName", "lastName"] }, "UserBlockResponseDto": { "type": "object", @@ -29810,13 +28032,7 @@ ] } }, - "required": [ - "id", - "blockerId", - "blockedId", - "createdAt", - "blockedUser" - ] + "required": ["id", "blockerId", "blockedId", "createdAt", "blockedUser"] }, "ReportReasonResponseDto": { "type": "object", @@ -29848,12 +28064,7 @@ "minimum": 0 } }, - "required": [ - "id", - "code", - "label", - "sortOrder" - ] + "required": ["id", "code", "label", "sortOrder"] }, "CreateUserReportDto": { "type": "object", @@ -29883,17 +28094,11 @@ "format": "uuid" } }, - "required": [ - "reportedId" - ] + "required": ["reportedId"] }, "ReportStatus": { "type": "string", - "enum": [ - "pending", - "reviewed", - "dismissed" - ], + "enum": ["pending", "reviewed", "dismissed"], "description": "Report review status." }, "UserReportResponseDto": { @@ -29986,13 +28191,7 @@ "format": "date-time" } }, - "required": [ - "id", - "reporterId", - "reportedId", - "status", - "createdAt" - ] + "required": ["id", "reporterId", "reportedId", "status", "createdAt"] }, "UserReportUserSummaryDto": { "type": "object", @@ -30015,11 +28214,7 @@ "nullable": true } }, - "required": [ - "mobile", - "firstName", - "lastName" - ] + "required": ["mobile", "firstName", "lastName"] }, "AdminUserReportResponseDto": { "type": "object", @@ -30135,15 +28330,7 @@ ] } }, - "required": [ - "id", - "reporterId", - "reportedId", - "status", - "createdAt", - "reporter", - "reported" - ] + "required": ["id", "reporterId", "reportedId", "status", "createdAt", "reporter", "reported"] }, "AdminUserReportBlockResponseDto": { "type": "object", @@ -30165,10 +28352,7 @@ ] } }, - "required": [ - "report", - "block" - ] + "required": ["report", "block"] }, "CreateSupportTicketDto": { "type": "object", @@ -30179,24 +28363,12 @@ }, "category": { "type": "string", - "enum": [ - "general", - "account", - "event", - "booking", - "payment", - "technical" - ], + "enum": ["general", "account", "event", "booking", "payment", "technical"], "example": "payment" }, "priority": { "type": "string", - "enum": [ - "low", - "normal", - "high", - "urgent" - ], + "enum": ["low", "normal", "high", "urgent"], "example": "normal" }, "message": { @@ -30204,12 +28376,7 @@ "example": "پرداخت انجام شد اما رزرو ثبت نشده است." } }, - "required": [ - "subject", - "category", - "priority", - "message" - ] + "required": ["subject", "category", "priority", "message"] }, "SupportTicketUserResponseDto": { "type": "object", @@ -30224,9 +28391,7 @@ "example": "علی رضایی" } }, - "required": [ - "mobile" - ] + "required": ["mobile"] }, "SupportTicketMessageResponseDto": { "type": "object", @@ -30250,13 +28415,7 @@ "format": "date-time" } }, - "required": [ - "id", - "senderId", - "body", - "isAdmin", - "createdAt" - ] + "required": ["id", "senderId", "body", "isAdmin", "createdAt"] }, "SupportTicketResponseDto": { "type": "object", @@ -30274,32 +28433,15 @@ }, "category": { "type": "string", - "enum": [ - "general", - "account", - "event", - "booking", - "payment", - "technical" - ] + "enum": ["general", "account", "event", "booking", "payment", "technical"] }, "priority": { "type": "string", - "enum": [ - "low", - "normal", - "high", - "urgent" - ] + "enum": ["low", "normal", "high", "urgent"] }, "status": { "type": "string", - "enum": [ - "open", - "waiting_admin", - "waiting_user", - "closed" - ] + "enum": ["open", "waiting_admin", "waiting_user", "closed"] }, "lastMessageAt": { "type": "string", @@ -30324,18 +28466,7 @@ } } }, - "required": [ - "id", - "userId", - "subject", - "category", - "priority", - "status", - "lastMessageAt", - "createdAt", - "user", - "messages" - ] + "required": ["id", "userId", "subject", "category", "priority", "status", "lastMessageAt", "createdAt", "user", "messages"] }, "SupportTicketSummaryResponseDto": { "type": "object", @@ -30353,32 +28484,15 @@ }, "category": { "type": "string", - "enum": [ - "general", - "account", - "event", - "booking", - "payment", - "technical" - ] + "enum": ["general", "account", "event", "booking", "payment", "technical"] }, "priority": { "type": "string", - "enum": [ - "low", - "normal", - "high", - "urgent" - ] + "enum": ["low", "normal", "high", "urgent"] }, "status": { "type": "string", - "enum": [ - "open", - "waiting_admin", - "waiting_user", - "closed" - ] + "enum": ["open", "waiting_admin", "waiting_user", "closed"] }, "lastMessageAt": { "type": "string", @@ -30407,17 +28521,7 @@ ] } }, - "required": [ - "id", - "userId", - "subject", - "category", - "priority", - "status", - "lastMessageAt", - "createdAt", - "user" - ] + "required": ["id", "userId", "subject", "category", "priority", "status", "lastMessageAt", "createdAt", "user"] }, "ReplySupportTicketDto": { "type": "object", @@ -30427,26 +28531,17 @@ "example": "درخواست شما در حال بررسی است." } }, - "required": [ - "message" - ] + "required": ["message"] }, "UpdateSupportTicketStatusDto": { "type": "object", "properties": { "status": { "type": "string", - "enum": [ - "open", - "waiting_admin", - "waiting_user", - "closed" - ] + "enum": ["open", "waiting_admin", "waiting_user", "closed"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "UserCountsDto": { "type": "object", @@ -30468,12 +28563,7 @@ "example": 12 } }, - "required": [ - "total", - "active", - "pending", - "suspended" - ] + "required": ["total", "active", "pending", "suspended"] }, "EventStatusCountsDto": { "type": "object", @@ -30507,15 +28597,7 @@ "example": 210 } }, - "required": [ - "draft", - "pending_review", - "published", - "full", - "rejected", - "cancelled", - "completed" - ] + "required": ["draft", "pending_review", "published", "full", "rejected", "cancelled", "completed"] }, "EventCountsDto": { "type": "object", @@ -30538,12 +28620,7 @@ "$ref": "#/components/schemas/EventStatusCountsDto" } }, - "required": [ - "total", - "active", - "totalHeld", - "byStatus" - ] + "required": ["total", "active", "totalHeld", "byStatus"] }, "BookingStatusCountsDto": { "type": "object", @@ -30573,14 +28650,7 @@ "example": 25 } }, - "required": [ - "pending_payment", - "confirmed", - "cancelled", - "expired", - "refunded", - "no_show" - ] + "required": ["pending_payment", "confirmed", "cancelled", "expired", "refunded", "no_show"] }, "BookingCountsDto": { "type": "object", @@ -30593,10 +28663,7 @@ "$ref": "#/components/schemas/BookingStatusCountsDto" } }, - "required": [ - "total", - "byStatus" - ] + "required": ["total", "byStatus"] }, "IdentityVerificationCountsDto": { "type": "object", @@ -30618,12 +28685,7 @@ "example": 29 } }, - "required": [ - "none", - "pending", - "verified", - "rejected" - ] + "required": ["none", "pending", "verified", "rejected"] }, "FinancialTotalsDto": { "type": "object", @@ -30639,10 +28701,7 @@ "description": "Sum of wallets.balance across all wallets (Toman, as a string)." } }, - "required": [ - "totalCommissionCollected", - "totalWalletBalance" - ] + "required": ["totalCommissionCollected", "totalWalletBalance"] }, "AdminReportsOverviewDto": { "type": "object", @@ -30663,13 +28722,7 @@ "$ref": "#/components/schemas/FinancialTotalsDto" } }, - "required": [ - "users", - "events", - "bookings", - "identityVerifications", - "financial" - ] + "required": ["users", "events", "bookings", "identityVerifications", "financial"] }, "AdminUserContactLinkDto": { "type": "object", @@ -30702,22 +28755,11 @@ "type": "number" } }, - "required": [ - "id", - "channel", - "label", - "value", - "url", - "isPublic", - "displayOrder" - ] + "required": ["id", "channel", "label", "value", "url", "isPublic", "displayOrder"] }, "HostPlan": { "type": "string", - "enum": [ - "free", - "unlimited" - ] + "enum": ["free", "unlimited"] }, "AdminUserSummaryCountsDto": { "type": "object", @@ -30851,12 +28893,7 @@ }, "identityStatus": { "type": "string", - "enum": [ - "none", - "pending", - "verified", - "rejected" - ] + "enum": ["none", "pending", "verified", "rejected"] }, "identityVerifiedAt": { "type": "string", @@ -30930,9 +28967,7 @@ "description": "Optional admin note (Toman credit reason)" } }, - "required": [ - "amount" - ] + "required": ["amount"] }, "AdminCreditWalletResponseDto": { "type": "object", @@ -30945,10 +28980,7 @@ "$ref": "#/components/schemas/WalletTransactionResponseDto" } }, - "required": [ - "walletBalance", - "transaction" - ] + "required": ["walletBalance", "transaction"] }, "AdminUserHostedEventDto": { "type": "object", @@ -30992,18 +29024,7 @@ "type": "string" } }, - "required": [ - "id", - "title", - "status", - "startsAt", - "endsAt", - "capacity", - "bookedCount", - "isFree", - "price", - "createdAt" - ] + "required": ["id", "title", "status", "startsAt", "endsAt", "capacity", "bookedCount", "isFree", "price", "createdAt"] }, "AdminUserBookingDto": { "type": "object", @@ -31049,14 +29070,7 @@ "type": "string" } }, - "required": [ - "id", - "bookingCode", - "status", - "eventId", - "eventTitle", - "createdAt" - ] + "required": ["id", "bookingCode", "status", "eventId", "eventTitle", "createdAt"] }, "AdminUserPaymentDto": { "type": "object", @@ -31173,15 +29187,7 @@ "type": "string" } }, - "required": [ - "id", - "rating", - "status", - "eventId", - "eventTitle", - "authorId", - "createdAt" - ] + "required": ["id", "rating", "status", "eventId", "eventTitle", "authorId", "createdAt"] }, "AdminUserFollowDto": { "type": "object", @@ -31209,13 +29215,7 @@ "type": "string" } }, - "required": [ - "id", - "userId", - "mobile", - "notifyNewEvents", - "createdAt" - ] + "required": ["id", "userId", "mobile", "notifyNewEvents", "createdAt"] }, "AdminUserReportDto": { "type": "object", @@ -31255,13 +29255,7 @@ "type": "string" } }, - "required": [ - "id", - "status", - "otherUserId", - "otherUserMobile", - "createdAt" - ] + "required": ["id", "status", "otherUserId", "otherUserMobile", "createdAt"] }, "AdminUserBlockDto": { "type": "object", @@ -31286,12 +29280,7 @@ "type": "string" } }, - "required": [ - "id", - "otherUserId", - "otherUserMobile", - "createdAt" - ] + "required": ["id", "otherUserId", "otherUserMobile", "createdAt"] }, "AdminAuditLogResponseDto": { "type": "object", @@ -31347,14 +29336,7 @@ "format": "date-time" } }, - "required": [ - "id", - "method", - "path", - "params", - "statusCode", - "createdAt" - ] + "required": ["id", "method", "path", "params", "statusCode", "createdAt"] }, "UploadFileResponseDto": { "type": "object", @@ -31370,10 +29352,7 @@ "example": "http://localhost:3000/uploads/files/550e8400-e29b-41d4-a716-446655440000.jpg" } }, - "required": [ - "id", - "url" - ] + "required": ["id", "url"] }, "BlogArticleCitySummaryDto": { "type": "object", @@ -31391,11 +29370,7 @@ "example": "اهواز" } }, - "required": [ - "id", - "slug", - "name" - ] + "required": ["id", "slug", "name"] }, "BlogArticleEventCategorySummaryDto": { "type": "object", @@ -31413,11 +29388,7 @@ "example": "عکاسی" } }, - "required": [ - "id", - "slug", - "name" - ] + "required": ["id", "slug", "name"] }, "BlogArticleSummaryResponseDto": { "type": "object", @@ -31647,12 +29618,7 @@ }, "categorySlug": { "type": "string", - "enum": [ - "attendee-guide", - "hosting", - "city-guides", - "event-selection" - ], + "enum": ["attendee-guide", "hosting", "city-guides", "event-selection"], "example": "city-guides" }, "categoryName": { @@ -31690,14 +29656,7 @@ "format": "date-time" } }, - "required": [ - "slug", - "title", - "excerpt", - "categorySlug", - "categoryName", - "bodyHtml" - ] + "required": ["slug", "title", "excerpt", "categorySlug", "categoryName", "bodyHtml"] }, "UpdateBlogArticleDto": { "type": "object", @@ -31726,12 +29685,7 @@ }, "categorySlug": { "type": "string", - "enum": [ - "attendee-guide", - "hosting", - "city-guides", - "event-selection" - ], + "enum": ["attendee-guide", "hosting", "city-guides", "event-selection"], "example": "city-guides" }, "categoryName": { @@ -31779,9 +29733,7 @@ "example": "ok" } }, - "required": [ - "status" - ] + "required": ["status"] } } } diff --git a/services/events.ts b/services/events.ts index 986c01e..6a92e83 100644 --- a/services/events.ts +++ b/services/events.ts @@ -4,6 +4,7 @@ import type { CreateEventMediaDto, EventCategoryResponseDto, EventResponseDto, + AdminCreateEventDto, } from '@/api/generated/models' import { getAdminEventCategories } from '@/api/generated/admin-event-categories/admin-event-categories' import { getAdminEvents } from '@/api/generated/admin-events/admin-events' @@ -14,6 +15,7 @@ import { API_ROUTES } from '@/services/config' export type EventCategory = EventCategoryResponseDto export type CreateEventPayload = CreateEventDto +export type AdminCreateEventPayload = AdminCreateEventDto export type CreatedEvent = EventResponseDto export type CreateEventMediaPayload = CreateEventMediaDto export type CreateEventFaqPayload = CreateEventFaqDto @@ -45,6 +47,16 @@ export async function fetchEventCategories(): Promise { return items } +/** + * Create a pre-approved draft for a verified host. Host still publishes; + * backend notifies the host via `event_created_by_admin`. + */ +export async function createEventAsAdmin(payload: AdminCreateEventPayload): Promise { + const response = await adminEventsApi.adminEventsControllerCreate(payload) + + return unwrapApiPayload(response.data) +} + /** Admin approval is one half of the two-key publication workflow. */ export async function approveEventAsAdmin(eventId: string): Promise { const response = await adminEventsApi.adminEventsControllerApprove(eventId) diff --git a/texts/events.ts b/texts/events.ts index 94b6641..c1d3708 100644 --- a/texts/events.ts +++ b/texts/events.ts @@ -87,6 +87,21 @@ export const events = { eventLoadFailed: 'بارگذاری رویداد ناموفق بود', eventUpdated: 'رویداد به‌روزرسانی شد', eventUpdateFailed: 'ذخیره تغییرات ناموفق بود', + createEventTitle: 'رویداد جدید', + createEventSuccess: 'رویداد ساخته شد؛ میزبان باید آن را منتشر کند', + createEventFailed: 'ساخت رویداد ناموفق بود', + createEventHostRequired: 'یک میزبان تأییدشده انتخاب کنید', + createEventHostSectionTitle: 'میزبان رویداد', + createEventHostSectionDescription: + 'رویداد به نام این میزبان ساخته می‌شود، از قبل تأیید می‌شود و پیامک اطلاع‌رسانی برای او ارسال می‌گردد. انتشار با خود میزبان است.', + createEventHostPickerLabel: 'انتخاب میزبان تأییدشده', + createEventHostPickerPlaceholder: 'میزبان را انتخاب کنید', + createEventHostSearchPlaceholder: 'جستجو با موبایل، نام یا نام خانوادگی', + createEventHostSearchEmpty: 'میزبان تأییدشده‌ای پیدا نشد', + createEventHostSearchFailed: 'دریافت لیست میزبان‌ها ناموفق بود', + reservedCapacityLabel: 'ظرفیت رزروشده (خارج از قبیله)', + createEventSubmit: 'ساخت رویداد تأییدشده', + createEventApprovedHint: 'پس از ساخت، وضعیت پیش‌نویس تأییدشده است و فقط میزبان می‌تواند آن را منتشر کند.', editStatusBlocked: 'این رویداد در وضعیت «{status}» دیگر قابل ویرایش نیست.', capacityBelowOccupied: 'ظرفیت نمی‌تواند کمتر از صندلی‌های اشغال‌شده ({min}) باشد', basicInfoCardTitle: 'اطلاعات پایه',