Files
tm_back/cmd/web/docs/docs.go
T
n.nakhostin 8670b3272d Enhance Company Management with Category Integration and API Documentation Updates
- Updated the Company service to include category validation during creation and updates, ensuring that only valid categories are associated with companies.
- Introduced a new CategoryResponse structure to encapsulate category details in API responses, improving the clarity of the data returned.
- Enhanced the CompanyResponse structure to include category details, providing more comprehensive information in API responses.
- Updated Swagger and YAML documentation to reflect the new category integration, including detailed descriptions and examples for the updated response structures.
- Improved error handling for invalid category data during company creation and updates, enhancing the robustness of the API.
- Refactored existing API handlers to accommodate the new category-related changes, ensuring a seamless user experience across the application.
2025-09-08 13:01:45 +03:30

7130 lines
268 KiB
Go

// Package docs Code generated by swaggo/swag. DO NOT EDIT
package docs
import "github.com/swaggo/swag"
const docTemplate = `{
"schemes": {{ marshal .Schemes }},
"swagger": "2.0",
"info": {
"description": "{{escape .Description}}",
"title": "{{.Title}}",
"termsOfService": "https://tender-management.com/terms",
"contact": {
"name": "Tender Management API Support",
"url": "https://tender-management.com/support",
"email": "api-support@tender-management.com"
},
"license": {
"name": "MIT",
"url": "https://opensource.org/licenses/MIT"
},
"version": "{{.Version}}"
},
"host": "{{.Host}}",
"basePath": "{{.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": [
{
"BearerAuth": []
}
],
"description": "Search companies with advanced filtering capabilities including tags, business criteria, and location",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Companies"
],
"summary": "Advanced search for companies",
"parameters": [
{
"type": "string",
"description": "Search query",
"name": "q",
"in": "query"
},
{
"type": "array",
"description": "CPV codes filter",
"name": "cpv_codes",
"in": "query"
},
{
"type": "array",
"description": "Categories filter",
"name": "categories",
"in": "query"
},
{
"type": "array",
"description": "Keywords filter",
"name": "keywords",
"in": "query"
},
{
"type": "array",
"description": "Specializations filter",
"name": "specializations",
"in": "query"
},
{
"type": "string",
"description": "Industry filter",
"name": "industry",
"in": "query"
},
{
"type": "string",
"description": "Location filter",
"name": "location",
"in": "query"
},
{
"type": "integer",
"description": "Minimum employees",
"name": "min_employees",
"in": "query"
},
{
"type": "integer",
"description": "Maximum employees",
"name": "max_employees",
"in": "query"
},
{
"type": "number",
"description": "Minimum revenue",
"name": "min_revenue",
"in": "query"
},
{
"type": "number",
"description": "Maximum revenue",
"name": "max_revenue",
"in": "query"
},
{
"type": "boolean",
"description": "Verification status",
"name": "is_verified",
"in": "query"
},
{
"type": "boolean",
"description": "Compliance status",
"name": "is_compliant",
"in": "query"
},
{
"type": "integer",
"default": 20,
"description": "Limit",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"default": 0,
"description": "Offset",
"name": "offset",
"in": "query"
}
],
"responses": {
"200": {
"description": "Companies search completed",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company.CompanyListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "Create a new company with comprehensive information including business details, address, tags, and customer assignment. This endpoint is used by the web panel for full company registration.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Companies"
],
"summary": "Create a new company",
"parameters": [
{
"description": "Company information including type, business details, address, tags, and optional customer assignment",
"name": "company",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/company.CompanyForm"
}
}
],
"responses": {
"201": {
"description": "Company created successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company.CompanyResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Company with this name/registration/tax ID already exists",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/companies/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve detailed company information by company ID",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Companies"
],
"summary": "Get company by ID",
"parameters": [
{
"type": "string",
"description": "Company ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Company retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company.CompanyResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid company ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Company not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update company information including business details, address, tags, and customer assignment",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Companies"
],
"summary": "Update company information",
"parameters": [
{
"type": "string",
"description": "Company ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Company update information",
"name": "company",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/company.CompanyForm"
}
}
],
"responses": {
"200": {
"description": "Company updated successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company.CompanyResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Company not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Company with this name/registration/tax ID already exists",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Soft delete a company by setting status to inactive",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Companies"
],
"summary": "Delete company",
"parameters": [
{
"type": "string",
"description": "Company ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Company deleted successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid company ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Company not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/companies/{id}/status": {
"patch": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update company account status (active, inactive, suspended, pending)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Companies"
],
"summary": "Update company status",
"parameters": [
{
"type": "string",
"description": "Company ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "New company status",
"name": "status",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/company.StatusForm"
}
}
],
"responses": {
"200": {
"description": "Company status updated successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Company not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/companies/{id}/verification": {
"patch": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update company verification and compliance status",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Companies"
],
"summary": "Update company verification status",
"parameters": [
{
"type": "string",
"description": "Company ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Verification status update",
"name": "verification",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/company.VerificationForm"
}
}
],
"responses": {
"200": {
"description": "Company verification updated successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Company not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/company-categories": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Search categories with filtering capabilities",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Search categories",
"parameters": [
{
"type": "string",
"description": "Search query",
"name": "q",
"in": "query"
},
{
"type": "boolean",
"description": "Published status filter",
"name": "published",
"in": "query"
},
{
"type": "integer",
"default": 20,
"description": "Limit",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"default": 0,
"description": "Offset",
"name": "offset",
"in": "query"
},
{
"enum": [
"name",
"created_at",
"updated_at",
"published_at"
],
"type": "string",
"description": "Sort by field",
"name": "sort_by",
"in": "query"
},
{
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort order",
"name": "sort_order",
"in": "query"
}
],
"responses": {
"200": {
"description": "Categories search completed",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company_category.CategoryListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "Create a new category with name, description, and thumbnail",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Create a new category",
"parameters": [
{
"description": "Category information",
"name": "category",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/company_category.CategoryForm"
}
}
],
"responses": {
"201": {
"description": "Category created successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company_category.CategoryResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Category with this name already exists",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/company-categories/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve detailed category information by category ID",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Get category by ID",
"parameters": [
{
"type": "string",
"description": "Category ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Category retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company_category.CategoryResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid category ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Category not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update category information including name, description, and thumbnail",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Update category information",
"parameters": [
{
"type": "string",
"description": "Category ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Category update information",
"name": "category",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/company_category.CategoryForm"
}
}
],
"responses": {
"200": {
"description": "Category updated successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company_category.CategoryResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Category not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Category with this name already exists",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Delete a category permanently",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Delete category",
"parameters": [
{
"type": "string",
"description": "Category ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Category deleted successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid category ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Category not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/company-categories/{id}/publish": {
"patch": {
"security": [
{
"BearerAuth": []
}
],
"description": "Toggle category publish/unpublish status",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Toggle category publish status",
"parameters": [
{
"type": "string",
"description": "Category ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Category publish status updated successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Category not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/customers": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve a paginated list of customers with advanced filtering options including search, type, status, company, industry, verification status, and compliance status. Supports sorting and pagination.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Customers"
],
"summary": "List customers with filters and pagination",
"parameters": [
{
"type": "string",
"description": "Search term to filter customers by name, email, or company name",
"name": "search",
"in": "query"
},
{
"enum": [
"individual",
"company",
"government"
],
"type": "string",
"description": "Filter by customer type",
"name": "type",
"in": "query"
},
{
"enum": [
"active",
"inactive",
"suspended",
"pending"
],
"type": "string",
"description": "Filter by customer status",
"name": "status",
"in": "query"
},
{
"type": "string",
"format": "uuid",
"description": "Filter by company ID",
"name": "company_id",
"in": "query"
},
{
"maximum": 100,
"minimum": 1,
"type": "integer",
"default": 20,
"description": "Number of customers per page (1-100)",
"name": "limit",
"in": "query"
},
{
"minimum": 0,
"type": "integer",
"default": 0,
"description": "Number of customers to skip for pagination",
"name": "offset",
"in": "query"
},
{
"enum": [
"email",
"company_name",
"created_at",
"updated_at",
"status"
],
"type": "string",
"default": "created_at",
"description": "Field to sort by",
"name": "sort_by",
"in": "query"
},
{
"enum": [
"asc",
"desc"
],
"type": "string",
"default": "desc",
"description": "Sort order",
"name": "sort_order",
"in": "query"
}
],
"responses": {
"200": {
"description": "Customers retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/customer.CustomerListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "Create a new customer with comprehensive information including personal details, company information, address, and business details. This endpoint is used by the web panel for full customer registration.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Customers"
],
"summary": "Create a new customer",
"parameters": [
{
"description": "Customer information including type (individual|company|government), personal details, company info, address, and business details",
"name": "customer",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/customer.CreateCustomerForm"
}
}
],
"responses": {
"201": {
"description": "Customer created successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/customer.CustomerResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Customer with this email/company already exists",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/customers/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve detailed customer information by customer ID",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Customers"
],
"summary": "Get customer by ID",
"parameters": [
{
"type": "string",
"description": "Customer ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Customer retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/customer.CustomerResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid customer ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Customer not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update customer information including personal details, company information, address, and business details",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Customers"
],
"summary": "Update customer information",
"parameters": [
{
"type": "string",
"description": "Customer ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Updated customer information",
"name": "customer",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/customer.UpdateCustomerForm"
}
}
],
"responses": {
"200": {
"description": "Customer updated successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/customer.CustomerResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Customer not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Customer with this email/company already exists",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Soft delete a customer by setting status to inactive",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Customers"
],
"summary": "Delete customer",
"parameters": [
{
"type": "string",
"description": "Customer ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Customer deleted successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid customer ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Customer not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/customers/{id}/status": {
"patch": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update customer account status (active, inactive, suspended, pending)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Customers"
],
"summary": "Update customer status",
"parameters": [
{
"type": "string",
"description": "Customer ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "New customer status",
"name": "status",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/customer.UpdateStatusForm"
}
}
],
"responses": {
"200": {
"description": "Customer status updated successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Customer not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/feedback": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve paginated list of feedback with optional filtering by various criteria. This endpoint is for administrative use and provides comprehensive filtering options.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Feedback"
],
"summary": "List feedback with filters",
"parameters": [
{
"type": "string",
"description": "Filter by tender ID (MongoDB ObjectID format)",
"name": "tender_id",
"in": "query"
},
{
"type": "string",
"description": "Filter by customer ID (MongoDB ObjectID format)",
"name": "customer_id",
"in": "query"
},
{
"type": "string",
"description": "Filter by company ID (MongoDB ObjectID format)",
"name": "company_id",
"in": "query"
},
{
"enum": [
"like",
"dislike"
],
"type": "string",
"description": "Filter by feedback type",
"name": "feedback_type",
"in": "query"
},
{
"type": "integer",
"format": "int64",
"description": "Filter by creation date from (Unix timestamp in seconds)",
"name": "date_from",
"in": "query"
},
{
"type": "integer",
"format": "int64",
"description": "Filter by creation date to (Unix timestamp in seconds)",
"name": "date_to",
"in": "query"
},
{
"maximum": 100,
"minimum": 1,
"type": "integer",
"description": "Number of items per page (default: 20, max: 100)",
"name": "limit",
"in": "query"
},
{
"minimum": 0,
"type": "integer",
"description": "Number of items to skip for pagination (default: 0)",
"name": "offset",
"in": "query"
}
],
"responses": {
"200": {
"description": "Feedback list retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/feedback.FeedbackListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid query parameters",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"422": {
"description": "Validation error - Invalid filter criteria",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"500": {
"description": "Internal server error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
}
}
}
},
"/admin/v1/feedback/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve feedback details by its unique identifier with loaded tender, customer, and company information. This endpoint provides comprehensive feedback data including related entity details.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Feedback"
],
"summary": "Get feedback by ID",
"parameters": [
{
"maxLength": 24,
"minLength": 24,
"type": "string",
"description": "Feedback ID (MongoDB ObjectID format)",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "feedback retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/feedback.FeedbackResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid feedback ID format",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"404": {
"description": "Feedback not found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"500": {
"description": "Internal server error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Mark feedback as deleted without permanently removing it from the database. The feedback will be marked as deleted and hidden from normal queries but can be restored if needed.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Feedback"
],
"summary": "Soft delete feedback",
"parameters": [
{
"maxLength": 24,
"minLength": 24,
"type": "string",
"description": "Feedback ID (MongoDB ObjectID format)",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Feedback soft deleted successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid feedback ID format",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"401": {
"description": "Unauthorized - User not authenticated",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"403": {
"description": "Forbidden - User not authorized to delete this feedback",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"404": {
"description": "Not found - Feedback not found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"500": {
"description": "Internal server error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
}
}
}
},
"/admin/v1/health": {
"get": {
"description": "Get comprehensive server health status including system information, dependencies status, and performance metrics. This endpoint is used for monitoring and load balancer health checks.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Health"
],
"summary": "Health check endpoint",
"responses": {
"200": {
"description": "System is healthy and operational",
"schema": {
"$ref": "#/definitions/bootstrap.HealthResponse"
}
},
"503": {
"description": "System is unhealthy or experiencing issues",
"schema": {
"$ref": "#/definitions/bootstrap.HealthResponse"
}
}
}
}
},
"/admin/v1/inquiries": {
"get": {
"description": "Search and filter inquiries with pagination support. This endpoint allows administrators to find inquiries based on various criteria including name, company, email, status, and other filters.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Inquiries"
],
"summary": "Search inquiries",
"parameters": [
{
"type": "string",
"description": "Search term for full name, company name, or email",
"name": "q",
"in": "query"
},
{
"type": "string",
"description": "Filter by status (pending, reviewed, approved, rejected)",
"name": "status",
"in": "query"
},
{
"type": "integer",
"description": "Limit results (1-100)",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Offset results",
"name": "offset",
"in": "query"
},
{
"type": "string",
"description": "Sort field (full_name, company_name, work_email, status, created_at)",
"name": "sort_by",
"in": "query"
},
{
"type": "string",
"description": "Sort order (asc, desc)",
"name": "sort_order",
"in": "query"
}
],
"responses": {
"200": {
"description": "Inquiries retrieved successfully with pagination metadata",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/inquiry.InquiryListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid parameter values",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/inquiries/{id}": {
"get": {
"description": "Retrieve detailed information about a specific inquiry by its unique identifier. This endpoint provides complete inquiry details including contact information, status, and status history.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Inquiries"
],
"summary": "Get inquiry by ID",
"parameters": [
{
"type": "string",
"description": "Inquiry ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Inquiry retrieved successfully with complete details",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/inquiry.InquiryResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid inquiry ID format",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Inquiry with specified ID not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"delete": {
"description": "Delete an inquiry permanently from the system. This action cannot be undone and will remove all inquiry data including contact information, status history, and timestamps.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Inquiries"
],
"summary": "Delete inquiry",
"parameters": [
{
"type": "string",
"description": "Inquiry ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Inquiry deleted successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid inquiry ID format",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Inquiry with specified ID not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/inquiries/{id}/status": {
"put": {
"description": "Update the status of an inquiry with reason and optional description. This endpoint allows administrators to change inquiry status following the defined workflow: pending -\u003e reviewed -\u003e approved/rejected.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Inquiries"
],
"summary": "Update inquiry status",
"parameters": [
{
"type": "string",
"description": "Inquiry ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Status update information including new status, reason, and optional description",
"name": "status",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/inquiry.UpdateInquiryStatusForm"
}
}
],
"responses": {
"200": {
"description": "Inquiry status updated successfully with updated details",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/inquiry.InquiryResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid inquiry ID format or invalid status transition",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Inquiry with specified ID not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid data format or validation rules not met",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/profile": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve complete profile information for the currently authenticated user including personal details, role information, permissions, and account status. This endpoint requires valid authentication token.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Authorization"
],
"summary": "Get authenticated user profile",
"responses": {
"200": {
"description": "Profile retrieved successfully with user details",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/user.UserResponse"
}
}
}
]
}
},
"401": {
"description": "Unauthorized - Invalid or expired authentication token",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - User profile not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update profile information for the currently authenticated user including personal details, contact information, and preferences. Only the authenticated user can update their own profile.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Authorization"
],
"summary": "Update authenticated user profile",
"parameters": [
{
"description": "Profile update data including name, email, phone, and other personal information",
"name": "profile",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/user.UpdateUserForm"
}
}
],
"responses": {
"200": {
"description": "Profile updated successfully with updated user details",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/user.UserResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid request format or missing required fields",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized - Invalid or expired authentication token",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Email address already exists for another user",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid input data format",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/profile/change-password": {
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Change password for the currently authenticated user. Requires current password verification and enforces password policy. This operation invalidates all existing sessions and requires re-authentication.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Authorization"
],
"summary": "Change user password",
"parameters": [
{
"description": "Password change data including current password and new password",
"name": "password",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/user.ChangePasswordForm"
}
}
],
"responses": {
"200": {
"description": "Password changed successfully - user must re-authenticate",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid request format or password policy violation",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized - Invalid authentication token or incorrect current password",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid password format or policy requirements not met",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/profile/login": {
"post": {
"description": "Authenticate user with username/email and password to obtain access and refresh tokens for web panel administration. This endpoint validates credentials and returns JWT tokens for subsequent API calls.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Authorization"
],
"summary": "Authenticate user login",
"parameters": [
{
"description": "User login credentials including username/email and password",
"name": "login",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/user.LoginForm"
}
}
],
"responses": {
"200": {
"description": "Login successful with access and refresh tokens",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/user.AuthResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid request format or missing fields",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized - Invalid credentials or account locked",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid input data format",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"429": {
"description": "Too many requests - Rate limit exceeded",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/profile/logout": {
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Logout the currently authenticated user by invalidating their access and refresh tokens. This endpoint ensures secure session termination and prevents further use of the user's tokens.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Authorization"
],
"summary": "Logout authenticated user",
"responses": {
"200": {
"description": "Logout successful - all tokens invalidated",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized - Invalid or expired authentication token",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error - Failed to invalidate tokens",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/profile/refresh-token": {
"post": {
"description": "Generate a new access token using a valid refresh token. This endpoint allows clients to obtain fresh access tokens without re-authentication, maintaining session continuity.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Authorization"
],
"summary": "Refresh access token",
"parameters": [
{
"description": "Refresh token for generating new access token",
"name": "refresh",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/user.RefreshTokenForm"
}
}
],
"responses": {
"200": {
"description": "Token refreshed successfully with new access token",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/user.AuthResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid request format",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized - Invalid or expired refresh token",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid token format",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/profile/reset-password": {
"post": {
"description": "Send password reset email to user with reset token. This endpoint validates the email address and sends a secure reset link to the user's registered email address.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Authorization"
],
"summary": "Initiate password reset process",
"parameters": [
{
"description": "Email address for password reset request",
"name": "reset",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/user.ResetPasswordForm"
}
}
],
"responses": {
"200": {
"description": "Password reset email sent successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid request format or email address",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Email address not registered",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid email format",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"429": {
"description": "Too many requests - Rate limit for reset emails exceeded",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error - Failed to send email",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/tender-approvals": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve a paginated list of tender approvals with filtering options",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-TenderApprovals"
],
"summary": "List tender approvals with filters and pagination",
"parameters": [
{
"type": "string",
"description": "Filter by tender ID",
"name": "tender_id",
"in": "query"
},
{
"type": "string",
"description": "Filter by company ID",
"name": "company_id",
"in": "query"
},
{
"type": "array",
"description": "Filter by status",
"name": "status",
"in": "query"
},
{
"type": "array",
"description": "Filter by submission mode",
"name": "submission_mode",
"in": "query"
},
{
"type": "integer",
"description": "Filter by creation date from (Unix timestamp)",
"name": "created_at_from",
"in": "query"
},
{
"type": "integer",
"description": "Filter by creation date to (Unix timestamp)",
"name": "created_at_to",
"in": "query"
},
{
"maximum": 100,
"minimum": 1,
"type": "integer",
"default": 20,
"description": "Number of approvals per page (1-100)",
"name": "limit",
"in": "query"
},
{
"minimum": 0,
"type": "integer",
"default": 0,
"description": "Number of approvals to skip for pagination",
"name": "offset",
"in": "query"
},
{
"enum": [
"created_at",
"updated_at",
"status",
"submission_mode"
],
"type": "string",
"default": "created_at",
"description": "Field to sort by",
"name": "sort_by",
"in": "query"
},
{
"enum": [
"asc",
"desc"
],
"type": "string",
"default": "desc",
"description": "Sort order",
"name": "sort_order",
"in": "query"
}
],
"responses": {
"200": {
"description": "Tender approvals retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender_approval.TenderApprovalListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/tender-approvals/stats": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Get comprehensive tender approval statistics for dashboard",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-TenderApprovals"
],
"summary": "Get tender approval statistics",
"responses": {
"200": {
"description": "Tender approval statistics retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender_approval.TenderApprovalStatsResponse"
}
}
}
]
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/tender-approvals/status/{status}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve tender approvals filtered by their status (submitted, rejected)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-TenderApprovals"
],
"summary": "Get tender approvals by status",
"parameters": [
{
"enum": [
"submitted",
"rejected"
],
"type": "string",
"description": "Tender approval status",
"name": "status",
"in": "path",
"required": true
},
{
"maximum": 100,
"minimum": 1,
"type": "integer",
"default": 20,
"description": "Number of approvals per page (1-100)",
"name": "limit",
"in": "query"
},
{
"minimum": 0,
"type": "integer",
"default": 0,
"description": "Number of approvals to skip for pagination",
"name": "offset",
"in": "query"
}
],
"responses": {
"200": {
"description": "Tender approvals retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/definitions/tender_approval.TenderApprovalResponse"
}
},
"meta": {
"$ref": "#/definitions/response.Meta"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid tender approval status",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/tender-approvals/submission-mode/{submission_mode}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve tender approvals filtered by their submission mode (self-apply, partnership)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-TenderApprovals"
],
"summary": "Get tender approvals by submission mode",
"parameters": [
{
"enum": [
"self-apply",
"partnership"
],
"type": "string",
"description": "Tender approval submission mode",
"name": "submission_mode",
"in": "path",
"required": true
},
{
"maximum": 100,
"minimum": 1,
"type": "integer",
"default": 20,
"description": "Number of approvals per page (1-100)",
"name": "limit",
"in": "query"
},
{
"minimum": 0,
"type": "integer",
"default": 0,
"description": "Number of approvals to skip for pagination",
"name": "offset",
"in": "query"
}
],
"responses": {
"200": {
"description": "Tender approvals retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/definitions/tender_approval.TenderApprovalResponse"
}
},
"meta": {
"$ref": "#/definitions/response.Meta"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid tender approval submission mode",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/tender-approvals/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve detailed tender approval information by ID",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-TenderApprovals"
],
"summary": "Get tender approval by ID",
"parameters": [
{
"type": "string",
"description": "Tender Approval ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Tender approval retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender_approval.TenderApprovalResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid tender approval ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Tender approval not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/users": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "List users with search and filters (admin only)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Users"
],
"summary": "List users",
"parameters": [
{
"type": "string",
"description": "Search term",
"name": "search",
"in": "query"
},
{
"type": "string",
"description": "User status filter",
"name": "status",
"in": "query"
},
{
"type": "string",
"description": "User role filter",
"name": "role",
"in": "query"
},
{
"type": "integer",
"description": "Limit results",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Offset results",
"name": "offset",
"in": "query"
},
{
"type": "string",
"description": "Sort field",
"name": "sort_by",
"in": "query"
},
{
"type": "string",
"description": "Sort order",
"name": "sort_order",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/user.UserListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "Create a new user account with specified role and permissions. This endpoint is restricted to administrators only and allows creation of various user types including admins, managers, and operators with appropriate access levels.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Users"
],
"summary": "Create new user account",
"parameters": [
{
"description": "User creation data including username, email, password, role, and profile information",
"name": "user",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/user.CreateUserForm"
}
}
],
"responses": {
"201": {
"description": "User created successfully with assigned role and permissions",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/user.UserResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data or missing required fields",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized - Invalid or expired authentication token",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"403": {
"description": "Forbidden - Insufficient privileges to create users",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Username or email already exists",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid data format or password policy violation",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/users/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Get user details by ID (admin only)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Users"
],
"summary": "Get user by ID",
"parameters": [
{
"type": "string",
"description": "User ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/user.UserResponse"
}
}
}
]
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update user information (admin only)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Users"
],
"summary": "Update user",
"parameters": [
{
"type": "string",
"description": "User ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "User update data",
"name": "user",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/user.UpdateUserForm"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/user.UserResponse"
}
}
}
]
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"403": {
"description": "Forbidden",
"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 user (admin only)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Users"
],
"summary": "Delete user",
"parameters": [
{
"type": "string",
"description": "User ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"403": {
"description": "Forbidden",
"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/{id}/status": {
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update user account status (admin only)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Users"
],
"summary": "Update user status",
"parameters": [
{
"type": "string",
"description": "User ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Status update data",
"name": "status",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/user.UpdateUserStatusForm"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/companies": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve the profile of the company associated with the authenticated user",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Company"
],
"summary": "Get my company profile",
"responses": {
"200": {
"description": "Company retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company.CompanyProfileResponse"
}
}
}
]
}
},
"401": {
"description": "Unauthorized - User not authenticated",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/feedback": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve paginated list of feedback with optional filtering by various criteria. This endpoint is for public use and filters results based on the authenticated user's company.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Feedback"
],
"summary": "List feedback with filters",
"parameters": [
{
"type": "string",
"description": "Filter by tender ID (MongoDB ObjectID format)",
"name": "tender_id",
"in": "query"
},
{
"type": "string",
"description": "Filter by customer ID (MongoDB ObjectID format)",
"name": "customer_id",
"in": "query"
},
{
"type": "string",
"description": "Filter by company ID (MongoDB ObjectID format)",
"name": "company_id",
"in": "query"
},
{
"enum": [
"like",
"dislike"
],
"type": "string",
"description": "Filter by feedback type",
"name": "feedback_type",
"in": "query"
},
{
"minimum": 0,
"type": "integer",
"format": "int64",
"description": "Filter by creation date from (Unix timestamp in seconds)",
"name": "date_from",
"in": "query"
},
{
"minimum": 0,
"type": "integer",
"format": "int64",
"description": "Filter by creation date to (Unix timestamp in seconds)",
"name": "date_to",
"in": "query"
},
{
"maximum": 100,
"minimum": 1,
"type": "integer",
"description": "Number of items per page (default: 20, max: 100)",
"name": "limit",
"in": "query"
},
{
"minimum": 0,
"type": "integer",
"description": "Number of items to skip for pagination (default: 0)",
"name": "offset",
"in": "query"
}
],
"responses": {
"200": {
"description": "Feedback list retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/feedback.FeedbackListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid query parameters or missing company association",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"422": {
"description": "Validation error - Invalid filter criteria",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"500": {
"description": "Internal server error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
}
}
},
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "Toggle between like and dislike for a tender, or create a like if no feedback exists. This endpoint allows users to express their preference for tenders and automatically handles the toggle logic.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Feedback"
],
"summary": "Toggle feedback for a tender",
"parameters": [
{
"description": "Feedback toggle request containing tender ID",
"name": "feedback",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/feedback.ToggleFeedbackForm"
}
}
],
"responses": {
"200": {
"description": "Feedback toggled successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/feedback.FeedbackResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data or missing customer/company association",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"401": {
"description": "Unauthorized - User not authenticated",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"422": {
"description": "Validation error - Invalid request data format",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"500": {
"description": "Internal server error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
}
}
}
},
"/api/v1/feedback/stats/company": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve comprehensive feedback statistics for the authenticated user's company including total likes, dislikes, and percentage calculations.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Feedback"
],
"summary": "Get company feedback statistics",
"responses": {
"200": {
"description": "Company feedback statistics retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/feedback.CompanyFeedbackStatsResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Missing company association",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"401": {
"description": "Unauthorized - User not authenticated",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"500": {
"description": "Internal server error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
}
}
}
},
"/api/v1/feedback/tender/{tender_id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve feedback details by tender ID. This endpoint provides basic feedback information for public users.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Feedback"
],
"summary": "Get feedback by tender ID",
"parameters": [
{
"maxLength": 24,
"minLength": 24,
"type": "string",
"description": "Tender ID (MongoDB ObjectID format)",
"name": "tender_id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Feedback retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/feedback.FeedbackResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid tender ID format",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"404": {
"description": "Feedback not found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"500": {
"description": "Internal server error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
}
}
}
},
"/api/v1/feedback/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve feedback details by its unique identifier. This endpoint provides basic feedback information for public users.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Feedback"
],
"summary": "Get feedback by ID",
"parameters": [
{
"maxLength": 24,
"minLength": 24,
"type": "string",
"description": "Feedback ID (MongoDB ObjectID format)",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Feedback retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/feedback.FeedbackResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid feedback ID format",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"404": {
"description": "Feedback not found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
},
"500": {
"description": "Internal server error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
}
}
}
}
},
"/api/v1/inquiries": {
"post": {
"description": "Create a new inquiry with contact information for potential business opportunities. This endpoint allows external users to submit inquiries about services or partnerships. Duplicate submissions are prevented based on email and phone number.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Inquiries"
],
"summary": "Create new inquiry",
"parameters": [
{
"description": "Inquiry information including contact details and company information",
"name": "inquiry",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/inquiry.CreateInquiryForm"
}
}
],
"responses": {
"201": {
"description": "Inquiry created successfully with assigned ID and timestamps",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/inquiry.InquiryResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data or missing required fields",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Duplicate inquiry already exists with same email or phone number",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid data format or validation rules not met",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/profile": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve current customer profile information",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Authorization"
],
"summary": "Get customer profile",
"responses": {
"200": {
"description": "Profile retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/customer.CustomerResponse"
}
}
}
]
}
},
"401": {
"description": "Unauthorized - Invalid or missing token",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Customer not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/profile/login": {
"post": {
"description": "Authenticate customer with username (email) and password. Returns access token, refresh token, and customer information upon successful authentication.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Authorization"
],
"summary": "Customer login",
"parameters": [
{
"description": "Login credentials (username/email and password)",
"name": "login",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/customer.LoginForm"
}
}
],
"responses": {
"200": {
"description": "Login successful",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/customer.AuthResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized - Invalid credentials or inactive account",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/profile/logout": {
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Logout customer and invalidate access token",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Authorization"
],
"summary": "Customer logout",
"responses": {
"200": {
"description": "Logout successful",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized - Invalid or missing token",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/profile/refresh-token": {
"post": {
"description": "Refresh access token using a valid refresh token. This allows customers to maintain their session without re-authentication.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Authorization"
],
"summary": "Refresh customer access token",
"parameters": [
{
"description": "Refresh token for generating new access token",
"name": "refresh",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/customer.RefreshTokenForm"
}
}
],
"responses": {
"200": {
"description": "Token refreshed successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/customer.AuthResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid refresh token or feature not implemented",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"401": {
"description": "Unauthorized - Invalid or expired refresh token",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/tender-approvals": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve all tender approvals for a specific company with optional filtering",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"TenderApprovals"
],
"summary": "Get tender approvals by company ID",
"parameters": [
{
"maximum": 100,
"minimum": 1,
"type": "integer",
"default": 20,
"description": "Number of approvals per page (1-100)",
"name": "limit",
"in": "query"
},
{
"minimum": 0,
"type": "integer",
"default": 0,
"description": "Number of approvals to skip for pagination",
"name": "offset",
"in": "query"
},
{
"enum": [
"self-apply",
"partnership"
],
"type": "string",
"description": "Filter by submission mode Enums(self-apply, partnership)",
"name": "submission_mode",
"in": "query"
},
{
"enum": [
"submitted",
"rejected"
],
"type": "string",
"description": "Filter by status Enums(submitted, rejected)",
"name": "status",
"in": "query"
},
{
"type": "integer",
"description": "Filter by created date from (Unix timestamp)",
"name": "created_from",
"in": "query"
},
{
"type": "integer",
"description": "Filter by created date to (Unix timestamp)",
"name": "created_to",
"in": "query"
}
],
"responses": {
"200": {
"description": "Tender approvals retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender_approval.TenderApprovalWithTenderListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid company ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "Create a new tender approval for a company to approve or reject a tender",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"TenderApprovals"
],
"summary": "Create a new tender approval",
"parameters": [
{
"description": "Tender approval information",
"name": "tender_approval",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/tender_approval.CreateTenderApprovalForm"
}
}
],
"responses": {
"201": {
"description": "Tender approval created successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender_approval.TenderApprovalResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Tender approval already exists for this tender and company",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/tender-approvals/stats": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Get comprehensive tender approval statistics for a specific company",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"TenderApprovals"
],
"summary": "Get company tender approval statistics",
"responses": {
"200": {
"description": "Company tender approval statistics retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender_approval.CompanyTenderApprovalStatsResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid company ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/tender-approvals/tender/{tender_id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve tender approval information for a specific tender and company combination",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"TenderApprovals"
],
"summary": "Get tender approval by tender and company",
"parameters": [
{
"type": "string",
"description": "Tender ID",
"name": "tender_id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Tender approval retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender_approval.TenderApprovalResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid tender ID or company ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Tender approval not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/tender-approvals/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve detailed tender approval information by ID",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"TenderApprovals"
],
"summary": "Get tender approval by ID",
"parameters": [
{
"type": "string",
"description": "Tender Approval ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Tender approval retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/tender_approval.TenderApprovalResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid tender approval ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Tender approval not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/tenders": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve active tenders for mobile application users with automatic company-based matching from customer profile",
"produces": [
"application/json"
],
"tags": [
"Tenders"
],
"summary": "Get public tenders",
"parameters": [
{
"type": "integer",
"description": "Number of items per page (default: 20, max: 50)",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Number of items to skip (default: 0)",
"name": "offset",
"in": "query"
},
{
"type": "string",
"description": "Filter by country code",
"name": "country_code",
"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": "number",
"description": "Publication from",
"name": "publication_from",
"in": "query"
},
{
"type": "number",
"description": "Publication to",
"name": "publication_to",
"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"
}
}
}
}
},
"/api/v1/tenders/details/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve detailed information about a specific tender for mobile application users",
"produces": [
"application/json"
],
"tags": [
"Tenders"
],
"summary": "Get public tender details",
"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": {
"type": "object",
"additionalProperties": true
}
}
}
]
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/api/v1/tenders/recommend": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve active tenders for mobile application users with automatic company-based matching from customer profile",
"produces": [
"application/json"
],
"tags": [
"Tenders"
],
"summary": "Get public tenders",
"parameters": [
{
"type": "integer",
"description": "Number of items per page (default: 20, max: 50)",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Number of items to skip (default: 0)",
"name": "offset",
"in": "query"
},
{
"type": "string",
"description": "Filter by country code",
"name": "country_code",
"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": "number",
"description": "Publication from",
"name": "publication_from",
"in": "query"
},
{
"type": "number",
"description": "Publication to",
"name": "publication_to",
"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"
}
}
}
}
}
},
"definitions": {
"bootstrap.HealthResponse": {
"type": "object",
"properties": {
"service": {
"description": "Service name",
"type": "string",
"example": "tender-management-api"
},
"status": {
"description": "Current health status",
"type": "string",
"example": "healthy"
},
"time": {
"description": "Current Unix timestamp",
"type": "integer",
"example": 1699123456
},
"uptime": {
"description": "Service uptime duration",
"type": "string",
"example": "24h30m15s"
},
"version": {
"description": "API version",
"type": "string",
"example": "2.0.0"
}
}
},
"company.Address": {
"type": "object",
"properties": {
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"state": {
"type": "string"
},
"street": {
"type": "string"
}
}
},
"company.AddressForm": {
"type": "object",
"properties": {
"city": {
"type": "string",
"example": "New York"
},
"country": {
"type": "string",
"example": "US"
},
"postal_code": {
"type": "string",
"example": "10001"
},
"state": {
"type": "string",
"example": "NY"
},
"street": {
"type": "string",
"example": "123 Main St"
}
}
},
"company.CategoryResponse": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"company.CompanyForm": {
"type": "object",
"properties": {
"address": {
"description": "Address information",
"allOf": [
{
"$ref": "#/definitions/company.AddressForm"
}
]
},
"annual_revenue": {
"type": "number",
"example": 1000000
},
"currency": {
"type": "string",
"example": "USD"
},
"description": {
"type": "string",
"example": "Opplens is a technology company"
},
"email": {
"type": "string",
"example": "info@opplens.com"
},
"employee_count": {
"description": "Business information",
"type": "integer",
"example": 100
},
"founded_year": {
"type": "integer",
"example": 2020
},
"industry": {
"type": "string",
"example": "Technology"
},
"language": {
"description": "Settings",
"type": "string",
"example": "en"
},
"name": {
"type": "string",
"example": "Opplens"
},
"phone": {
"description": "Contact information",
"type": "string",
"example": "+1234567890"
},
"registration_number": {
"type": "string",
"example": "1234567890"
},
"tags": {
"description": "Tags for categorization and search",
"allOf": [
{
"$ref": "#/definitions/company.CompanyTagsForm"
}
]
},
"tax_id": {
"type": "string",
"example": "1234567890"
},
"timezone": {
"type": "string",
"example": "UTC"
},
"type": {
"type": "string",
"example": "private"
},
"website": {
"type": "string",
"example": "https://opplens.com"
}
}
},
"company.CompanyListResponse": {
"type": "object",
"properties": {
"companies": {
"type": "array",
"items": {
"$ref": "#/definitions/company.CompanyResponse"
}
}
}
},
"company.CompanyProfileResponse": {
"type": "object",
"properties": {
"created_at": {
"type": "integer"
},
"founded_year": {
"type": "integer"
},
"id": {
"type": "string"
},
"industry": {
"type": "string"
},
"name": {
"type": "string"
},
"registration_number": {
"type": "string"
}
}
},
"company.CompanyResponse": {
"type": "object",
"properties": {
"address": {
"$ref": "#/definitions/company.Address"
},
"annual_revenue": {
"type": "number"
},
"compliance_notes": {
"type": "string"
},
"created_at": {
"type": "integer"
},
"currency": {
"type": "string"
},
"description": {
"type": "string"
},
"email": {
"type": "string"
},
"employee_count": {
"type": "integer"
},
"founded_year": {
"type": "integer"
},
"id": {
"type": "string"
},
"industry": {
"type": "string"
},
"is_compliant": {
"type": "boolean"
},
"is_verified": {
"type": "boolean"
},
"language": {
"type": "string"
},
"name": {
"type": "string"
},
"phone": {
"type": "string"
},
"registration_number": {
"type": "string"
},
"status": {
"type": "string"
},
"tags": {
"$ref": "#/definitions/company.CompanyTagsResponse"
},
"tax_id": {
"type": "string"
},
"timezone": {
"type": "string"
},
"type": {
"type": "string"
},
"updated_at": {
"type": "integer"
},
"website": {
"type": "string"
}
}
},
"company.CompanyTagsForm": {
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"type": "string"
},
"example": [
"Technology"
]
},
"certifications": {
"type": "array",
"items": {
"type": "string"
},
"example": [
"Opplens"
]
},
"cpv_codes": {
"type": "array",
"items": {
"type": "string"
},
"example": [
"1234567890"
]
},
"keywords": {
"type": "array",
"items": {
"type": "string"
},
"example": [
"Opplens"
]
},
"specializations": {
"type": "array",
"items": {
"type": "string"
},
"example": [
"Opplens"
]
}
}
},
"company.CompanyTagsResponse": {
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"$ref": "#/definitions/company.CategoryResponse"
}
},
"certifications": {
"type": "array",
"items": {
"type": "string"
}
},
"cpv_codes": {
"type": "array",
"items": {
"type": "string"
}
},
"keywords": {
"type": "array",
"items": {
"type": "string"
}
},
"specializations": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"company.StatusForm": {
"type": "object",
"properties": {
"reason": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"company.VerificationForm": {
"type": "object",
"properties": {
"compliance_notes": {
"type": "string"
},
"is_compliant": {
"type": "boolean"
},
"is_verified": {
"type": "boolean"
}
}
},
"company_category.CategoryForm": {
"type": "object",
"properties": {
"description": {
"type": "string",
"example": "Technology related companies"
},
"name": {
"type": "string",
"example": "Technology"
},
"thumbnail": {
"type": "string",
"example": "https://example.com/thumbnail.jpg"
}
}
},
"company_category.CategoryListResponse": {
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"$ref": "#/definitions/company_category.CategoryResponse"
}
}
}
},
"company_category.CategoryResponse": {
"type": "object",
"properties": {
"created_at": {
"type": "integer"
},
"description": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"published": {
"type": "boolean"
},
"published_at": {
"type": "integer"
},
"thumbnail": {
"type": "string"
},
"updated_at": {
"type": "integer"
}
}
},
"customer.AuthResponse": {
"type": "object",
"properties": {
"access_token": {
"type": "string"
},
"customer": {
"$ref": "#/definitions/customer.CustomerResponse"
},
"expires_at": {
"type": "integer"
},
"refresh_token": {
"type": "string"
}
}
},
"customer.CompanySummary": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"customer.CreateCustomerForm": {
"type": "object",
"properties": {
"company_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"email": {
"type": "string",
"example": "user@opplens.com"
},
"full_name": {
"type": "string",
"example": "User"
},
"password": {
"type": "string",
"example": "User!1234"
},
"phone": {
"type": "string",
"example": "+1234567890"
},
"type": {
"type": "string",
"example": "individual"
},
"username": {
"type": "string",
"example": "user"
}
}
},
"customer.CustomerListResponse": {
"type": "object",
"properties": {
"customers": {
"type": "array",
"items": {
"$ref": "#/definitions/customer.CustomerResponse"
}
}
}
},
"customer.CustomerResponse": {
"type": "object",
"properties": {
"companies": {
"type": "array",
"items": {
"$ref": "#/definitions/customer.CompanySummary"
}
},
"companyIDs": {
"type": "array",
"items": {
"type": "string"
}
},
"createdAt": {
"type": "integer"
},
"email": {
"type": "string"
},
"fullName": {
"type": "string"
},
"id": {
"type": "string"
},
"lastLoginAt": {
"type": "integer"
},
"password": {
"type": "string"
},
"phone": {
"type": "string"
},
"status": {
"type": "string"
},
"type": {
"type": "string"
},
"updatedAt": {
"type": "integer"
},
"username": {
"type": "string"
}
}
},
"customer.LoginForm": {
"type": "object",
"properties": {
"password": {
"type": "string",
"example": "App!1234"
},
"username": {
"type": "string",
"example": "app"
}
}
},
"customer.RefreshTokenForm": {
"type": "object",
"properties": {
"refresh_token": {
"type": "string"
}
}
},
"customer.UpdateCustomerForm": {
"type": "object",
"properties": {
"company_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"email": {
"type": "string",
"example": "user@opplens.com"
},
"full_name": {
"type": "string",
"example": "User"
},
"password": {
"type": "string",
"example": "User!1234"
},
"phone": {
"type": "string",
"example": "+1234567890"
},
"type": {
"type": "string",
"example": "individual"
},
"username": {
"type": "string",
"example": "user"
}
}
},
"customer.UpdateStatusForm": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"example": "Customer is active"
},
"status": {
"type": "string",
"example": "active"
}
}
},
"feedback.CompanyFeedbackStatsResponse": {
"type": "object",
"properties": {
"company_id": {
"type": "string"
},
"last_updated": {
"description": "Unix timestamp",
"type": "integer"
},
"total_dislikes": {
"type": "integer"
},
"total_feedback": {
"type": "integer"
},
"total_likes": {
"type": "integer"
}
}
},
"feedback.FeedbackListResponse": {
"type": "object",
"properties": {
"feedback": {
"type": "array",
"items": {
"$ref": "#/definitions/feedback.FeedbackResponse"
}
},
"meta": {
"$ref": "#/definitions/response.Meta"
}
}
},
"feedback.FeedbackResponse": {
"type": "object",
"properties": {
"company_id": {
"type": "string"
},
"created_at": {
"type": "integer"
},
"customer_id": {
"type": "string"
},
"feedback_type": {
"$ref": "#/definitions/feedback.FeedbackType"
},
"id": {
"type": "string"
},
"tender": {
"type": "string"
},
"updated_at": {
"type": "integer"
}
}
},
"feedback.FeedbackType": {
"type": "string",
"enum": [
"like",
"dislike"
],
"x-enum-varnames": [
"FeedbackTypeLike",
"FeedbackTypeDislike"
]
},
"feedback.ToggleFeedbackForm": {
"type": "object",
"required": [
"feedback_type",
"tender_id"
],
"properties": {
"feedback_type": {
"enum": [
"like",
"dislike"
],
"allOf": [
{
"$ref": "#/definitions/feedback.FeedbackType"
}
]
},
"tender_id": {
"type": "string"
}
}
},
"inquiry.CreateInquiryForm": {
"type": "object",
"properties": {
"company_name": {
"description": "Company name",
"type": "string",
"example": "Opplens"
},
"full_name": {
"description": "Full name of the inquirer",
"type": "string",
"example": "John Doe"
},
"phone_number": {
"description": "Phone number",
"type": "string",
"example": "+1234567890"
},
"work_email": {
"description": "Work email address",
"type": "string",
"example": "info@opplens.com"
}
}
},
"inquiry.InquiryListResponse": {
"type": "object",
"properties": {
"inquiries": {
"type": "array",
"items": {
"$ref": "#/definitions/inquiry.InquiryResponse"
}
},
"meta": {
"$ref": "#/definitions/response.Meta"
}
}
},
"inquiry.InquiryResponse": {
"type": "object",
"properties": {
"company_name": {
"type": "string"
},
"created_at": {
"type": "integer"
},
"full_name": {
"type": "string"
},
"id": {
"type": "string"
},
"phone_number": {
"type": "string"
},
"status": {
"type": "string"
},
"status_history": {
"type": "array",
"items": {
"$ref": "#/definitions/inquiry.StatusHistoryResponse"
}
},
"updated_at": {
"type": "integer"
},
"work_email": {
"type": "string"
}
}
},
"inquiry.StatusHistoryResponse": {
"type": "object",
"properties": {
"changed_at": {
"type": "integer"
},
"description": {
"type": "string"
},
"reason": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"inquiry.UpdateInquiryStatusForm": {
"type": "object",
"properties": {
"description": {
"description": "Optional description",
"type": "string",
"example": "Additional notes about the review"
},
"reason": {
"description": "Reason for status change",
"type": "string",
"example": "Initial review completed"
},
"status": {
"description": "New status",
"type": "string",
"example": "reviewed"
}
}
},
"response.APIError": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"details": {
"type": "string"
},
"message": {
"type": "string"
}
}
},
"response.APIResponse": {
"type": "object",
"properties": {
"data": {},
"error": {
"$ref": "#/definitions/response.APIError"
},
"message": {
"type": "string"
},
"meta": {
"$ref": "#/definitions/response.Meta"
},
"success": {
"type": "boolean"
}
}
},
"response.Meta": {
"type": "object",
"properties": {
"limit": {
"type": "integer"
},
"offset": {
"type": "integer"
},
"page": {
"type": "integer"
},
"pages": {
"type": "integer"
},
"total": {
"type": "integer"
}
}
},
"tender.OrganizationResponse": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
}
},
"tender.TenderResponse": {
"type": "object",
"properties": {
"application_deadline": {
"type": "integer"
},
"buyer_organization": {
"$ref": "#/definitions/tender.OrganizationResponse"
},
"country_code": {
"type": "string"
},
"currency": {
"type": "string"
},
"description": {
"type": "string"
},
"duration": {
"type": "string"
},
"duration_unit": {
"type": "string"
},
"estimated_value": {
"type": "number"
},
"id": {
"type": "string"
},
"notice_publication_id": {
"type": "string"
},
"procedure_code": {
"type": "string"
},
"procurement_type_code": {
"type": "string"
},
"publication_date": {
"type": "integer"
},
"status": {
"$ref": "#/definitions/tender.TenderStatus"
},
"submission_deadline": {
"type": "integer"
},
"submission_url": {
"type": "string"
},
"tender_deadline": {
"type": "integer"
},
"tender_id": {
"type": "string"
},
"title": {
"type": "string"
}
}
},
"tender.TenderStatus": {
"type": "string",
"enum": [
"active",
"expired",
"cancelled",
"awarded",
"draft"
],
"x-enum-varnames": [
"TenderStatusActive",
"TenderStatusExpired",
"TenderStatusCancelled",
"TenderStatusAwarded",
"TenderStatusDraft"
]
},
"tender.UpdateTenderRequest": {
"type": "object",
"properties": {
"currency": {
"type": "string"
},
"description": {
"type": "string"
},
"estimated_value": {
"type": "number"
},
"id": {
"type": "string"
},
"status": {
"$ref": "#/definitions/tender.TenderStatus"
},
"tender_deadline": {
"description": "Unix milliseconds",
"type": "integer"
},
"title": {
"type": "string"
}
}
},
"tender_approval.ApprovalStatus": {
"type": "string",
"enum": [
"submitted",
"rejected"
],
"x-enum-comments": {
"ApprovalStatusRejected": "Company rejected the tender",
"ApprovalStatusSubmitted": "Company submitted the tender"
},
"x-enum-descriptions": [
"Company submitted the tender",
"Company rejected the tender"
],
"x-enum-varnames": [
"ApprovalStatusSubmitted",
"ApprovalStatusRejected"
]
},
"tender_approval.CompanyTenderApprovalStatsResponse": {
"type": "object",
"properties": {
"company_id": {
"type": "string"
},
"last_updated": {
"type": "integer"
},
"partnership_count": {
"type": "integer"
},
"rejected_tenders": {
"type": "integer"
},
"self_apply_count": {
"type": "integer"
},
"submitted_tenders": {
"type": "integer"
},
"total_approvals": {
"type": "integer"
}
}
},
"tender_approval.CreateTenderApprovalForm": {
"type": "object",
"properties": {
"status": {
"$ref": "#/definitions/tender_approval.ApprovalStatus"
},
"submission_mode": {
"$ref": "#/definitions/tender_approval.SubmissionMode"
},
"tender_id": {
"type": "string"
}
}
},
"tender_approval.OrganizationResponse": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
}
},
"tender_approval.SubmissionMode": {
"type": "string",
"enum": [
"self-apply",
"partnership"
],
"x-enum-comments": {
"SubmissionModePartnership": "Company applies for the tender with a partner",
"SubmissionModeSelfApply": "Company applies for the tender on their own"
},
"x-enum-descriptions": [
"Company applies for the tender on their own",
"Company applies for the tender with a partner"
],
"x-enum-varnames": [
"SubmissionModeSelfApply",
"SubmissionModePartnership"
]
},
"tender_approval.TenderApprovalListResponse": {
"type": "object",
"properties": {
"limit": {
"type": "integer"
},
"offset": {
"type": "integer"
},
"tender_approvals": {
"type": "array",
"items": {
"$ref": "#/definitions/tender_approval.TenderApprovalResponse"
}
},
"total": {
"type": "integer"
},
"total_pages": {
"type": "integer"
}
}
},
"tender_approval.TenderApprovalResponse": {
"type": "object",
"properties": {
"company_id": {
"type": "string"
},
"created_at": {
"type": "integer"
},
"id": {
"type": "string"
},
"status": {
"type": "string"
},
"submission_mode": {
"type": "string"
},
"tender_id": {
"type": "string"
}
}
},
"tender_approval.TenderApprovalStatsResponse": {
"type": "object",
"properties": {
"last_updated": {
"type": "integer"
},
"rejected_tenders": {
"type": "integer"
},
"submitted_tenders": {
"type": "integer"
},
"total_approvals": {
"type": "integer"
}
}
},
"tender_approval.TenderApprovalWithTenderListResponse": {
"type": "object",
"properties": {
"metadata": {
"$ref": "#/definitions/response.Meta"
},
"tenders": {
"type": "array",
"items": {
"$ref": "#/definitions/tender_approval.TenderApprovalWithTenderResponse"
}
}
}
},
"tender_approval.TenderApprovalWithTenderResponse": {
"type": "object",
"properties": {
"company_id": {
"type": "string"
},
"created_at": {
"type": "integer"
},
"id": {
"type": "string"
},
"status": {
"type": "string"
},
"submission_mode": {
"type": "string"
},
"tender": {
"$ref": "#/definitions/tender_approval.TenderDetails"
},
"tender_id": {
"type": "string"
}
}
},
"tender_approval.TenderDetails": {
"type": "object",
"properties": {
"buyer_organization": {
"$ref": "#/definitions/tender_approval.OrganizationResponse"
},
"country_code": {
"type": "string"
},
"currency": {
"type": "string"
},
"description": {
"type": "string"
},
"duration": {
"type": "string"
},
"duration_unit": {
"type": "string"
},
"estimated_value": {
"type": "number"
},
"id": {
"type": "string"
},
"notice_publication_id": {
"type": "string"
},
"procedure_code": {
"type": "string"
},
"procurement_type_code": {
"type": "string"
},
"publication_date": {
"type": "integer"
},
"status": {
"type": "string"
},
"submission_deadline": {
"type": "integer"
},
"tender_deadline": {
"type": "integer"
},
"title": {
"type": "string"
}
}
},
"user.AuthResponse": {
"type": "object",
"properties": {
"access_token": {
"type": "string"
},
"expires_at": {
"type": "integer"
},
"refresh_token": {
"type": "string"
},
"user": {
"$ref": "#/definitions/user.UserResponse"
}
}
},
"user.ChangePasswordForm": {
"type": "object",
"properties": {
"new_password": {
"description": "New password (minimum 8 characters)",
"type": "string",
"example": "NewAdmin!1234"
},
"old_password": {
"description": "Current password for verification",
"type": "string",
"example": "Admin!1234"
}
}
},
"user.CreateUserForm": {
"type": "object",
"properties": {
"department": {
"description": "Optional department name",
"type": "string",
"example": "Information Technology"
},
"email": {
"description": "Valid email address",
"type": "string",
"example": "admin@opplens.com"
},
"full_name": {
"description": "Full name of the user",
"type": "string",
"example": "Admin User"
},
"password": {
"description": "Password (minimum 8 characters)",
"type": "string",
"example": "Admin!1234"
},
"phone": {
"description": "Optional phone number",
"type": "string",
"example": "+18289784438"
},
"position": {
"description": "Optional job position",
"type": "string",
"example": "Lead"
},
"profile_image": {
"description": "Optional profile image URL",
"type": "string",
"example": ""
},
"role": {
"description": "User role (admin, manager, operator, viewer)",
"type": "string",
"example": "admin"
},
"username": {
"description": "Unique username (alphanumeric only)",
"type": "string",
"example": "admin"
}
}
},
"user.LoginForm": {
"type": "object",
"properties": {
"password": {
"description": "User password",
"type": "string",
"example": "Admin!1234"
},
"username": {
"description": "Username or email address",
"type": "string",
"example": "admin"
}
}
},
"user.RefreshTokenForm": {
"type": "object",
"properties": {
"refresh_token": {
"description": "Valid refresh token",
"type": "string",
"example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
},
"user.ResetPasswordForm": {
"type": "object",
"properties": {
"email": {
"description": "Email address for password reset",
"type": "string",
"example": "admin@opplens.com"
}
}
},
"user.UpdateUserForm": {
"type": "object",
"properties": {
"department": {
"description": "Updated department",
"type": "string",
"example": "Information Technology"
},
"email": {
"description": "Updated email address",
"type": "string",
"example": "admin@opplens.com"
},
"full_name": {
"description": "Updated full name",
"type": "string",
"example": "Admin User"
},
"phone": {
"description": "Updated phone number",
"type": "string",
"example": "+18289784438"
},
"position": {
"description": "Updated position",
"type": "string",
"example": "Lead"
},
"profile_image": {
"description": "Updated profile image URL",
"type": "string",
"example": ""
},
"role": {
"description": "Updated user role",
"type": "string",
"example": "admin"
},
"username": {
"description": "Updated username",
"type": "string",
"example": "admin"
}
}
},
"user.UpdateUserStatusForm": {
"type": "object",
"properties": {
"status": {
"type": "string"
}
}
},
"user.UserListResponse": {
"type": "object",
"properties": {
"users": {
"type": "array",
"items": {
"$ref": "#/definitions/user.UserResponse"
}
}
}
},
"user.UserResponse": {
"type": "object",
"properties": {
"created_at": {
"type": "integer"
},
"department": {
"type": "string"
},
"email": {
"type": "string"
},
"full_name": {
"type": "string"
},
"id": {
"type": "string"
},
"is_verified": {
"type": "boolean"
},
"last_login_at": {
"type": "integer"
},
"phone": {
"type": "string"
},
"position": {
"type": "string"
},
"profile_image": {
"type": "string"
},
"role": {
"type": "string"
},
"status": {
"type": "string"
},
"updated_at": {
"type": "integer"
},
"username": {
"type": "string"
}
}
}
},
"securityDefinitions": {
"BearerAuth": {
"description": "Type \"Bearer\" followed by a space and JWT token. Example: \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"",
"type": "apiKey",
"name": "Authorization",
"in": "header"
}
},
"tags": [
{
"description": "System health check operations for monitoring application status and dependencies",
"name": "Admin-Health"
},
{
"description": "User authentication and authorization operations including login, logout, token refresh, and password management for web panel administration",
"name": "Admin-Authorization"
},
{
"description": "Administrative user management operations including CRUD operations, role management, status updates, and profile management for web panel administrators",
"name": "Admin-Users"
},
{
"description": "Administrative customer management operations for web panel including CRUD operations, company assignment, verification, status management, and comprehensive filtering with pagination",
"name": "Admin-Customers"
},
{
"description": "Administrative company management operations for web panel including CRUD operations, tag management, verification, status updates, comprehensive search and filtering, and statistical reporting",
"name": "Admin-Companies"
},
{
"description": "Administrative company category management operations for web panel including CRUD operations, publish/unpublish status, and comprehensive filtering with pagination",
"name": "Admin-Company-Categories"
},
{
"description": "Administrative tender management operations for web panel including CRUD operations, search, statistics, and comprehensive filtering with pagination",
"name": "Admin-Tenders"
},
{
"description": "Administrative feedback management operations for web panel including CRUD operations, search, statistics, and comprehensive filtering with pagination",
"name": "Admin-Feedback"
},
{
"description": "Administrative tender approval management operations for web panel including CRUD operations, search, statistics, and comprehensive filtering with pagination",
"name": "Admin-TenderApprovals"
},
{
"description": "Administrative inquiry management operations for web panel including CRUD operations, search, statistics, and comprehensive filtering with pagination",
"name": "Admin-Inquiries"
},
{
"description": "Customer authentication and authorization operations for mobile application including login, logout, token refresh, and profile access",
"name": "Authorization"
},
{
"description": "Company information access for mobile application including company profile and company tenders",
"name": "Company"
},
{
"description": "Public tender information access for mobile application including active tender listings and detailed tender information",
"name": "Tenders"
},
{
"description": "Public feedback management operations for mobile application including like, dislike, and comment on tenders",
"name": "Feedback"
},
{
"description": "Public tender approval management operations for mobile application including tender approval listing and detailed tender approval information",
"name": "TenderApprovals"
},
{
"description": "Public inquiry management operations for mobile application including inquiry submission and inquiry listing",
"name": "Inquiries"
}
]
}`
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = &swag.Spec{
Version: "2.0.0",
Host: "localhost:8082",
BasePath: "/",
Schemes: []string{},
Title: "Tender Management API",
Description: "This is a comprehensive API for the Tender Management System built with Clean Architecture principles and Domain-Driven Design (DDD) patterns. The API provides endpoints for user management, customer management, company management, and authentication for both web panel administration and mobile application access.",
InfoInstanceName: "swagger",
SwaggerTemplate: docTemplate,
LeftDelim: "{{",
RightDelim: "}}",
}
func init() {
swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)
}