Refactor Tender Management API Endpoints and Update Documentation

- Renamed and restructured tender-related API endpoints for improved clarity and consistency, including changing the route from `/admin/tenders` to `/admin/v1/companies` and updating the associated methods.
- Introduced a new SearchForm structure for listing tenders with advanced filtering capabilities, enhancing the API's search functionality.
- Updated the service and repository layers to align with the new endpoint structure, ensuring proper handling of tender data.
- Enhanced Swagger and YAML documentation to reflect the changes in endpoint structure, including detailed descriptions and examples for the new search functionality.
- Improved error handling and response structures to provide clearer feedback to API consumers, ensuring a more robust and user-friendly experience.
This commit is contained in:
n.nakhostin
2025-09-08 14:20:50 +03:30
parent 3b265e567d
commit 3911180486
11 changed files with 1216 additions and 1382 deletions
+361 -309
View File
@@ -18,315 +18,6 @@
"host": "localhost:8082",
"basePath": "/",
"paths": {
"/admin/tenders": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve tenders with pagination, filtering, and search capabilities with optional company-based matching",
"produces": [
"application/json"
],
"tags": [
"Admin-Tenders"
],
"summary": "List tenders",
"parameters": [
{
"type": "integer",
"description": "Number of items per page (default: 20, max: 100)",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Number of items to skip (default: 0)",
"name": "offset",
"in": "query"
},
{
"type": "string",
"description": "Company ID for match percentage calculation and sorting",
"name": "company_id",
"in": "query"
},
{
"type": "string",
"description": "Search query for title and description",
"name": "query",
"in": "query"
},
{
"type": "string",
"description": "Filter by notice type code",
"name": "notice_type",
"in": "query"
},
{
"type": "string",
"description": "Filter by procurement type code",
"name": "procurement_type",
"in": "query"
},
{
"type": "array",
"items": {
"type": "string"
},
"collectionFormat": "csv",
"description": "Filter by country codes (comma-separated)",
"name": "country_codes",
"in": "query"
},
{
"type": "array",
"items": {
"type": "string"
},
"collectionFormat": "csv",
"description": "Filter by status (comma-separated)",
"name": "status",
"in": "query"
},
{
"type": "array",
"items": {
"type": "string"
},
"collectionFormat": "csv",
"description": "Filter by source (comma-separated)",
"name": "source",
"in": "query"
},
{
"type": "number",
"description": "Minimum estimated value",
"name": "min_estimated_value",
"in": "query"
},
{
"type": "number",
"description": "Maximum estimated value",
"name": "max_estimated_value",
"in": "query"
},
{
"type": "string",
"description": "Filter by currency",
"name": "currency",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"type": "object",
"additionalProperties": true
}
}
}
]
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/tenders/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve a specific tender by its ID",
"produces": [
"application/json"
],
"tags": [
"Admin-Tenders"
],
"summary": "Get tender by ID",
"parameters": [
{
"type": "string",
"description": "Tender ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender.TenderResponse"
}
}
}
]
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update an existing tender with the provided information",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Tenders"
],
"summary": "Update tender",
"parameters": [
{
"type": "string",
"description": "Tender ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Updated tender information",
"name": "tender",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/tender.UpdateTenderRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender.TenderResponse"
}
}
}
]
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Delete a tender by its ID",
"tags": [
"Admin-Tenders"
],
"summary": "Delete tender",
"parameters": [
{
"type": "string",
"description": "Tender ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/companies": {
"get": {
"security": [
@@ -3446,6 +3137,367 @@
}
}
},
"/admin/v1/tenders": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve tenders with pagination, filtering, and search capabilities with optional company-based matching",
"produces": [
"application/json"
],
"tags": [
"Admin-Tenders"
],
"summary": "List tenders",
"parameters": [
{
"type": "string",
"description": "Company ID for match percentage calculation and sorting",
"name": "company_id",
"in": "query"
},
{
"type": "string",
"description": "Search query for title and description",
"name": "q",
"in": "query"
},
{
"type": "string",
"description": "Filter by notice type code",
"name": "notice_type",
"in": "query"
},
{
"type": "string",
"description": "Filter by procurement type code",
"name": "procurement_type",
"in": "query"
},
{
"type": "array",
"items": {
"type": "string"
},
"collectionFormat": "csv",
"description": "Filter by country codes (comma-separated)",
"name": "country_codes",
"in": "query"
},
{
"type": "array",
"items": {
"type": "string"
},
"collectionFormat": "csv",
"description": "Filter by status (comma-separated)",
"name": "status",
"in": "query"
},
{
"type": "array",
"items": {
"type": "string"
},
"collectionFormat": "csv",
"description": "Filter by source (comma-separated)",
"name": "source",
"in": "query"
},
{
"type": "number",
"description": "Minimum estimated value",
"name": "min_estimated_value",
"in": "query"
},
{
"type": "number",
"description": "Maximum estimated value",
"name": "max_estimated_value",
"in": "query"
},
{
"type": "string",
"description": "Filter by currency",
"name": "currency",
"in": "query"
},
{
"type": "number",
"description": "Deadline from",
"name": "deadline_from",
"in": "query"
},
{
"type": "number",
"description": "Deadline to",
"name": "deadline_to",
"in": "query"
},
{
"type": "number",
"description": "Publication date from",
"name": "publication_date_from",
"in": "query"
},
{
"type": "number",
"description": "Publication date to",
"name": "publication_date_to",
"in": "query"
},
{
"type": "array",
"items": {
"type": "string"
},
"collectionFormat": "csv",
"description": "Filter by languages (comma-separated)",
"name": "languages",
"in": "query"
},
{
"type": "string",
"description": "Filter by buyer organization ID",
"name": "buyer_organization_id",
"in": "query"
},
{
"type": "integer",
"description": "Number of items per page (default: 20, max: 100)",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Number of items to skip (default: 0)",
"name": "offset",
"in": "query"
},
{
"type": "string",
"description": "Sort by field",
"name": "sort_by",
"in": "query"
},
{
"type": "string",
"description": "Sort order (asc or desc)",
"name": "sort_order",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"type": "object",
"additionalProperties": true
}
}
}
]
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/tenders/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve a specific tender by its ID",
"produces": [
"application/json"
],
"tags": [
"Admin-Tenders"
],
"summary": "Get tender by ID",
"parameters": [
{
"type": "string",
"description": "Tender ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender.TenderResponse"
}
}
}
]
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update an existing tender with the provided information",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Tenders"
],
"summary": "Update tender",
"parameters": [
{
"type": "string",
"description": "Tender ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Updated tender information",
"name": "tender",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/tender.UpdateTenderRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender.TenderResponse"
}
}
}
]
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Delete a tender by its ID",
"tags": [
"Admin-Tenders"
],
"summary": "Delete tender",
"parameters": [
{
"type": "string",
"description": "Tender ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/users": {
"get": {
"security": [