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.
13618 lines
370 KiB
13618 lines
370 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
|
|
description: Login specifically for Admin Panel users. Returns auth token on
|
|
success.
|
|
summary: Admin panel login
|
|
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':
|
|
description: Returns token and admin user info.
|
|
/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: Exchange a one-time temporary token (issued by mobile app) for
|
|
a real auth token and user info.
|
|
summary: Exchange temporary token for user authentication
|
|
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':
|
|
description: Token exchanged successfully. Returns auth token and user details.
|
|
'400':
|
|
description: Invalid request — token not provided or malformed.
|
|
'404':
|
|
description: Token not found, expired, or user does not exist.
|
|
/api/v1/account/guest/:
|
|
post:
|
|
operationId: v1_account_guest_create
|
|
description: Create a guest user account with device information.
|
|
summary: Create guest user account
|
|
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:
|
|
'200':
|
|
description: Returns auth token for the guest user.
|
|
/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
|
|
description: "\n# \U0001F408 Scenario\n\U0001F6E0️ ورود به حساب کاربری\n\nکاربر
|
|
با وارد کردن ایمیل و رمز عبور خود به سیستم وارد میشود. اگر اعتبارنامهها
|
|
معتبر باشند، توکن احراز هویت برای دسترسی به دیگر بخشهای سیستم بازگردانده
|
|
میشود.\n\n---\n\n## \U0001F680 درخواست API\n\n### URL:\n```\nPOST /api/login/\n```\n\n###
|
|
Header:\n| کلید | مقدار |\n|---------------|---------------------------------|\n|
|
|
Content-Type | application/json |\n| Authorization | Optional
|
|
(برای این endpoint نیاز نیست) |\n\n### Body:\n```json\n{\n \"email\": \"johndoe@example.com\",\n
|
|
\ \"password\": \"strongpassword\",\n \"fcm\": \"fcm_token_optional\",\n
|
|
\ \"device_id\": \"device_id_optional\"\n}\n```\n\n---\n\n## \U0001F4CA
|
|
پاسخها\n\n| کد وضعیت | توضیحات |\n|---------------|-----------------------------------------------------------|\n|
|
|
`201` | موفقیتآمیز - کاربر با موفقیت وارد شد و توکن احراز هویت بازگردانده
|
|
شد. |\n| `400` | درخواست نادرست - مشکلات مربوط به دادههای ارسالی.
|
|
\ |\n| `404` | کاربر یافت نشد. |\n|
|
|
`500` | مشکل موقتی در سرور. |\n\n---\n\n##
|
|
\U0001F4C4 نمونه پاسخ موفقیتآمیز\n\n```json\n{\n \"id\": 1,\n \"fullname\":
|
|
\"John Doe\",\n \"email\": \"johndoe@example.com\",\n \"token\": \"abc123def456\",\n
|
|
\ \"avatar\": \"https://example.com/avatar.jpg\"\n}\n```\n\n---\n\n## \U0001F4C4
|
|
نمونه پاسخ خطا\n\n### ورود ناموفق (اطلاعات اشتباه):\n```json\n{\n \"status\":
|
|
\"error\",\n \"code\": \"invalid_credentials\",\n \"status_code\": 400,\n
|
|
\ \"message\": \"Unable to log in with provided credentials.\"\n}\n```\n\n###
|
|
کاربر یافت نشد:\n```json\n{\n \"status\": \"error\",\n \"code\": \"not_found\",\n
|
|
\ \"status_code\": 404,\n \"message\": \"User not found.\"\n}\n```\n\n###
|
|
مشکل موقتی در سرور:\n```json\n{\n \"status\": \"error\",\n \"code\":
|
|
\"service_unavailable\",\n \"status_code\": 500,\n \"message\": \"Service
|
|
temporarily unavailable.\"\n}\n```\n\n---\n\n## \U0001F4A1 نکات مهم:\n1. **رمز
|
|
عبور:**\n - رمز عبور باید صحیح و مطابق با آنچه کاربر هنگام ثبتنام ارائه
|
|
کرده است، باشد.\n2. **توکن احراز هویت:**\n - پس از ورود موفقیتآمیز، توکن
|
|
احراز هویت به کاربر بازگردانده میشود که برای دسترسی به دیگر بخشهای سیستم
|
|
نیاز است.\n3. **اطلاعات دستگاه:**\n - `fcm` و `device_id` به عنوان اطلاعات
|
|
اختیاری برای شناسایی دستگاه ارسال میشوند.\n\n---\n\n## \U0001F527 توضیحات
|
|
فنی:\n\n### فرآیند ورود به حساب کاربری:\n1. کاربر ایمیل و رمز عبور خود را
|
|
وارد میکند.\n2. سیستم سعی میکند کاربر را با استفاده از اعتبارنامههای ارائه
|
|
شده احراز هویت کند.\n3. اگر کاربر یافت شود و اعتبارنامهها صحیح باشند، یک
|
|
توکن احراز هویت ایجاد شده و به کاربر بازگردانده میشود.\n4. اگر اعتبارنامه
|
|
نادرست باشند، پیام خطا برگردانده میشود.\n\n### ولیدیشنها:\n- **ایمیل و رمز
|
|
عبور:**\n - بررسی میشود که ایمیل و رمز عبور وارد شده معتبر باشند.\n - اگر
|
|
کاربر با این ایمیل و رمز عبور یافت نشود، پیام خطای مناسب برگردانده میشود.\n\n---\n\n##
|
|
\U0001F4C4 نمونه درخواست:\n\n### درخواست کامل:\n```json\n{\n \"email\":
|
|
\"janedoe@example.com\",\n \"password\": \"mypassword\",\n \"fcm\":
|
|
\"fcm_token_example\",\n \"device_id\": \"device_id_example\"\n}\n```\n\n###
|
|
پاسخ موفق:\n```json\n{\n \"id\": 2,\n \"fullname\": \"Jane Doe\",\n
|
|
\ \"email\": \"janedoe@example.com\",\n \"token\": \"xyz987uvw654\",\n
|
|
\ \"avatar\": null\n}\n```\n"
|
|
summary: User login
|
|
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':
|
|
description: Returns token and user info.
|
|
/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
|
|
description: "\n# \U0001F408 Scenario\n\U0001F6E0️ بازیابی رمز عبور\n\nکاربر
|
|
با وارد کردن ایمیل خود، درخواست بازیابی رمز عبور میدهد. \nیک کد تأیید به
|
|
ایمیل کاربر ارسال میشود تا کاربر بتواند رمز عبور خود را بازیابی کند.\nسپس
|
|
کاربر باید به صفحه وریفای ریدایرکت شود\nو بعد از تایید وریفای با توکن داده
|
|
شده \nبه صفحه ریست پسورد ریدایرکت میشود تا پسور جدیدی را ست کند\n\n---\n\n##
|
|
\U0001F680 درخواست API\n\n### URL:\n```\nPOST /api/recover-password/\n```\n\n###
|
|
Header:\n| کلید | مقدار |\n|---------------|---------------------------------|\n|
|
|
Content-Type | application/json |\n| Authorization | Optional
|
|
(برای این endpoint نیاز نیست) |\n\n### Body:\n```json\n{\n \"email\": \"johndoe@example.com\"\n}\n```\n\n---\n\n##
|
|
\U0001F4CA پاسخها\n\n| کد وضعیت | توضیحات |\n|---------------|-----------------------------------------------------------|\n|
|
|
`202` | موفقیتآمیز - کد بازیابی رمز عبور به ایمیل کاربر ارسال شد.
|
|
\ |\n| `400` | درخواست نادرست - مشکلات مربوط به دادههای ارسالی.
|
|
\ |\n| `404` | کاربر یافت نشد. |\n|
|
|
`500` | مشکل موقتی در سرور. |\n\n---\n\n##
|
|
\U0001F4C4 نمونه پاسخ موفقیتآمیز\n\n```json\n{\n \"id\": 1,\n \"fullname\":
|
|
\"John Doe\",\n \"phone_number\": \"1234567890\",\n \"email\": \"johndoe@example.com\",\n
|
|
\ \"avatar\": null,\n \"message\": \"Forgot password code sent\"\n}\n```\n\n---\n\n##
|
|
\U0001F4C4 نمونه پاسخ خطا\n\n### کاربر یافت نشد:\n```json\n{\n \"status\":
|
|
\"error\",\n \"code\": \"not_found\",\n \"status_code\": 404,\n \"message\":
|
|
\"User not found.\"\n}\n```\n\n### مشکل موقتی در سرور:\n```json\n{\n \"status\":
|
|
\"error\",\n \"code\": \"service_unavailable\",\n \"status_code\": 500,\n
|
|
\ \"message\": \"Service temporarily unavailable.\"\n}\n```\n\n---\n\n##
|
|
\U0001F4A1 نکات مهم:\n1. **کد بازیابی رمز عبور:**\n - کد تأیید به ایمیل
|
|
کاربر ارسال میشود و باید در مرحله بعدی برای بازیابی رمز عبور استفاده شود.\n2.
|
|
**امنیت:**\n - کد بازیابی رمز عبور فقط برای مدت محدود اعتبار دارد و بعد
|
|
از آن منقضی میشود.\n\n---\n\n## \U0001F527 توضیحات فنی:\n\n### فرآیند بازیابی
|
|
رمز عبور:\n1. کاربر ایمیل خود را وارد میکند.\n2. سیستم بررسی میکند که آیا
|
|
کاربری با این ایمیل وجود دارد یا خیر.\n3. اگر کاربر یافت شود، یک کد تأیید
|
|
بازیابی رمز عبور به ایمیل کاربر ارسال میشود.\n4. کاربر باید این کد را در
|
|
مرحله بعدی برای تنظیم رمز عبور جدید وارد کند.\n\n### ولیدیشنها:\n- **ایمیل:**\n
|
|
\ - بررسی میشود که ایمیل وارد شده معتبر باشد.\n - اگر کاربری با این ایمیل
|
|
یافت نشود، پیام خطای مناسب برگردانده میشود.\n\n---\n\n## \U0001F4C4 نمونه
|
|
درخواست:\n\n### درخواست کامل:\n```json\n{\n \"email\": \"janedoe@example.com\"\n}\n```\n\n###
|
|
پاسخ موفق:\n```json\n{\n \"id\": 2,\n \"fullname\": \"Jane Doe\",\n
|
|
\ \"phone_number\": \"0987654321\",\n \"email\": \"janedoe@example.com\",\n
|
|
\ \"avatar\": null,\n \"message\": \"Forgot password code sent\"\n}\n```\n"
|
|
summary: Request password recovery
|
|
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:
|
|
'202':
|
|
description: Recovery code sent to email.
|
|
/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
|
|
description: "\n# \U0001F408 Scenario\nثبت نام کاربر\n\nکاربر با وارد کردن اطلاعات
|
|
مورد نیاز شامل نام کامل، ایمیل، رمز عبور و تأیید رمز عبور درخواست ثبتنام
|
|
ارسال میکند. پس از ثبت موفق، یک کد تأیید به ایمیل ارسال میشود که برای تکمیل
|
|
ثبتنام مورد نیاز است.\n\n---\n\n## \U0001F680 درخواست API\n\n### URL:\n```\nPOST
|
|
/api/register/\n```\n\n### Header:\n| کلید | مقدار |\n|---------------|---------------------------------|\n|
|
|
Content-Type | application/json |\n| Authorization | Optional
|
|
(برای این endpoint نیاز نیست) |\n\n### Body:\n```json\n{\n \"fullname\":
|
|
\"John Doe\",\n \"email\": \"johndoe@example.com\",\n \"password\":
|
|
\"strongpassword\",\n \"password_confirmation\": \"strongpassword\",\n
|
|
\ \"fcm\": \"fcm_token_optional\",\n \"device_id\": \"device_id_optional\"\n}\n```\n\n---\n\n##
|
|
\U0001F4CA پاسخها\n\n| کد وضعیت | توضیحات |\n|---------------|-----------------------------------------------------------|\n|
|
|
`202` | موفقیتآمیز - کد تأیید به ایمیل کاربر ارسال شد. |\n|
|
|
`400` | درخواست نادرست - مشکلات مربوط به دادههای ارسالی. |\n|
|
|
`409` | ایمیل قبلاً ثبت شده است. |\n|
|
|
`404` | کاربر یا منبع یافت نشد. |\n|
|
|
`410` | کد تأیید منقضی شده است. |\n|
|
|
`500` | مشکل موقتی در سرور. |\n\n---\n\n##
|
|
\U0001F4C4 نمونه پاسخ موفقیتآمیز\n\n```json\n{\n \"user\": {\n \"id\":
|
|
1,\n \"fullname\": \"John Doe\",\n \"email\": \"johndoe@example.com\"\n
|
|
\ },\n \"message\": \"The otp code was sent to the user's email\"\n}\n```\n\n---\n\n##
|
|
\U0001F4C4 نمونه پاسخ خطا\n\n### ایمیل تکراری:\n```json\n{\n \"status\":
|
|
\"error\",\n \"code\": \"validation_error\",\n \"status_code\": 409,\n
|
|
\ \"message\": \"There were validation errors.\",\n \"errors\": [\n {\n
|
|
\ \"field\": \"email\",\n \"message\": \"This email is
|
|
already registered.\"\n }\n ]\n}\n```\n\n### رمز عبور و تأیید رمز
|
|
عبور برابر نیستند:\n```json\n{\n \"status\": \"error\",\n \"code\":
|
|
\"validation_error\",\n \"status_code\": 400,\n \"message\": \"There
|
|
were validation errors.\",\n \"errors\": [\n {\n \"field\":
|
|
\"password_confirmation\",\n \"message\": \"Passwords do not match.\"\n
|
|
\ }\n ]\n}\n```\n\n### رمز عبور کوتاهتر از 8 کاراکتر است:\n```json\n{\n
|
|
\ \"status\": \"error\",\n \"code\": \"validation_error\",\n \"status_code\":
|
|
400,\n \"message\": \"There were validation errors.\",\n \"errors\":
|
|
[\n {\n \"field\": \"password\",\n \"message\":
|
|
\"Password must be at least 8 characters long.\"\n }\n ]\n}\n```\n\n###
|
|
درخواست نامعتبر (فیلدهای اجباری):\n```json\n{\n \"status\": \"error\",\n
|
|
\ \"code\": \"validation_error\",\n \"status_code\": 400,\n \"message\":
|
|
\"There were validation errors.\",\n \"errors\": [\n {\n \"field\":
|
|
\"fullname\",\n \"message\": \"This field is required.\"\n },\n
|
|
\ {\n \"field\": \"email\",\n \"message\": \"This
|
|
field is required.\"\n },\n {\n \"field\": \"password\",\n
|
|
\ \"message\": \"This field is required.\"\n },\n {\n
|
|
\ \"field\": \"password_confirmation\",\n \"message\":
|
|
\"This field is required.\"\n }\n ]\n}\n```\n\n### کاربر یافت نشد:\n```json\n{\n
|
|
\ \"status\": \"error\",\n \"code\": \"not_found\",\n \"status_code\":
|
|
404,\n \"message\": \"The requested resource was not found.\"\n}\n```\n\n###
|
|
کد تأیید منقضی شده است:\n```json\n{\n \"status\": \"error\",\n \"code\":
|
|
\"expired_code\",\n \"status_code\": 410,\n \"message\": \"The verification
|
|
code has expired.\"\n}\n```\n\n### مشکل موقتی در سرور:\n```json\n{\n \"status\":
|
|
\"error\",\n \"code\": \"service_unavailable\",\n \"status_code\": 500,\n
|
|
\ \"message\": \"Service temporarily unavailable.\"\n}\n```\n\n---\n\n##
|
|
\U0001F4A1 نکات مهم:\n1. **رمز عبور:**\n - باید حداقل 8 کاراکتر باشد.\n
|
|
\ - رمز عبور و تأیید رمز عبور (`password_confirmation`) باید یکسان باشند.\n2.
|
|
**ایمیل:**\n - باید یک آدرس ایمیل معتبر باشد.\n - ایمیلهای تکراری مجاز
|
|
نیستند.\n3. **کد OTP:**\n - کد تأیید به ایمیل ارسال میشود و برای وریفای
|
|
کاربر استفاده میشود.\n4. **فیلدهای اختیاری:**\n - `fcm` و `device_id` در
|
|
صورت نیاز میتوانند ارسال شوند اما اجباری نیستند.\n\n---\n\n### ولیدیشنها:\n-
|
|
**ایمیل:**\n - بررسی میشود که در سیستم موجود نباشد.\n - اگر موجود باشد،
|
|
پیام خطای زیر برگردانده میشود:\n ```json\n {\n \"status\": \"error\",\n
|
|
\ \"code\": \"validation_error\",\n \"status_code\": 409,\n \"message\":
|
|
\"There were validation errors.\",\n \"errors\": [\n {\n
|
|
\ \"field\": \"email\",\n \"message\": \"This
|
|
email is already registered.\"\n }\n ]\n }\n ```\n-
|
|
**رمز عبور:**\n - بررسی میشود که حداقل 8 کاراکتر باشد:\n ```json\n {\n
|
|
\ \"status\": \"error\",\n \"code\": \"validation_error\",\n
|
|
\ \"status_code\": 400,\n \"message\": \"There were validation
|
|
errors.\",\n \"errors\": [\n {\n \"field\":
|
|
\"password\",\n \"message\": \"Password must be at least 8
|
|
characters long.\"\n }\n ]\n }\n ```\n - بررسی میشود
|
|
که با `password_confirmation` یکسان باشد:\n ```json\n {\n \"status\":
|
|
\"error\",\n \"code\": \"validation_error\",\n \"status_code\":
|
|
400,\n \"message\": \"There were validation errors.\",\n \"errors\":
|
|
[\n {\n \"field\": \"password_confirmation\",\n
|
|
\ \"message\": \"Passwords do not match.\"\n }\n
|
|
\ ]\n }\n ```\n\n---\n\n## \U0001F4C4 نمونه درخواست:\n\n### درخواست
|
|
کامل:\n```json\n{\n \"fullname\": \"Jane Doe\",\n \"email\": \"janedoe@example.com\",\n
|
|
\ \"password\": \"securepassword\",\n \"password_confirmation\": \"securepassword\",\n
|
|
\ \"fcm\": \"fcm_token_example\",\n \"device_id\": \"device_id_example\"\n}\n```\n\n###
|
|
پاسخ موفق:\n```json\n{\n \"user\": {\n \"id\": 2,\n \"fullname\":
|
|
\"Jane Doe\",\n \"email\": \"janedoe@example.com\"\n },\n \"message\":
|
|
\"The otp code was sent to the user's email\"\n}\n```\n"
|
|
summary: Register new user
|
|
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:
|
|
'202':
|
|
description: OTP code sent to user email.
|
|
/api/v1/account/reset/:
|
|
post:
|
|
operationId: v1_account_reset_create
|
|
description: "\n# \U0001F408 Scenario\n\U0001F6E0️ تنظیم مجدد رمز عبور\n\nکاربر
|
|
پس از تأیید کد بازیابی رمز عبور، میتواند رمز عبور جدید خود را تنظیم کند.
|
|
برای این کار، کاربر باید رمز عبور جدید و تأیید آن را وارد کند.\n\nبعد از ریکاور
|
|
و وریفای\nبه این صفحه برای ریست میآید\nکه باید با همان توکنی که در وریفای
|
|
دریافت کرده است را درخواست کند\n\n(نکته بعد از ریست پسورد توکن ذخیره شده حذف
|
|
شود و کاربر باید با رمز عبور جدیدی که ست کرده است مجددا لاگین را انجام دهد)\n---\n\n##
|
|
\U0001F680 درخواست API\n\n### URL:\n```\nPOST /api/reset-password/\n```\n\n###
|
|
Header:\n| کلید | مقدار |\n|---------------|---------------------------------|\n|
|
|
Content-Type | application/json |\n| Authorization | Bearer
|
|
<توکن احراز هویت> |\n\n### Body:\n```json\n{\n \"password\":
|
|
\"newstrongpassword\",\n \"password_confirmation\": \"newstrongpassword\"\n}\n```\n\n---\n\n##
|
|
\U0001F4CA پاسخها\n\n| کد وضعیت | توضیحات |\n|---------------|-----------------------------------------------------------|\n|
|
|
`200` | موفقیتآمیز - رمز عبور با موفقیت تغییر یافت. |\n|
|
|
`400` | درخواست نادرست - مشکلات مربوط به دادههای ارسالی. |\n|
|
|
`401` | عدم احراز هویت - کاربر وارد نشده است یا توکن نامعتبر است.
|
|
\ |\n| `500` | مشکل موقتی در سرور. |\n\n---\n\n##
|
|
\U0001F4C4 نمونه پاسخ موفقیتآمیز\n\n```json\n{\n \"message\": \"Your password
|
|
has been changed successfully.\"\n}\n```\n\n---\n\n## \U0001F4C4 نمونه پاسخ
|
|
خطا\n\n### رمز عبور و تأیید رمز عبور برابر نیستند:\n```json\n{\n \"status\":
|
|
\"error\",\n \"code\": \"validation_error\",\n \"status_code\": 400,\n
|
|
\ \"message\": \"Passwords do not match.\"\n}\n```\n\n### رمز عبور کوتاهتر
|
|
از 8 کاراکتر است:\n```json\n{\n \"status\": \"error\",\n \"code\": \"validation_error\",\n
|
|
\ \"status_code\": 400,\n \"message\": \"Password must be at least 8
|
|
characters long.\"\n}\n```\n\n### عدم احراز هویت:\n```json\n{\n \"status\":
|
|
\"error\",\n \"code\": \"unauthorized\",\n \"status_code\": 401,\n \"message\":
|
|
\"Authentication credentials were not provided or are invalid.\"\n}\n```\n\n###
|
|
مشکل موقتی در سرور:\n```json\n{\n \"status\": \"error\",\n \"code\":
|
|
\"service_unavailable\",\n \"status_code\": 500,\n \"message\": \"Service
|
|
temporarily unavailable.\"\n}\n```\n\n---\n\n## \U0001F4A1 نکات مهم:\n1. **رمز
|
|
عبور جدید:**\n - باید حداقل 8 کاراکتر باشد و تأیید رمز عبور (`password_confirmation`)
|
|
باید با رمز عبور اصلی یکسان باشد.\n2. **امنیت:**\n - کاربر باید توکن احراز
|
|
هویت معتبر برای تنظیم مجدد رمز عبور ارائه دهد.\n3. **توکن احراز هویت:**\n
|
|
\ - فقط کاربران احراز هویت شده میتوانند رمز عبور خود را تغییر دهند.\n\n---\n\n##
|
|
\U0001F527 توضیحات فنی:\n\n### فرآیند تنظیم مجدد رمز عبور:\n1. کاربر باید
|
|
ابتدا کد بازیابی رمز عبور را تأیید کند.\n2. پس از تأیید موفقیتآمیز، کاربر
|
|
با استفاده از توکن احراز هویت، رمز عبور جدید و تأیید آن را وارد میکند.\n3.
|
|
اگر دادهها معتبر باشند، رمز عبور جدید برای کاربر تنظیم میشود.\n4. اگر دادهها
|
|
نادرست باشند، پیام خطای مناسب به کاربر بازگردانده میشود.\n\n### ولیدیشنها:\n-
|
|
**رمز عبور:**\n - بررسی میشود که رمز عبور حداقل 8 کاراکتر باشد.\n - بررسی
|
|
میشود که رمز عبور و تأیید آن یکسان باشند.\n\n---\n\n## \U0001F4C4 نمونه درخواست:\n\n###
|
|
درخواست کامل:\n```json\n{\n \"password\": \"mynewpassword\",\n \"password_confirmation\":
|
|
\"mynewpassword\"\n}\n```\n\n### پاسخ موفق:\n```json\n{\n \"message\":
|
|
\"Your password has been changed successfully.\"\n}\n```\n"
|
|
summary: Reset user password
|
|
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:
|
|
'200':
|
|
description: Password changed successfully.
|
|
/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
|
|
description: "\n# \U0001F408 Scenario\n\U0001F4C5️ تأیید حساب کاربری با کد تأیید\n\nکاربر
|
|
پس از ثبتنام، باید با استفاده از کد تأییدی که به ایمیل او ارسال شده است،\nحساب
|
|
کاربری خود را تأیید کند. در این مرحله، کاربر ایمیل و کد تأیید خود را ارسال
|
|
میکند.\n\n---\n\n## \U0001F680 درخواست API\n\n### URL:\n```\nPOST /api/verify/\n```\n\n###
|
|
Header:\n| کلید | مقدار |\n|---------------|---------------------------------|\n|
|
|
Content-Type | application/json |\n| Authorization | Optional
|
|
(برای این endpoint نیاز نیست) |\n\n### Body:\n```json\n{\n \"email\": \"johndoe@example.com\",\n
|
|
\ \"code\": \"12345\"\n}\n```\n\n---\n\n## \U0001F4CA پاسخها\n\n| کد وضعیت
|
|
\ | توضیحات |\n|---------------|-----------------------------------------------------------|\n|
|
|
`201` | موفقیتآمیز - کاربر تأیید شد و توکن احراز هویت بازگردانده
|
|
شد. |\n| `400` | درخواست نادرست - مشکلات مربوط به دادههای ارسالی.
|
|
\ |\n| `404` | کاربر یا کد تأیید یافت نشد. |\n|
|
|
`410` | کد تأیید منقضی شده است. |\n|
|
|
`500` | مشکل موقتی در سرور. |\n\n---\n\n##
|
|
\U0001F4C4 نمونه پاسخ موفقیتآمیز\n\n```json\n{\n \"token\": \"abc123def456\",\n
|
|
\ \"user_id\": 1,\n \"phone_number\": \"1234567890\",\n \"email\":
|
|
\"johndoe@example.com\",\n \"fullname\": \"John Doe\",\n \"avatar\":
|
|
null\n}\n```\n\n---\n\n## \U0001F4C4 نمونه پاسخ خطا\n\n### کد تأیید نادرست:\n```json\n{\n
|
|
\ \"status\": \"error\",\n \"code\": \"invalid_verification_code\",\n
|
|
\ \"status_code\": 400,\n \"message\": \"The verification code is invalid.\"\n}\n```\n\n###
|
|
کد تأیید منقضی شده است:\n```json\n{\n \"status\": \"error\",\n \"code\":
|
|
\"expired_code\",\n \"status_code\": 410,\n \"message\": \"The verification
|
|
code has expired.\"\n}\n```\n\n### کاربر یا کد تأیید یافت نشد:\n```json\n{\n
|
|
\ \"status\": \"error\",\n \"code\": \"not_found\",\n \"status_code\":
|
|
404,\n \"message\": \"Verification data not found or expired.\"\n}\n```\n\n###
|
|
مشکل موقتی در سرور:\n```json\n{\n \"status\": \"error\",\n \"code\":
|
|
\"service_unavailable\",\n \"status_code\": 500,\n \"message\": \"Service
|
|
temporarily unavailable.\"\n}\n```\n\n---\n\n## \U0001F4A1 نکات مهم:\n1. **کد
|
|
تأیید:**\n - کد تأیید باید دقیقاً با کدی که به ایمیل کاربر ارسال شده مطابقت
|
|
داشته باشد.\n - کد تأیید فقط برای یک مدت محدود اعتبار دارد.\n2. **خطاها:**\n
|
|
\ - اگر کد تأیید نادرست باشد، پیام مناسب بازگردانده میشود.\n - اگر کد
|
|
تأیید منقضی شده باشد، کاربر باید درخواست کد جدید کند.\n3. **توکن احراز هویت:**\n
|
|
\ - پس از تأیید موفقیتآمیز، توکن احراز هویت به کاربر بازگردانده میشود که
|
|
برای دسترسی به دیگر بخشهای سیستم نیاز است.\n\n---\n\n### ولیدیشنها:\n- **کد
|
|
تأیید:**\n - باید حداکثر 5 کاراکتر باشد.\n - اگر کد معتبر نباشد یا منقضی
|
|
شده باشد، پیام خطای مناسب برگردانده میشود.\n\n---\n\n## \U0001F4C4 نمونه
|
|
درخواست:\n\n### درخواست کامل:\n```json\n{\n \"email\": \"janedoe@example.com\",\n
|
|
\ \"code\": \"67890\"\n}\n```\n\n### پاسخ موفق:\n```json\n{\n \"token\":
|
|
\"xyz987uvw654\",\n \"user_id\": 2,\n \"phone_number\": \"0987654321\",\n
|
|
\ \"email\": \"janedoe@example.com\",\n \"fullname\": \"Jane Doe\",\n
|
|
\ \"avatar\": null\n}\n```\n"
|
|
summary: Verify OTP and activate user
|
|
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':
|
|
description: Returns token and user info.
|
|
/api/v1/account/web/register/:
|
|
post:
|
|
operationId: v1_account_web_register_create
|
|
description: Web registration with password and confirmation.
|
|
summary: Register web user with password
|
|
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:
|
|
'202':
|
|
description: OTP code sent to user email.
|
|
/api/v1/analytics/dashboard/:
|
|
get:
|
|
operationId: v1_analytics_dashboard_retrieve
|
|
description: Aggregates platform KPIs across international institutions, collaborative
|
|
projects, LMS academy, official ticketing, campaigns, and field diplomacy
|
|
reports.
|
|
summary: Executive KPIs & Global Analytics Dashboard
|
|
tags:
|
|
- Executive Analytics & KPIs
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ExecutiveDashboard'
|
|
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:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserMeUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserMeUpdateRequest'
|
|
application/json:
|
|
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 (either 'username' or 'email' +
|
|
password) and returns access & refresh token pair.
|
|
tags:
|
|
- v1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CustomTokenObtainPairRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/CustomTokenObtainPairRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/CustomTokenObtainPairRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
description: No response body
|
|
/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/diplomacy/reports/:
|
|
get:
|
|
operationId: v1_diplomacy_reports_list
|
|
description: Retrieves periodic reports submitted by regional mission representatives
|
|
(Module 6.5).
|
|
summary: List field representative activity reports
|
|
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: query
|
|
name: region_hub
|
|
schema:
|
|
type: string
|
|
description: Filter by regional hub name
|
|
- in: query
|
|
name: status
|
|
schema:
|
|
type: string
|
|
description: Filter by status (submitted, under_review, approved, returned)
|
|
tags:
|
|
- Diplomacy & Field Reports
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedRepresentativeReportListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_diplomacy_reports_create
|
|
description: Submits a field audit, visits summary, and achievements report
|
|
for headquarters review.
|
|
summary: Submit periodic field activity report
|
|
tags:
|
|
- Diplomacy & Field Reports
|
|
requestBody:
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/RepresentativeReportCreateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/RepresentativeReportCreateRequest'
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RepresentativeReportCreateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RepresentativeReportDetail'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
/api/v1/diplomacy/reports/{id}/:
|
|
get:
|
|
operationId: v1_diplomacy_reports_retrieve
|
|
description: Returns full report contents, achievements, challenges, attachment,
|
|
and headquarters feedback.
|
|
summary: Retrieve representative report details
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Diplomacy & Field Reports
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RepresentativeReportDetail'
|
|
description: ''
|
|
'403':
|
|
description: Permission denied
|
|
'404':
|
|
description: Report not found
|
|
/api/v1/diplomacy/reports/{id}/review/:
|
|
patch:
|
|
operationId: v1_diplomacy_reports_review_partial_update
|
|
description: Approves or returns report with headquarters feedback directives
|
|
(Staff/Admin only).
|
|
summary: Review and give directives on field report
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Diplomacy & Field Reports
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedRepresentativeReportReviewRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedRepresentativeReportReviewRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedRepresentativeReportReviewRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RepresentativeReportDetail'
|
|
description: ''
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/donations/campaigns/:
|
|
get:
|
|
operationId: v1_donations_campaigns_list
|
|
description: Retrieves charitable campaigns with target, raised amounts, progress
|
|
percentages, and filters.
|
|
summary: List active donation appeals & campaigns
|
|
parameters:
|
|
- in: query
|
|
name: category
|
|
schema:
|
|
type: string
|
|
description: Filter by campaign category
|
|
- in: query
|
|
name: featured
|
|
schema:
|
|
type: boolean
|
|
description: Filter featured campaigns
|
|
- 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: priority
|
|
schema:
|
|
type: string
|
|
description: Filter by priority (urgent, high, medium)
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
description: Search in campaign title or description
|
|
tags:
|
|
- Donations & Financial Campaigns
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedDonationCampaignListList'
|
|
description: ''
|
|
/api/v1/donations/campaigns/{pk_or_slug}/:
|
|
get:
|
|
operationId: v1_donations_campaigns_retrieve
|
|
description: Returns detailed campaign goal, beneficiary center, progress rate,
|
|
and recent donors.
|
|
summary: Retrieve campaign details & recent contributions
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Donations & Financial Campaigns
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/DonationCampaignDetail'
|
|
description: ''
|
|
'404':
|
|
description: Campaign not found
|
|
/api/v1/donations/campaigns/{pk_or_slug}/contribute/:
|
|
post:
|
|
operationId: v1_donations_campaigns_contribute_create
|
|
description: Processes a donation contribution, persists transaction, and increments
|
|
campaign accumulated funds.
|
|
summary: Make a charitable contribution to campaign
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Donations & Financial Campaigns
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/DonationContributeRequestRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/DonationContributeRequestRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/DonationContributeRequestRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/DonationTransaction'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
'404':
|
|
description: Campaign not found
|
|
/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/forms/:
|
|
get:
|
|
operationId: v1_forms_list
|
|
description: Retrieves available custom dynamic forms and survey workflows.
|
|
summary: List active dynamic forms
|
|
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:
|
|
- Dynamic Forms & Surveys
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedFormDefinitionListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_forms_create
|
|
description: Defines a new custom form, questions, validation rules, and schema
|
|
(Staff/Admin only).
|
|
summary: Create new dynamic form schema
|
|
tags:
|
|
- Dynamic Forms & Surveys
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FormDefinitionDetailRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/FormDefinitionDetailRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/FormDefinitionDetailRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FormDefinitionDetail'
|
|
description: ''
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/forms/{pk_or_slug}/:
|
|
get:
|
|
operationId: v1_forms_retrieve
|
|
description: Retrieves the detailed form definition, instructions, and fields
|
|
JSON schema.
|
|
summary: Get form schema definition
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Dynamic Forms & Surveys
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FormDefinitionDetail'
|
|
description: ''
|
|
'404':
|
|
description: Form not found
|
|
/api/v1/forms/{pk_or_slug}/responses/:
|
|
post:
|
|
operationId: v1_forms_responses_create
|
|
description: Records user answers to custom dynamic form questions with optional
|
|
file attachments.
|
|
summary: Submit dynamic form responses
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Dynamic Forms & Surveys
|
|
requestBody:
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/FormResponseSubmitRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/FormResponseSubmitRequest'
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FormResponseSubmitRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FormResponse'
|
|
description: ''
|
|
'400':
|
|
description: Invalid response data
|
|
/api/v1/forms/{pk_or_slug}/submissions/:
|
|
get:
|
|
operationId: v1_forms_submissions_list
|
|
description: Retrieves submissions for a form. Admins see all submissions; users
|
|
see their own.
|
|
summary: List submitted form responses
|
|
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:
|
|
- Dynamic Forms & Surveys
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedFormResponseList'
|
|
description: ''
|
|
/api/v1/forms/responses/{response_id}/review/:
|
|
patch:
|
|
operationId: v1_forms_responses_review_partial_update
|
|
description: Updates workflow status (under_review, approved, rejected) and
|
|
adds admin notes (Staff only).
|
|
summary: Review and update form response workflow state
|
|
parameters:
|
|
- in: path
|
|
name: response_id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Dynamic Forms & Surveys
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedFormResponseReviewRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedFormResponseReviewRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedFormResponseReviewRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FormResponse'
|
|
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/lms/certificates/{code}/:
|
|
get:
|
|
operationId: v1_lms_certificates_retrieve
|
|
description: Public endpoint for verifying credentials by certificate code or
|
|
UUID. Does not require login.
|
|
summary: Verify digital certificate authenticity (Public / QR)
|
|
parameters:
|
|
- in: path
|
|
name: code
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- LMS - Online Academy
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PublicCertificateVerify'
|
|
description: ''
|
|
'404':
|
|
description: Certificate code not found
|
|
/api/v1/lms/courses/:
|
|
get:
|
|
operationId: v1_lms_courses_list
|
|
description: Retrieves a list of published courses with category, language,
|
|
level, and keyword filtering.
|
|
summary: List online academy courses
|
|
parameters:
|
|
- in: query
|
|
name: category
|
|
schema:
|
|
type: string
|
|
description: Filter by course category (e.g. razavi_teachings, cultural_diplomacy)
|
|
- in: query
|
|
name: featured
|
|
schema:
|
|
type: boolean
|
|
description: Filter only featured courses
|
|
- in: query
|
|
name: language
|
|
schema:
|
|
type: string
|
|
description: Filter by language code (fa, ar, en, ur, fr)
|
|
- in: query
|
|
name: level
|
|
schema:
|
|
type: string
|
|
description: Filter by difficulty level (introductory, intermediate, advanced)
|
|
- 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: Keyword search in title, instructor, or description
|
|
tags:
|
|
- LMS - Online Academy
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedCourseListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_lms_courses_create
|
|
description: Creates a new LMS course. Creator is automatically set as course
|
|
author.
|
|
summary: Create a new course
|
|
tags:
|
|
- LMS - Online Academy
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseCreateUpdateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseDetail'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
'403':
|
|
description: Permission denied
|
|
/api/v1/lms/courses/{pk_or_slug}/:
|
|
get:
|
|
operationId: v1_lms_courses_retrieve
|
|
description: Returns full course information, curriculum modules, lessons list,
|
|
instructor details, and authenticated user enrollment status.
|
|
summary: Retrieve course syllabus and details
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- LMS - Online Academy
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseDetail'
|
|
description: ''
|
|
'404':
|
|
description: Course not found
|
|
patch:
|
|
operationId: v1_lms_courses_partial_update
|
|
description: Partially updates course information. Restricted to instructor
|
|
or platform administrator.
|
|
summary: Update course metadata
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- LMS - Online Academy
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedCourseCreateUpdateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedCourseCreateUpdateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedCourseCreateUpdateRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseDetail'
|
|
description: ''
|
|
'403':
|
|
description: Permission denied
|
|
delete:
|
|
operationId: v1_lms_courses_destroy
|
|
description: Deletes a course and its modules. Restricted to instructor or platform
|
|
administrator.
|
|
summary: Delete a course
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- LMS - Online Academy
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'204':
|
|
description: Course deleted
|
|
/api/v1/lms/courses/{pk_or_slug}/enroll/:
|
|
post:
|
|
operationId: v1_lms_courses_enroll_create
|
|
description: Enrolls the authenticated user into the specified course. Returns
|
|
enrollment status.
|
|
summary: Enroll current user in course
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- LMS - Online Academy
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseDetailRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseDetailRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseDetailRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
description: Already enrolled
|
|
'201':
|
|
description: Successfully enrolled
|
|
'404':
|
|
description: Course not found
|
|
/api/v1/lms/courses/{pk_or_slug}/progress/:
|
|
get:
|
|
operationId: v1_lms_courses_progress_retrieve
|
|
description: Returns completion percentage, completed lessons tally, and certificate
|
|
code if finished.
|
|
summary: Get user progress in course
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- LMS - Online Academy
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CourseProgress'
|
|
description: ''
|
|
'404':
|
|
description: Course or enrollment not found
|
|
/api/v1/lms/lessons/{id}/:
|
|
get:
|
|
operationId: v1_lms_lessons_retrieve
|
|
description: Retrieves lesson video link, markdown content, slides attachment,
|
|
and quiz questions.
|
|
summary: Get lesson details and content
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- LMS - Online Academy
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LessonDetail'
|
|
description: ''
|
|
'404':
|
|
description: Lesson not found
|
|
/api/v1/lms/lessons/{id}/complete/:
|
|
post:
|
|
operationId: v1_lms_lessons_complete_create
|
|
description: Marks a reading or video lesson as complete. Automatically recalculates
|
|
course progress and issues certificate if 100%.
|
|
summary: Mark lesson as complete
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- LMS - Online Academy
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LessonCompleteResponseRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/LessonCompleteResponseRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/LessonCompleteResponseRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LessonCompleteResponse'
|
|
description: ''
|
|
'404':
|
|
description: Lesson not found
|
|
/api/v1/lms/lessons/{id}/submit-quiz/:
|
|
post:
|
|
operationId: v1_lms_lessons_submit_quiz_create
|
|
description: Evaluates user quiz responses. If score >= 70%, marks lesson complete,
|
|
recalculates progress, and issues certificate if 100%.
|
|
summary: Submit quiz answers and evaluate score
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- LMS - Online Academy
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/QuizSubmitRequestRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/QuizSubmitRequestRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/QuizSubmitRequestRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/QuizResult'
|
|
description: ''
|
|
'400':
|
|
description: Invalid submission
|
|
'404':
|
|
description: Lesson not found
|
|
/api/v1/lms/my-certificates/:
|
|
get:
|
|
operationId: v1_lms_my_certificates_list
|
|
description: Retrieves a list of all official digital certificates earned by
|
|
the authenticated user across completed academy courses.
|
|
summary: List user earned digital certificates
|
|
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:
|
|
- LMS - Online Academy
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedDigitalCertificateList'
|
|
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/search/:
|
|
get:
|
|
operationId: v1_search_retrieve
|
|
description: Search simultaneously across institutions, collaborative projects,
|
|
LMS academy courses, CMS articles/news, and international events with relevance
|
|
ranking and facet filtering.
|
|
summary: Unified Multi-Entity Search
|
|
parameters:
|
|
- in: query
|
|
name: limit
|
|
schema:
|
|
type: integer
|
|
description: 'Maximum number of search results to return (default: 20, max:
|
|
100)'
|
|
- in: query
|
|
name: offset
|
|
schema:
|
|
type: integer
|
|
description: 'Pagination offset (default: 0)'
|
|
- in: query
|
|
name: q
|
|
schema:
|
|
type: string
|
|
description: Search query string / keywords (Persian, Arabic, English, Urdu,
|
|
etc.)
|
|
- in: query
|
|
name: type
|
|
schema:
|
|
type: string
|
|
description: 'Comma-separated entity types to include: institution, project,
|
|
course, post, event'
|
|
tags:
|
|
- Unified Search
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UnifiedSearchResponse'
|
|
description: ''
|
|
/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/tickets/:
|
|
get:
|
|
operationId: v1_tickets_list
|
|
description: Retrieves a list of official inquiry tickets submitted by the user
|
|
or their institution.
|
|
summary: List user and institution tickets
|
|
parameters:
|
|
- in: query
|
|
name: category
|
|
schema:
|
|
type: string
|
|
description: Filter by category (cultural_affairs, religious_inquiry, etc.)
|
|
- 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: priority
|
|
schema:
|
|
type: string
|
|
description: Filter by priority (urgent, high, medium, low)
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
description: Search in subject or tracking code
|
|
- in: query
|
|
name: status
|
|
schema:
|
|
type: string
|
|
description: Filter by status (open, in_progress, answered, closed)
|
|
tags:
|
|
- Ticketing & Official Inquiries
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedTicketListList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_tickets_create
|
|
description: Creates a new official inquiry ticket with initial message content
|
|
and optional file attachment.
|
|
summary: Submit an official ticket inquiry
|
|
tags:
|
|
- Ticketing & Official Inquiries
|
|
requestBody:
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketCreateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketCreateRequest'
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketCreateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketDetail'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
/api/v1/tickets/{pk_or_code}/:
|
|
get:
|
|
operationId: v1_tickets_retrieve
|
|
description: Returns full ticket details including all dialogue messages and
|
|
attachments.
|
|
summary: Retrieve ticket thread and responses
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_code
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Ticketing & Official Inquiries
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketDetail'
|
|
description: ''
|
|
'403':
|
|
description: Permission denied
|
|
'404':
|
|
description: Ticket not found
|
|
patch:
|
|
operationId: v1_tickets_partial_update
|
|
description: Updates ticket priority, category, or assigned expert.
|
|
summary: Update ticket status or priority (Staff/Owner)
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_code
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Ticketing & Official Inquiries
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedTicketListRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedTicketListRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedTicketListRequest'
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketDetail'
|
|
description: ''
|
|
/api/v1/tickets/{pk_or_code}/close/:
|
|
post:
|
|
operationId: v1_tickets_close_create
|
|
description: Marks a ticket as closed and records the resolution timestamp.
|
|
summary: Close ticket inquiry
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_code
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Ticketing & Official Inquiries
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketDetailRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketDetailRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketDetailRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketDetail'
|
|
description: ''
|
|
/api/v1/tickets/{pk_or_code}/rate/:
|
|
post:
|
|
operationId: v1_tickets_rate_create
|
|
description: Records 1 to 5 star rating and optional user feedback upon inquiry
|
|
completion.
|
|
summary: Submit satisfaction rating for ticket
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_code
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Ticketing & Official Inquiries
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketRateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketRateRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketRateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketDetail'
|
|
description: ''
|
|
'400':
|
|
description: Validation error
|
|
/api/v1/tickets/{pk_or_code}/reply/:
|
|
post:
|
|
operationId: v1_tickets_reply_create
|
|
description: Appends a new message or official response to an existing ticket
|
|
thread.
|
|
summary: Reply to ticket inquiry
|
|
parameters:
|
|
- in: path
|
|
name: pk_or_code
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Ticketing & Official Inquiries
|
|
requestBody:
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketMessageCreateRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketMessageCreateRequest'
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketMessageCreateRequest'
|
|
required: true
|
|
security:
|
|
- jwtAuth: []
|
|
- tokenAuth: []
|
|
- cookieAuth: []
|
|
- jwtAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TicketMessage'
|
|
description: ''
|
|
'400':
|
|
description: Invalid reply
|
|
'403':
|
|
description: Permission denied
|
|
/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
|
|
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: ''
|
|
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/InstitutionTypeEnum'
|
|
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
|
|
ContentLanguageEnum:
|
|
enum:
|
|
- fa
|
|
- ar
|
|
- en
|
|
- ur
|
|
- fr
|
|
type: string
|
|
description: |-
|
|
* `fa` - Persian
|
|
* `ar` - Arabic
|
|
* `en` - English
|
|
* `ur` - Urdu
|
|
* `fr` - French
|
|
CourseCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Course Title
|
|
maxLength: 255
|
|
category:
|
|
$ref: '#/components/schemas/LMSCourseCategoryEnum'
|
|
language:
|
|
$ref: '#/components/schemas/ContentLanguageEnum'
|
|
level:
|
|
allOf:
|
|
- $ref: '#/components/schemas/LMSCourseLevelEnum'
|
|
title: Difficulty Level
|
|
cover_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
instructor_name:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
instructor_title:
|
|
type: string
|
|
nullable: true
|
|
title: Instructor Title / Specialty
|
|
maxLength: 255
|
|
instructor_avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Partner Institution / Center
|
|
organization_name:
|
|
type: string
|
|
nullable: true
|
|
title: Organization / Academy Name
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
minLength: 1
|
|
title: Course Description & Syllabus Summary
|
|
duration_hours:
|
|
type: number
|
|
format: double
|
|
title: Duration (Hours)
|
|
is_published:
|
|
type: boolean
|
|
is_featured:
|
|
type: boolean
|
|
required:
|
|
- description
|
|
- instructor_name
|
|
- title
|
|
CourseDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Course Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
category:
|
|
$ref: '#/components/schemas/LMSCourseCategoryEnum'
|
|
language:
|
|
$ref: '#/components/schemas/ContentLanguageEnum'
|
|
level:
|
|
allOf:
|
|
- $ref: '#/components/schemas/LMSCourseLevelEnum'
|
|
title: Difficulty Level
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
instructor_name:
|
|
type: string
|
|
maxLength: 255
|
|
instructor_title:
|
|
type: string
|
|
nullable: true
|
|
title: Instructor Title / Specialty
|
|
maxLength: 255
|
|
instructor_avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Partner Institution / Center
|
|
organization_name:
|
|
type: string
|
|
nullable: true
|
|
title: Organization / Academy Name
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
title: Course Description & Syllabus Summary
|
|
duration_hours:
|
|
type: number
|
|
format: double
|
|
title: Duration (Hours)
|
|
rating:
|
|
type: number
|
|
format: double
|
|
title: Average Rating
|
|
reviews_count:
|
|
type: integer
|
|
is_published:
|
|
type: boolean
|
|
is_featured:
|
|
type: boolean
|
|
modules:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/CourseModule'
|
|
readOnly: true
|
|
total_lessons:
|
|
type: integer
|
|
readOnly: true
|
|
total_students:
|
|
type: integer
|
|
readOnly: true
|
|
is_enrolled:
|
|
type: boolean
|
|
readOnly: true
|
|
progress_percentage:
|
|
type: integer
|
|
readOnly: true
|
|
certificate_code:
|
|
type: string
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- certificate_code
|
|
- created_at
|
|
- description
|
|
- id
|
|
- instructor_name
|
|
- is_enrolled
|
|
- modules
|
|
- progress_percentage
|
|
- title
|
|
- total_lessons
|
|
- total_students
|
|
- updated_at
|
|
CourseDetailRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Course Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
category:
|
|
$ref: '#/components/schemas/LMSCourseCategoryEnum'
|
|
language:
|
|
$ref: '#/components/schemas/ContentLanguageEnum'
|
|
level:
|
|
allOf:
|
|
- $ref: '#/components/schemas/LMSCourseLevelEnum'
|
|
title: Difficulty Level
|
|
cover_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
instructor_name:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
instructor_title:
|
|
type: string
|
|
nullable: true
|
|
title: Instructor Title / Specialty
|
|
maxLength: 255
|
|
instructor_avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Partner Institution / Center
|
|
organization_name:
|
|
type: string
|
|
nullable: true
|
|
title: Organization / Academy Name
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
minLength: 1
|
|
title: Course Description & Syllabus Summary
|
|
duration_hours:
|
|
type: number
|
|
format: double
|
|
title: Duration (Hours)
|
|
rating:
|
|
type: number
|
|
format: double
|
|
title: Average Rating
|
|
reviews_count:
|
|
type: integer
|
|
is_published:
|
|
type: boolean
|
|
is_featured:
|
|
type: boolean
|
|
required:
|
|
- description
|
|
- instructor_name
|
|
- title
|
|
CourseList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Course Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
category:
|
|
$ref: '#/components/schemas/LMSCourseCategoryEnum'
|
|
language:
|
|
$ref: '#/components/schemas/ContentLanguageEnum'
|
|
level:
|
|
allOf:
|
|
- $ref: '#/components/schemas/LMSCourseLevelEnum'
|
|
title: Difficulty Level
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
instructor_name:
|
|
type: string
|
|
maxLength: 255
|
|
instructor_title:
|
|
type: string
|
|
nullable: true
|
|
title: Instructor Title / Specialty
|
|
maxLength: 255
|
|
instructor_avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
organization_name:
|
|
type: string
|
|
nullable: true
|
|
title: Organization / Academy Name
|
|
maxLength: 255
|
|
duration_hours:
|
|
type: number
|
|
format: double
|
|
title: Duration (Hours)
|
|
rating:
|
|
type: number
|
|
format: double
|
|
title: Average Rating
|
|
reviews_count:
|
|
type: integer
|
|
is_featured:
|
|
type: boolean
|
|
total_lessons:
|
|
type: integer
|
|
readOnly: true
|
|
total_students:
|
|
type: integer
|
|
readOnly: true
|
|
is_enrolled:
|
|
type: boolean
|
|
readOnly: true
|
|
progress_percentage:
|
|
type: integer
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- id
|
|
- instructor_name
|
|
- is_enrolled
|
|
- progress_percentage
|
|
- title
|
|
- total_lessons
|
|
- total_students
|
|
CourseModule:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Module Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Module Description
|
|
order:
|
|
type: integer
|
|
title: Display Order
|
|
lessons:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/LessonList'
|
|
readOnly: true
|
|
required:
|
|
- id
|
|
- lessons
|
|
- title
|
|
CourseModuleRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Module Title
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Module Description
|
|
order:
|
|
type: integer
|
|
title: Display Order
|
|
required:
|
|
- title
|
|
CourseProgress:
|
|
type: object
|
|
properties:
|
|
course_id:
|
|
type: integer
|
|
course_title:
|
|
type: string
|
|
progress_percentage:
|
|
type: integer
|
|
completed_lessons_count:
|
|
type: integer
|
|
total_lessons_count:
|
|
type: integer
|
|
is_completed:
|
|
type: boolean
|
|
certificate_code:
|
|
type: string
|
|
nullable: true
|
|
required:
|
|
- certificate_code
|
|
- completed_lessons_count
|
|
- course_id
|
|
- course_title
|
|
- is_completed
|
|
- progress_percentage
|
|
- total_lessons_count
|
|
CustomTokenObtainPairRequest:
|
|
type: object
|
|
description: JWT token obtain serializer that accepts either 'username' or 'email'
|
|
as the credential.
|
|
properties:
|
|
email:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
username:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
required:
|
|
- password
|
|
DeviceOsEnum:
|
|
enum:
|
|
- android
|
|
- apple
|
|
- web
|
|
type: string
|
|
description: |-
|
|
* `android` - Android
|
|
* `apple` - Apple iOS
|
|
* `web` - Web
|
|
DigitalCertificate:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
certificate_code:
|
|
type: string
|
|
title: Verification Code
|
|
description: e.g. CERT-RAZAVI-2026-AB12CD
|
|
maxLength: 100
|
|
uuid:
|
|
type: string
|
|
format: uuid
|
|
readOnly: true
|
|
title: Unique UUID
|
|
recipient_name:
|
|
type: string
|
|
readOnly: true
|
|
course_title:
|
|
type: string
|
|
readOnly: true
|
|
course_slug:
|
|
type: string
|
|
readOnly: true
|
|
organization:
|
|
type: string
|
|
readOnly: true
|
|
issue_date:
|
|
type: string
|
|
format: date
|
|
final_score:
|
|
type: number
|
|
format: double
|
|
title: Final Score (%)
|
|
certificate_file:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Certificate PDF Document
|
|
is_revoked:
|
|
type: boolean
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- certificate_code
|
|
- course_slug
|
|
- course_title
|
|
- created_at
|
|
- id
|
|
- organization
|
|
- recipient_name
|
|
- uuid
|
|
DiplomacyAnalytics:
|
|
type: object
|
|
properties:
|
|
total_reports_submitted:
|
|
type: integer
|
|
approved_reports_count:
|
|
type: integer
|
|
total_centers_visited:
|
|
type: integer
|
|
required:
|
|
- approved_reports_count
|
|
- total_centers_visited
|
|
- total_reports_submitted
|
|
DiplomacyReportStatusEnum:
|
|
enum:
|
|
- submitted
|
|
- under_review
|
|
- approved
|
|
- returned
|
|
type: string
|
|
description: |-
|
|
* `submitted` - Submitted
|
|
* `under_review` - Under Review
|
|
* `approved` - Approved by Headquarters
|
|
* `returned` - Returned for Revision
|
|
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
|
|
DonationCampaignCategoryEnum:
|
|
enum:
|
|
- mosque_construction
|
|
- humanitarian_relief
|
|
- pilgrim_support
|
|
- cultural_publications
|
|
- educational_scholarships
|
|
- general
|
|
type: string
|
|
description: |-
|
|
* `mosque_construction` - Mosque & Center Construction / Renovation
|
|
* `humanitarian_relief` - Humanitarian & Disaster Relief
|
|
* `pilgrim_support` - Imam Reza (AS) Pilgrim Services
|
|
* `cultural_publications` - Quran & Islamic Publications Translation
|
|
* `educational_scholarships` - Seminary & Academic Scholarships
|
|
* `general` - General Waqf & Endowment
|
|
DonationCampaignDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Campaign Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
description:
|
|
type: string
|
|
title: Campaign Description & Objectives
|
|
target_amount:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
|
|
raised_amount:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
|
|
title: Accumulated Raised Amount
|
|
currency:
|
|
type: string
|
|
title: Currency (e.g. USD, EUR, IRR, AED)
|
|
maxLength: 10
|
|
category:
|
|
$ref: '#/components/schemas/DonationCampaignCategoryEnum'
|
|
priority:
|
|
$ref: '#/components/schemas/DonationCampaignPriorityEnum'
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Campaign Image
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Beneficiary Institution / Mosque
|
|
institution_name:
|
|
type: string
|
|
readOnly: true
|
|
organization_name:
|
|
type: string
|
|
nullable: true
|
|
title: Managing Foundation Name
|
|
maxLength: 255
|
|
deadline:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
title: Campaign Deadline
|
|
progress_percentage:
|
|
type: integer
|
|
readOnly: true
|
|
donors_count:
|
|
type: integer
|
|
readOnly: true
|
|
is_featured:
|
|
type: boolean
|
|
recent_donations:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/DonationTransaction'
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- description
|
|
- donors_count
|
|
- id
|
|
- institution_name
|
|
- progress_percentage
|
|
- recent_donations
|
|
- target_amount
|
|
- title
|
|
- updated_at
|
|
DonationCampaignList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Campaign Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
description:
|
|
type: string
|
|
title: Campaign Description & Objectives
|
|
target_amount:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
|
|
raised_amount:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
|
|
title: Accumulated Raised Amount
|
|
currency:
|
|
type: string
|
|
title: Currency (e.g. USD, EUR, IRR, AED)
|
|
maxLength: 10
|
|
category:
|
|
$ref: '#/components/schemas/DonationCampaignCategoryEnum'
|
|
priority:
|
|
$ref: '#/components/schemas/DonationCampaignPriorityEnum'
|
|
cover_image:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Campaign Image
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Beneficiary Institution / Mosque
|
|
institution_name:
|
|
type: string
|
|
readOnly: true
|
|
organization_name:
|
|
type: string
|
|
nullable: true
|
|
title: Managing Foundation Name
|
|
maxLength: 255
|
|
deadline:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
title: Campaign Deadline
|
|
progress_percentage:
|
|
type: integer
|
|
readOnly: true
|
|
donors_count:
|
|
type: integer
|
|
readOnly: true
|
|
is_featured:
|
|
type: boolean
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- description
|
|
- donors_count
|
|
- id
|
|
- institution_name
|
|
- progress_percentage
|
|
- target_amount
|
|
- title
|
|
DonationCampaignPriorityEnum:
|
|
enum:
|
|
- urgent
|
|
- high
|
|
- medium
|
|
type: string
|
|
description: |-
|
|
* `urgent` - Urgent Appeal
|
|
* `high` - High Priority
|
|
* `medium` - Medium Priority
|
|
DonationContributeRequestRequest:
|
|
type: object
|
|
properties:
|
|
amount:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,10}(?:\.\d{0,2})?$
|
|
donor_name:
|
|
type: string
|
|
default: Anonymous Donor
|
|
donor_email:
|
|
nullable: true
|
|
oneOf:
|
|
- type: string
|
|
format: email
|
|
- type: string
|
|
maxLength: 0
|
|
required:
|
|
- amount
|
|
DonationTransaction:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
transaction_reference:
|
|
type: string
|
|
readOnly: true
|
|
description: e.g. DON-RAZAVI-2026-XYZ123
|
|
campaign:
|
|
type: integer
|
|
campaign_title:
|
|
type: string
|
|
readOnly: true
|
|
donor_name:
|
|
type: string
|
|
title: Donor Display Name
|
|
maxLength: 255
|
|
amount:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,10}(?:\.\d{0,2})?$
|
|
title: Donation Amount
|
|
currency:
|
|
type: string
|
|
maxLength: 10
|
|
payment_status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/PaymentStatusEnum'
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
title: Donated At
|
|
required:
|
|
- amount
|
|
- campaign
|
|
- campaign_title
|
|
- created_at
|
|
- id
|
|
- payment_status
|
|
- transaction_reference
|
|
DonationsAnalytics:
|
|
type: object
|
|
properties:
|
|
active_campaigns_count:
|
|
type: integer
|
|
total_funds_raised_usd:
|
|
type: number
|
|
format: double
|
|
required:
|
|
- active_campaigns_count
|
|
- total_funds_raised_usd
|
|
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/EventCategoryEnum'
|
|
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
|
|
EventCategoryEnum:
|
|
enum:
|
|
- religious
|
|
- educational
|
|
- cultural
|
|
- counseling
|
|
- conference
|
|
- workshop
|
|
type: string
|
|
description: |-
|
|
* `religious` - Religious
|
|
* `educational` - Educational
|
|
* `cultural` - Cultural
|
|
* `counseling` - Counseling
|
|
* `conference` - Conference
|
|
* `workshop` - Workshop
|
|
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/EventCategoryEnum'
|
|
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/ContentLanguageEnum'
|
|
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/EventCategoryEnum'
|
|
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/ContentLanguageEnum'
|
|
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/EventCategoryEnum'
|
|
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/ContentLanguageEnum'
|
|
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/EventCategoryEnum'
|
|
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/ContentLanguageEnum'
|
|
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/InstitutionTypeEnum'
|
|
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
|
|
ExchangeTokenRequest:
|
|
type: object
|
|
properties:
|
|
temp_token:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 128
|
|
required:
|
|
- temp_token
|
|
ExecutiveDashboard:
|
|
type: object
|
|
properties:
|
|
institutions:
|
|
$ref: '#/components/schemas/InstitutionsAnalytics'
|
|
projects:
|
|
$ref: '#/components/schemas/ProjectsAnalytics'
|
|
lms:
|
|
$ref: '#/components/schemas/LMSAnalytics'
|
|
ticketing:
|
|
$ref: '#/components/schemas/TicketingAnalytics'
|
|
donations:
|
|
$ref: '#/components/schemas/DonationsAnalytics'
|
|
diplomacy:
|
|
$ref: '#/components/schemas/DiplomacyAnalytics'
|
|
required:
|
|
- diplomacy
|
|
- donations
|
|
- institutions
|
|
- lms
|
|
- projects
|
|
- ticketing
|
|
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
|
|
FormDefinitionDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Form Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Instructions & Description
|
|
schema:
|
|
title: Form Fields Schema (JSON)
|
|
description: 'Array of field definitions: [{"id": "applicant_name", "label":
|
|
"Full Name", "type": "text", "required": true}]'
|
|
is_active:
|
|
type: boolean
|
|
is_public:
|
|
type: boolean
|
|
title: Is Publicly Accessible (No Login Required)
|
|
target_role:
|
|
type: string
|
|
nullable: true
|
|
title: Target User Role Restriction
|
|
maxLength: 50
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- id
|
|
- title
|
|
- updated_at
|
|
FormDefinitionDetailRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Form Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Instructions & Description
|
|
schema:
|
|
title: Form Fields Schema (JSON)
|
|
description: 'Array of field definitions: [{"id": "applicant_name", "label":
|
|
"Full Name", "type": "text", "required": true}]'
|
|
is_active:
|
|
type: boolean
|
|
is_public:
|
|
type: boolean
|
|
title: Is Publicly Accessible (No Login Required)
|
|
target_role:
|
|
type: string
|
|
nullable: true
|
|
title: Target User Role Restriction
|
|
maxLength: 50
|
|
required:
|
|
- title
|
|
FormDefinitionList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Form Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
title: Slug / URL Identifier
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
title: Instructions & Description
|
|
is_active:
|
|
type: boolean
|
|
is_public:
|
|
type: boolean
|
|
title: Is Publicly Accessible (No Login Required)
|
|
target_role:
|
|
type: string
|
|
nullable: true
|
|
title: Target User Role Restriction
|
|
maxLength: 50
|
|
responses_count:
|
|
type: integer
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- id
|
|
- responses_count
|
|
- title
|
|
FormResponse:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
form:
|
|
type: integer
|
|
form_title:
|
|
type: string
|
|
readOnly: true
|
|
user:
|
|
type: integer
|
|
readOnly: true
|
|
nullable: true
|
|
title: Submitter
|
|
submitter_name:
|
|
type: string
|
|
readOnly: true
|
|
answers:
|
|
title: Submitted Form Answers
|
|
attachment:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Uploaded Attachment
|
|
workflow_status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/WorkflowStatusEnum'
|
|
readOnly: true
|
|
admin_notes:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Reviewer / Admin Notes
|
|
reviewed_by:
|
|
type: integer
|
|
readOnly: true
|
|
nullable: true
|
|
reviewer_name:
|
|
type: string
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
title: Submitted At
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- admin_notes
|
|
- created_at
|
|
- form
|
|
- form_title
|
|
- id
|
|
- reviewed_by
|
|
- reviewer_name
|
|
- submitter_name
|
|
- updated_at
|
|
- user
|
|
- workflow_status
|
|
FormResponseSubmitRequest:
|
|
type: object
|
|
properties:
|
|
answers:
|
|
description: Dictionary of question IDs and answers
|
|
attachment:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
required:
|
|
- answers
|
|
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/InstitutionTypeEnum'
|
|
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/InstitutionTypeEnum'
|
|
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/InstitutionTypeEnum'
|
|
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/InstitutionTypeEnum'
|
|
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
|
|
InstitutionTypeEnum:
|
|
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
|
|
InstitutionsAnalytics:
|
|
type: object
|
|
properties:
|
|
total_institutions:
|
|
type: integer
|
|
verified_institutions:
|
|
type: integer
|
|
countries_count:
|
|
type: integer
|
|
by_type:
|
|
type: object
|
|
additionalProperties:
|
|
type: integer
|
|
top_countries:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: {}
|
|
required:
|
|
- by_type
|
|
- countries_count
|
|
- top_countries
|
|
- total_institutions
|
|
- verified_institutions
|
|
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/TicketPriorityEnum'
|
|
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/TicketPriorityEnum'
|
|
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
|
|
LMSAnalytics:
|
|
type: object
|
|
properties:
|
|
total_courses:
|
|
type: integer
|
|
total_enrollments:
|
|
type: integer
|
|
total_certificates_issued:
|
|
type: integer
|
|
required:
|
|
- total_certificates_issued
|
|
- total_courses
|
|
- total_enrollments
|
|
LMSCourseCategoryEnum:
|
|
enum:
|
|
- razavi_teachings
|
|
- cultural_diplomacy
|
|
- center_management
|
|
- international_media
|
|
- specialized_languages
|
|
- general
|
|
type: string
|
|
description: |-
|
|
* `razavi_teachings` - Razavi Teachings & Lifestyle
|
|
* `cultural_diplomacy` - Cultural Diplomacy & Interfaith
|
|
* `center_management` - Center & Mosque Management
|
|
* `international_media` - International Media & Content
|
|
* `specialized_languages` - Specialized Languages & Translation
|
|
* `general` - General Religious Studies
|
|
LMSCourseLevelEnum:
|
|
enum:
|
|
- introductory
|
|
- intermediate
|
|
- advanced
|
|
type: string
|
|
description: |-
|
|
* `introductory` - Introductory
|
|
* `intermediate` - Intermediate
|
|
* `advanced` - Advanced
|
|
LMSLessonTypeEnum:
|
|
enum:
|
|
- video
|
|
- reading
|
|
- quiz
|
|
- assignment
|
|
type: string
|
|
description: |-
|
|
* `video` - Video Lesson
|
|
* `reading` - Reading & Text
|
|
* `quiz` - Interactive Quiz
|
|
* `assignment` - Practical Assignment
|
|
LessonCompleteResponse:
|
|
type: object
|
|
properties:
|
|
message:
|
|
type: string
|
|
lesson_id:
|
|
type: integer
|
|
is_completed:
|
|
type: boolean
|
|
course_progress_percentage:
|
|
type: integer
|
|
certificate_code:
|
|
type: string
|
|
nullable: true
|
|
required:
|
|
- course_progress_percentage
|
|
- is_completed
|
|
- lesson_id
|
|
- message
|
|
LessonCompleteResponseRequest:
|
|
type: object
|
|
properties:
|
|
message:
|
|
type: string
|
|
minLength: 1
|
|
lesson_id:
|
|
type: integer
|
|
is_completed:
|
|
type: boolean
|
|
course_progress_percentage:
|
|
type: integer
|
|
certificate_code:
|
|
type: string
|
|
nullable: true
|
|
minLength: 1
|
|
required:
|
|
- course_progress_percentage
|
|
- is_completed
|
|
- lesson_id
|
|
- message
|
|
LessonDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Lesson Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
lesson_type:
|
|
$ref: '#/components/schemas/LMSLessonTypeEnum'
|
|
duration_minutes:
|
|
type: integer
|
|
title: Duration (Minutes)
|
|
video_url:
|
|
nullable: true
|
|
title: Video URL (YouTube, Vimeo, HLS, MP4)
|
|
oneOf:
|
|
- type: string
|
|
format: uri
|
|
maxLength: 500
|
|
- type: string
|
|
maxLength: 0
|
|
content:
|
|
type: string
|
|
nullable: true
|
|
title: Lesson Content / Notes (Markdown)
|
|
slides_attachment:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Slides / PDF Handout
|
|
order:
|
|
type: integer
|
|
title: Display Order
|
|
is_preview:
|
|
type: boolean
|
|
title: Is Free Preview (Public)
|
|
quiz_questions:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/QuizQuestionStudent'
|
|
readOnly: true
|
|
is_completed:
|
|
type: boolean
|
|
readOnly: true
|
|
quiz_score:
|
|
type: number
|
|
format: float
|
|
readOnly: true
|
|
required:
|
|
- id
|
|
- is_completed
|
|
- quiz_questions
|
|
- quiz_score
|
|
- title
|
|
LessonList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Lesson Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
lesson_type:
|
|
$ref: '#/components/schemas/LMSLessonTypeEnum'
|
|
duration_minutes:
|
|
type: integer
|
|
title: Duration (Minutes)
|
|
order:
|
|
type: integer
|
|
title: Display Order
|
|
is_preview:
|
|
type: boolean
|
|
title: Is Free Preview (Public)
|
|
is_completed:
|
|
type: boolean
|
|
readOnly: true
|
|
required:
|
|
- id
|
|
- is_completed
|
|
- title
|
|
LessonListRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Lesson Title
|
|
maxLength: 255
|
|
slug:
|
|
nullable: true
|
|
oneOf:
|
|
- type: string
|
|
pattern: ^[-\w]+$
|
|
maxLength: 280
|
|
- type: string
|
|
maxLength: 0
|
|
lesson_type:
|
|
$ref: '#/components/schemas/LMSLessonTypeEnum'
|
|
duration_minutes:
|
|
type: integer
|
|
title: Duration (Minutes)
|
|
order:
|
|
type: integer
|
|
title: Display Order
|
|
is_preview:
|
|
type: boolean
|
|
title: Is Free Preview (Public)
|
|
required:
|
|
- 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'
|
|
PaginatedCourseListList:
|
|
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/CourseList'
|
|
PaginatedDigitalCertificateList:
|
|
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/DigitalCertificate'
|
|
PaginatedDonationCampaignListList:
|
|
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/DonationCampaignList'
|
|
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'
|
|
PaginatedFormDefinitionListList:
|
|
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/FormDefinitionList'
|
|
PaginatedFormResponseList:
|
|
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/FormResponse'
|
|
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'
|
|
PaginatedRepresentativeReportListList:
|
|
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/RepresentativeReportList'
|
|
PaginatedTicketListList:
|
|
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/TicketList'
|
|
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.
|
|
PatchedCourseCreateUpdateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Course Title
|
|
maxLength: 255
|
|
category:
|
|
$ref: '#/components/schemas/LMSCourseCategoryEnum'
|
|
language:
|
|
$ref: '#/components/schemas/ContentLanguageEnum'
|
|
level:
|
|
allOf:
|
|
- $ref: '#/components/schemas/LMSCourseLevelEnum'
|
|
title: Difficulty Level
|
|
cover_image:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
instructor_name:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
instructor_title:
|
|
type: string
|
|
nullable: true
|
|
title: Instructor Title / Specialty
|
|
maxLength: 255
|
|
instructor_avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Partner Institution / Center
|
|
organization_name:
|
|
type: string
|
|
nullable: true
|
|
title: Organization / Academy Name
|
|
maxLength: 255
|
|
description:
|
|
type: string
|
|
minLength: 1
|
|
title: Course Description & Syllabus Summary
|
|
duration_hours:
|
|
type: number
|
|
format: double
|
|
title: Duration (Hours)
|
|
is_published:
|
|
type: boolean
|
|
is_featured:
|
|
type: boolean
|
|
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/EventCategoryEnum'
|
|
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/ContentLanguageEnum'
|
|
tags: {}
|
|
PatchedFormResponseReviewRequest:
|
|
type: object
|
|
properties:
|
|
workflow_status:
|
|
$ref: '#/components/schemas/WorkflowStatusEnum'
|
|
admin_notes:
|
|
type: string
|
|
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/InstitutionTypeEnum'
|
|
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/TicketPriorityEnum'
|
|
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/ContentLanguageEnum'
|
|
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
|
|
PatchedRepresentativeReportReviewRequest:
|
|
type: object
|
|
properties:
|
|
status:
|
|
$ref: '#/components/schemas/DiplomacyReportStatusEnum'
|
|
feedback_notes:
|
|
type: string
|
|
PatchedTicketListRequest:
|
|
type: object
|
|
properties:
|
|
tracking_code:
|
|
type: string
|
|
description: e.g. TK-RAZAVI-2026-AB12CD
|
|
maxLength: 100
|
|
subject:
|
|
type: string
|
|
minLength: 1
|
|
title: Subject / Title
|
|
maxLength: 255
|
|
category:
|
|
$ref: '#/components/schemas/TicketCategoryEnum'
|
|
priority:
|
|
$ref: '#/components/schemas/TicketPriorityEnum'
|
|
status:
|
|
$ref: '#/components/schemas/TicketStatusEnum'
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Affiliated Institution
|
|
satisfaction_rating:
|
|
type: integer
|
|
nullable: true
|
|
title: Satisfaction Rating (1-5 Stars)
|
|
closed_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
PatchedUserMeUpdateRequest:
|
|
type: object
|
|
properties:
|
|
fullname:
|
|
type: string
|
|
nullable: true
|
|
title: Full Name
|
|
description: Full name of the user.
|
|
maxLength: 255
|
|
first_name:
|
|
type: string
|
|
last_name:
|
|
type: string
|
|
name:
|
|
type: string
|
|
writeOnly: true
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
phone:
|
|
type: string
|
|
writeOnly: true
|
|
avatar:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
bio:
|
|
type: string
|
|
nullable: true
|
|
languages: {}
|
|
preferred_language:
|
|
type: string
|
|
writeOnly: true
|
|
skills: {}
|
|
expertise:
|
|
type: array
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
writeOnly: true
|
|
title:
|
|
type: string
|
|
rank:
|
|
type: string
|
|
institution:
|
|
type: string
|
|
writeOnly: true
|
|
institution_name:
|
|
type: string
|
|
website:
|
|
type: string
|
|
address:
|
|
type: string
|
|
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.
|
|
first_name:
|
|
type: string
|
|
last_name:
|
|
type: string
|
|
fullname:
|
|
type: string
|
|
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
|
|
PaymentStatusEnum:
|
|
enum:
|
|
- completed
|
|
- pending
|
|
- failed
|
|
type: string
|
|
description: |-
|
|
* `completed` - Completed
|
|
* `pending` - Pending
|
|
* `failed` - Failed
|
|
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/ContentLanguageEnum'
|
|
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/ContentLanguageEnum'
|
|
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/InstitutionTypeEnum'
|
|
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/ContentLanguageEnum'
|
|
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
|
|
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/InstitutionTypeEnum'
|
|
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
|
|
ProjectsAnalytics:
|
|
type: object
|
|
properties:
|
|
total_projects:
|
|
type: integer
|
|
active_projects:
|
|
type: integer
|
|
completed_projects:
|
|
type: integer
|
|
required:
|
|
- active_projects
|
|
- completed_projects
|
|
- total_projects
|
|
PublicCertificateVerify:
|
|
type: object
|
|
properties:
|
|
certificate_code:
|
|
type: string
|
|
uuid:
|
|
type: string
|
|
format: uuid
|
|
recipient_name:
|
|
type: string
|
|
course_title:
|
|
type: string
|
|
organization:
|
|
type: string
|
|
nullable: true
|
|
issue_date:
|
|
type: string
|
|
format: date
|
|
final_score:
|
|
type: number
|
|
format: double
|
|
is_valid:
|
|
type: boolean
|
|
required:
|
|
- certificate_code
|
|
- course_title
|
|
- final_score
|
|
- is_valid
|
|
- issue_date
|
|
- organization
|
|
- recipient_name
|
|
- uuid
|
|
QuizQuestionResultItem:
|
|
type: object
|
|
properties:
|
|
question_id:
|
|
type: integer
|
|
is_correct:
|
|
type: boolean
|
|
selected_option:
|
|
type: integer
|
|
correct_option:
|
|
type: integer
|
|
explanation:
|
|
type: string
|
|
nullable: true
|
|
required:
|
|
- correct_option
|
|
- explanation
|
|
- is_correct
|
|
- question_id
|
|
- selected_option
|
|
QuizQuestionStudent:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
question_text:
|
|
type: string
|
|
options:
|
|
title: Options Array
|
|
description: 'List of multiple-choice strings: ["Option A", "Option B",
|
|
"Option C", "Option D"]'
|
|
order:
|
|
type: integer
|
|
title: Display Order
|
|
required:
|
|
- id
|
|
- question_text
|
|
QuizResult:
|
|
type: object
|
|
properties:
|
|
score:
|
|
type: number
|
|
format: double
|
|
description: Percentage score achieved (0-100)
|
|
passed:
|
|
type: boolean
|
|
description: True if score >= 70%
|
|
total_questions:
|
|
type: integer
|
|
correct_count:
|
|
type: integer
|
|
question_results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/QuizQuestionResultItem'
|
|
is_lesson_completed:
|
|
type: boolean
|
|
course_progress_percentage:
|
|
type: integer
|
|
certificate_code:
|
|
type: string
|
|
nullable: true
|
|
required:
|
|
- correct_count
|
|
- course_progress_percentage
|
|
- is_lesson_completed
|
|
- passed
|
|
- question_results
|
|
- score
|
|
- total_questions
|
|
QuizSubmitRequestRequest:
|
|
type: object
|
|
properties:
|
|
answers:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/SingleQuizAnswerRequest'
|
|
required:
|
|
- answers
|
|
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
|
|
first_name:
|
|
type: string
|
|
maxLength: 150
|
|
last_name:
|
|
type: string
|
|
maxLength: 150
|
|
fullname:
|
|
type: string
|
|
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
|
|
- password
|
|
RegisterResponse:
|
|
type: object
|
|
properties:
|
|
user:
|
|
$ref: '#/components/schemas/UserMe'
|
|
access:
|
|
type: string
|
|
refresh:
|
|
type: string
|
|
message:
|
|
type: string
|
|
required:
|
|
- access
|
|
- message
|
|
- refresh
|
|
- user
|
|
RepresentativeReportCreateRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
title: Report Title
|
|
maxLength: 255
|
|
region_hub:
|
|
type: string
|
|
minLength: 1
|
|
title: Regional Hub / Mission Zone
|
|
description: e.g. East Africa Regional Hub, South Asia Bureau, European
|
|
Cultural Mission
|
|
maxLength: 150
|
|
period:
|
|
type: string
|
|
minLength: 1
|
|
title: Reporting Period
|
|
description: e.g. Q1 2026, Muharram 1448 AH, March 2026
|
|
maxLength: 100
|
|
activities_summary:
|
|
type: string
|
|
minLength: 1
|
|
title: Summary of Activities & Negotiations
|
|
centers_visited_count:
|
|
type: integer
|
|
title: Number of Mosques / Centers Visited
|
|
key_achievements:
|
|
type: string
|
|
nullable: true
|
|
title: Key Achievements & Milestones
|
|
challenges_and_needs:
|
|
type: string
|
|
nullable: true
|
|
title: Challenges, Risks & Logistical Needs
|
|
attachment:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
title: Official Report Document (PDF / Word)
|
|
required:
|
|
- activities_summary
|
|
- period
|
|
- region_hub
|
|
- title
|
|
RepresentativeReportDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Report Title
|
|
maxLength: 255
|
|
representative:
|
|
type: integer
|
|
readOnly: true
|
|
title: Field Representative
|
|
representative_name:
|
|
type: string
|
|
readOnly: true
|
|
region_hub:
|
|
type: string
|
|
title: Regional Hub / Mission Zone
|
|
description: e.g. East Africa Regional Hub, South Asia Bureau, European
|
|
Cultural Mission
|
|
maxLength: 150
|
|
period:
|
|
type: string
|
|
title: Reporting Period
|
|
description: e.g. Q1 2026, Muharram 1448 AH, March 2026
|
|
maxLength: 100
|
|
activities_summary:
|
|
type: string
|
|
title: Summary of Activities & Negotiations
|
|
centers_visited_count:
|
|
type: integer
|
|
title: Number of Mosques / Centers Visited
|
|
key_achievements:
|
|
type: string
|
|
nullable: true
|
|
title: Key Achievements & Milestones
|
|
challenges_and_needs:
|
|
type: string
|
|
nullable: true
|
|
title: Challenges, Risks & Logistical Needs
|
|
attachment:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
title: Official Report Document (PDF / Word)
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/DiplomacyReportStatusEnum'
|
|
readOnly: true
|
|
title: Review Status
|
|
feedback_notes:
|
|
type: string
|
|
readOnly: true
|
|
nullable: true
|
|
title: Headquarters Feedback & Directives
|
|
reviewed_by:
|
|
type: integer
|
|
readOnly: true
|
|
nullable: true
|
|
title: Reviewed By Officer
|
|
reviewer_name:
|
|
type: string
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
title: Submitted At
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- activities_summary
|
|
- created_at
|
|
- feedback_notes
|
|
- id
|
|
- period
|
|
- region_hub
|
|
- representative
|
|
- representative_name
|
|
- reviewed_by
|
|
- reviewer_name
|
|
- status
|
|
- title
|
|
- updated_at
|
|
RepresentativeReportList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
title: Report Title
|
|
maxLength: 255
|
|
representative_name:
|
|
type: string
|
|
readOnly: true
|
|
representative_email:
|
|
type: string
|
|
format: email
|
|
readOnly: true
|
|
region_hub:
|
|
type: string
|
|
title: Regional Hub / Mission Zone
|
|
description: e.g. East Africa Regional Hub, South Asia Bureau, European
|
|
Cultural Mission
|
|
maxLength: 150
|
|
period:
|
|
type: string
|
|
title: Reporting Period
|
|
description: e.g. Q1 2026, Muharram 1448 AH, March 2026
|
|
maxLength: 100
|
|
centers_visited_count:
|
|
type: integer
|
|
title: Number of Mosques / Centers Visited
|
|
status:
|
|
allOf:
|
|
- $ref: '#/components/schemas/DiplomacyReportStatusEnum'
|
|
title: Review Status
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
title: Submitted At
|
|
required:
|
|
- created_at
|
|
- id
|
|
- period
|
|
- region_hub
|
|
- representative_email
|
|
- representative_name
|
|
- title
|
|
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
|
|
SearchEntityTypeEnum:
|
|
enum:
|
|
- institution
|
|
- project
|
|
- course
|
|
- post
|
|
- event
|
|
type: string
|
|
description: |-
|
|
* `institution` - Institution
|
|
* `project` - Project
|
|
* `course` - Course
|
|
* `post` - Post
|
|
* `event` - Event
|
|
SearchResultItem:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
description: Entity unique identifier
|
|
type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/SearchEntityTypeEnum'
|
|
description: |-
|
|
Type of the entity found
|
|
|
|
* `institution` - Institution
|
|
* `project` - Project
|
|
* `course` - Course
|
|
* `post` - Post
|
|
* `event` - Event
|
|
title:
|
|
type: string
|
|
description: Title or primary name
|
|
description:
|
|
type: string
|
|
description: Summary or excerpt
|
|
url_path:
|
|
type: string
|
|
description: Frontend navigation route
|
|
image:
|
|
type: string
|
|
nullable: true
|
|
description: Cover or avatar image URL
|
|
badge:
|
|
type: string
|
|
description: Contextual badge / label
|
|
metadata:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Additional metadata attributes
|
|
relevance_score:
|
|
type: number
|
|
format: double
|
|
default: 1.0
|
|
description: Relevance ranking score
|
|
required:
|
|
- id
|
|
- title
|
|
- type
|
|
- url_path
|
|
SearchTypeCount:
|
|
type: object
|
|
properties:
|
|
institutions:
|
|
type: integer
|
|
default: 0
|
|
projects:
|
|
type: integer
|
|
default: 0
|
|
courses:
|
|
type: integer
|
|
default: 0
|
|
posts:
|
|
type: integer
|
|
default: 0
|
|
events:
|
|
type: integer
|
|
default: 0
|
|
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
|
|
SingleQuizAnswerRequest:
|
|
type: object
|
|
properties:
|
|
question_id:
|
|
type: integer
|
|
selected_option:
|
|
type: integer
|
|
required:
|
|
- question_id
|
|
- selected_option
|
|
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: ''
|
|
TicketCategoryEnum:
|
|
enum:
|
|
- cultural_affairs
|
|
- religious_inquiry
|
|
- inter_center_cooperation
|
|
- financial_legal
|
|
- technical_support
|
|
- general
|
|
type: string
|
|
description: |-
|
|
* `cultural_affairs` - Cultural & International Affairs
|
|
* `religious_inquiry` - Religious & Theological Inquiry
|
|
* `inter_center_cooperation` - Inter-Center Cooperation & Partnerships
|
|
* `financial_legal` - Financial & Legal Affairs
|
|
* `technical_support` - Technical & Portal Support
|
|
* `general` - General Inquiry
|
|
TicketCreateRequest:
|
|
type: object
|
|
properties:
|
|
subject:
|
|
type: string
|
|
minLength: 1
|
|
title: Subject / Title
|
|
maxLength: 255
|
|
category:
|
|
$ref: '#/components/schemas/TicketCategoryEnum'
|
|
priority:
|
|
$ref: '#/components/schemas/TicketPriorityEnum'
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Affiliated Institution
|
|
content:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
description: Initial message description
|
|
attachment:
|
|
type: string
|
|
format: binary
|
|
writeOnly: true
|
|
nullable: true
|
|
required:
|
|
- content
|
|
- subject
|
|
TicketDetail:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
tracking_code:
|
|
type: string
|
|
description: e.g. TK-RAZAVI-2026-AB12CD
|
|
maxLength: 100
|
|
subject:
|
|
type: string
|
|
title: Subject / Title
|
|
maxLength: 255
|
|
category:
|
|
$ref: '#/components/schemas/TicketCategoryEnum'
|
|
priority:
|
|
$ref: '#/components/schemas/TicketPriorityEnum'
|
|
status:
|
|
$ref: '#/components/schemas/TicketStatusEnum'
|
|
submitter_name:
|
|
type: string
|
|
readOnly: true
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Affiliated Institution
|
|
institution_name:
|
|
type: string
|
|
readOnly: true
|
|
assigned_expert:
|
|
type: integer
|
|
nullable: true
|
|
title: Assigned Expert / Officer
|
|
expert_name:
|
|
type: string
|
|
readOnly: true
|
|
satisfaction_rating:
|
|
type: integer
|
|
nullable: true
|
|
title: Satisfaction Rating (1-5 Stars)
|
|
feedback_comment:
|
|
type: string
|
|
nullable: true
|
|
title: User Feedback Notes
|
|
messages:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TicketMessage'
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
closed_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
required:
|
|
- created_at
|
|
- expert_name
|
|
- id
|
|
- institution_name
|
|
- messages
|
|
- subject
|
|
- submitter_name
|
|
- updated_at
|
|
TicketDetailRequest:
|
|
type: object
|
|
properties:
|
|
tracking_code:
|
|
type: string
|
|
description: e.g. TK-RAZAVI-2026-AB12CD
|
|
maxLength: 100
|
|
subject:
|
|
type: string
|
|
minLength: 1
|
|
title: Subject / Title
|
|
maxLength: 255
|
|
category:
|
|
$ref: '#/components/schemas/TicketCategoryEnum'
|
|
priority:
|
|
$ref: '#/components/schemas/TicketPriorityEnum'
|
|
status:
|
|
$ref: '#/components/schemas/TicketStatusEnum'
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Affiliated Institution
|
|
assigned_expert:
|
|
type: integer
|
|
nullable: true
|
|
title: Assigned Expert / Officer
|
|
satisfaction_rating:
|
|
type: integer
|
|
nullable: true
|
|
title: Satisfaction Rating (1-5 Stars)
|
|
feedback_comment:
|
|
type: string
|
|
nullable: true
|
|
title: User Feedback Notes
|
|
closed_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
required:
|
|
- subject
|
|
TicketList:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
tracking_code:
|
|
type: string
|
|
description: e.g. TK-RAZAVI-2026-AB12CD
|
|
maxLength: 100
|
|
subject:
|
|
type: string
|
|
title: Subject / Title
|
|
maxLength: 255
|
|
category:
|
|
$ref: '#/components/schemas/TicketCategoryEnum'
|
|
priority:
|
|
$ref: '#/components/schemas/TicketPriorityEnum'
|
|
status:
|
|
$ref: '#/components/schemas/TicketStatusEnum'
|
|
submitter_name:
|
|
type: string
|
|
readOnly: true
|
|
institution:
|
|
type: integer
|
|
nullable: true
|
|
title: Affiliated Institution
|
|
institution_name:
|
|
type: string
|
|
readOnly: true
|
|
messages_count:
|
|
type: integer
|
|
readOnly: true
|
|
satisfaction_rating:
|
|
type: integer
|
|
nullable: true
|
|
title: Satisfaction Rating (1-5 Stars)
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
closed_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
required:
|
|
- created_at
|
|
- id
|
|
- institution_name
|
|
- messages_count
|
|
- subject
|
|
- submitter_name
|
|
- updated_at
|
|
TicketMessage:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
sender_id:
|
|
type: integer
|
|
readOnly: true
|
|
sender_name:
|
|
type: string
|
|
readOnly: true
|
|
is_official_response:
|
|
type: boolean
|
|
readOnly: true
|
|
title: Is Official Response from Astan / Expert
|
|
department_label:
|
|
type: string
|
|
title: Department / Authority Label
|
|
maxLength: 255
|
|
content:
|
|
type: string
|
|
title: Message Content
|
|
attachment:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- content
|
|
- created_at
|
|
- id
|
|
- is_official_response
|
|
- sender_id
|
|
- sender_name
|
|
TicketMessageCreateRequest:
|
|
type: object
|
|
properties:
|
|
content:
|
|
type: string
|
|
minLength: 1
|
|
title: Message Content
|
|
attachment:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
department_label:
|
|
type: string
|
|
title: Department / Authority Label
|
|
maxLength: 255
|
|
required:
|
|
- content
|
|
TicketMessageRequest:
|
|
type: object
|
|
properties:
|
|
department_label:
|
|
type: string
|
|
title: Department / Authority Label
|
|
maxLength: 255
|
|
content:
|
|
type: string
|
|
minLength: 1
|
|
title: Message Content
|
|
attachment:
|
|
type: string
|
|
format: binary
|
|
nullable: true
|
|
required:
|
|
- content
|
|
TicketPriorityEnum:
|
|
enum:
|
|
- low
|
|
- medium
|
|
- high
|
|
- urgent
|
|
type: string
|
|
description: |-
|
|
* `low` - Low
|
|
* `medium` - Medium
|
|
* `high` - High
|
|
* `urgent` - Urgent
|
|
TicketRateRequest:
|
|
type: object
|
|
properties:
|
|
rating:
|
|
type: integer
|
|
maximum: 5
|
|
minimum: 1
|
|
description: 1 to 5 stars
|
|
feedback:
|
|
type: string
|
|
required:
|
|
- rating
|
|
TicketStatusEnum:
|
|
enum:
|
|
- open
|
|
- in_progress
|
|
- answered
|
|
- closed
|
|
type: string
|
|
description: |-
|
|
* `open` - Open
|
|
* `in_progress` - In Progress
|
|
* `answered` - Official Response Provided
|
|
* `closed` - Closed
|
|
TicketingAnalytics:
|
|
type: object
|
|
properties:
|
|
total_tickets:
|
|
type: integer
|
|
open_tickets:
|
|
type: integer
|
|
answered_or_closed:
|
|
type: integer
|
|
average_satisfaction_rating:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
required:
|
|
- answered_or_closed
|
|
- average_satisfaction_rating
|
|
- open_tickets
|
|
- total_tickets
|
|
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
|
|
UnifiedSearchResponse:
|
|
type: object
|
|
properties:
|
|
query:
|
|
type: string
|
|
description: Original search query string
|
|
total_results:
|
|
type: integer
|
|
description: Total number of matched records across categories
|
|
by_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/SearchTypeCount'
|
|
description: Breakdown count of matched records by entity type
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/SearchResultItem'
|
|
description: List of matched search results ordered by relevance
|
|
required:
|
|
- by_type
|
|
- query
|
|
- results
|
|
- total_results
|
|
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
|
|
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
|
|
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
|
|
first_name:
|
|
type: string
|
|
readOnly: true
|
|
last_name:
|
|
type: string
|
|
readOnly: true
|
|
name:
|
|
type: string
|
|
readOnly: true
|
|
phone_number:
|
|
type: string
|
|
nullable: true
|
|
description: e.g., +1 555 1234567
|
|
maxLength: 128
|
|
phone:
|
|
type: string
|
|
readOnly: true
|
|
user_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/UserTypeEnum'
|
|
readOnly: true
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
bio:
|
|
type: string
|
|
nullable: true
|
|
languages: {}
|
|
preferred_language:
|
|
type: string
|
|
readOnly: true
|
|
skills: {}
|
|
title:
|
|
type: string
|
|
readOnly: true
|
|
rank:
|
|
type: string
|
|
readOnly: true
|
|
position:
|
|
type: string
|
|
readOnly: true
|
|
institution:
|
|
type: string
|
|
readOnly: true
|
|
institution_id:
|
|
type: integer
|
|
nullable: true
|
|
readOnly: true
|
|
website:
|
|
type: string
|
|
readOnly: true
|
|
address:
|
|
type: string
|
|
readOnly: true
|
|
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:
|
|
- address
|
|
- date_joined
|
|
- email
|
|
- first_name
|
|
- id
|
|
- institution
|
|
- institution_id
|
|
- is_active
|
|
- is_staff
|
|
- is_verified
|
|
- last_name
|
|
- name
|
|
- permissions
|
|
- phone
|
|
- position
|
|
- preferred_language
|
|
- rank
|
|
- roles
|
|
- title
|
|
- user_type
|
|
- username
|
|
- verification_status
|
|
- website
|
|
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.
|
|
first_name:
|
|
type: string
|
|
last_name:
|
|
type: string
|
|
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.
|
|
first_name:
|
|
type: string
|
|
last_name:
|
|
type: string
|
|
fullname:
|
|
type: string
|
|
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
|
|
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
|
|
UserRegisterRequest:
|
|
type: object
|
|
properties:
|
|
first_name:
|
|
type: string
|
|
last_name:
|
|
type: string
|
|
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
|
|
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
|
|
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
|
|
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
|
|
- 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
|
|
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
|
|
WorkflowStatusEnum:
|
|
enum:
|
|
- submitted
|
|
- under_review
|
|
- approved
|
|
- rejected
|
|
type: string
|
|
description: |-
|
|
* `submitted` - Submitted
|
|
* `under_review` - Under Review
|
|
* `approved` - Approved
|
|
* `rejected` - Rejected
|
|
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"
|