You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
9941 lines
252 KiB
9941 lines
252 KiB
openapi: 3.0.3
|
|
info:
|
|
title: API سامانه تعاملات بینالملل
|
|
version: 2.0.0
|
|
description: مستندات نقاط پایانی سامانه تعاملات بینالملل آستان قدس رضوی (فاز دوم)
|
|
paths:
|
|
/api/v1/account/admin/directory-users/:
|
|
get:
|
|
operationId: v1_account_admin_directory_users_list
|
|
description: |-
|
|
Separate, dedicated endpoint for accounts/users list page.
|
|
Filters users who have an email, are not deleted (deleted_at is null).
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedAdminUserList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_account_admin_directory_users_create
|
|
description: |-
|
|
Separate, dedicated endpoint for accounts/users list page.
|
|
Filters users who have an email, are not deleted (deleted_at is null).
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
/api/v1/account/admin/directory-users/{id}/:
|
|
get:
|
|
operationId: v1_account_admin_directory_users_retrieve
|
|
description: |-
|
|
Separate, dedicated endpoint for accounts/users list page.
|
|
Filters users who have an email, are not deleted (deleted_at is null).
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this User.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
put:
|
|
operationId: v1_account_admin_directory_users_update
|
|
description: |-
|
|
Separate, dedicated endpoint for accounts/users list page.
|
|
Filters users who have an email, are not deleted (deleted_at is null).
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this User.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_account_admin_directory_users_partial_update
|
|
description: |-
|
|
Separate, dedicated endpoint for accounts/users list page.
|
|
Filters users who have an email, are not deleted (deleted_at is null).
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this User.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedAdminUserRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedAdminUserRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedAdminUserRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_account_admin_directory_users_destroy
|
|
description: |-
|
|
Separate, dedicated endpoint for accounts/users list page.
|
|
Filters users who have an email, are not deleted (deleted_at is null).
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this User.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
/api/v1/account/admin/directory-users/export_excel/:
|
|
get:
|
|
operationId: v1_account_admin_directory_users_export_excel_retrieve
|
|
description: |-
|
|
Export users to an Excel (.xlsx) file.
|
|
Accepts user_ids in POST body for selective bulk export,
|
|
or uses current queryset filters if no specific IDs are provided.
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
post:
|
|
operationId: v1_account_admin_directory_users_export_excel_create
|
|
description: |-
|
|
Export users to an Excel (.xlsx) file.
|
|
Accepts user_ids in POST body for selective bulk export,
|
|
or uses current queryset filters if no specific IDs are provided.
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
/api/v1/account/admin/login/:
|
|
post:
|
|
operationId: v1_account_admin_login_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserLoginRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserLoginRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserLoginRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserLogin'
|
|
description: ''
|
|
/api/v1/account/admin/notification-templates/:
|
|
get:
|
|
operationId: v1_account_admin_notification_templates_list
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedNotificationTemplateList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_account_admin_notification_templates_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplateRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplate'
|
|
description: ''
|
|
/api/v1/account/admin/notification-templates/{id}/:
|
|
get:
|
|
operationId: v1_account_admin_notification_templates_retrieve
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this Notification Template.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplate'
|
|
description: ''
|
|
put:
|
|
operationId: v1_account_admin_notification_templates_update
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this Notification Template.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplateRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplate'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_account_admin_notification_templates_partial_update
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this Notification Template.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedNotificationTemplateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedNotificationTemplateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedNotificationTemplateRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/NotificationTemplate'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_account_admin_notification_templates_destroy
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this Notification Template.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
/api/v1/account/admin/notifications/:
|
|
get:
|
|
operationId: v1_account_admin_notifications_list
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedAdminNotificationList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_account_admin_notifications_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotificationRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotificationRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotificationRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotification'
|
|
description: ''
|
|
/api/v1/account/admin/notifications/{id}/:
|
|
get:
|
|
operationId: v1_account_admin_notifications_retrieve
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this Notification.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotification'
|
|
description: ''
|
|
put:
|
|
operationId: v1_account_admin_notifications_update
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this Notification.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotificationRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotificationRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotificationRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotification'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_account_admin_notifications_partial_update
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this Notification.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedAdminNotificationRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedAdminNotificationRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedAdminNotificationRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminNotification'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_account_admin_notifications_destroy
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this Notification.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
/api/v1/account/admin/users/:
|
|
get:
|
|
operationId: v1_account_admin_users_list
|
|
description: |-
|
|
Admin-only endpoint for full CRUD operations on Users.
|
|
Includes searching, filtering, and pagination.
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedAdminUserList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_account_admin_users_create
|
|
description: |-
|
|
Admin-only endpoint for full CRUD operations on Users.
|
|
Includes searching, filtering, and pagination.
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
/api/v1/account/admin/users/{id}/:
|
|
get:
|
|
operationId: v1_account_admin_users_retrieve
|
|
description: |-
|
|
Admin-only endpoint for full CRUD operations on Users.
|
|
Includes searching, filtering, and pagination.
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this User.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
put:
|
|
operationId: v1_account_admin_users_update
|
|
description: |-
|
|
Admin-only endpoint for full CRUD operations on Users.
|
|
Includes searching, filtering, and pagination.
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this User.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_account_admin_users_partial_update
|
|
description: |-
|
|
Admin-only endpoint for full CRUD operations on Users.
|
|
Includes searching, filtering, and pagination.
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this User.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedAdminUserRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedAdminUserRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedAdminUserRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_account_admin_users_destroy
|
|
description: |-
|
|
Admin-only endpoint for full CRUD operations on Users.
|
|
Includes searching, filtering, and pagination.
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this User.
|
|
required: true
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
/api/v1/account/admin/users/export_excel/:
|
|
get:
|
|
operationId: v1_account_admin_users_export_excel_retrieve
|
|
description: |-
|
|
Export users to an Excel (.xlsx) file.
|
|
Accepts user_ids in POST body for selective bulk export,
|
|
or uses current queryset filters if no specific IDs are provided.
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
post:
|
|
operationId: v1_account_admin_users_export_excel_create
|
|
description: |-
|
|
Export users to an Excel (.xlsx) file.
|
|
Accepts user_ids in POST body for selective bulk export,
|
|
or uses current queryset filters if no specific IDs are provided.
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUserRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
description: ''
|
|
/api/v1/account/exchange-token/:
|
|
post:
|
|
operationId: v1_account_exchange_token_create
|
|
description: تبدیل temporary token به اطلاعات کاربر برای ورود از اپ موبایل
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ExchangeTokenRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ExchangeTokenRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ExchangeTokenRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ExchangeToken'
|
|
description: ''
|
|
/api/v1/account/guest/:
|
|
post:
|
|
operationId: v1_account_guest_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserGuestRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserGuestRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserGuestRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserGuest'
|
|
description: ''
|
|
/api/v1/account/location-update/:
|
|
post:
|
|
operationId: v1_account_location_update_create
|
|
description: Records client coordinates and IP address for session security.
|
|
summary: Record location update
|
|
tags:
|
|
- Location
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LocationHistoryRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/LocationHistoryRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/LocationHistoryRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LocationHistory'
|
|
description: ''
|
|
/api/v1/account/login/:
|
|
post:
|
|
operationId: v1_account_login_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserLoginRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserLoginRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserLoginRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserLogin'
|
|
description: ''
|
|
/api/v1/account/notif/:
|
|
get:
|
|
operationId: v1_account_notif_list
|
|
description: Retrieve a paginated list of notifications for the authenticated
|
|
user.
|
|
summary: Retrieve user notifications
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- Notifications
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedNotificationList'
|
|
description: ''
|
|
/api/v1/account/notif/read/:
|
|
post:
|
|
operationId: v1_account_notif_read_create
|
|
description: Mark all notifications as read for the authenticated user.
|
|
summary: Mark all notifications as read
|
|
tags:
|
|
- Notifications
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
description: All notifications marked as read
|
|
/api/v1/account/notif/send/:
|
|
post:
|
|
operationId: v1_account_notif_send_create
|
|
description: Dispatch an in-app notification to a specific user.
|
|
summary: Send notification to user
|
|
tags:
|
|
- Notifications
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SendNotificationRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/SendNotificationRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/SendNotificationRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
description: Notification dispatched.
|
|
'404':
|
|
description: User not found.
|
|
/api/v1/account/profile/:
|
|
get:
|
|
operationId: v1_account_profile_retrieve
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfile'
|
|
description: ''
|
|
/api/v1/account/profile/delete/:
|
|
delete:
|
|
operationId: v1_account_profile_delete_destroy
|
|
description: Soft deletes the current authenticated user account and revokes
|
|
active tokens.
|
|
summary: Delete current user account
|
|
tags:
|
|
- Account
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: Account successfully deleted
|
|
'404':
|
|
description: User does not exist
|
|
/api/v1/account/profile/update/:
|
|
put:
|
|
operationId: v1_account_profile_update_update
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfile'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_account_profile_update_partial_update
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserProfileRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserProfileRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserProfileRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfile'
|
|
description: ''
|
|
/api/v1/account/recover/:
|
|
post:
|
|
operationId: v1_account_recover_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserRecoverPasswordRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserRecoverPasswordRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserRecoverPasswordRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserRecoverPassword'
|
|
description: ''
|
|
/api/v1/account/region-info/:
|
|
get:
|
|
operationId: v1_account_region_info_retrieve
|
|
description: Returns basic client region, browser, and network info.
|
|
summary: Get client region info
|
|
tags:
|
|
- Location
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RegionInfo'
|
|
description: ''
|
|
/api/v1/account/register/:
|
|
post:
|
|
operationId: v1_account_register_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserRegisterRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserRegisterRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserRegisterRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserRegister'
|
|
description: ''
|
|
/api/v1/account/reset/:
|
|
post:
|
|
operationId: v1_account_reset_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserResetPasswordRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserResetPasswordRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserResetPasswordRequest'
|
|
required: true
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
description: No response body
|
|
/api/v1/account/update-fcm/:
|
|
post:
|
|
operationId: v1_account_update_fcm_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserFCMRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserFCMRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserFCMRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserFCM'
|
|
description: ''
|
|
/api/v1/account/verify/:
|
|
post:
|
|
operationId: v1_account_verify_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserVerifyRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserVerifyRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserVerifyRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserVerify'
|
|
description: ''
|
|
/api/v1/account/web/register/:
|
|
post:
|
|
operationId: v1_account_web_register_create
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/WebUserRegisterRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/WebUserRegisterRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/WebUserRegisterRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/WebUserRegister'
|
|
description: ''
|
|
/api/v1/auth/documents/:
|
|
get:
|
|
operationId: v1_auth_documents_list
|
|
description: Retrieves a list of verification documents uploaded by the current
|
|
user or managed by admin.
|
|
summary: List user verification documents
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- Authentication & Profile
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedVerificationDocumentList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_auth_documents_create
|
|
description: Uploads an identity card, passport, institutional license, or recommendation
|
|
letter for account verification.
|
|
summary: Upload verification document
|
|
tags:
|
|
- Authentication & Profile
|
|
requestBody:
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/VerificationDocumentUploadRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/VerificationDocumentUploadRequest'
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/VerificationDocumentUploadRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/VerificationDocument'
|
|
description: ''
|
|
'400':
|
|
description: Invalid document upload data
|
|
/api/v1/auth/me/:
|
|
get:
|
|
operationId: v1_auth_me_retrieve
|
|
description: Returns detailed profile data, role hierarchy, and verification
|
|
status for authenticated user.
|
|
summary: Get current user details and permissions
|
|
tags:
|
|
- Authentication & Profile
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserMe'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_auth_me_partial_update
|
|
description: Partially updates user profile attributes (name, phone, bio, languages,
|
|
skills, country, city, avatar).
|
|
summary: Update current user details
|
|
tags:
|
|
- Authentication & Profile
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserMeUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserMeUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserMeUpdateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserMe'
|
|
description: ''
|
|
/api/v1/auth/recover-password/:
|
|
post:
|
|
operationId: v1_auth_recover_password_create
|
|
description: Generates and dispatches a password recovery token to the specified
|
|
user email.
|
|
summary: Request password recovery token
|
|
tags:
|
|
- Authentication & Profile
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordRecoverRequestRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordRecoverRequestRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordRecoverRequestRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
description: Reset instructions sent if email exists
|
|
/api/v1/auth/register/:
|
|
post:
|
|
operationId: v1_auth_register_create
|
|
description: Creates a new account and immediately issues JWT access and refresh
|
|
tokens.
|
|
summary: Register new user or representative
|
|
tags:
|
|
- Authentication & Profile
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RegisterRequestRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/RegisterRequestRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/RegisterRequestRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RegisterResponse'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
/api/v1/auth/reset-password/:
|
|
post:
|
|
operationId: v1_auth_reset_password_create
|
|
description: Resets the account password given a valid verification token.
|
|
summary: Reset user password using token
|
|
tags:
|
|
- Authentication & Profile
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordResetRequestRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordResetRequestRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordResetRequestRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
description: Password reset successfully
|
|
'400':
|
|
description: Invalid or expired token
|
|
/api/v1/auth/token/:
|
|
post:
|
|
operationId: v1_auth_token_create
|
|
description: |-
|
|
Takes a set of user credentials and returns an access and refresh JSON web
|
|
token pair to prove the authentication of those credentials.
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenObtainPairRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenObtainPairRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenObtainPairRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenObtainPair'
|
|
description: ''
|
|
/api/v1/auth/token/refresh/:
|
|
post:
|
|
operationId: v1_auth_token_refresh_create
|
|
description: |-
|
|
Takes a refresh type JSON web token and returns an access type JSON web
|
|
token if the refresh token is valid.
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenRefreshRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenRefreshRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenRefreshRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenRefresh'
|
|
description: ''
|
|
/api/v1/auth/token/verify/:
|
|
post:
|
|
operationId: v1_auth_token_verify_create
|
|
description: |-
|
|
Takes a token and indicates if it is valid. This view provides no
|
|
information about a token's fitness for a particular use.
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenVerifyRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenVerifyRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TokenVerifyRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
description: No response body
|
|
/api/v1/chat/centrifugo-token/:
|
|
get:
|
|
operationId: v1_chat_centrifugo_token_retrieve
|
|
description: Generates an HMAC-SHA256 connection JWT for client WebSocket authentication
|
|
with Centrifugo v5.
|
|
summary: Obtain Centrifugo real-time WebSocket connection token
|
|
tags:
|
|
- Real-Time Messaging & Chat
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CentrifugoTokenResponse'
|
|
description: ''
|
|
/api/v1/chat/rooms/:
|
|
get:
|
|
operationId: v1_chat_rooms_list
|
|
description: Returns all active direct and group conversations for the authenticated
|
|
user with unread counts.
|
|
summary: List active conversations & direct chats
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- Real-Time Messaging & Chat
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedChatRoomListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_chat_rooms_create
|
|
description: Creates a new direct chat or multi-institution group room. Reuses
|
|
existing direct chat if already active.
|
|
summary: Start conversation with user or institution
|
|
tags:
|
|
- Real-Time Messaging & Chat
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatRoomCreateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatRoomCreateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatRoomCreateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatRoomDetail'
|
|
description: ''
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatRoomDetail'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
/api/v1/chat/rooms/{id}/:
|
|
get:
|
|
operationId: v1_chat_rooms_retrieve
|
|
description: Retrieves metadata, participants, and channel name for a conversation.
|
|
summary: Get chat room details & metadata
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Real-Time Messaging & Chat
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatRoomDetail'
|
|
description: ''
|
|
'403':
|
|
description: Not a participant in this conversation
|
|
'404':
|
|
description: Room not found
|
|
/api/v1/chat/rooms/{id}/messages/:
|
|
get:
|
|
operationId: v1_chat_rooms_messages_list
|
|
description: Returns paginated message history for a conversation and marks
|
|
messages as read.
|
|
summary: Get message history for chat room
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- Real-Time Messaging & Chat
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedChatMessageList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_chat_rooms_messages_create
|
|
description: Persists message to database and broadcasts real-time WebSocket
|
|
event via Centrifugo.
|
|
summary: Send message in conversation
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Real-Time Messaging & Chat
|
|
requestBody:
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatMessageCreateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatMessageCreateRequest'
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatMessageCreateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ChatMessage'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/chat/rooms/{id}/read/:
|
|
post:
|
|
operationId: v1_chat_rooms_read_create
|
|
description: Updates read receipts for all messages in the room and emits read
|
|
event.
|
|
summary: Mark all conversation messages as read
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Real-Time Messaging & Chat
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
description: Messages marked as read
|
|
/api/v1/cms/categories/:
|
|
get:
|
|
operationId: v1_cms_categories_list
|
|
description: Returns content categories with optional language filtering.
|
|
summary: List post categories
|
|
parameters:
|
|
- in: query
|
|
name: language
|
|
schema:
|
|
type: string
|
|
description: Filter categories by language code (fa, ar, en, ur, fr)
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- Content Management System (CMS)
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedPostCategoryList'
|
|
description: ''
|
|
/api/v1/cms/media/:
|
|
get:
|
|
operationId: v1_cms_media_list
|
|
description: Retrieves uploaded photos, videos, and documents.
|
|
summary: List media library assets
|
|
parameters:
|
|
- in: query
|
|
name: media_type
|
|
schema:
|
|
type: string
|
|
description: Filter by media type (image, video, audio, document)
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- Content Management System (CMS)
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedMediaAssetList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_cms_media_create
|
|
description: Uploads a new photo, document, or audio file to the media library.
|
|
summary: Upload media asset
|
|
tags:
|
|
- Content Management System (CMS)
|
|
requestBody:
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/MediaAssetRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/MediaAssetRequest'
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MediaAssetRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MediaAsset'
|
|
description: ''
|
|
/api/v1/cms/posts/:
|
|
get:
|
|
operationId: v1_cms_posts_list
|
|
description: Returns a paginated list of published news, articles, and interviews
|
|
with multilingual filtering.
|
|
summary: List multilingual posts & articles
|
|
parameters:
|
|
- in: query
|
|
name: author_id
|
|
schema:
|
|
type: integer
|
|
description: Filter by author user ID
|
|
- in: query
|
|
name: category
|
|
schema:
|
|
type: string
|
|
description: Filter by category ID or slug
|
|
- in: query
|
|
name: institution_id
|
|
schema:
|
|
type: integer
|
|
description: Filter by associated institution ID
|
|
- in: query
|
|
name: is_featured
|
|
schema:
|
|
type: boolean
|
|
description: Filter by featured status
|
|
- in: query
|
|
name: language
|
|
schema:
|
|
type: string
|
|
description: Filter by language code (fa, ar, en, ur, fr)
|
|
- in: query
|
|
name: my_posts
|
|
schema:
|
|
type: boolean
|
|
description: Filter by current authenticated user posts
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: post_type
|
|
schema:
|
|
type: string
|
|
description: Filter by type (news, article, report, interview)
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
description: Search text in title, excerpt, and content
|
|
- in: query
|
|
name: status
|
|
schema:
|
|
type: string
|
|
description: Filter by status (staff/admin only)
|
|
- in: query
|
|
name: tag
|
|
schema:
|
|
type: string
|
|
description: Filter by tag string
|
|
tags:
|
|
- Content Management System (CMS)
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedPostListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_cms_posts_create
|
|
description: Creates a new article, news announcement, or report.
|
|
summary: Publish or draft new post
|
|
tags:
|
|
- Content Management System (CMS)
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PostCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PostCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PostCreateUpdateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PostDetail'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
'401':
|
|
description: Authentication required
|
|
/api/v1/cms/posts/{pk_or_slug}/:
|
|
get:
|
|
operationId: v1_cms_posts_retrieve
|
|
description: Retrieves full article content and increments the view counter.
|
|
summary: Get full post details
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Content Management System (CMS)
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PostDetail'
|
|
description: ''
|
|
'404':
|
|
description: Post not found
|
|
patch:
|
|
operationId: v1_cms_posts_partial_update
|
|
description: Updates an existing post. Permitted for original author, institution
|
|
editors, or platform admins.
|
|
summary: Update post
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Content Management System (CMS)
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedPostCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedPostCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedPostCreateUpdateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PostDetail'
|
|
description: ''
|
|
'403':
|
|
description: Permission denied
|
|
delete:
|
|
operationId: v1_cms_posts_destroy
|
|
description: Removes a post from the platform.
|
|
summary: Delete post
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Content Management System (CMS)
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: Post deleted successfully
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/cms/posts/{pk_or_slug}/comments/:
|
|
get:
|
|
operationId: v1_cms_posts_comments_list
|
|
description: Retrieves approved reader comments for a post.
|
|
summary: List post comments
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Content Management System (CMS)
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedPostCommentList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_cms_posts_comments_create
|
|
description: Submits a comment on an article.
|
|
summary: Submit post comment
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Content Management System (CMS)
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PostCommentCreateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PostCommentCreateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PostCommentCreateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PostComment'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
/api/v1/cms/posts/{pk_or_slug}/like/:
|
|
post:
|
|
operationId: v1_cms_posts_like_create
|
|
description: Likes or unlikes an article for the authenticated user and updates
|
|
the like counter.
|
|
summary: Toggle like on post
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Content Management System (CMS)
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PostLikeResponseRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PostLikeResponseRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PostLikeResponseRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PostLikeResponse'
|
|
description: ''
|
|
/api/v1/cms/tags/:
|
|
get:
|
|
operationId: v1_cms_tags_list
|
|
description: Returns distinct content tags used across posts.
|
|
summary: List CMS tags
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- Content Management System (CMS)
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedPostTagList'
|
|
description: ''
|
|
/api/v1/contact-us/:
|
|
post:
|
|
operationId: v1_contact_us_create
|
|
description: Submit a user contact or support inquiry
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SupportMessageCreateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/SupportMessageCreateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/SupportMessageCreateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SupportMessageCreate'
|
|
description: ''
|
|
/api/v1/events/:
|
|
get:
|
|
operationId: v1_events_list
|
|
description: Filter events by category, date range, institution organizer, location
|
|
type, and search keywords.
|
|
summary: List events and programs
|
|
parameters:
|
|
- in: query
|
|
name: category
|
|
schema:
|
|
type: string
|
|
description: Event category filter
|
|
- in: query
|
|
name: end_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter to date (YYYY-MM-DD)
|
|
- in: query
|
|
name: is_featured
|
|
schema:
|
|
type: boolean
|
|
description: Filter featured events
|
|
- in: query
|
|
name: language
|
|
schema:
|
|
type: string
|
|
description: Event language (fa, ar, en, ur, fr)
|
|
- in: query
|
|
name: location_type
|
|
schema:
|
|
type: string
|
|
description: in_person, online, or hybrid
|
|
- in: query
|
|
name: organizer
|
|
schema:
|
|
type: integer
|
|
description: Organizer institution ID
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
description: Search in title, description, or speaker
|
|
- in: query
|
|
name: start_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter from date (YYYY-MM-DD)
|
|
tags:
|
|
- Events
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedEventListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_events_create
|
|
description: Create an event on behalf of an institution where the user is an
|
|
admin/editor.
|
|
summary: Create a new event
|
|
tags:
|
|
- Events
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EventCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/EventCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/EventCreateUpdateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EventDetail'
|
|
description: ''
|
|
/api/v1/events/{id_or_slug}/:
|
|
get:
|
|
operationId: v1_events_retrieve
|
|
description: Get full event details, speaker bio, registration status for current
|
|
user, and venue/meeting info.
|
|
summary: Retrieve event details
|
|
parameters:
|
|
- in: path
|
|
name: id_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Events
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EventDetail'
|
|
description: ''
|
|
put:
|
|
operationId: v1_events_update
|
|
parameters:
|
|
- in: path
|
|
name: id_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EventCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/EventCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/EventCreateUpdateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EventCreateUpdate'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_events_partial_update
|
|
description: Update event metadata (requires organizer admin/editor permission).
|
|
summary: Update event
|
|
parameters:
|
|
- in: path
|
|
name: id_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Events
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedEventCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedEventCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedEventCreateUpdateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EventDetail'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_events_destroy
|
|
description: Delete or deactivate an event.
|
|
summary: Delete event
|
|
parameters:
|
|
- in: path
|
|
name: id_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Events
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
/api/v1/events/{id_or_slug}/cancel-registration/:
|
|
post:
|
|
operationId: v1_events_cancel_registration_create
|
|
description: Cancel registration for the current authenticated user.
|
|
summary: Cancel event registration
|
|
parameters:
|
|
- in: path
|
|
name: id_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Events
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EventDetail'
|
|
description: ''
|
|
/api/v1/events/{id_or_slug}/register/:
|
|
post:
|
|
operationId: v1_events_register_create
|
|
description: Register the current authenticated user for this event.
|
|
summary: Register for an event
|
|
parameters:
|
|
- in: path
|
|
name: id_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Events
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EventRegisterInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/EventRegisterInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/EventRegisterInputRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EventDetail'
|
|
description: ''
|
|
/api/v1/events/{id_or_slug}/registrations/:
|
|
get:
|
|
operationId: v1_events_registrations_list
|
|
description: View registered participants for an event (organizer admin/editor
|
|
or staff only).
|
|
summary: List event attendees
|
|
parameters:
|
|
- in: path
|
|
name: id_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- Events
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedEventRegistrationList'
|
|
description: ''
|
|
/api/v1/events/calendar/:
|
|
get:
|
|
operationId: v1_events_calendar_list
|
|
description: Get streamlined event entries for calendar components filtered
|
|
by month/year.
|
|
summary: Calendar view feed
|
|
parameters:
|
|
- in: query
|
|
name: category
|
|
schema:
|
|
type: string
|
|
description: Category filter
|
|
- in: query
|
|
name: month
|
|
schema:
|
|
type: integer
|
|
description: Calendar month (1-12)
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: year
|
|
schema:
|
|
type: integer
|
|
description: Calendar year (e.g. 2026)
|
|
tags:
|
|
- Events
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedEventCalendarItemList'
|
|
description: ''
|
|
/api/v1/health/:
|
|
get:
|
|
operationId: v1_health_retrieve
|
|
description: Returns system status, current timestamp, and API version
|
|
summary: Check API server health status
|
|
tags:
|
|
- v1
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/HealthCheckResponse'
|
|
description: ''
|
|
/api/v1/map/clusters/:
|
|
get:
|
|
operationId: v1_map_clusters_list
|
|
description: Returns aggregated institution counts and density breakdown per
|
|
country and region.
|
|
summary: Regional density & geographic cluster overview
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
tags:
|
|
- Smart Geo-Atlas
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedRegionalDensityList'
|
|
description: ''
|
|
/api/v1/map/institutions/:
|
|
get:
|
|
operationId: v1_map_institutions_list
|
|
description: Returns geographic markers or aggregated clusters for institutions
|
|
within the current map viewport.
|
|
summary: Query map markers with bounding box & clustering
|
|
parameters:
|
|
- in: query
|
|
name: city
|
|
schema:
|
|
type: string
|
|
description: Filter by city
|
|
- in: query
|
|
name: cluster
|
|
schema:
|
|
type: boolean
|
|
description: Whether to cluster nearby pins (default true)
|
|
- in: query
|
|
name: country
|
|
schema:
|
|
type: string
|
|
description: Filter by country
|
|
- in: query
|
|
name: east
|
|
schema:
|
|
type: number
|
|
format: double
|
|
description: Easternmost longitude of viewport
|
|
- in: query
|
|
name: is_featured
|
|
schema:
|
|
type: boolean
|
|
description: Filter by featured status
|
|
- in: query
|
|
name: north
|
|
schema:
|
|
type: number
|
|
format: double
|
|
description: Northernmost latitude of viewport
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
description: Search text query
|
|
- in: query
|
|
name: south
|
|
schema:
|
|
type: number
|
|
format: double
|
|
description: Southernmost latitude of viewport
|
|
- in: query
|
|
name: tag
|
|
schema:
|
|
type: string
|
|
description: Filter by tag string
|
|
- in: query
|
|
name: type
|
|
schema:
|
|
type: string
|
|
description: Filter by institution type
|
|
- in: query
|
|
name: west
|
|
schema:
|
|
type: number
|
|
format: double
|
|
description: Westernmost longitude of viewport
|
|
- in: query
|
|
name: zoom
|
|
schema:
|
|
type: integer
|
|
description: Current map zoom level (1 to 20, default 10)
|
|
tags:
|
|
- Smart Geo-Atlas
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedMapClusterItemList'
|
|
description: ''
|
|
/api/v1/map/stats/:
|
|
get:
|
|
operationId: v1_map_stats_retrieve
|
|
description: Returns total institutions, countries covered, cities count, and
|
|
classification distributions.
|
|
summary: Get global atlas statistics
|
|
tags:
|
|
- Smart Geo-Atlas
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MapStats'
|
|
description: ''
|
|
/api/v1/meetings/:
|
|
get:
|
|
operationId: v1_meetings_list
|
|
description: List bilateral video meetings involving the authenticated user's
|
|
affiliated institutions.
|
|
summary: List scheduled & pending meetings
|
|
parameters:
|
|
- in: query
|
|
name: end_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter meetings to date (YYYY-MM-DD)
|
|
- in: query
|
|
name: institution_id
|
|
schema:
|
|
type: integer
|
|
description: Filter meetings by participating institution ID
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
description: Search in title or agenda
|
|
- in: query
|
|
name: start_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter meetings from date (YYYY-MM-DD)
|
|
- in: query
|
|
name: status
|
|
schema:
|
|
type: string
|
|
description: Meeting status (pending, scheduled, completed, cancelled, declined)
|
|
tags:
|
|
- Meetings
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedMeetingListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_meetings_create
|
|
description: Schedule/propose a bilateral meeting between institutions (requires
|
|
institution admin/editor role).
|
|
summary: Propose a new video meeting
|
|
tags:
|
|
- Meetings
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingCreateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingCreateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingCreateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingDetail'
|
|
description: ''
|
|
/api/v1/meetings/{id}/:
|
|
get:
|
|
operationId: v1_meetings_retrieve
|
|
description: Get full meeting details including video link, agenda, and participants.
|
|
summary: Retrieve meeting details
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Meetings
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingDetail'
|
|
description: ''
|
|
put:
|
|
operationId: v1_meetings_update
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingUpdateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingUpdate'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_meetings_partial_update
|
|
description: Accept, reschedule, decline, complete, or update meeting room URL
|
|
and agenda notes.
|
|
summary: Update or respond to meeting request
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Meetings
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedMeetingUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedMeetingUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedMeetingUpdateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MeetingDetail'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_meetings_destroy
|
|
description: Cancel or delete a meeting request.
|
|
summary: Cancel / delete meeting
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Meetings
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
/api/v1/profiles/:
|
|
get:
|
|
operationId: v1_profiles_list
|
|
description: Returns a paginated list of mosques, cultural centers, and institutes
|
|
with filtering.
|
|
summary: List active institutions
|
|
parameters:
|
|
- in: query
|
|
name: city
|
|
schema:
|
|
type: string
|
|
description: Filter by city name
|
|
- in: query
|
|
name: country
|
|
schema:
|
|
type: string
|
|
description: Filter by country name
|
|
- in: query
|
|
name: is_featured
|
|
schema:
|
|
type: boolean
|
|
description: Filter by featured status
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
description: Search query across name, city, country, description
|
|
- in: query
|
|
name: tag
|
|
schema:
|
|
type: string
|
|
description: Filter by tag string
|
|
- in: query
|
|
name: type
|
|
schema:
|
|
type: string
|
|
description: Filter by institution type (mosque, cultural_center, etc.)
|
|
- in: query
|
|
name: verification_status
|
|
schema:
|
|
type: string
|
|
description: Filter by verification status (pending, approved, rejected)
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedInstitutionListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_profiles_create
|
|
description: Registers a new institution profile and designates the creator
|
|
as primary Administrator.
|
|
summary: Register a new institution
|
|
tags:
|
|
- Institutions & Profiles
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionCreateUpdateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionDetail'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
'401':
|
|
description: Authentication required
|
|
/api/v1/profiles/{pk_or_slug}/:
|
|
get:
|
|
operationId: v1_profiles_retrieve
|
|
description: Retrieves complete institution information, historical timeline
|
|
milestones, and media gallery.
|
|
summary: Get full institution profile
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionDetail'
|
|
description: ''
|
|
'404':
|
|
description: Institution not found
|
|
patch:
|
|
operationId: v1_profiles_partial_update
|
|
description: Updates details of an institution. Requires Admin or Editor role
|
|
on the institution.
|
|
summary: Update institution profile
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedInstitutionCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedInstitutionCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedInstitutionCreateUpdateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionDetail'
|
|
description: ''
|
|
'403':
|
|
description: Permission denied
|
|
delete:
|
|
operationId: v1_profiles_destroy
|
|
description: Deactivates an institution. Permitted for institution administrator
|
|
or platform administrator.
|
|
summary: Deactivate / Delete institution
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: Institution successfully deactivated
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/profiles/{pk_or_slug}/follow/:
|
|
post:
|
|
operationId: v1_profiles_follow_create
|
|
description: Follows the specified institution to receive updates and news.
|
|
summary: Follow institution
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FollowResponseRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/FollowResponseRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/FollowResponseRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FollowResponse'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_profiles_follow_destroy
|
|
description: Unfollows the specified institution.
|
|
summary: Unfollow institution
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FollowResponse'
|
|
description: ''
|
|
/api/v1/profiles/{pk_or_slug}/media/:
|
|
get:
|
|
operationId: v1_profiles_media_list
|
|
description: Returns uploaded photos, videos, and documents for an institution.
|
|
summary: List media gallery assets
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedInstitutionMediaList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_profiles_media_create
|
|
description: Uploads a photo, video, or publication to the institution media
|
|
gallery.
|
|
summary: Upload media to gallery
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
requestBody:
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionMediaRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionMediaRequest'
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionMediaRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionMedia'
|
|
description: ''
|
|
/api/v1/profiles/{pk_or_slug}/media/{media_id}/:
|
|
delete:
|
|
operationId: v1_profiles_media_destroy
|
|
description: Removes an asset from the institution media gallery.
|
|
summary: Delete media item
|
|
parameters:
|
|
- in: path
|
|
name: media_id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: Media deleted
|
|
/api/v1/profiles/{pk_or_slug}/members/:
|
|
get:
|
|
operationId: v1_profiles_members_list
|
|
description: Retrieves administrative and editorial team members of the institution.
|
|
summary: List institution team members
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedInstitutionMemberList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_profiles_members_create
|
|
description: Adds or updates a member role (admin, editor, viewer) for an existing
|
|
registered user by email.
|
|
summary: Delegate role / Add team member
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionMemberAddRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionMemberAddRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionMemberAddRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionMember'
|
|
description: ''
|
|
'400':
|
|
description: User not found or invalid payload
|
|
'403':
|
|
description: Only institution administrators can delegate roles
|
|
/api/v1/profiles/{pk_or_slug}/members/{member_id}/:
|
|
delete:
|
|
operationId: v1_profiles_members_destroy
|
|
description: Revokes institution membership and delegated role for a user.
|
|
summary: Remove team member
|
|
parameters:
|
|
- in: path
|
|
name: member_id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: Member removed
|
|
/api/v1/profiles/{pk_or_slug}/timeline/:
|
|
get:
|
|
operationId: v1_profiles_timeline_list
|
|
description: Returns historical milestone entries for an institution.
|
|
summary: List timeline milestones
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedInstitutionTimelineList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_profiles_timeline_create
|
|
description: Creates a new milestone in the institution historical timeline.
|
|
summary: Add timeline milestone
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionTimelineRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionTimelineRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionTimelineRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/InstitutionTimeline'
|
|
description: ''
|
|
/api/v1/profiles/{pk_or_slug}/timeline/{entry_id}/:
|
|
delete:
|
|
operationId: v1_profiles_timeline_destroy
|
|
description: Removes a timeline entry from the institution profile.
|
|
summary: Delete timeline milestone
|
|
parameters:
|
|
- in: path
|
|
name: entry_id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Institutions & Profiles
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: Entry deleted
|
|
/api/v1/projects/:
|
|
get:
|
|
operationId: v1_projects_list
|
|
description: Returns a paginated list of collaborative projects with filtering
|
|
by institution, category, and status.
|
|
summary: List collaborative projects
|
|
parameters:
|
|
- in: query
|
|
name: category
|
|
schema:
|
|
type: string
|
|
description: Filter by category name
|
|
- in: query
|
|
name: institution_id
|
|
schema:
|
|
type: integer
|
|
description: Filter by owner or collaborating institution ID
|
|
- in: query
|
|
name: owner_institution_id
|
|
schema:
|
|
type: integer
|
|
description: Filter specifically by owner institution ID
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
description: Search query across title and description
|
|
- in: query
|
|
name: status
|
|
schema:
|
|
type: string
|
|
description: Filter by project status (active, completed, on_hold, planning)
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedProjectListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_projects_create
|
|
description: Creates a new multi-institution collaborative project with default
|
|
Kanban columns.
|
|
summary: Create collaborative project
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectCreateUpdateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectDetail'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
'401':
|
|
description: Authentication required
|
|
/api/v1/projects/{pk_or_slug}/:
|
|
get:
|
|
operationId: v1_projects_retrieve
|
|
description: Retrieves full project details, collaborating institutions, and
|
|
Kanban boards.
|
|
summary: Get project details
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectDetail'
|
|
description: ''
|
|
'404':
|
|
description: Project not found
|
|
patch:
|
|
operationId: v1_projects_partial_update
|
|
description: Updates project status, progress percentage, or details. Permitted
|
|
for owner and collaborating editors.
|
|
summary: Update project
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedProjectCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedProjectCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedProjectCreateUpdateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectDetail'
|
|
description: ''
|
|
'403':
|
|
description: Permission denied
|
|
delete:
|
|
operationId: v1_projects_destroy
|
|
description: Removes a collaborative project and associated Kanban boards.
|
|
summary: Delete project
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: Project deleted successfully
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/projects/{pk_or_slug}/documents/:
|
|
get:
|
|
operationId: v1_projects_documents_list
|
|
description: Returns uploaded agreements, contracts, and progress reports for
|
|
a project.
|
|
summary: List project documents & MOUs
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedProjectDocumentList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_projects_documents_create
|
|
description: Uploads an agreement, contract, or milestone report.
|
|
summary: Upload project document
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
requestBody:
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectDocumentRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectDocumentRequest'
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectDocumentRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ProjectDocument'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/projects/{pk_or_slug}/documents/{doc_id}/:
|
|
delete:
|
|
operationId: v1_projects_documents_destroy
|
|
description: Removes a document attachment from the project.
|
|
summary: Delete project document
|
|
parameters:
|
|
- in: path
|
|
name: doc_id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: Document removed successfully
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/projects/{pk_or_slug}/kanban/:
|
|
get:
|
|
operationId: v1_projects_kanban_list
|
|
description: Returns hierarchical Kanban columns with nested task lists for
|
|
drag-and-drop board interfaces.
|
|
summary: Get project Kanban board hierarchy
|
|
parameters:
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: page_size
|
|
required: false
|
|
in: query
|
|
description: Number of results to return per page.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedKanbanColumnList'
|
|
description: ''
|
|
/api/v1/projects/{pk_or_slug}/tasks/:
|
|
post:
|
|
operationId: v1_projects_tasks_create
|
|
description: Adds a new task under a specific column of the project.
|
|
summary: Create Kanban task
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/KanbanTaskCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/KanbanTaskCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/KanbanTaskCreateUpdateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/KanbanTask'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/projects/{pk_or_slug}/tasks/{task_id}/:
|
|
patch:
|
|
operationId: v1_projects_tasks_partial_update
|
|
description: Updates task attributes, priority, assignee, or moves task to another
|
|
column / reorders within column.
|
|
summary: Update or move Kanban task
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
- in: path
|
|
name: task_id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedKanbanTaskCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedKanbanTaskCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedKanbanTaskCreateUpdateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/KanbanTask'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
'403':
|
|
description: Permission denied
|
|
delete:
|
|
operationId: v1_projects_tasks_destroy
|
|
description: Removes a task from the project Kanban board.
|
|
summary: Delete Kanban task
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
- in: path
|
|
name: task_id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Collaborative Projects & Kanban
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'204':
|
|
description: Task deleted successfully
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/settings/about-us/:
|
|
get:
|
|
operationId: v1_settings_about_us_retrieve
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUs'
|
|
description: ''
|
|
put:
|
|
operationId: v1_settings_about_us_update
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUsRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUsRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUsRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUs'
|
|
description: ''
|
|
/api/v1/settings/about-us-dobodi/:
|
|
get:
|
|
operationId: v1_settings_about_us_dobodi_retrieve
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUsDobodi'
|
|
description: ''
|
|
put:
|
|
operationId: v1_settings_about_us_dobodi_update
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUsDobodiRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUsDobodiRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUsDobodiRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AboutUsDobodi'
|
|
description: ''
|
|
/api/v1/settings/card/:
|
|
get:
|
|
operationId: v1_settings_card_retrieve
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Card'
|
|
description: ''
|
|
put:
|
|
operationId: v1_settings_card_update
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CardRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/CardRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/CardRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Card'
|
|
description: ''
|
|
/api/v1/settings/faq-course/:
|
|
get:
|
|
operationId: v1_settings_faq_course_retrieve
|
|
tags:
|
|
- v1
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FAQItem'
|
|
description: ''
|
|
/api/v1/settings/faq-general/:
|
|
get:
|
|
operationId: v1_settings_faq_general_retrieve
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FAQItem'
|
|
description: ''
|
|
put:
|
|
operationId: v1_settings_faq_general_update
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FAQItemRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/FAQItemRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/FAQItemRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FAQItem'
|
|
description: ''
|
|
/api/v1/settings/support/:
|
|
get:
|
|
operationId: v1_settings_support_retrieve
|
|
tags:
|
|
- v1
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Support'
|
|
description: ''
|
|
put:
|
|
operationId: v1_settings_support_update
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SupportRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/SupportRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/SupportRequest'
|
|
security:
|
|
- tokenAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Support'
|
|
description: ''
|
|
/api/v1/version/:
|
|
get:
|
|
operationId: v1_version_retrieve
|
|
description: Returns latest active mobile/web application version details
|
|
summary: Get active application version
|
|
tags:
|
|
- v1
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AppVersion'
|
|
description: ''
|
|
'404':
|
|
description: No active version found
|
|
components:
|
|
schemas:
|
|
AboutUs:
|
|
type: object
|
|
properties:
|
|
content:
|
|
type: string
|
|
default: ''
|
|
AboutUsDobodi:
|
|
type: object
|
|
properties:
|
|
arabic_text:
|
|
type: string
|
|
default: ''
|
|
translated_text:
|
|
type: string
|
|
default: ''
|
|
title:
|
|
type: string
|
|
default: ''
|
|
content:
|
|
type: string
|
|
default: ''
|
|
AboutUsDobodiRequest:
|
|
type: object
|
|
properties:
|
|
arabic_text:
|
|
type: string
|
|
default: ''
|
|
translated_text:
|
|
type: string
|
|
default: ''
|
|
title:
|
|
type: string
|
|
default: ''
|
|
content:
|
|
type: string
|
|
default: ''
|
|
AboutUsRequest:
|
|
type: object
|
|
properties:
|
|
content:
|
|
type: string
|
|
default: ''
|
|
AdminNotification:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
maxLength: 255
|
|
message:
|
|
type: string
|
|
maxLength: 1024
|
|
is_read:
|
|
type: boolean
|
|
notification_type:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 50
|
|
action:
|
|
type: string
|
|
maxLength: 50
|
|
navigate_to:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
user_fullname:
|
|
type: string
|
|
readOnly: true
|
|
user_email:
|
|
type: string
|
|
readOnly: true
|
|
user_id:
|
|
type: integer
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- id
|
|
- message
|
|
- title
|
|
- updated_at
|
|
- user_email
|
|
- user_fullname
|
|
- user_id
|
|
AdminNotificationRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
message:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1024
|
|
is_read:
|
|
type: boolean
|
|
notification_type:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 50
|
|
action:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 50
|
|
navigate_to:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
required:
|
|
- message
|
|
- title
|
|
AdminUser:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
email:
|
|
type: string
|
|
format: email
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
avatar:
|
|
type: string
|
|
nullable: true
|
|
gender:
|
|
nullable: true
|
|
oneOf:
|
|
- $ref: '#/components/schemas/GenderEnum'
|
|
- $ref: '#/components/schemas/BlankEnum'
|
|
- $ref: '#/components/schemas/NullEnum'
|
|
birthdate:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
info:
|
|
type: string
|
|
nullable: true
|
|
title: Bio / Info
|
|
skill:
|
|
type: string
|
|
nullable: true
|
|
title: Skill / Role
|
|
maxLength: 512
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
device_id:
|
|
type: string
|
|
readOnly: true
|
|
device_os:
|
|
type: string
|
|
readOnly: true
|
|
user_agent:
|
|
type: string
|
|
readOnly: true
|
|
client_ip:
|
|
type: string
|
|
readOnly: true
|
|
fcm:
|
|
type: string
|
|
nullable: true
|
|
title: FCM Token
|
|
maxLength: 512
|
|
user_type:
|
|
$ref: '#/components/schemas/UserTypeEnum'
|
|
is_active:
|
|
type: boolean
|
|
title: Active
|
|
description: Designates whether this user should be treated as active.
|
|
is_staff:
|
|
type: boolean
|
|
is_superuser:
|
|
type: boolean
|
|
title: Superuser status
|
|
description: Designates that this user has all permissions without explicitly
|
|
assigning them.
|
|
date_joined:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
last_login:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
nullable: true
|
|
auth_token:
|
|
type: string
|
|
readOnly: true
|
|
plain_password:
|
|
type: string
|
|
readOnly: true
|
|
required:
|
|
- auth_token
|
|
- client_ip
|
|
- date_joined
|
|
- device_id
|
|
- device_os
|
|
- email
|
|
- id
|
|
- last_login
|
|
- plain_password
|
|
- user_agent
|
|
AdminUserRequest:
|
|
type: object
|
|
properties:
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
avatar:
|
|
type: string
|
|
nullable: true
|
|
minLength: 1
|
|
gender:
|
|
nullable: true
|
|
oneOf:
|
|
- $ref: '#/components/schemas/GenderEnum'
|
|
- $ref: '#/components/schemas/BlankEnum'
|
|
- $ref: '#/components/schemas/NullEnum'
|
|
birthdate:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
info:
|
|
type: string
|
|
nullable: true
|
|
title: Bio / Info
|
|
skill:
|
|
type: string
|
|
nullable: true
|
|
title: Skill / Role
|
|
maxLength: 512
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
fcm:
|
|
type: string
|
|
nullable: true
|
|
title: FCM Token
|
|
maxLength: 512
|
|
user_type:
|
|
$ref: '#/components/schemas/UserTypeEnum'
|
|
is_active:
|
|
type: boolean
|
|
title: Active
|
|
description: Designates whether this user should be treated as active.
|
|
is_staff:
|
|
type: boolean
|
|
is_superuser:
|
|
type: boolean
|
|
title: Superuser status
|
|
description: Designates that this user has all permissions without explicitly
|
|
assigning them.
|
|
required:
|
|
- email
|
|
AppTypeEnum:
|
|
enum:
|
|
- google_play
|
|
- app_store
|
|
- direct
|
|
type: string
|
|
description: |-
|
|
* `google_play` - Google Play
|
|
* `app_store` - Apple App Store
|
|
* `direct` - Direct Download
|
|
AppVersion:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
version:
|
|
type: string
|
|
description: Application version in format X.Y.Z (e.g., 1.0.0)
|
|
pattern: ^\d+\.\d+\.\d+$
|
|
maxLength: 20
|
|
apk_file:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
description:
|
|
type: string
|
|
description: Release notes and changes for this version
|
|
app_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/AppTypeEnum'
|
|
title: App Distribution Platform
|
|
downloads_count:
|
|
type: integer
|
|
is_active:
|
|
type: boolean
|
|
title: Active
|
|
description: Is this version currently active?
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- apk_file
|
|
- created_at
|
|
- id
|
|
- updated_at
|
|
- version
|
|
BlankEnum:
|
|
enum:
|
|
- ''
|
|
CMSCommentStatusEnum:
|
|
enum:
|
|
- pending
|
|
- approved
|
|
- spam
|
|
type: string
|
|
description: |-
|
|
* `pending` - Pending Moderation
|
|
* `approved` - Approved
|
|
* `spam` - Spam / Rejected
|
|
CMSPostLanguageEnum:
|
|
enum:
|
|
- fa
|
|
- ar
|
|
- en
|
|
- ur
|
|
- fr
|
|
type: string
|
|
description: |-
|
|
* `fa` - Persian
|
|
* `ar` - Arabic
|
|
* `en` - English
|
|
* `ur` - Urdu
|
|
* `fr` - French
|
|
CMSPostStatusEnum:
|
|
enum:
|
|
- draft
|
|
- review
|
|
- published
|
|
- archived
|
|
type: string
|
|
description: |-
|
|
* `draft` - Draft
|
|
* `review` - Under Review
|
|
* `published` - Published
|
|
* `archived` - Archived
|
|
Card:
|
|
type: object
|
|
properties:
|
|
card_number:
|
|
type: string
|
|
default: ''
|
|
card_name:
|
|
type: string
|
|
default: ''
|
|
whatsapp_number:
|
|
type: string
|
|
default: ''
|
|
CardRequest:
|
|
type: object
|
|
properties:
|
|
card_number:
|
|
type: string
|
|
default: ''
|
|
card_name:
|
|
type: string
|
|
default: ''
|
|
whatsapp_number:
|
|
type: string
|
|
default: ''
|
|
CategoryEnum:
|
|
enum:
|
|
- religious
|
|
- educational
|
|
- cultural
|
|
- counseling
|
|
- conference
|
|
- workshop
|
|
type: string
|
|
description: |-
|
|
* `religious` - Religious
|
|
* `educational` - Educational
|
|
* `cultural` - Cultural
|
|
* `counseling` - Counseling
|
|
* `conference` - Conference
|
|
* `workshop` - Workshop
|
|
CentrifugoTokenResponse:
|
|
type: object
|
|
properties:
|
|
token:
|
|
type: string
|
|
description: Signed HMAC-SHA256 JWT for Centrifugo WebSocket connection
|
|
ws_url:
|
|
type: string
|
|
description: WebSocket endpoint URL for frontend client
|
|
user_id:
|
|
type: integer
|
|
description: Authenticated user ID
|
|
expires_in:
|
|
type: integer
|
|
description: Token lifetime in seconds
|
|
required:
|
|
- expires_in
|
|
- token
|
|
- user_id
|
|
- ws_url
|
|
ChatInstitutionMini:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
readOnly: true
|
|
title: Institution Name
|
|
description: Official name of the mosque, center, or institute.
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TypeEnum'
|
|
readOnly: true
|
|
title: Institution Type
|
|
type_display:
|
|
type: string
|
|
readOnly: true
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
title: Logo / Avatar
|
|
city:
|
|
type: string
|
|
readOnly: true
|
|
country:
|
|
type: string
|
|
readOnly: true
|
|
required:
|
|
- avatar
|
|
- city
|
|
- country
|
|
- id
|
|
- name
|
|
- slug
|
|
- type
|
|
- type_display
|
|
ChatMessage:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
room:
|
|
type: integer
|
|
readOnly: true
|
|
title: Chat Room
|
|
sender:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ChatUserMini'
|
|
readOnly: true
|
|
sender_institution:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ChatInstitutionMini'
|
|
readOnly: true
|
|
content:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Message Text
|
|
attachment:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
title: Attachment File
|
|
attachment_name:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Attachment Filename
|
|
is_read_by_me:
|
|
type: boolean
|
|
readOnly: true
|
|
read_by_count:
|
|
type: integer
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
title: Timestamp
|
|
required:
|
|
- attachment
|
|
- attachment_name
|
|
- content
|
|
- created_at
|
|
- id
|
|
- is_read_by_me
|
|
- read_by_count
|
|
- room
|
|
- sender
|
|
- sender_institution
|
|
ChatMessageCreateRequest:
|
|
type: object
|
|
properties:
|
|
content:
|
|
type: string
|
|
attachment:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
sender_institution_id:
|
|
type: integer
|
|
nullable: true
|
|
ChatRoomCreateRequest:
|
|
type: object
|
|
properties:
|
|
room_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/RoomTypeEnum'
|
|
default: direct
|
|
title:
|
|
type: string
|
|
maxLength: 255
|
|
target_user_id:
|
|
type: integer
|
|
nullable: true
|
|
target_institution_id:
|
|
type: integer
|
|
nullable: true
|
|
participant_user_ids:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
participant_institution_ids:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
initial_message:
|
|
type: string
|
|
ChatRoomDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
room_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/RoomTypeEnum'
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Conversation Title
|
|
display_title:
|
|
type: string
|
|
readOnly: true
|
|
participant_users:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ChatUserMini'
|
|
readOnly: true
|
|
participant_institutions:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ChatInstitutionMini'
|
|
readOnly: true
|
|
unread_count:
|
|
type: integer
|
|
readOnly: true
|
|
centrifugo_channel:
|
|
type: string
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
title: Last Activity
|
|
required:
|
|
- centrifugo_channel
|
|
- created_at
|
|
- display_title
|
|
- id
|
|
- participant_institutions
|
|
- participant_users
|
|
- room_type
|
|
- title
|
|
- unread_count
|
|
- updated_at
|
|
ChatRoomList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
room_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/RoomTypeEnum'
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Conversation Title
|
|
display_title:
|
|
type: string
|
|
readOnly: true
|
|
participant_users:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ChatUserMini'
|
|
readOnly: true
|
|
participant_institutions:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ChatInstitutionMini'
|
|
readOnly: true
|
|
last_message:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ChatMessage'
|
|
nullable: true
|
|
readOnly: true
|
|
unread_count:
|
|
type: integer
|
|
readOnly: true
|
|
centrifugo_channel:
|
|
type: string
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
title: Last Activity
|
|
required:
|
|
- centrifugo_channel
|
|
- display_title
|
|
- id
|
|
- last_message
|
|
- participant_institutions
|
|
- participant_users
|
|
- room_type
|
|
- title
|
|
- unread_count
|
|
- updated_at
|
|
ChatUserMini:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
title: Email Address
|
|
description: User primary email address.
|
|
fullname:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
user_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/UserTypeEnum'
|
|
readOnly: true
|
|
required:
|
|
- avatar
|
|
- email
|
|
- fullname
|
|
- id
|
|
- user_type
|
|
DeviceOsEnum:
|
|
enum:
|
|
- android
|
|
- apple
|
|
- web
|
|
type: string
|
|
description: |-
|
|
* `android` - Android
|
|
* `apple` - Apple iOS
|
|
* `web` - Web
|
|
DocTypeEnum:
|
|
enum:
|
|
- mou
|
|
- report
|
|
- contract
|
|
- other
|
|
type: string
|
|
description: |-
|
|
* `mou` - MOU / Bilateral Agreement
|
|
* `report` - Progress / Milestone Report
|
|
* `contract` - Contract / Agreement
|
|
* `other` - Other Document
|
|
DocumentTypeEnum:
|
|
enum:
|
|
- national_id
|
|
- institution_license
|
|
- recommendation_letter
|
|
- student_card
|
|
- other
|
|
type: string
|
|
description: |-
|
|
* `national_id` - National ID / Passport
|
|
* `institution_license` - Institution Registration / License
|
|
* `recommendation_letter` - Recommendation Letter
|
|
* `student_card` - Student / Member Card
|
|
* `other` - Other Document
|
|
EventCalendarItem:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Event Title
|
|
maxLength: 255
|
|
slug:
|
|
oneOf:
|
|
- type: string
|
|
maxLength: 280
|
|
pattern: ^[-a-zA-Z0-9_]+$
|
|
- type: string
|
|
maxLength: 0
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
event_date:
|
|
type: string
|
|
format: date
|
|
start_time:
|
|
type: string
|
|
format: time
|
|
end_time:
|
|
type: string
|
|
format: time
|
|
nullable: true
|
|
location_type:
|
|
$ref: '#/components/schemas/LocationTypeEnum'
|
|
organizer_name:
|
|
type: string
|
|
readOnly: true
|
|
is_featured:
|
|
type: boolean
|
|
required:
|
|
- event_date
|
|
- id
|
|
- organizer_name
|
|
- start_time
|
|
- title
|
|
EventCreateUpdate:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Event Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
title: Event Description
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
event_date:
|
|
type: string
|
|
format: date
|
|
start_time:
|
|
type: string
|
|
format: time
|
|
end_time:
|
|
type: string
|
|
format: time
|
|
nullable: true
|
|
speaker_name:
|
|
type: string
|
|
maxLength: 255
|
|
speaker_title:
|
|
type: string
|
|
title: Speaker Title / Affiliation
|
|
maxLength: 255
|
|
speaker_avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
location_type:
|
|
$ref: '#/components/schemas/LocationTypeEnum'
|
|
venue_address:
|
|
type: string
|
|
maxLength: 500
|
|
online_meeting_url:
|
|
title: Online Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 200
|
|
- type: string
|
|
maxLength: 0
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
capacity:
|
|
type: integer
|
|
title: Capacity Limit
|
|
is_active:
|
|
type: boolean
|
|
is_featured:
|
|
type: boolean
|
|
language:
|
|
$ref: '#/components/schemas/CMSPostLanguageEnum'
|
|
tags: {}
|
|
required:
|
|
- description
|
|
- event_date
|
|
- id
|
|
- start_time
|
|
- title
|
|
EventCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Event Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
minLength: 1
|
|
title: Event Description
|
|
organizer_id:
|
|
type: integer
|
|
writeOnly: true
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
event_date:
|
|
type: string
|
|
format: date
|
|
start_time:
|
|
type: string
|
|
format: time
|
|
end_time:
|
|
type: string
|
|
format: time
|
|
nullable: true
|
|
speaker_name:
|
|
type: string
|
|
maxLength: 255
|
|
speaker_title:
|
|
type: string
|
|
title: Speaker Title / Affiliation
|
|
maxLength: 255
|
|
speaker_avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
location_type:
|
|
$ref: '#/components/schemas/LocationTypeEnum'
|
|
venue_address:
|
|
type: string
|
|
maxLength: 500
|
|
online_meeting_url:
|
|
title: Online Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 200
|
|
- type: string
|
|
maxLength: 0
|
|
cover_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
capacity:
|
|
type: integer
|
|
title: Capacity Limit
|
|
is_active:
|
|
type: boolean
|
|
is_featured:
|
|
type: boolean
|
|
language:
|
|
$ref: '#/components/schemas/CMSPostLanguageEnum'
|
|
tags: {}
|
|
required:
|
|
- description
|
|
- event_date
|
|
- organizer_id
|
|
- start_time
|
|
- title
|
|
EventDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Event Title
|
|
maxLength: 255
|
|
slug:
|
|
oneOf:
|
|
- type: string
|
|
maxLength: 280
|
|
pattern: ^[-a-zA-Z0-9_]+$
|
|
- type: string
|
|
maxLength: 0
|
|
description:
|
|
type: string
|
|
title: Event Description
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
event_date:
|
|
type: string
|
|
format: date
|
|
start_time:
|
|
type: string
|
|
format: time
|
|
end_time:
|
|
type: string
|
|
format: time
|
|
nullable: true
|
|
speaker_name:
|
|
type: string
|
|
maxLength: 255
|
|
speaker_title:
|
|
type: string
|
|
title: Speaker Title / Affiliation
|
|
maxLength: 255
|
|
speaker_avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
location_type:
|
|
$ref: '#/components/schemas/LocationTypeEnum'
|
|
venue_address:
|
|
type: string
|
|
maxLength: 500
|
|
online_meeting_url:
|
|
title: Online Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 200
|
|
- type: string
|
|
maxLength: 0
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
capacity:
|
|
type: integer
|
|
title: Capacity Limit
|
|
registration_count:
|
|
type: integer
|
|
title: Current Registrations
|
|
is_active:
|
|
type: boolean
|
|
is_featured:
|
|
type: boolean
|
|
language:
|
|
$ref: '#/components/schemas/CMSPostLanguageEnum'
|
|
tags: {}
|
|
organizer:
|
|
allOf:
|
|
- $ref: '#/components/schemas/EventOrganizerMinimal'
|
|
readOnly: true
|
|
is_registered:
|
|
type: boolean
|
|
readOnly: true
|
|
my_registration:
|
|
type: object
|
|
additionalProperties: {}
|
|
nullable: true
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- description
|
|
- event_date
|
|
- id
|
|
- is_registered
|
|
- my_registration
|
|
- organizer
|
|
- start_time
|
|
- title
|
|
- updated_at
|
|
EventList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Event Title
|
|
maxLength: 255
|
|
slug:
|
|
oneOf:
|
|
- type: string
|
|
maxLength: 280
|
|
pattern: ^[-a-zA-Z0-9_]+$
|
|
- type: string
|
|
maxLength: 0
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
event_date:
|
|
type: string
|
|
format: date
|
|
start_time:
|
|
type: string
|
|
format: time
|
|
end_time:
|
|
type: string
|
|
format: time
|
|
nullable: true
|
|
speaker_name:
|
|
type: string
|
|
maxLength: 255
|
|
speaker_title:
|
|
type: string
|
|
title: Speaker Title / Affiliation
|
|
maxLength: 255
|
|
speaker_avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
location_type:
|
|
$ref: '#/components/schemas/LocationTypeEnum'
|
|
venue_address:
|
|
type: string
|
|
maxLength: 500
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
capacity:
|
|
type: integer
|
|
title: Capacity Limit
|
|
registration_count:
|
|
type: integer
|
|
title: Current Registrations
|
|
is_active:
|
|
type: boolean
|
|
is_featured:
|
|
type: boolean
|
|
language:
|
|
$ref: '#/components/schemas/CMSPostLanguageEnum'
|
|
tags: {}
|
|
organizer:
|
|
allOf:
|
|
- $ref: '#/components/schemas/EventOrganizerMinimal'
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- event_date
|
|
- id
|
|
- organizer
|
|
- start_time
|
|
- title
|
|
EventOrganizerMinimal:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
title: Institution Name
|
|
description: Official name of the mosque, center, or institute.
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 255
|
|
- type: string
|
|
maxLength: 0
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TypeEnum'
|
|
title: Institution Type
|
|
city:
|
|
type: string
|
|
maxLength: 255
|
|
country:
|
|
type: string
|
|
maxLength: 255
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Logo / Avatar
|
|
verification_status:
|
|
$ref: '#/components/schemas/VerificationStatusEnum'
|
|
required:
|
|
- city
|
|
- country
|
|
- id
|
|
- name
|
|
EventParticipantUser:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
email:
|
|
nullable: true
|
|
title: Email Address
|
|
description: User primary email address.
|
|
oneOf:
|
|
- type: string
|
|
format: email
|
|
maxLength: 254
|
|
- type: string
|
|
maxLength: 0
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
required:
|
|
- id
|
|
EventRegisterInputRequest:
|
|
type: object
|
|
properties:
|
|
notes:
|
|
type: string
|
|
default: ''
|
|
EventRegistration:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
event:
|
|
type: integer
|
|
readOnly: true
|
|
user:
|
|
allOf:
|
|
- $ref: '#/components/schemas/EventParticipantUser'
|
|
readOnly: true
|
|
status:
|
|
$ref: '#/components/schemas/EventRegistrationStatusEnum'
|
|
notes:
|
|
type: string
|
|
title: Participant Notes
|
|
registered_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- event
|
|
- id
|
|
- registered_at
|
|
- user
|
|
EventRegistrationStatusEnum:
|
|
enum:
|
|
- registered
|
|
- attended
|
|
- cancelled
|
|
type: string
|
|
description: |-
|
|
* `registered` - Registered
|
|
* `attended` - Attended
|
|
* `cancelled` - Cancelled
|
|
ExchangeToken:
|
|
type: object
|
|
properties:
|
|
temp_token:
|
|
type: string
|
|
maxLength: 128
|
|
required:
|
|
- temp_token
|
|
ExchangeTokenRequest:
|
|
type: object
|
|
properties:
|
|
temp_token:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 128
|
|
required:
|
|
- temp_token
|
|
FAQItem:
|
|
type: object
|
|
properties:
|
|
question:
|
|
type: string
|
|
default: ''
|
|
answer:
|
|
type: string
|
|
default: ''
|
|
FAQItemRequest:
|
|
type: object
|
|
properties:
|
|
question:
|
|
type: string
|
|
default: ''
|
|
answer:
|
|
type: string
|
|
default: ''
|
|
FollowResponse:
|
|
type: object
|
|
properties:
|
|
is_following:
|
|
type: boolean
|
|
follower_count:
|
|
type: integer
|
|
message:
|
|
type: string
|
|
required:
|
|
- follower_count
|
|
- is_following
|
|
- message
|
|
FollowResponseRequest:
|
|
type: object
|
|
properties:
|
|
is_following:
|
|
type: boolean
|
|
follower_count:
|
|
type: integer
|
|
message:
|
|
type: string
|
|
minLength: 1
|
|
required:
|
|
- follower_count
|
|
- is_following
|
|
- message
|
|
GenderEnum:
|
|
enum:
|
|
- male
|
|
- female
|
|
- other
|
|
type: string
|
|
description: |-
|
|
* `male` - Male
|
|
* `female` - Female
|
|
* `other` - Other
|
|
HealthCheckResponse:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
default: healthy
|
|
timestamp:
|
|
type: string
|
|
format: date-time
|
|
version:
|
|
type: string
|
|
default: 1.0.0
|
|
required:
|
|
- timestamp
|
|
InstitutionCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
minLength: 1
|
|
title: Institution Name
|
|
description: Official name of the mosque, center, or institute.
|
|
maxLength: 255
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TypeEnum'
|
|
title: Institution Type
|
|
country:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
city:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
address:
|
|
type: string
|
|
nullable: true
|
|
title: Full Address
|
|
latitude:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
longitude:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Description & Background
|
|
website:
|
|
nullable: true
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
email:
|
|
nullable: true
|
|
title: Official Email
|
|
oneOf:
|
|
- type: string
|
|
format: email
|
|
maxLength: 254
|
|
- type: string
|
|
maxLength: 0
|
|
phone:
|
|
type: string
|
|
nullable: true
|
|
title: Official Phone
|
|
maxLength: 50
|
|
established_year:
|
|
type: integer
|
|
nullable: true
|
|
title: Established Year (CE)
|
|
cover_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
title: Logo / Avatar
|
|
social_media:
|
|
title: Social Media Links
|
|
description: 'Dictionary with keys: facebook, twitter, instagram, linkedin,
|
|
youtube, telegram'
|
|
working_hours:
|
|
title: Working Hours / Prayer Times Schedule
|
|
tags:
|
|
title: Tags & Specializations
|
|
is_featured:
|
|
type: boolean
|
|
required:
|
|
- city
|
|
- country
|
|
- name
|
|
InstitutionDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
title: Institution Name
|
|
description: Official name of the mosque, center, or institute.
|
|
maxLength: 255
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TypeEnum'
|
|
title: Institution Type
|
|
type_display:
|
|
type: string
|
|
readOnly: true
|
|
country:
|
|
type: string
|
|
maxLength: 255
|
|
city:
|
|
type: string
|
|
maxLength: 255
|
|
address:
|
|
type: string
|
|
nullable: true
|
|
title: Full Address
|
|
latitude:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
longitude:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Description & Background
|
|
website:
|
|
nullable: true
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
email:
|
|
nullable: true
|
|
title: Official Email
|
|
oneOf:
|
|
- type: string
|
|
format: email
|
|
maxLength: 254
|
|
- type: string
|
|
maxLength: 0
|
|
phone:
|
|
type: string
|
|
nullable: true
|
|
title: Official Phone
|
|
maxLength: 50
|
|
established_year:
|
|
type: integer
|
|
nullable: true
|
|
title: Established Year (CE)
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Logo / Avatar
|
|
social_media:
|
|
title: Social Media Links
|
|
description: 'Dictionary with keys: facebook, twitter, instagram, linkedin,
|
|
youtube, telegram'
|
|
working_hours:
|
|
title: Working Hours / Prayer Times Schedule
|
|
tags:
|
|
title: Tags & Specializations
|
|
verification_status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/VerificationStatusEnum'
|
|
readOnly: true
|
|
verification_status_display:
|
|
type: string
|
|
readOnly: true
|
|
follower_count:
|
|
type: integer
|
|
readOnly: true
|
|
title: Followers Count
|
|
is_featured:
|
|
type: boolean
|
|
readOnly: true
|
|
is_active:
|
|
type: boolean
|
|
readOnly: true
|
|
created_by_email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
members_count:
|
|
type: integer
|
|
readOnly: true
|
|
is_following:
|
|
type: boolean
|
|
readOnly: true
|
|
user_role:
|
|
type: string
|
|
nullable: true
|
|
readOnly: true
|
|
timeline_entries:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/InstitutionTimeline'
|
|
readOnly: true
|
|
media_items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/InstitutionMedia'
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- city
|
|
- country
|
|
- created_at
|
|
- created_by_email
|
|
- follower_count
|
|
- id
|
|
- is_active
|
|
- is_featured
|
|
- is_following
|
|
- media_items
|
|
- members_count
|
|
- name
|
|
- slug
|
|
- timeline_entries
|
|
- type_display
|
|
- updated_at
|
|
- user_role
|
|
- verification_status
|
|
- verification_status_display
|
|
InstitutionList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
readOnly: true
|
|
title: Institution Name
|
|
description: Official name of the mosque, center, or institute.
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TypeEnum'
|
|
readOnly: true
|
|
title: Institution Type
|
|
type_display:
|
|
type: string
|
|
readOnly: true
|
|
country:
|
|
type: string
|
|
readOnly: true
|
|
city:
|
|
type: string
|
|
readOnly: true
|
|
address:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Full Address
|
|
latitude:
|
|
type: number
|
|
format: double
|
|
readOnly: true
|
|
nullable: true
|
|
longitude:
|
|
type: number
|
|
format: double
|
|
readOnly: true
|
|
nullable: true
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
title: Logo / Avatar
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
verification_status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/VerificationStatusEnum'
|
|
readOnly: true
|
|
verification_status_display:
|
|
type: string
|
|
readOnly: true
|
|
follower_count:
|
|
type: integer
|
|
readOnly: true
|
|
title: Followers Count
|
|
is_featured:
|
|
type: boolean
|
|
readOnly: true
|
|
tags:
|
|
readOnly: true
|
|
title: Tags & Specializations
|
|
is_following:
|
|
type: boolean
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- address
|
|
- avatar
|
|
- city
|
|
- country
|
|
- cover_image
|
|
- created_at
|
|
- follower_count
|
|
- id
|
|
- is_featured
|
|
- is_following
|
|
- latitude
|
|
- longitude
|
|
- name
|
|
- slug
|
|
- tags
|
|
- type
|
|
- type_display
|
|
- verification_status
|
|
- verification_status_display
|
|
InstitutionMedia:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
institution:
|
|
type: integer
|
|
readOnly: true
|
|
file:
|
|
type: string
|
|
format: uri
|
|
title: Media File
|
|
media_type:
|
|
$ref: '#/components/schemas/InstitutionMediaMediaTypeEnum'
|
|
media_type_display:
|
|
type: string
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
nullable: true
|
|
title: Media Title
|
|
maxLength: 255
|
|
caption:
|
|
type: string
|
|
nullable: true
|
|
title: Caption / Notes
|
|
uploaded_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- file
|
|
- id
|
|
- institution
|
|
- media_type_display
|
|
- uploaded_at
|
|
InstitutionMediaMediaTypeEnum:
|
|
enum:
|
|
- image
|
|
- video
|
|
- document
|
|
type: string
|
|
description: |-
|
|
* `image` - Image
|
|
* `video` - Video
|
|
* `document` - Document / Publication
|
|
InstitutionMediaRequest:
|
|
type: object
|
|
properties:
|
|
file:
|
|
type: string
|
|
format: binary
|
|
title: Media File
|
|
media_type:
|
|
$ref: '#/components/schemas/InstitutionMediaMediaTypeEnum'
|
|
title:
|
|
type: string
|
|
nullable: true
|
|
title: Media Title
|
|
maxLength: 255
|
|
caption:
|
|
type: string
|
|
nullable: true
|
|
title: Caption / Notes
|
|
required:
|
|
- file
|
|
InstitutionMeetingMinimal:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
title: Institution Name
|
|
description: Official name of the mosque, center, or institute.
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 255
|
|
- type: string
|
|
maxLength: 0
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TypeEnum'
|
|
title: Institution Type
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Logo / Avatar
|
|
city:
|
|
type: string
|
|
maxLength: 255
|
|
country:
|
|
type: string
|
|
maxLength: 255
|
|
required:
|
|
- city
|
|
- country
|
|
- id
|
|
- name
|
|
InstitutionMember:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
institution:
|
|
type: integer
|
|
readOnly: true
|
|
user:
|
|
allOf:
|
|
- $ref: '#/components/schemas/MemberUserMini'
|
|
readOnly: true
|
|
role:
|
|
$ref: '#/components/schemas/RoleEnum'
|
|
role_display:
|
|
type: string
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
nullable: true
|
|
title: Organizational Title
|
|
description: e.g., Director, Media Manager, Cultural Affairs Officer
|
|
maxLength: 150
|
|
joined_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- id
|
|
- institution
|
|
- joined_at
|
|
- role_display
|
|
- user
|
|
InstitutionMemberAddRequest:
|
|
type: object
|
|
properties:
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
role:
|
|
allOf:
|
|
- $ref: '#/components/schemas/RoleEnum'
|
|
default: viewer
|
|
title:
|
|
type: string
|
|
maxLength: 150
|
|
required:
|
|
- email
|
|
InstitutionTimeline:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
institution:
|
|
type: integer
|
|
readOnly: true
|
|
year:
|
|
type: string
|
|
title: Year / Period
|
|
description: e.g. 1995, 1416 AH, or 2020-Present
|
|
maxLength: 50
|
|
title:
|
|
type: string
|
|
title: Milestone Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Milestone Description
|
|
order:
|
|
type: integer
|
|
title: Display Order
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- id
|
|
- institution
|
|
- title
|
|
- year
|
|
InstitutionTimelineRequest:
|
|
type: object
|
|
properties:
|
|
year:
|
|
type: string
|
|
minLength: 1
|
|
title: Year / Period
|
|
description: e.g. 1995, 1416 AH, or 2020-Present
|
|
maxLength: 50
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Milestone Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Milestone Description
|
|
order:
|
|
type: integer
|
|
title: Display Order
|
|
required:
|
|
- title
|
|
- year
|
|
KanbanColumn:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
project:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
title: Column Name
|
|
maxLength: 100
|
|
code:
|
|
type: string
|
|
title: Column Code Identifier
|
|
maxLength: 50
|
|
order:
|
|
type: integer
|
|
title: Display Order
|
|
color:
|
|
type: string
|
|
nullable: true
|
|
title: Badge / Header Color
|
|
maxLength: 20
|
|
tasks:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/KanbanTask'
|
|
readOnly: true
|
|
required:
|
|
- id
|
|
- name
|
|
- project
|
|
- tasks
|
|
KanbanTask:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
project:
|
|
type: integer
|
|
readOnly: true
|
|
column:
|
|
type: integer
|
|
title: Kanban Column
|
|
column_name:
|
|
type: string
|
|
readOnly: true
|
|
column_code:
|
|
type: string
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Task Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Task Description
|
|
priority:
|
|
$ref: '#/components/schemas/PriorityEnum'
|
|
priority_display:
|
|
type: string
|
|
readOnly: true
|
|
assignee:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ProjectUserMini'
|
|
readOnly: true
|
|
due_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
labels:
|
|
title: Task Labels
|
|
order:
|
|
type: integer
|
|
title: Display Order within Column
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- assignee
|
|
- column
|
|
- column_code
|
|
- column_name
|
|
- created_at
|
|
- id
|
|
- priority_display
|
|
- project
|
|
- title
|
|
- updated_at
|
|
KanbanTaskCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
column:
|
|
type: integer
|
|
title: Kanban Column
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Task Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Task Description
|
|
priority:
|
|
$ref: '#/components/schemas/PriorityEnum'
|
|
assignee:
|
|
type: integer
|
|
nullable: true
|
|
title: Assignee User
|
|
due_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
labels:
|
|
title: Task Labels
|
|
order:
|
|
type: integer
|
|
title: Display Order within Column
|
|
required:
|
|
- column
|
|
- title
|
|
LocationHistory:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
lat:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
title: Latitude
|
|
lon:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
title: Longitude
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
selected_manually:
|
|
type: boolean
|
|
ip:
|
|
type: string
|
|
nullable: true
|
|
title: IP Address
|
|
maxLength: 255
|
|
timezone:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 60
|
|
required:
|
|
- id
|
|
LocationHistoryRequest:
|
|
type: object
|
|
properties:
|
|
lat:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
title: Latitude
|
|
lon:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
title: Longitude
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
selected_manually:
|
|
type: boolean
|
|
ip:
|
|
type: string
|
|
nullable: true
|
|
title: IP Address
|
|
maxLength: 255
|
|
timezone:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 60
|
|
LocationTypeEnum:
|
|
enum:
|
|
- in_person
|
|
- online
|
|
- hybrid
|
|
type: string
|
|
description: |-
|
|
* `in_person` - In Person
|
|
* `online` - Online
|
|
* `hybrid` - Hybrid
|
|
MapClusterItem:
|
|
type: object
|
|
properties:
|
|
is_cluster:
|
|
type: boolean
|
|
id:
|
|
type: integer
|
|
nullable: true
|
|
name:
|
|
type: string
|
|
nullable: true
|
|
slug:
|
|
type: string
|
|
nullable: true
|
|
type:
|
|
type: string
|
|
nullable: true
|
|
type_display:
|
|
type: string
|
|
nullable: true
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
avatar:
|
|
type: string
|
|
nullable: true
|
|
cover_image:
|
|
type: string
|
|
nullable: true
|
|
is_featured:
|
|
type: boolean
|
|
verification_status:
|
|
type: string
|
|
nullable: true
|
|
follower_count:
|
|
type: integer
|
|
cluster_id:
|
|
type: string
|
|
count:
|
|
type: integer
|
|
lat:
|
|
type: number
|
|
format: double
|
|
lng:
|
|
type: number
|
|
format: double
|
|
type_breakdown:
|
|
type: object
|
|
additionalProperties: {}
|
|
preview_institutions:
|
|
type: array
|
|
items: {}
|
|
required:
|
|
- is_cluster
|
|
- lat
|
|
- lng
|
|
MapStats:
|
|
type: object
|
|
properties:
|
|
total_institutions:
|
|
type: integer
|
|
total_countries:
|
|
type: integer
|
|
total_cities:
|
|
type: integer
|
|
type_distribution:
|
|
type: object
|
|
additionalProperties: {}
|
|
verified_count:
|
|
type: integer
|
|
featured_count:
|
|
type: integer
|
|
required:
|
|
- featured_count
|
|
- total_cities
|
|
- total_countries
|
|
- total_institutions
|
|
- type_distribution
|
|
- verified_count
|
|
MediaAsset:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
file:
|
|
type: string
|
|
format: uri
|
|
title: Media File
|
|
title:
|
|
type: string
|
|
nullable: true
|
|
title: Title / Description
|
|
maxLength: 255
|
|
media_type:
|
|
$ref: '#/components/schemas/MediaAssetMediaTypeEnum'
|
|
media_type_display:
|
|
type: string
|
|
readOnly: true
|
|
file_size:
|
|
type: integer
|
|
readOnly: true
|
|
title: File Size (Bytes)
|
|
dimensions:
|
|
type: string
|
|
nullable: true
|
|
title: Dimensions (WxH)
|
|
maxLength: 50
|
|
uploaded_by_email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- file
|
|
- file_size
|
|
- id
|
|
- media_type_display
|
|
- uploaded_by_email
|
|
MediaAssetMediaTypeEnum:
|
|
enum:
|
|
- image
|
|
- video
|
|
- audio
|
|
- document
|
|
type: string
|
|
description: |-
|
|
* `image` - Image
|
|
* `video` - Video
|
|
* `audio` - Audio
|
|
* `document` - Document / PDF
|
|
MediaAssetRequest:
|
|
type: object
|
|
properties:
|
|
file:
|
|
type: string
|
|
format: binary
|
|
title: Media File
|
|
title:
|
|
type: string
|
|
nullable: true
|
|
title: Title / Description
|
|
maxLength: 255
|
|
media_type:
|
|
$ref: '#/components/schemas/MediaAssetMediaTypeEnum'
|
|
dimensions:
|
|
type: string
|
|
nullable: true
|
|
title: Dimensions (WxH)
|
|
maxLength: 50
|
|
required:
|
|
- file
|
|
MeetingCreateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Meeting Title / Subject
|
|
maxLength: 255
|
|
requester_institution_id:
|
|
type: integer
|
|
writeOnly: true
|
|
recipient_institution_id:
|
|
type: integer
|
|
writeOnly: true
|
|
meeting_date:
|
|
type: string
|
|
format: date
|
|
title: Proposed / Confirmed Date
|
|
meeting_time:
|
|
type: string
|
|
format: time
|
|
title: Proposed / Confirmed Time
|
|
duration_minutes:
|
|
type: integer
|
|
title: Duration (Minutes)
|
|
meeting_url:
|
|
title: Video Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
agenda:
|
|
type: string
|
|
title: Meeting Agenda & Topics
|
|
required:
|
|
- meeting_date
|
|
- meeting_time
|
|
- recipient_institution_id
|
|
- requester_institution_id
|
|
- title
|
|
MeetingDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Meeting Title / Subject
|
|
maxLength: 255
|
|
requester_institution:
|
|
allOf:
|
|
- $ref: '#/components/schemas/InstitutionMeetingMinimal'
|
|
readOnly: true
|
|
recipient_institution:
|
|
allOf:
|
|
- $ref: '#/components/schemas/InstitutionMeetingMinimal'
|
|
readOnly: true
|
|
created_by:
|
|
allOf:
|
|
- $ref: '#/components/schemas/MeetingUser'
|
|
readOnly: true
|
|
status:
|
|
$ref: '#/components/schemas/MeetingStatusEnum'
|
|
meeting_date:
|
|
type: string
|
|
format: date
|
|
title: Proposed / Confirmed Date
|
|
meeting_time:
|
|
type: string
|
|
format: time
|
|
title: Proposed / Confirmed Time
|
|
duration_minutes:
|
|
type: integer
|
|
title: Duration (Minutes)
|
|
meeting_url:
|
|
title: Video Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
agenda:
|
|
type: string
|
|
title: Meeting Agenda & Topics
|
|
admin_notes:
|
|
type: string
|
|
title: Internal / Admin Notes
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- created_by
|
|
- id
|
|
- meeting_date
|
|
- meeting_time
|
|
- recipient_institution
|
|
- requester_institution
|
|
- title
|
|
- updated_at
|
|
MeetingList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Meeting Title / Subject
|
|
maxLength: 255
|
|
requester_institution:
|
|
allOf:
|
|
- $ref: '#/components/schemas/InstitutionMeetingMinimal'
|
|
readOnly: true
|
|
recipient_institution:
|
|
allOf:
|
|
- $ref: '#/components/schemas/InstitutionMeetingMinimal'
|
|
readOnly: true
|
|
created_by:
|
|
allOf:
|
|
- $ref: '#/components/schemas/MeetingUser'
|
|
readOnly: true
|
|
status:
|
|
$ref: '#/components/schemas/MeetingStatusEnum'
|
|
meeting_date:
|
|
type: string
|
|
format: date
|
|
title: Proposed / Confirmed Date
|
|
meeting_time:
|
|
type: string
|
|
format: time
|
|
title: Proposed / Confirmed Time
|
|
duration_minutes:
|
|
type: integer
|
|
title: Duration (Minutes)
|
|
meeting_url:
|
|
title: Video Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- created_by
|
|
- id
|
|
- meeting_date
|
|
- meeting_time
|
|
- recipient_institution
|
|
- requester_institution
|
|
- title
|
|
MeetingStatusEnum:
|
|
enum:
|
|
- pending
|
|
- scheduled
|
|
- completed
|
|
- cancelled
|
|
- declined
|
|
type: string
|
|
description: |-
|
|
* `pending` - Pending
|
|
* `scheduled` - Scheduled
|
|
* `completed` - Completed
|
|
* `cancelled` - Cancelled
|
|
* `declined` - Declined
|
|
MeetingUpdate:
|
|
type: object
|
|
properties:
|
|
status:
|
|
$ref: '#/components/schemas/MeetingStatusEnum'
|
|
meeting_date:
|
|
type: string
|
|
format: date
|
|
title: Proposed / Confirmed Date
|
|
meeting_time:
|
|
type: string
|
|
format: time
|
|
title: Proposed / Confirmed Time
|
|
duration_minutes:
|
|
type: integer
|
|
title: Duration (Minutes)
|
|
meeting_url:
|
|
title: Video Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
agenda:
|
|
type: string
|
|
title: Meeting Agenda & Topics
|
|
admin_notes:
|
|
type: string
|
|
title: Internal / Admin Notes
|
|
required:
|
|
- meeting_date
|
|
- meeting_time
|
|
MeetingUpdateRequest:
|
|
type: object
|
|
properties:
|
|
status:
|
|
$ref: '#/components/schemas/MeetingStatusEnum'
|
|
meeting_date:
|
|
type: string
|
|
format: date
|
|
title: Proposed / Confirmed Date
|
|
meeting_time:
|
|
type: string
|
|
format: time
|
|
title: Proposed / Confirmed Time
|
|
duration_minutes:
|
|
type: integer
|
|
title: Duration (Minutes)
|
|
meeting_url:
|
|
title: Video Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
agenda:
|
|
type: string
|
|
title: Meeting Agenda & Topics
|
|
admin_notes:
|
|
type: string
|
|
title: Internal / Admin Notes
|
|
required:
|
|
- meeting_date
|
|
- meeting_time
|
|
MeetingUser:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
email:
|
|
nullable: true
|
|
title: Email Address
|
|
description: User primary email address.
|
|
oneOf:
|
|
- type: string
|
|
format: email
|
|
maxLength: 254
|
|
- type: string
|
|
maxLength: 0
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
required:
|
|
- id
|
|
MemberUserMini:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
title: Email Address
|
|
description: User primary email address.
|
|
fullname:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
phone_number:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
required:
|
|
- avatar
|
|
- email
|
|
- fullname
|
|
- id
|
|
- phone_number
|
|
Notification:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
maxLength: 255
|
|
message:
|
|
type: string
|
|
maxLength: 1024
|
|
is_read:
|
|
type: boolean
|
|
notification_type:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 50
|
|
action:
|
|
type: string
|
|
maxLength: 50
|
|
navigate_to:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- id
|
|
- message
|
|
- title
|
|
- updated_at
|
|
NotificationTemplate:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
notification_type:
|
|
type: string
|
|
maxLength: 50
|
|
name:
|
|
type: string
|
|
maxLength: 100
|
|
is_active:
|
|
type: boolean
|
|
title:
|
|
type: string
|
|
maxLength: 255
|
|
body:
|
|
type: string
|
|
maxLength: 1024
|
|
placeholders_info:
|
|
type: string
|
|
nullable: true
|
|
title: Allowed Placeholders Description
|
|
maxLength: 255
|
|
required:
|
|
- id
|
|
- name
|
|
- notification_type
|
|
NotificationTemplateRequest:
|
|
type: object
|
|
properties:
|
|
notification_type:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 50
|
|
name:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 100
|
|
is_active:
|
|
type: boolean
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
body:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1024
|
|
placeholders_info:
|
|
type: string
|
|
nullable: true
|
|
title: Allowed Placeholders Description
|
|
maxLength: 255
|
|
required:
|
|
- name
|
|
- notification_type
|
|
NullEnum:
|
|
enum:
|
|
- null
|
|
PaginatedAdminNotificationList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/AdminNotification'
|
|
PaginatedAdminUserList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/AdminUser'
|
|
PaginatedChatMessageList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ChatMessage'
|
|
PaginatedChatRoomListList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ChatRoomList'
|
|
PaginatedEventCalendarItemList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/EventCalendarItem'
|
|
PaginatedEventListList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/EventList'
|
|
PaginatedEventRegistrationList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/EventRegistration'
|
|
PaginatedInstitutionListList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/InstitutionList'
|
|
PaginatedInstitutionMediaList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/InstitutionMedia'
|
|
PaginatedInstitutionMemberList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/InstitutionMember'
|
|
PaginatedInstitutionTimelineList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/InstitutionTimeline'
|
|
PaginatedKanbanColumnList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/KanbanColumn'
|
|
PaginatedMapClusterItemList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/MapClusterItem'
|
|
PaginatedMediaAssetList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/MediaAsset'
|
|
PaginatedMeetingListList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/MeetingList'
|
|
PaginatedNotificationList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Notification'
|
|
PaginatedNotificationTemplateList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/NotificationTemplate'
|
|
PaginatedPostCategoryList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PostCategory'
|
|
PaginatedPostCommentList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PostComment'
|
|
PaginatedPostListList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PostList'
|
|
PaginatedPostTagList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PostTag'
|
|
PaginatedProjectDocumentList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ProjectDocument'
|
|
PaginatedProjectListList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ProjectList'
|
|
PaginatedRegionalDensityList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/RegionalDensity'
|
|
PaginatedVerificationDocumentList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/VerificationDocument'
|
|
PasswordRecoverRequestRequest:
|
|
type: object
|
|
properties:
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
required:
|
|
- email
|
|
PasswordResetRequestRequest:
|
|
type: object
|
|
properties:
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
token:
|
|
type: string
|
|
minLength: 1
|
|
new_password:
|
|
type: string
|
|
minLength: 6
|
|
required:
|
|
- email
|
|
- new_password
|
|
- token
|
|
PatchedAdminNotificationRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
message:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1024
|
|
is_read:
|
|
type: boolean
|
|
notification_type:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 50
|
|
action:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 50
|
|
navigate_to:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
PatchedAdminUserRequest:
|
|
type: object
|
|
properties:
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
avatar:
|
|
type: string
|
|
nullable: true
|
|
minLength: 1
|
|
gender:
|
|
nullable: true
|
|
oneOf:
|
|
- $ref: '#/components/schemas/GenderEnum'
|
|
- $ref: '#/components/schemas/BlankEnum'
|
|
- $ref: '#/components/schemas/NullEnum'
|
|
birthdate:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
info:
|
|
type: string
|
|
nullable: true
|
|
title: Bio / Info
|
|
skill:
|
|
type: string
|
|
nullable: true
|
|
title: Skill / Role
|
|
maxLength: 512
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
fcm:
|
|
type: string
|
|
nullable: true
|
|
title: FCM Token
|
|
maxLength: 512
|
|
user_type:
|
|
$ref: '#/components/schemas/UserTypeEnum'
|
|
is_active:
|
|
type: boolean
|
|
title: Active
|
|
description: Designates whether this user should be treated as active.
|
|
is_staff:
|
|
type: boolean
|
|
is_superuser:
|
|
type: boolean
|
|
title: Superuser status
|
|
description: Designates that this user has all permissions without explicitly
|
|
assigning them.
|
|
PatchedEventCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Event Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
minLength: 1
|
|
title: Event Description
|
|
organizer_id:
|
|
type: integer
|
|
writeOnly: true
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
event_date:
|
|
type: string
|
|
format: date
|
|
start_time:
|
|
type: string
|
|
format: time
|
|
end_time:
|
|
type: string
|
|
format: time
|
|
nullable: true
|
|
speaker_name:
|
|
type: string
|
|
maxLength: 255
|
|
speaker_title:
|
|
type: string
|
|
title: Speaker Title / Affiliation
|
|
maxLength: 255
|
|
speaker_avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
location_type:
|
|
$ref: '#/components/schemas/LocationTypeEnum'
|
|
venue_address:
|
|
type: string
|
|
maxLength: 500
|
|
online_meeting_url:
|
|
title: Online Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 200
|
|
- type: string
|
|
maxLength: 0
|
|
cover_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
capacity:
|
|
type: integer
|
|
title: Capacity Limit
|
|
is_active:
|
|
type: boolean
|
|
is_featured:
|
|
type: boolean
|
|
language:
|
|
$ref: '#/components/schemas/CMSPostLanguageEnum'
|
|
tags: {}
|
|
PatchedInstitutionCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
minLength: 1
|
|
title: Institution Name
|
|
description: Official name of the mosque, center, or institute.
|
|
maxLength: 255
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TypeEnum'
|
|
title: Institution Type
|
|
country:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
city:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
address:
|
|
type: string
|
|
nullable: true
|
|
title: Full Address
|
|
latitude:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
longitude:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Description & Background
|
|
website:
|
|
nullable: true
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
email:
|
|
nullable: true
|
|
title: Official Email
|
|
oneOf:
|
|
- type: string
|
|
format: email
|
|
maxLength: 254
|
|
- type: string
|
|
maxLength: 0
|
|
phone:
|
|
type: string
|
|
nullable: true
|
|
title: Official Phone
|
|
maxLength: 50
|
|
established_year:
|
|
type: integer
|
|
nullable: true
|
|
title: Established Year (CE)
|
|
cover_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
title: Logo / Avatar
|
|
social_media:
|
|
title: Social Media Links
|
|
description: 'Dictionary with keys: facebook, twitter, instagram, linkedin,
|
|
youtube, telegram'
|
|
working_hours:
|
|
title: Working Hours / Prayer Times Schedule
|
|
tags:
|
|
title: Tags & Specializations
|
|
is_featured:
|
|
type: boolean
|
|
PatchedKanbanTaskCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
column:
|
|
type: integer
|
|
title: Kanban Column
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Task Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Task Description
|
|
priority:
|
|
$ref: '#/components/schemas/PriorityEnum'
|
|
assignee:
|
|
type: integer
|
|
nullable: true
|
|
title: Assignee User
|
|
due_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
labels:
|
|
title: Task Labels
|
|
order:
|
|
type: integer
|
|
title: Display Order within Column
|
|
PatchedMeetingUpdateRequest:
|
|
type: object
|
|
properties:
|
|
status:
|
|
$ref: '#/components/schemas/MeetingStatusEnum'
|
|
meeting_date:
|
|
type: string
|
|
format: date
|
|
title: Proposed / Confirmed Date
|
|
meeting_time:
|
|
type: string
|
|
format: time
|
|
title: Proposed / Confirmed Time
|
|
duration_minutes:
|
|
type: integer
|
|
title: Duration (Minutes)
|
|
meeting_url:
|
|
title: Video Meeting Link
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
agenda:
|
|
type: string
|
|
title: Meeting Agenda & Topics
|
|
admin_notes:
|
|
type: string
|
|
title: Internal / Admin Notes
|
|
PatchedNotificationTemplateRequest:
|
|
type: object
|
|
properties:
|
|
notification_type:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 50
|
|
name:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 100
|
|
is_active:
|
|
type: boolean
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
body:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1024
|
|
placeholders_info:
|
|
type: string
|
|
nullable: true
|
|
title: Allowed Placeholders Description
|
|
maxLength: 255
|
|
PatchedPostCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Post Title
|
|
maxLength: 255
|
|
post_type:
|
|
$ref: '#/components/schemas/PostTypeEnum'
|
|
category:
|
|
type: integer
|
|
nullable: true
|
|
language:
|
|
$ref: '#/components/schemas/CMSPostLanguageEnum'
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/CMSPostStatusEnum'
|
|
title: Publication Status
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Associated Institution
|
|
author_role_label:
|
|
type: string
|
|
nullable: true
|
|
description: e.g. Senior Researcher, Center Director, Diplomatic Envoy
|
|
maxLength: 150
|
|
author_custom_avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
title: Custom Author Avatar
|
|
featured_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
title: Featured Cover Image
|
|
excerpt:
|
|
type: string
|
|
nullable: true
|
|
title: Excerpt / Summary
|
|
description: Brief summary for search results and cards.
|
|
content:
|
|
type: string
|
|
minLength: 1
|
|
title: Rich Text / Markdown Content
|
|
tags: {}
|
|
is_featured:
|
|
type: boolean
|
|
publish_date:
|
|
type: string
|
|
format: date-time
|
|
PatchedProjectCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Project Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Project Description & Objectives
|
|
owner_institution:
|
|
type: integer
|
|
title: Lead / Owner Institution
|
|
collaborating_institutions:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
title: Collaborating Institutions
|
|
category:
|
|
type: string
|
|
nullable: true
|
|
title: Project Category
|
|
description: e.g. Cultural Diplomacy, Educational Academy, Interfaith Dialogue,
|
|
Humanitarian Relief
|
|
maxLength: 100
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ProjectStatusEnum'
|
|
title: Project Status
|
|
progress_percentage:
|
|
type: integer
|
|
title: Progress Percentage (0-100)
|
|
budget:
|
|
type: string
|
|
nullable: true
|
|
title: Estimated Budget
|
|
description: e.g. $50,000 or €35,000
|
|
maxLength: 100
|
|
team_size:
|
|
type: integer
|
|
cover_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
start_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
estimated_end_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
actual_end_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
title: Actual Completion Date
|
|
PatchedUserMeUpdateRequest:
|
|
type: object
|
|
properties:
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
bio:
|
|
type: string
|
|
nullable: true
|
|
languages: {}
|
|
skills: {}
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
gender:
|
|
nullable: true
|
|
oneOf:
|
|
- $ref: '#/components/schemas/GenderEnum'
|
|
- $ref: '#/components/schemas/BlankEnum'
|
|
- $ref: '#/components/schemas/NullEnum'
|
|
birthdate:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
PatchedUserProfileRequest:
|
|
type: object
|
|
properties:
|
|
fcm:
|
|
type: string
|
|
minLength: 1
|
|
description: Firebase Cloud Messaging token.
|
|
fullname:
|
|
type: string
|
|
minLength: 1
|
|
avatar:
|
|
type: string
|
|
nullable: true
|
|
minLength: 1
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
birthdate:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
gender:
|
|
allOf:
|
|
- $ref: '#/components/schemas/GenderEnum'
|
|
description: |-
|
|
Select the user's gender.
|
|
|
|
* `male` - Male
|
|
* `female` - Female
|
|
* `other` - Other
|
|
PostAuthorMini:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
title: Email Address
|
|
description: User primary email address.
|
|
fullname:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
required:
|
|
- avatar
|
|
- email
|
|
- fullname
|
|
- id
|
|
PostCategory:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
title: Category Name
|
|
maxLength: 255
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
language:
|
|
$ref: '#/components/schemas/PostCategoryLanguageEnum'
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Category Description
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
posts_count:
|
|
type: integer
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- id
|
|
- name
|
|
- posts_count
|
|
- slug
|
|
PostCategoryLanguageEnum:
|
|
enum:
|
|
- fa
|
|
- en
|
|
- ar
|
|
- ur
|
|
- ru
|
|
type: string
|
|
description: |-
|
|
* `fa` - Persian
|
|
* `en` - English
|
|
* `ar` - Arabic
|
|
* `ur` - Urdu
|
|
* `ru` - Russian
|
|
PostComment:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
post:
|
|
type: integer
|
|
readOnly: true
|
|
user:
|
|
allOf:
|
|
- $ref: '#/components/schemas/PostAuthorMini'
|
|
readOnly: true
|
|
author_name:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
author_email:
|
|
nullable: true
|
|
oneOf:
|
|
- type: string
|
|
format: email
|
|
maxLength: 254
|
|
- type: string
|
|
maxLength: 0
|
|
content:
|
|
type: string
|
|
title: Comment Content
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/CMSCommentStatusEnum'
|
|
readOnly: true
|
|
title: Moderation Status
|
|
status_display:
|
|
type: string
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- content
|
|
- created_at
|
|
- id
|
|
- post
|
|
- status
|
|
- status_display
|
|
- user
|
|
PostCommentCreateRequest:
|
|
type: object
|
|
properties:
|
|
content:
|
|
type: string
|
|
minLength: 1
|
|
author_name:
|
|
type: string
|
|
maxLength: 255
|
|
author_email:
|
|
oneOf:
|
|
- type: string
|
|
format: email
|
|
- type: string
|
|
maxLength: 0
|
|
required:
|
|
- content
|
|
PostCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Post Title
|
|
maxLength: 255
|
|
post_type:
|
|
$ref: '#/components/schemas/PostTypeEnum'
|
|
category:
|
|
type: integer
|
|
nullable: true
|
|
language:
|
|
$ref: '#/components/schemas/CMSPostLanguageEnum'
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/CMSPostStatusEnum'
|
|
title: Publication Status
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Associated Institution
|
|
author_role_label:
|
|
type: string
|
|
nullable: true
|
|
description: e.g. Senior Researcher, Center Director, Diplomatic Envoy
|
|
maxLength: 150
|
|
author_custom_avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
title: Custom Author Avatar
|
|
featured_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
title: Featured Cover Image
|
|
excerpt:
|
|
type: string
|
|
nullable: true
|
|
title: Excerpt / Summary
|
|
description: Brief summary for search results and cards.
|
|
content:
|
|
type: string
|
|
minLength: 1
|
|
title: Rich Text / Markdown Content
|
|
tags: {}
|
|
is_featured:
|
|
type: boolean
|
|
publish_date:
|
|
type: string
|
|
format: date-time
|
|
required:
|
|
- content
|
|
- title
|
|
PostDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Post Title
|
|
maxLength: 255
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
post_type:
|
|
$ref: '#/components/schemas/PostTypeEnum'
|
|
post_type_display:
|
|
type: string
|
|
readOnly: true
|
|
category:
|
|
allOf:
|
|
- $ref: '#/components/schemas/PostCategory'
|
|
readOnly: true
|
|
language:
|
|
$ref: '#/components/schemas/CMSPostLanguageEnum'
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/CMSPostStatusEnum'
|
|
title: Publication Status
|
|
author:
|
|
allOf:
|
|
- $ref: '#/components/schemas/PostAuthorMini'
|
|
readOnly: true
|
|
institution:
|
|
allOf:
|
|
- $ref: '#/components/schemas/PostInstitutionMini'
|
|
readOnly: true
|
|
author_role_label:
|
|
type: string
|
|
nullable: true
|
|
description: e.g. Senior Researcher, Center Director, Diplomatic Envoy
|
|
maxLength: 150
|
|
author_custom_avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Custom Author Avatar
|
|
featured_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Featured Cover Image
|
|
excerpt:
|
|
type: string
|
|
nullable: true
|
|
title: Excerpt / Summary
|
|
description: Brief summary for search results and cards.
|
|
content:
|
|
type: string
|
|
title: Rich Text / Markdown Content
|
|
tags: {}
|
|
reading_time_minutes:
|
|
type: integer
|
|
readOnly: true
|
|
title: Reading Time (Minutes)
|
|
views_count:
|
|
type: integer
|
|
readOnly: true
|
|
likes_count:
|
|
type: integer
|
|
readOnly: true
|
|
comments_count:
|
|
type: integer
|
|
readOnly: true
|
|
is_featured:
|
|
type: boolean
|
|
publish_date:
|
|
type: string
|
|
format: date-time
|
|
is_liked:
|
|
type: boolean
|
|
readOnly: true
|
|
comments:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PostComment'
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- author
|
|
- category
|
|
- comments
|
|
- comments_count
|
|
- content
|
|
- created_at
|
|
- id
|
|
- institution
|
|
- is_liked
|
|
- likes_count
|
|
- post_type_display
|
|
- reading_time_minutes
|
|
- slug
|
|
- title
|
|
- updated_at
|
|
- views_count
|
|
PostInstitutionMini:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
readOnly: true
|
|
title: Institution Name
|
|
description: Official name of the mosque, center, or institute.
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TypeEnum'
|
|
readOnly: true
|
|
title: Institution Type
|
|
type_display:
|
|
type: string
|
|
readOnly: true
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
title: Logo / Avatar
|
|
city:
|
|
type: string
|
|
readOnly: true
|
|
country:
|
|
type: string
|
|
readOnly: true
|
|
required:
|
|
- avatar
|
|
- city
|
|
- country
|
|
- id
|
|
- name
|
|
- slug
|
|
- type
|
|
- type_display
|
|
PostLikeResponse:
|
|
type: object
|
|
properties:
|
|
is_liked:
|
|
type: boolean
|
|
likes_count:
|
|
type: integer
|
|
message:
|
|
type: string
|
|
required:
|
|
- is_liked
|
|
- likes_count
|
|
- message
|
|
PostLikeResponseRequest:
|
|
type: object
|
|
properties:
|
|
is_liked:
|
|
type: boolean
|
|
likes_count:
|
|
type: integer
|
|
message:
|
|
type: string
|
|
minLength: 1
|
|
required:
|
|
- is_liked
|
|
- likes_count
|
|
- message
|
|
PostList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
readOnly: true
|
|
title: Post Title
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
post_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/PostTypeEnum'
|
|
readOnly: true
|
|
post_type_display:
|
|
type: string
|
|
readOnly: true
|
|
category:
|
|
type: integer
|
|
readOnly: true
|
|
nullable: true
|
|
category_name:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
language:
|
|
allOf:
|
|
- $ref: '#/components/schemas/CMSPostLanguageEnum'
|
|
readOnly: true
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/CMSPostStatusEnum'
|
|
readOnly: true
|
|
title: Publication Status
|
|
author:
|
|
allOf:
|
|
- $ref: '#/components/schemas/PostAuthorMini'
|
|
readOnly: true
|
|
institution:
|
|
allOf:
|
|
- $ref: '#/components/schemas/PostInstitutionMini'
|
|
readOnly: true
|
|
author_role_label:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
description: e.g. Senior Researcher, Center Director, Diplomatic Envoy
|
|
author_custom_avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
title: Custom Author Avatar
|
|
featured_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
title: Featured Cover Image
|
|
excerpt:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Excerpt / Summary
|
|
description: Brief summary for search results and cards.
|
|
tags:
|
|
readOnly: true
|
|
reading_time_minutes:
|
|
type: integer
|
|
readOnly: true
|
|
title: Reading Time (Minutes)
|
|
views_count:
|
|
type: integer
|
|
readOnly: true
|
|
likes_count:
|
|
type: integer
|
|
readOnly: true
|
|
comments_count:
|
|
type: integer
|
|
readOnly: true
|
|
is_featured:
|
|
type: boolean
|
|
readOnly: true
|
|
publish_date:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
is_liked:
|
|
type: boolean
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- author
|
|
- author_custom_avatar
|
|
- author_role_label
|
|
- category
|
|
- category_name
|
|
- comments_count
|
|
- created_at
|
|
- excerpt
|
|
- featured_image
|
|
- id
|
|
- institution
|
|
- is_featured
|
|
- is_liked
|
|
- language
|
|
- likes_count
|
|
- post_type
|
|
- post_type_display
|
|
- publish_date
|
|
- reading_time_minutes
|
|
- slug
|
|
- status
|
|
- tags
|
|
- title
|
|
- views_count
|
|
PostTag:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
title: Tag Name
|
|
maxLength: 100
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
pattern: ^[-\w]+$
|
|
required:
|
|
- id
|
|
- name
|
|
- slug
|
|
PostTypeEnum:
|
|
enum:
|
|
- news
|
|
- article
|
|
- report
|
|
- interview
|
|
type: string
|
|
description: |-
|
|
* `news` - News & Announcements
|
|
* `article` - Analytical Article
|
|
* `report` - Field & Diplomatic Report
|
|
* `interview` - Expert Interview
|
|
PriorityEnum:
|
|
enum:
|
|
- low
|
|
- medium
|
|
- high
|
|
- urgent
|
|
type: string
|
|
description: |-
|
|
* `low` - Low
|
|
* `medium` - Medium
|
|
* `high` - High
|
|
* `urgent` - Urgent
|
|
ProjectCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Project Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Project Description & Objectives
|
|
owner_institution:
|
|
type: integer
|
|
title: Lead / Owner Institution
|
|
collaborating_institutions:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
title: Collaborating Institutions
|
|
category:
|
|
type: string
|
|
nullable: true
|
|
title: Project Category
|
|
description: e.g. Cultural Diplomacy, Educational Academy, Interfaith Dialogue,
|
|
Humanitarian Relief
|
|
maxLength: 100
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ProjectStatusEnum'
|
|
title: Project Status
|
|
progress_percentage:
|
|
type: integer
|
|
title: Progress Percentage (0-100)
|
|
budget:
|
|
type: string
|
|
nullable: true
|
|
title: Estimated Budget
|
|
description: e.g. $50,000 or €35,000
|
|
maxLength: 100
|
|
team_size:
|
|
type: integer
|
|
cover_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
start_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
estimated_end_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
actual_end_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
title: Actual Completion Date
|
|
required:
|
|
- owner_institution
|
|
- title
|
|
ProjectDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Project Title
|
|
maxLength: 255
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Project Description & Objectives
|
|
owner_institution:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ProjectInstitutionMini'
|
|
readOnly: true
|
|
collaborating_institutions:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ProjectInstitutionMini'
|
|
readOnly: true
|
|
category:
|
|
type: string
|
|
nullable: true
|
|
title: Project Category
|
|
description: e.g. Cultural Diplomacy, Educational Academy, Interfaith Dialogue,
|
|
Humanitarian Relief
|
|
maxLength: 100
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ProjectStatusEnum'
|
|
title: Project Status
|
|
status_display:
|
|
type: string
|
|
readOnly: true
|
|
progress_percentage:
|
|
type: integer
|
|
title: Progress Percentage (0-100)
|
|
budget:
|
|
type: string
|
|
nullable: true
|
|
title: Estimated Budget
|
|
description: e.g. $50,000 or €35,000
|
|
maxLength: 100
|
|
team_size:
|
|
type: integer
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
start_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
estimated_end_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
actual_end_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
title: Actual Completion Date
|
|
columns:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/KanbanColumn'
|
|
readOnly: true
|
|
documents:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ProjectDocument'
|
|
readOnly: true
|
|
can_edit:
|
|
type: boolean
|
|
readOnly: true
|
|
created_by_email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- can_edit
|
|
- collaborating_institutions
|
|
- columns
|
|
- created_at
|
|
- created_by_email
|
|
- documents
|
|
- id
|
|
- owner_institution
|
|
- slug
|
|
- status_display
|
|
- title
|
|
- updated_at
|
|
ProjectDocument:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
project:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Document Title
|
|
maxLength: 255
|
|
file:
|
|
type: string
|
|
format: uri
|
|
title: Document File
|
|
doc_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/DocTypeEnum'
|
|
title: Document Type
|
|
doc_type_display:
|
|
type: string
|
|
readOnly: true
|
|
uploaded_by_email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
uploaded_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- doc_type_display
|
|
- file
|
|
- id
|
|
- project
|
|
- title
|
|
- uploaded_at
|
|
- uploaded_by_email
|
|
ProjectDocumentRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Document Title
|
|
maxLength: 255
|
|
file:
|
|
type: string
|
|
format: binary
|
|
title: Document File
|
|
doc_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/DocTypeEnum'
|
|
title: Document Type
|
|
required:
|
|
- file
|
|
- title
|
|
ProjectInstitutionMini:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
readOnly: true
|
|
title: Institution Name
|
|
description: Official name of the mosque, center, or institute.
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TypeEnum'
|
|
readOnly: true
|
|
title: Institution Type
|
|
type_display:
|
|
type: string
|
|
readOnly: true
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
title: Logo / Avatar
|
|
city:
|
|
type: string
|
|
readOnly: true
|
|
country:
|
|
type: string
|
|
readOnly: true
|
|
required:
|
|
- avatar
|
|
- city
|
|
- country
|
|
- id
|
|
- name
|
|
- slug
|
|
- type
|
|
- type_display
|
|
ProjectList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
readOnly: true
|
|
title: Project Title
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
pattern: ^[-\w]+$
|
|
owner_institution:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ProjectInstitutionMini'
|
|
readOnly: true
|
|
collaborating_institutions_count:
|
|
type: integer
|
|
readOnly: true
|
|
category:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Project Category
|
|
description: e.g. Cultural Diplomacy, Educational Academy, Interfaith Dialogue,
|
|
Humanitarian Relief
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/ProjectStatusEnum'
|
|
readOnly: true
|
|
title: Project Status
|
|
status_display:
|
|
type: string
|
|
readOnly: true
|
|
progress_percentage:
|
|
type: integer
|
|
readOnly: true
|
|
title: Progress Percentage (0-100)
|
|
budget:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Estimated Budget
|
|
description: e.g. $50,000 or €35,000
|
|
team_size:
|
|
type: integer
|
|
readOnly: true
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
start_date:
|
|
type: string
|
|
format: date
|
|
readOnly: true
|
|
nullable: true
|
|
estimated_end_date:
|
|
type: string
|
|
format: date
|
|
readOnly: true
|
|
nullable: true
|
|
tasks_count:
|
|
type: integer
|
|
readOnly: true
|
|
completed_tasks_count:
|
|
type: integer
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- budget
|
|
- category
|
|
- collaborating_institutions_count
|
|
- completed_tasks_count
|
|
- cover_image
|
|
- created_at
|
|
- estimated_end_date
|
|
- id
|
|
- owner_institution
|
|
- progress_percentage
|
|
- slug
|
|
- start_date
|
|
- status
|
|
- status_display
|
|
- tasks_count
|
|
- team_size
|
|
- title
|
|
ProjectStatusEnum:
|
|
enum:
|
|
- planning
|
|
- active
|
|
- on_hold
|
|
- completed
|
|
type: string
|
|
description: |-
|
|
* `planning` - Planning
|
|
* `active` - Active / In Progress
|
|
* `on_hold` - On Hold
|
|
* `completed` - Completed
|
|
ProjectUserMini:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
title: Email Address
|
|
description: User primary email address.
|
|
fullname:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
required:
|
|
- avatar
|
|
- email
|
|
- fullname
|
|
- id
|
|
RegionInfo:
|
|
type: object
|
|
properties:
|
|
ip:
|
|
type: string
|
|
nullable: true
|
|
browser:
|
|
type: string
|
|
nullable: true
|
|
user_agent:
|
|
type: string
|
|
required:
|
|
- browser
|
|
- ip
|
|
- user_agent
|
|
RegionalDensity:
|
|
type: object
|
|
properties:
|
|
country:
|
|
type: string
|
|
total_institutions:
|
|
type: integer
|
|
mosques_count:
|
|
type: integer
|
|
hussainiyas_count:
|
|
type: integer
|
|
cultural_centers_count:
|
|
type: integer
|
|
libraries_count:
|
|
type: integer
|
|
institutes_count:
|
|
type: integer
|
|
charities_count:
|
|
type: integer
|
|
total_followers:
|
|
type: integer
|
|
center_lat:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
center_lng:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
required:
|
|
- center_lat
|
|
- center_lng
|
|
- charities_count
|
|
- country
|
|
- cultural_centers_count
|
|
- hussainiyas_count
|
|
- institutes_count
|
|
- libraries_count
|
|
- mosques_count
|
|
- total_followers
|
|
- total_institutions
|
|
RegisterRequestRequest:
|
|
type: object
|
|
properties:
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 6
|
|
fullname:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
user_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/UserTypeEnum'
|
|
default: client
|
|
languages:
|
|
type: array
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 10
|
|
skills:
|
|
type: array
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 100
|
|
country:
|
|
type: string
|
|
maxLength: 255
|
|
city:
|
|
type: string
|
|
maxLength: 255
|
|
required:
|
|
- email
|
|
- fullname
|
|
- password
|
|
RegisterResponse:
|
|
type: object
|
|
properties:
|
|
user:
|
|
$ref: '#/components/schemas/UserMe'
|
|
access:
|
|
type: string
|
|
refresh:
|
|
type: string
|
|
message:
|
|
type: string
|
|
required:
|
|
- access
|
|
- message
|
|
- refresh
|
|
- user
|
|
RoleEnum:
|
|
enum:
|
|
- admin
|
|
- editor
|
|
- viewer
|
|
type: string
|
|
description: |-
|
|
* `admin` - Administrator
|
|
* `editor` - Content & Project Editor
|
|
* `viewer` - Viewer / Member
|
|
RoomTypeEnum:
|
|
enum:
|
|
- direct
|
|
- group
|
|
type: string
|
|
description: |-
|
|
* `direct` - Direct Message
|
|
* `group` - Group Conversation
|
|
SendNotificationRequest:
|
|
type: object
|
|
properties:
|
|
user_id:
|
|
type: integer
|
|
description: Target User ID
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
description: Notification title
|
|
maxLength: 255
|
|
body:
|
|
type: string
|
|
minLength: 1
|
|
description: Notification body
|
|
data:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Extra payload data
|
|
required:
|
|
- body
|
|
- title
|
|
- user_id
|
|
Support:
|
|
type: object
|
|
properties:
|
|
telegram_number:
|
|
type: string
|
|
default: ''
|
|
whatsapp_number:
|
|
type: string
|
|
default: ''
|
|
office_hours:
|
|
type: string
|
|
default: ''
|
|
SupportMessageCreate:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
sender_name:
|
|
type: string
|
|
maxLength: 255
|
|
sender_email:
|
|
type: string
|
|
format: email
|
|
maxLength: 254
|
|
subject:
|
|
type: string
|
|
maxLength: 255
|
|
sender_phone:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 128
|
|
message:
|
|
type: string
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- id
|
|
- message
|
|
- sender_email
|
|
- sender_name
|
|
- subject
|
|
SupportMessageCreateRequest:
|
|
type: object
|
|
properties:
|
|
sender_name:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
sender_email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
maxLength: 254
|
|
subject:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
sender_phone:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 128
|
|
message:
|
|
type: string
|
|
minLength: 1
|
|
required:
|
|
- message
|
|
- sender_email
|
|
- sender_name
|
|
- subject
|
|
SupportRequest:
|
|
type: object
|
|
properties:
|
|
telegram_number:
|
|
type: string
|
|
default: ''
|
|
whatsapp_number:
|
|
type: string
|
|
default: ''
|
|
office_hours:
|
|
type: string
|
|
default: ''
|
|
TokenObtainPair:
|
|
type: object
|
|
properties:
|
|
access:
|
|
type: string
|
|
readOnly: true
|
|
refresh:
|
|
type: string
|
|
readOnly: true
|
|
required:
|
|
- access
|
|
- refresh
|
|
TokenObtainPairRequest:
|
|
type: object
|
|
properties:
|
|
email:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
required:
|
|
- email
|
|
- password
|
|
TokenRefresh:
|
|
type: object
|
|
properties:
|
|
access:
|
|
type: string
|
|
readOnly: true
|
|
refresh:
|
|
type: string
|
|
required:
|
|
- access
|
|
- refresh
|
|
TokenRefreshRequest:
|
|
type: object
|
|
properties:
|
|
refresh:
|
|
type: string
|
|
minLength: 1
|
|
required:
|
|
- refresh
|
|
TokenVerifyRequest:
|
|
type: object
|
|
properties:
|
|
token:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
required:
|
|
- token
|
|
TypeEnum:
|
|
enum:
|
|
- mosque
|
|
- hussainiya
|
|
- cultural_center
|
|
- library
|
|
- institute
|
|
- charity
|
|
- other
|
|
type: string
|
|
description: |-
|
|
* `mosque` - Mosque
|
|
* `hussainiya` - Hussainiya / Islamic Center
|
|
* `cultural_center` - Cultural Center
|
|
* `library` - Islamic Library
|
|
* `institute` - Seminary & Institute
|
|
* `charity` - Charity & Foundation
|
|
* `other` - Other Organization
|
|
UserFCM:
|
|
type: object
|
|
properties:
|
|
fcm:
|
|
type: string
|
|
nullable: true
|
|
title: FCM Token
|
|
maxLength: 512
|
|
UserFCMRequest:
|
|
type: object
|
|
properties:
|
|
fcm:
|
|
type: string
|
|
nullable: true
|
|
title: FCM Token
|
|
maxLength: 512
|
|
UserGuest:
|
|
type: object
|
|
properties:
|
|
device_id:
|
|
type: string
|
|
fcm:
|
|
type: string
|
|
device_os:
|
|
$ref: '#/components/schemas/DeviceOsEnum'
|
|
lat:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
lon:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
timezone:
|
|
type: string
|
|
nullable: true
|
|
UserGuestRequest:
|
|
type: object
|
|
properties:
|
|
device_id:
|
|
type: string
|
|
minLength: 1
|
|
fcm:
|
|
type: string
|
|
minLength: 1
|
|
device_os:
|
|
$ref: '#/components/schemas/DeviceOsEnum'
|
|
lat:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
lon:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
timezone:
|
|
type: string
|
|
nullable: true
|
|
UserLogin:
|
|
type: object
|
|
properties:
|
|
token:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
fullname:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
avatar:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
password:
|
|
type: string
|
|
fcm:
|
|
type: string
|
|
device_id:
|
|
type: string
|
|
timezone:
|
|
type: string
|
|
nullable: true
|
|
required:
|
|
- avatar
|
|
- fullname
|
|
- password
|
|
- token
|
|
UserLoginRequest:
|
|
type: object
|
|
properties:
|
|
email:
|
|
type: string
|
|
format: email
|
|
writeOnly: true
|
|
minLength: 1
|
|
password:
|
|
type: string
|
|
minLength: 1
|
|
fcm:
|
|
type: string
|
|
minLength: 1
|
|
device_id:
|
|
type: string
|
|
minLength: 1
|
|
timezone:
|
|
type: string
|
|
nullable: true
|
|
required:
|
|
- email
|
|
- password
|
|
UserMe:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
title: Email Address
|
|
description: User primary email address.
|
|
username:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
user_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/UserTypeEnum'
|
|
readOnly: true
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
bio:
|
|
type: string
|
|
nullable: true
|
|
languages: {}
|
|
skills: {}
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
gender:
|
|
nullable: true
|
|
oneOf:
|
|
- $ref: '#/components/schemas/GenderEnum'
|
|
- $ref: '#/components/schemas/BlankEnum'
|
|
- $ref: '#/components/schemas/NullEnum'
|
|
birthdate:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
date_joined:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
is_active:
|
|
type: boolean
|
|
readOnly: true
|
|
title: Active
|
|
description: Designates whether this user should be treated as active.
|
|
is_staff:
|
|
type: boolean
|
|
readOnly: true
|
|
roles:
|
|
type: array
|
|
items: {}
|
|
readOnly: true
|
|
permissions:
|
|
type: array
|
|
items: {}
|
|
readOnly: true
|
|
verification_status:
|
|
type: string
|
|
readOnly: true
|
|
is_verified:
|
|
type: boolean
|
|
readOnly: true
|
|
required:
|
|
- date_joined
|
|
- email
|
|
- id
|
|
- is_active
|
|
- is_staff
|
|
- is_verified
|
|
- permissions
|
|
- roles
|
|
- user_type
|
|
- username
|
|
- verification_status
|
|
UserProfile:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
device_id:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
fcm:
|
|
type: string
|
|
description: Firebase Cloud Messaging token.
|
|
fullname:
|
|
type: string
|
|
slug:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
pattern: ^[-a-zA-Z0-9_]+$
|
|
avatar:
|
|
type: string
|
|
nullable: true
|
|
email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
title: Email Address
|
|
description: User primary email address.
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
info:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Bio / Info
|
|
skill:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Skill / Role
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
birthdate:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
gender:
|
|
allOf:
|
|
- $ref: '#/components/schemas/GenderEnum'
|
|
description: |-
|
|
Select the user's gender.
|
|
|
|
* `male` - Male
|
|
* `female` - Female
|
|
* `other` - Other
|
|
saved_location:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
required:
|
|
- device_id
|
|
- email
|
|
- id
|
|
- info
|
|
- saved_location
|
|
- skill
|
|
- slug
|
|
UserProfileRequest:
|
|
type: object
|
|
properties:
|
|
fcm:
|
|
type: string
|
|
minLength: 1
|
|
description: Firebase Cloud Messaging token.
|
|
fullname:
|
|
type: string
|
|
minLength: 1
|
|
avatar:
|
|
type: string
|
|
nullable: true
|
|
minLength: 1
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
city:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
country:
|
|
type: string
|
|
nullable: true
|
|
maxLength: 255
|
|
birthdate:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
gender:
|
|
allOf:
|
|
- $ref: '#/components/schemas/GenderEnum'
|
|
description: |-
|
|
Select the user's gender.
|
|
|
|
* `male` - Male
|
|
* `female` - Female
|
|
* `other` - Other
|
|
UserRecoverPassword:
|
|
type: object
|
|
description: |-
|
|
Validates that an email is provided and is in a valid format
|
|
without checking for database uniqueness.
|
|
properties:
|
|
email:
|
|
type: string
|
|
format: email
|
|
required:
|
|
- email
|
|
UserRecoverPasswordRequest:
|
|
type: object
|
|
description: |-
|
|
Validates that an email is provided and is in a valid format
|
|
without checking for database uniqueness.
|
|
properties:
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
required:
|
|
- email
|
|
UserRegister:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
email:
|
|
type: string
|
|
format: email
|
|
fcm:
|
|
type: string
|
|
nullable: true
|
|
required:
|
|
- email
|
|
- fullname
|
|
- id
|
|
UserRegisterRequest:
|
|
type: object
|
|
properties:
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
fcm:
|
|
type: string
|
|
nullable: true
|
|
device_id:
|
|
type: string
|
|
writeOnly: true
|
|
nullable: true
|
|
required:
|
|
- email
|
|
- fullname
|
|
UserResetPasswordRequest:
|
|
type: object
|
|
properties:
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
required:
|
|
- password
|
|
UserTypeEnum:
|
|
enum:
|
|
- client
|
|
- student
|
|
- professor
|
|
- consultant
|
|
- admin
|
|
- super_admin
|
|
- regional_admin
|
|
- institution_admin
|
|
- editor
|
|
- viewer
|
|
type: string
|
|
description: |-
|
|
* `client` - Client / User
|
|
* `student` - Student / Member
|
|
* `professor` - Professor / Scholar
|
|
* `consultant` - Consultant
|
|
* `admin` - Admin
|
|
* `super_admin` - Super Admin
|
|
* `regional_admin` - Regional Admin
|
|
* `institution_admin` - Institution Admin
|
|
* `editor` - Editor
|
|
* `viewer` - Viewer
|
|
UserVerify:
|
|
type: object
|
|
properties:
|
|
code:
|
|
type: string
|
|
maxLength: 6
|
|
email:
|
|
type: string
|
|
format: email
|
|
device_id:
|
|
type: string
|
|
maxLength: 255
|
|
required:
|
|
- code
|
|
- email
|
|
UserVerifyRequest:
|
|
type: object
|
|
properties:
|
|
code:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 6
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
device_id:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
required:
|
|
- code
|
|
- email
|
|
VerificationDocument:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
user:
|
|
type: integer
|
|
readOnly: true
|
|
document_type:
|
|
$ref: '#/components/schemas/DocumentTypeEnum'
|
|
document_type_display:
|
|
type: string
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
nullable: true
|
|
title: Document Title
|
|
maxLength: 255
|
|
document_file:
|
|
type: string
|
|
format: uri
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/VerificationDocumentStatusEnum'
|
|
readOnly: true
|
|
title: Verification Status
|
|
status_display:
|
|
type: string
|
|
readOnly: true
|
|
admin_notes:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Admin Notes / Feedback
|
|
reviewed_by_email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
nullable: true
|
|
uploaded_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
reviewed_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
nullable: true
|
|
required:
|
|
- admin_notes
|
|
- document_file
|
|
- document_type_display
|
|
- id
|
|
- reviewed_at
|
|
- reviewed_by_email
|
|
- status
|
|
- status_display
|
|
- uploaded_at
|
|
- user
|
|
VerificationDocumentStatusEnum:
|
|
enum:
|
|
- pending
|
|
- verified
|
|
- rejected
|
|
type: string
|
|
description: |-
|
|
* `pending` - Pending Review
|
|
* `verified` - Verified
|
|
* `rejected` - Rejected
|
|
VerificationDocumentUploadRequest:
|
|
type: object
|
|
properties:
|
|
document_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/DocumentTypeEnum'
|
|
default: national_id
|
|
title:
|
|
type: string
|
|
maxLength: 255
|
|
document_file:
|
|
type: string
|
|
format: binary
|
|
required:
|
|
- document_file
|
|
VerificationStatusEnum:
|
|
enum:
|
|
- pending
|
|
- approved
|
|
- rejected
|
|
type: string
|
|
description: |-
|
|
* `pending` - Pending Review
|
|
* `approved` - Approved & Verified
|
|
* `rejected` - Rejected
|
|
WebUserRegister:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
email:
|
|
type: string
|
|
format: email
|
|
fcm:
|
|
type: string
|
|
nullable: true
|
|
required:
|
|
- email
|
|
- fullname
|
|
- id
|
|
WebUserRegisterRequest:
|
|
type: object
|
|
properties:
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
fcm:
|
|
type: string
|
|
nullable: true
|
|
required:
|
|
- email
|
|
- fullname
|
|
- password
|
|
securitySchemes:
|
|
cookieAuth:
|
|
type: apiKey
|
|
in: cookie
|
|
name: sessionid
|
|
jwtAuth:
|
|
type: http
|
|
scheme: bearer
|
|
bearerFormat: JWT
|
|
tokenAuth:
|
|
type: apiKey
|
|
in: header
|
|
name: Authorization
|
|
description: Token-based authentication with required prefix "Token"
|