497 lines
13 KiB
Python
497 lines
13 KiB
Python
# Copyright (c) 2023-present Plane Software, Inc. and contributors
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
# See the LICENSE file for details.
|
|
|
|
"""
|
|
Common OpenAPI parameters for drf-spectacular.
|
|
|
|
This module provides reusable parameter definitions that can be shared
|
|
across multiple API endpoints to ensure consistency.
|
|
"""
|
|
|
|
from drf_spectacular.utils import OpenApiParameter, OpenApiExample
|
|
from drf_spectacular.types import OpenApiTypes
|
|
|
|
|
|
# Path Parameters
|
|
WORKSPACE_SLUG_PARAMETER = OpenApiParameter(
|
|
name="slug",
|
|
description="Workspace slug",
|
|
required=True,
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example workspace",
|
|
value="my-workspace",
|
|
description="A typical workspace slug",
|
|
)
|
|
],
|
|
)
|
|
|
|
PROJECT_ID_PARAMETER = OpenApiParameter(
|
|
name="project_id",
|
|
description="Project ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example project ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical project UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
PROJECT_PK_PARAMETER = OpenApiParameter(
|
|
name="pk",
|
|
description="Project ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example project ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical project UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
PROJECT_IDENTIFIER_PARAMETER = OpenApiParameter(
|
|
name="project_identifier",
|
|
description="Project identifier (unique string within workspace)",
|
|
required=True,
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example project identifier",
|
|
value="PROJ",
|
|
description="A typical project identifier",
|
|
)
|
|
],
|
|
)
|
|
|
|
ISSUE_IDENTIFIER_PARAMETER = OpenApiParameter(
|
|
name="issue_identifier",
|
|
description="Issue sequence ID (numeric identifier within project)",
|
|
required=True,
|
|
type=OpenApiTypes.INT,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example issue identifier",
|
|
value=123,
|
|
description="A typical issue sequence ID",
|
|
)
|
|
],
|
|
)
|
|
|
|
ASSET_ID_PARAMETER = OpenApiParameter(
|
|
name="asset_id",
|
|
description="Asset ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example asset ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical asset UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
CYCLE_ID_PARAMETER = OpenApiParameter(
|
|
name="cycle_id",
|
|
description="Cycle ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example cycle ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical cycle UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
MODULE_ID_PARAMETER = OpenApiParameter(
|
|
name="module_id",
|
|
description="Module ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example module ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical module UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
MODULE_PK_PARAMETER = OpenApiParameter(
|
|
name="pk",
|
|
description="Module ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example module ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical module UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
ISSUE_ID_PARAMETER = OpenApiParameter(
|
|
name="issue_id",
|
|
description="Issue ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example issue ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical issue UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
STATE_ID_PARAMETER = OpenApiParameter(
|
|
name="state_id",
|
|
description="State ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example state ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical state UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
# Additional Path Parameters
|
|
LABEL_ID_PARAMETER = OpenApiParameter(
|
|
name="pk",
|
|
description="Label ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example label ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical label UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
COMMENT_ID_PARAMETER = OpenApiParameter(
|
|
name="pk",
|
|
description="Comment ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example comment ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical comment UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
LINK_ID_PARAMETER = OpenApiParameter(
|
|
name="pk",
|
|
description="Link ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example link ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical link UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
ATTACHMENT_ID_PARAMETER = OpenApiParameter(
|
|
name="pk",
|
|
description="Attachment ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example attachment ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical attachment UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
ACTIVITY_ID_PARAMETER = OpenApiParameter(
|
|
name="pk",
|
|
description="Activity ID",
|
|
required=True,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.PATH,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example activity ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="A typical activity UUID",
|
|
)
|
|
],
|
|
)
|
|
|
|
# Query Parameters
|
|
CURSOR_PARAMETER = OpenApiParameter(
|
|
name="cursor",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Pagination cursor for getting next set of results",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Next page cursor",
|
|
value="20:1:0",
|
|
description="Cursor format: 'page_size:page_number:offset'",
|
|
)
|
|
],
|
|
)
|
|
|
|
PER_PAGE_PARAMETER = OpenApiParameter(
|
|
name="per_page",
|
|
type=OpenApiTypes.INT,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Number of results per page (default: 20, max: 100)",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(name="Default", value=20),
|
|
OpenApiExample(name="Maximum", value=100),
|
|
],
|
|
)
|
|
|
|
# External Integration Parameters
|
|
EXTERNAL_ID_PARAMETER = OpenApiParameter(
|
|
name="external_id",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="External system identifier for filtering or lookup",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="GitHub Issue",
|
|
value="1234567890",
|
|
description="GitHub issue number",
|
|
)
|
|
],
|
|
)
|
|
|
|
EXTERNAL_SOURCE_PARAMETER = OpenApiParameter(
|
|
name="external_source",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="External system source name for filtering or lookup",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="GitHub",
|
|
value="github",
|
|
description="GitHub integration source",
|
|
),
|
|
OpenApiExample(
|
|
name="Jira",
|
|
value="jira",
|
|
description="Jira integration source",
|
|
),
|
|
],
|
|
)
|
|
|
|
# Ordering Parameters
|
|
ORDER_BY_PARAMETER = OpenApiParameter(
|
|
name="order_by",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Field to order results by. Prefix with '-' for descending order",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Created date descending",
|
|
value="-created_at",
|
|
description="Most recent items first",
|
|
),
|
|
OpenApiExample(
|
|
name="Priority ascending",
|
|
value="priority",
|
|
description="Order by priority (urgent, high, medium, low, none)",
|
|
),
|
|
OpenApiExample(
|
|
name="State group",
|
|
value="state__group",
|
|
description="Order by state group (backlog, unstarted, started, completed, cancelled)", # noqa: E501
|
|
),
|
|
OpenApiExample(
|
|
name="Assignee name",
|
|
value="assignees__first_name",
|
|
description="Order by assignee first name",
|
|
),
|
|
],
|
|
)
|
|
|
|
# Search Parameters
|
|
SEARCH_PARAMETER = OpenApiParameter(
|
|
name="search",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Search query to filter results by name, description, or identifier",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Name search",
|
|
value="bug fix",
|
|
description="Search for items containing 'bug fix'",
|
|
),
|
|
OpenApiExample(
|
|
name="Sequence ID",
|
|
value="123",
|
|
description="Search by sequence ID number",
|
|
),
|
|
],
|
|
)
|
|
|
|
SEARCH_PARAMETER_REQUIRED = OpenApiParameter(
|
|
name="search",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Search query to filter results by name, description, or identifier",
|
|
required=True,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Name search",
|
|
value="bug fix",
|
|
description="Search for items containing 'bug fix'",
|
|
),
|
|
OpenApiExample(
|
|
name="Sequence ID",
|
|
value="123",
|
|
description="Search by sequence ID number",
|
|
),
|
|
],
|
|
)
|
|
|
|
LIMIT_PARAMETER = OpenApiParameter(
|
|
name="limit",
|
|
type=OpenApiTypes.INT,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Maximum number of results to return",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(name="Default", value=10),
|
|
OpenApiExample(name="More results", value=50),
|
|
],
|
|
)
|
|
|
|
WORKSPACE_SEARCH_PARAMETER = OpenApiParameter(
|
|
name="workspace_search",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Whether to search across entire workspace or within specific project",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Project only",
|
|
value="false",
|
|
description="Search within specific project only",
|
|
),
|
|
OpenApiExample(
|
|
name="Workspace wide",
|
|
value="true",
|
|
description="Search across entire workspace",
|
|
),
|
|
],
|
|
)
|
|
|
|
PROJECT_ID_QUERY_PARAMETER = OpenApiParameter(
|
|
name="project_id",
|
|
description="Project ID for filtering results within a specific project",
|
|
required=False,
|
|
type=OpenApiTypes.UUID,
|
|
location=OpenApiParameter.QUERY,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Example project ID",
|
|
value="550e8400-e29b-41d4-a716-446655440000",
|
|
description="Filter results for this project",
|
|
)
|
|
],
|
|
)
|
|
|
|
# Cycle View Parameter
|
|
CYCLE_VIEW_PARAMETER = OpenApiParameter(
|
|
name="cycle_view",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Filter cycles by status",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(name="All cycles", value="all"),
|
|
OpenApiExample(name="Current cycles", value="current"),
|
|
OpenApiExample(name="Upcoming cycles", value="upcoming"),
|
|
OpenApiExample(name="Completed cycles", value="completed"),
|
|
OpenApiExample(name="Draft cycles", value="draft"),
|
|
OpenApiExample(name="Incomplete cycles", value="incomplete"),
|
|
],
|
|
)
|
|
|
|
# Field Selection Parameters
|
|
FIELDS_PARAMETER = OpenApiParameter(
|
|
name="fields",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Comma-separated list of fields to include in response",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Basic fields",
|
|
value="id,name,description",
|
|
description="Include only basic fields",
|
|
),
|
|
OpenApiExample(
|
|
name="With relations",
|
|
value="id,name,assignees,state",
|
|
description="Include fields with relationships",
|
|
),
|
|
],
|
|
)
|
|
|
|
EXPAND_PARAMETER = OpenApiParameter(
|
|
name="expand",
|
|
type=OpenApiTypes.STR,
|
|
location=OpenApiParameter.QUERY,
|
|
description="Comma-separated list of related fields to expand in response",
|
|
required=False,
|
|
examples=[
|
|
OpenApiExample(
|
|
name="Expand assignees",
|
|
value="assignees",
|
|
description="Include full assignee details",
|
|
),
|
|
OpenApiExample(
|
|
name="Multiple expansions",
|
|
value="assignees,labels,state",
|
|
description="Include details for multiple relations",
|
|
),
|
|
],
|
|
)
|