basePath: / definitions: company.AddTagsForm: properties: categories: items: type: string type: array certifications: items: type: string type: array cpv_codes: items: type: string type: array keywords: items: type: string type: array specializations: items: type: string type: array type: object company.Address: properties: city: type: string country: type: string postal_code: type: string state: type: string street: type: string type: object company.AddressForm: properties: city: type: string country: type: string postal_code: type: string state: type: string street: type: string type: object company.CPVCodeCount: properties: count: type: integer cpv_code: type: string type: object company.CategoryCount: properties: category: type: string count: type: integer type: object company.CompanyListResponse: properties: companies: items: $ref: '#/definitions/company.CompanyResponse' type: array limit: type: integer offset: type: integer total: type: integer total_pages: type: integer type: object company.CompanyProfileResponse: properties: country: type: string created_at: type: integer founded_year: type: integer id: type: string industry: type: string name: type: string registration_number: type: string type: object company.CompanyResponse: properties: address: $ref: '#/definitions/company.Address' annual_revenue: type: number compliance_notes: type: string contact_person: $ref: '#/definitions/company.ContactPerson' created_at: type: integer created_by: type: string 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.CompanyTags' tax_id: type: string timezone: type: string type: type: string updated_at: type: integer updated_by: type: string website: type: string type: object company.CompanyStatsResponse: properties: active_companies: type: integer companies_by_industry: additionalProperties: format: int64 type: integer type: object companies_by_status: additionalProperties: format: int64 type: integer type: object companies_by_type: additionalProperties: format: int64 type: integer type: object top_categories: items: $ref: '#/definitions/company.CategoryCount' type: array top_cpv_codes: items: $ref: '#/definitions/company.CPVCodeCount' type: array total_companies: type: integer verified_companies: type: integer type: object company.CompanyTags: properties: categories: description: Categories items: type: string type: array certifications: description: Certifications items: type: string type: array cpv_codes: description: CPV codes (Common Procurement Vocabulary) items: type: string type: array keywords: description: Keywords for search and matching items: type: string type: array specializations: description: Specializations items: type: string type: array type: object company.CompanyTagsForm: properties: categories: items: type: string type: array certifications: items: type: string type: array cpv_codes: items: type: string type: array keywords: items: type: string type: array specializations: items: type: string type: array type: object company.ContactPerson: properties: email: type: string first_name: type: string full_name: type: string is_primary: type: boolean last_name: type: string mobile: type: string phone: type: string position: type: string type: object company.ContactPersonForm: properties: email: type: string first_name: type: string full_name: type: string is_primary: type: boolean last_name: type: string mobile: type: string phone: type: string position: type: string type: object company.CreateCompanyForm: properties: address: allOf: - $ref: '#/definitions/company.AddressForm' description: Address information annual_revenue: type: number contact_person: allOf: - $ref: '#/definitions/company.ContactPersonForm' description: Contact information currency: type: string description: type: string email: type: string employee_count: description: Business information type: integer founded_year: type: integer industry: type: string language: description: Settings type: string name: type: string phone: type: string registration_number: type: string tags: allOf: - $ref: '#/definitions/company.CompanyTagsForm' description: Tags for categorization and search tax_id: type: string timezone: type: string type: type: string website: type: string type: object company.RemoveTagsForm: properties: categories: items: type: string type: array certifications: items: type: string type: array cpv_codes: items: type: string type: array keywords: items: type: string type: array specializations: items: type: string type: array type: object company.SuspendCompanyForm: properties: reason: type: string type: object company.UpdateCompanyForm: properties: address: allOf: - $ref: '#/definitions/company.AddressForm' description: Address information annual_revenue: type: number contact_person: allOf: - $ref: '#/definitions/company.ContactPersonForm' description: Contact information currency: type: string description: type: string email: type: string employee_count: description: Business information type: integer founded_year: type: integer industry: type: string language: description: Settings type: string name: type: string phone: type: string registration_number: type: string tags: allOf: - $ref: '#/definitions/company.CompanyTagsForm' description: Tags for categorization and search tax_id: type: string timezone: type: string type: type: string website: type: string type: object company.UpdateCompanyStatusForm: properties: status: type: string type: object company.UpdateCompanyTagsForm: properties: tags: $ref: '#/definitions/company.CompanyTagsForm' type: object company.UpdateCompanyVerificationForm: properties: compliance_notes: type: string is_compliant: type: boolean is_verified: type: boolean type: object customer.Address: properties: address_type: description: billing, shipping, etc. type: string city: type: string country: type: string is_default: type: boolean postal_code: type: string state: type: string street: type: string type: object customer.AddressForm: properties: address_type: type: string city: type: string country: type: string is_default: type: boolean postal_code: type: string state: type: string street: type: string type: object customer.AssignCompaniesForm: properties: company_ids: items: type: string type: array type: object customer.AuthResponse: properties: access_token: type: string customer: $ref: '#/definitions/customer.CustomerResponse' expires_at: type: integer refresh_token: type: string type: object customer.CompanySummary: properties: id: type: string name: type: string type: object customer.ContactPerson: properties: email: type: string first_name: type: string full_name: type: string is_primary: type: boolean last_name: type: string mobile: type: string phone: type: string position: type: string type: object customer.ContactPersonForm: properties: email: type: string first_name: type: string full_name: type: string is_primary: type: boolean last_name: type: string mobile: type: string phone: type: string position: type: string type: object customer.CreateCustomerForm: properties: address: allOf: - $ref: '#/definitions/customer.AddressForm' description: Address information annual_revenue: type: number business_type: description: Business information type: string company_ids: description: Company assignments items: type: string type: array contact_person: allOf: - $ref: '#/definitions/customer.ContactPersonForm' description: Contact person (for company customers) currency: type: string email: type: string employee_count: type: integer first_name: description: Individual customer fields type: string founded_year: type: integer full_name: type: string industry: type: string language: description: Preferences and settings type: string last_name: type: string mobile: type: string password: type: string phone: type: string registration_number: description: Company customer fields type: string tax_id: type: string timezone: type: string type: type: string username: type: string type: object customer.CustomerListResponse: properties: customers: items: $ref: '#/definitions/customer.CustomerResponse' type: array limit: type: integer offset: type: integer total: type: integer total_pages: type: integer type: object customer.CustomerResponse: properties: address: $ref: '#/definitions/customer.Address' annual_revenue: type: number business_type: type: string companies: description: Company relationships items: $ref: '#/definitions/customer.CompanySummary' type: array compliance_notes: type: string contact_person: $ref: '#/definitions/customer.ContactPerson' created_at: type: integer created_by: type: string currency: type: string email: type: string employee_count: type: integer first_name: type: string founded_year: type: integer full_name: type: string id: type: string industry: type: string is_compliant: type: boolean is_verified: type: boolean language: type: string last_name: type: string mobile: type: string phone: type: string registration_number: description: Company customer fields type: string status: type: string tax_id: type: string timezone: type: string type: type: string updated_at: type: integer updated_by: type: string username: type: string type: object customer.LoginForm: properties: password: example: Nima.1998 type: string username: example: nakhostin type: string type: object customer.RefreshTokenForm: properties: refresh_token: type: string type: object customer.RemoveCompaniesForm: properties: company_ids: items: type: string type: array type: object customer.SuspendCustomerForm: properties: reason: type: string type: object customer.UpdateCustomerForm: properties: address: allOf: - $ref: '#/definitions/customer.AddressForm' description: Address information annual_revenue: type: number business_type: description: Business information type: string company_ids: description: Company assignments items: type: string type: array company_name: description: Company customer fields type: string contact_person: allOf: - $ref: '#/definitions/customer.ContactPersonForm' description: Contact person (for company customers) currency: type: string email: type: string employee_count: type: integer first_name: description: Individual customer fields type: string founded_year: type: integer full_name: type: string industry: type: string language: description: Preferences and settings type: string last_name: type: string mobile: type: string phone: type: string registration_number: type: string tax_id: type: string timezone: type: string type: type: string username: type: string type: object customer.UpdateCustomerStatusForm: properties: status: type: string type: object customer.UpdateCustomerVerificationForm: properties: compliance_notes: type: string is_compliant: type: boolean is_verified: type: boolean type: object feedback.FeedbackListResponse: properties: feedback: items: $ref: '#/definitions/feedback.FeedbackResponse' type: array meta: $ref: '#/definitions/response.Meta' type: object feedback.FeedbackResponse: 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 type: object feedback.FeedbackType: enum: - like - dislike type: string x-enum-varnames: - FeedbackTypeLike - FeedbackTypeDislike feedback.ToggleFeedbackForm: properties: feedback_type: allOf: - $ref: '#/definitions/feedback.FeedbackType' enum: - like - dislike tender_id: type: string required: - feedback_type - tender_id type: object main.HealthResponse: properties: service: description: Service name example: tender-management-api type: string status: description: Current health status example: healthy type: string time: description: Current Unix timestamp example: 1699123456 type: integer uptime: description: Service uptime duration example: 24h30m15s type: string version: description: API version example: 2.0.0 type: string type: object response.APIError: properties: code: type: string details: type: string message: type: string type: object response.APIResponse: properties: data: {} error: $ref: '#/definitions/response.APIError' message: type: string meta: $ref: '#/definitions/response.Meta' success: type: boolean type: object response.Meta: properties: limit: type: integer offset: type: integer page: type: integer pages: type: integer total: type: integer type: object tender.OrganizationResponse: properties: name: type: string type: object tender.TenderResponse: properties: 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 tender_deadline: type: integer title: type: string type: object tender.TenderStatus: enum: - active - expired - cancelled - awarded - draft type: string x-enum-varnames: - TenderStatusActive - TenderStatusExpired - TenderStatusCancelled - TenderStatusAwarded - TenderStatusDraft tender.UpdateTenderRequest: 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 type: object tender_approval.ApprovalStatus: enum: - approved - rejected type: string x-enum-comments: ApprovalStatusApproved: Company approved the tender ApprovalStatusRejected: Company rejected the tender x-enum-descriptions: - Company approved the tender - Company rejected the tender x-enum-varnames: - ApprovalStatusApproved - ApprovalStatusRejected tender_approval.CompanyTenderApprovalStatsResponse: properties: approvals_by_status: additionalProperties: format: int64 type: integer type: object approvals_by_submission: additionalProperties: format: int64 type: integer type: object approved_tenders: type: integer company_id: type: string last_updated: type: integer partnership_count: type: integer rejected_tenders: type: integer self_apply_count: type: integer total_approvals: type: integer type: object tender_approval.CreateTenderApprovalForm: properties: status: $ref: '#/definitions/tender_approval.ApprovalStatus' submission_mode: $ref: '#/definitions/tender_approval.SubmissionMode' tender_id: type: string type: object tender_approval.OrganizationResponse: properties: name: type: string type: object tender_approval.SubmissionMode: enum: - self-apply - partnership type: string 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: properties: limit: type: integer offset: type: integer tender_approvals: items: $ref: '#/definitions/tender_approval.TenderApprovalResponse' type: array total: type: integer total_pages: type: integer type: object tender_approval.TenderApprovalResponse: properties: company_id: type: string created_at: type: integer id: type: string status: type: string submission_mode: type: string tender_id: type: string type: object tender_approval.TenderApprovalStatsResponse: properties: approvals_by_status: additionalProperties: format: int64 type: integer type: object approvals_by_submission: additionalProperties: format: int64 type: integer type: object approved_tenders: type: integer last_updated: type: integer rejected_tenders: type: integer total_approvals: type: integer type: object tender_approval.TenderApprovalWithTenderResponse: 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 type: object tender_approval.TenderDetails: 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 type: object user.AuthResponse: properties: access_token: type: string expires_at: type: integer refresh_token: type: string user: $ref: '#/definitions/user.UserResponse' type: object user.ChangePasswordForm: properties: new_password: description: New password (minimum 8 characters) example: NewPass456! type: string old_password: description: Current password for verification example: OldPassword123! type: string type: object user.CreateUserForm: properties: department: description: Optional department name example: Information Technology type: string email: description: Valid email address example: john.smith@company.com type: string full_name: description: Full name of the user example: John Smith type: string password: description: Password (minimum 8 characters) example: SecurePass123! type: string phone: description: Optional phone number example: "+1234567890" type: string position: description: Optional job position example: Senior Developer type: string profile_image: description: Optional profile image URL example: https://example.com/avatar.jpg type: string role: description: User role (admin, manager, operator, viewer) example: manager type: string username: description: Unique username (alphanumeric only) example: johnsmith type: string type: object user.LoginForm: properties: password: description: User password example: Nima.1998 type: string username: description: Username or email address example: nakhostin type: string type: object user.RefreshTokenForm: properties: refresh_token: description: Valid refresh token example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... type: string type: object user.ResetPasswordForm: properties: email: description: Email address for password reset example: john.smith@company.com type: string type: object user.UpdateUserForm: properties: company_id: description: Updated company ID example: 123e4567-e89b-12d3-a456-426614174000 type: string department: description: Updated department example: Product Management type: string email: description: Updated email address example: john.smith@newcompany.com type: string full_name: description: Updated full name example: John Smith type: string phone: description: Updated phone number example: "+1234567890" type: string position: description: Updated position example: Tech Lead type: string profile_image: description: Updated profile image URL example: https://example.com/new-avatar.jpg type: string role: description: Updated user role example: admin type: string status: description: Updated account status example: active type: string username: description: Updated username example: johnsmith type: string type: object user.UpdateUserRoleForm: properties: role: type: string type: object user.UpdateUserStatusForm: properties: status: type: string type: object user.UserListResponse: properties: limit: type: integer offset: type: integer total: type: integer total_pages: type: integer users: items: $ref: '#/definitions/user.UserResponse' type: array type: object user.UserResponse: properties: company_id: type: string created_at: type: integer created_by: type: string 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 updated_by: type: string username: type: string type: object host: localhost:8081 info: contact: email: api-support@tender-management.com name: Tender Management API Support url: https://tender-management.com/support 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. license: name: MIT url: https://opensource.org/licenses/MIT termsOfService: https://tender-management.com/terms title: Tender Management API version: 2.0.0 paths: /admin/tenders: get: description: Retrieve tenders with pagination, filtering, and search capabilities with optional company-based matching parameters: - description: 'Number of items per page (default: 20, max: 100)' in: query name: limit type: integer - description: 'Number of items to skip (default: 0)' in: query name: offset type: integer - description: Company ID for match percentage calculation and sorting in: query name: company_id type: string - description: Search query for title and description in: query name: query type: string - description: Filter by notice type code in: query name: notice_type type: string - description: Filter by procurement type code in: query name: procurement_type type: string - collectionFormat: csv description: Filter by country codes (comma-separated) in: query items: type: string name: country_codes type: array - collectionFormat: csv description: Filter by status (comma-separated) in: query items: type: string name: status type: array - collectionFormat: csv description: Filter by source (comma-separated) in: query items: type: string name: source type: array - description: Minimum estimated value in: query name: min_estimated_value type: number - description: Maximum estimated value in: query name: max_estimated_value type: number - description: Filter by currency in: query name: currency type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: additionalProperties: true type: object type: object "400": description: Bad Request schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal Server Error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: List tenders tags: - Admin-Tenders /admin/tenders/{id}: delete: description: Delete a tender by its ID parameters: - description: Tender ID in: path name: id required: true type: string 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' security: - BearerAuth: [] summary: Delete tender tags: - Admin-Tenders get: description: Retrieve a specific tender by its ID parameters: - description: Tender ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/tender.TenderResponse' type: object "404": description: Not Found schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal Server Error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get tender by ID tags: - Admin-Tenders put: consumes: - application/json description: Update an existing tender with the provided information parameters: - description: Tender ID in: path name: id required: true type: string - description: Updated tender information in: body name: tender required: true schema: $ref: '#/definitions/tender.UpdateTenderRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/tender.TenderResponse' type: object "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' security: - BearerAuth: [] summary: Update tender tags: - Admin-Tenders /admin/v1/companies: get: consumes: - application/json description: Retrieve a paginated list of companies with advanced filtering options including search, type, status, industry, verification status, tags, and business criteria. Supports sorting and pagination. parameters: - description: Search term to filter companies by name, description, or industry in: query name: search type: string - description: Filter by company type enum: - private - public - government - ngo - startup in: query name: type type: string - description: Filter by company status enum: - active - inactive - suspended - pending in: query name: status type: string - description: Filter by industry in: query name: industry type: string - description: Filter by verification status in: query name: is_verified type: boolean - description: Filter by compliance status in: query name: is_compliant type: boolean - description: Filter by CPV codes in: query name: cpv_codes type: array - description: Filter by categories in: query name: categories type: array - description: Filter by keywords in: query name: keywords type: array - description: Filter by specializations in: query name: specializations type: array - description: Minimum employee count in: query name: employee_count_min type: integer - description: Maximum employee count in: query name: employee_count_max type: integer - description: Minimum annual revenue in: query name: annual_revenue_min type: number - description: Maximum annual revenue in: query name: annual_revenue_max type: number - description: Minimum founded year in: query name: founded_year_min type: integer - description: Maximum founded year in: query name: founded_year_max type: integer - default: 20 description: Number of companies per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of companies to skip for pagination in: query minimum: 0 name: offset type: integer - default: created_at description: Field to sort by enum: - name - type - industry - created_at - updated_at - status - employee_count - annual_revenue in: query name: sort_by type: string - default: desc description: Sort order enum: - asc - desc in: query name: sort_order type: string produces: - application/json responses: "200": description: Companies retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/company.CompanyListResponse' type: object "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' security: - BearerAuth: [] summary: List companies with filters and pagination tags: - Admin-Companies post: consumes: - application/json 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. parameters: - description: Company information including type, business details, address, tags, and optional customer assignment in: body name: company required: true schema: $ref: '#/definitions/company.CreateCompanyForm' produces: - application/json responses: "201": description: Company created successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/company.CompanyResponse' type: object "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' security: - BearerAuth: [] summary: Create a new company tags: - Admin-Companies /admin/v1/companies/{id}: delete: consumes: - application/json description: Soft delete a company by setting status to inactive parameters: - description: Company ID in: path name: id required: true type: string produces: - application/json 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' security: - BearerAuth: [] summary: Delete company tags: - Admin-Companies get: consumes: - application/json description: Retrieve detailed company information by company ID parameters: - description: Company ID in: path name: id required: true type: string produces: - application/json responses: "200": description: Company retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/company.CompanyResponse' type: object "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' security: - BearerAuth: [] summary: Get company by ID tags: - Admin-Companies put: consumes: - application/json description: Update company information including business details, address, tags, and customer assignment parameters: - description: Company ID in: path name: id required: true type: string - description: Company update information in: body name: company required: true schema: $ref: '#/definitions/company.UpdateCompanyForm' produces: - application/json responses: "200": description: Company updated successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/company.CompanyResponse' type: object "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' security: - BearerAuth: [] summary: Update company information tags: - Admin-Companies /admin/v1/companies/{id}/activate: post: consumes: - application/json description: Activate a suspended company account parameters: - description: Company ID in: path name: id required: true type: string produces: - application/json responses: "200": description: Company activated 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' security: - BearerAuth: [] summary: Activate company tags: - Admin-Companies /admin/v1/companies/{id}/status: patch: consumes: - application/json description: Update company account status (active, inactive, suspended, pending) parameters: - description: Company ID in: path name: id required: true type: string - description: New company status in: body name: status required: true schema: $ref: '#/definitions/company.UpdateCompanyStatusForm' produces: - application/json 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' security: - BearerAuth: [] summary: Update company status tags: - Admin-Companies /admin/v1/companies/{id}/suspend: post: consumes: - application/json description: Suspend a company account with reason parameters: - description: Company ID in: path name: id required: true type: string - description: Suspension information in: body name: suspension required: true schema: $ref: '#/definitions/company.SuspendCompanyForm' produces: - application/json responses: "200": description: Company suspended 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' security: - BearerAuth: [] summary: Suspend company tags: - Admin-Companies /admin/v1/companies/{id}/tags: put: consumes: - application/json description: Update company tags (CPV, categories, keywords, specializations, certifications) parameters: - description: Company ID in: path name: id required: true type: string - description: Tags update information in: body name: tags required: true schema: $ref: '#/definitions/company.UpdateCompanyTagsForm' produces: - application/json responses: "200": description: Company tags 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' security: - BearerAuth: [] summary: Update company tags tags: - Admin-Companies /admin/v1/companies/{id}/tags/add: post: consumes: - application/json description: Add specific tags to a company parameters: - description: Company ID in: path name: id required: true type: string - description: Tags to add in: body name: tags required: true schema: $ref: '#/definitions/company.AddTagsForm' produces: - application/json responses: "200": description: Tags added 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' security: - BearerAuth: [] summary: Add tags to company tags: - Admin-Companies /admin/v1/companies/{id}/tags/remove: post: consumes: - application/json description: Remove specific tags from a company parameters: - description: Company ID in: path name: id required: true type: string - description: Tags to remove in: body name: tags required: true schema: $ref: '#/definitions/company.RemoveTagsForm' produces: - application/json responses: "200": description: Tags removed 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' security: - BearerAuth: [] summary: Remove tags from company tags: - Admin-Companies /admin/v1/companies/{id}/verification: patch: consumes: - application/json description: Update company verification and compliance status parameters: - description: Company ID in: path name: id required: true type: string - description: Verification status update in: body name: verification required: true schema: $ref: '#/definitions/company.UpdateCompanyVerificationForm' produces: - application/json 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' security: - BearerAuth: [] summary: Update company verification status tags: - Admin-Companies /admin/v1/companies/{id}/verify: post: consumes: - application/json description: Mark a company as verified parameters: - description: Company ID in: path name: id required: true type: string produces: - application/json responses: "200": description: Company verified 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' security: - BearerAuth: [] summary: Verify company tags: - Admin-Companies /admin/v1/companies/industry/{industry}: get: consumes: - application/json description: Retrieve companies filtered by their industry parameters: - description: Industry in: path name: industry required: true type: string - default: 20 description: Number of companies per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of companies to skip for pagination in: query minimum: 0 name: offset type: integer produces: - application/json responses: "200": description: Companies retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: items: $ref: '#/definitions/company.CompanyResponse' type: array meta: $ref: '#/definitions/response.Meta' type: object "400": description: Bad request - Invalid industry schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get companies by industry tags: - Admin-Companies /admin/v1/companies/search: get: consumes: - application/json description: Search companies with advanced filtering capabilities including tags, business criteria, and location parameters: - description: Search query in: query name: q type: string - description: CPV codes filter in: query name: cpv_codes type: array - description: Categories filter in: query name: categories type: array - description: Keywords filter in: query name: keywords type: array - description: Specializations filter in: query name: specializations type: array - description: Industry filter in: query name: industry type: string - description: Location filter in: query name: location type: string - description: Minimum employees in: query name: min_employees type: integer - description: Maximum employees in: query name: max_employees type: integer - description: Minimum revenue in: query name: min_revenue type: number - description: Maximum revenue in: query name: max_revenue type: number - description: Verification status in: query name: is_verified type: boolean - description: Compliance status in: query name: is_compliant type: boolean - default: 20 description: Limit in: query name: limit type: integer - default: 0 description: Offset in: query name: offset type: integer produces: - application/json responses: "200": description: Companies search completed schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/company.CompanyListResponse' type: object "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' security: - BearerAuth: [] summary: Advanced search for companies tags: - Admin-Companies /admin/v1/companies/stats: get: consumes: - application/json description: Get comprehensive company statistics for dashboard produces: - application/json responses: "200": description: Company statistics retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/company.CompanyStatsResponse' type: object "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get company statistics tags: - Admin-Companies /admin/v1/companies/status/{status}: get: consumes: - application/json description: Retrieve companies filtered by their status (active, inactive, suspended, pending) parameters: - description: Company status enum: - active - inactive - suspended - pending in: path name: status required: true type: string - default: 20 description: Number of companies per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of companies to skip for pagination in: query minimum: 0 name: offset type: integer produces: - application/json responses: "200": description: Companies retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: items: $ref: '#/definitions/company.CompanyResponse' type: array meta: $ref: '#/definitions/response.Meta' type: object "400": description: Bad request - Invalid company status schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get companies by status tags: - Admin-Companies /admin/v1/companies/type/{type}: get: consumes: - application/json description: Retrieve companies filtered by their type (private, public, government, ngo, startup) parameters: - description: Company type enum: - private - public - government - ngo - startup in: path name: type required: true type: string - default: 20 description: Number of companies per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of companies to skip for pagination in: query minimum: 0 name: offset type: integer produces: - application/json responses: "200": description: Companies retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: items: $ref: '#/definitions/company.CompanyResponse' type: array meta: $ref: '#/definitions/response.Meta' type: object "400": description: Bad request - Invalid company type schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get companies by type tags: - Admin-Companies /admin/v1/customers: get: consumes: - application/json 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. parameters: - description: Search term to filter customers by name, email, or company name in: query name: search type: string - description: Filter by customer type enum: - individual - company - government in: query name: type type: string - description: Filter by customer status enum: - active - inactive - suspended - pending in: query name: status type: string - description: Filter by company ID format: uuid in: query name: company_id type: string - description: Filter by industry in: query name: industry type: string - description: Filter by verification status in: query name: is_verified type: boolean - description: Filter by compliance status in: query name: is_compliant type: boolean - description: Filter by preferred language in: query name: language type: string - description: Filter by preferred currency in: query name: currency type: string - default: 20 description: Number of customers per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of customers to skip for pagination in: query minimum: 0 name: offset type: integer - default: created_at description: Field to sort by enum: - email - company_name - created_at - updated_at - status in: query name: sort_by type: string - default: desc description: Sort order enum: - asc - desc in: query name: sort_order type: string produces: - application/json responses: "200": description: Customers retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/customer.CustomerListResponse' type: object "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' security: - BearerAuth: [] summary: List customers with filters and pagination tags: - Admin-Customers post: consumes: - application/json 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. parameters: - description: Customer information including type (individual|company|government), personal details, company info, address, and business details in: body name: customer required: true schema: $ref: '#/definitions/customer.CreateCustomerForm' produces: - application/json responses: "201": description: Customer created successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/customer.CustomerResponse' type: object "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' security: - BearerAuth: [] summary: Create a new customer tags: - Admin-Customers /admin/v1/customers/{id}: delete: consumes: - application/json description: Soft delete a customer by setting status to inactive parameters: - description: Customer ID in: path name: id required: true type: string produces: - application/json 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' security: - BearerAuth: [] summary: Delete customer tags: - Admin-Customers get: consumes: - application/json description: Retrieve detailed customer information by customer ID parameters: - description: Customer ID in: path name: id required: true type: string produces: - application/json responses: "200": description: Customer retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/customer.CustomerResponse' type: object "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' security: - BearerAuth: [] summary: Get customer by ID tags: - Admin-Customers put: consumes: - application/json description: Update customer information including personal details, company information, address, and business details parameters: - description: Customer ID in: path name: id required: true type: string - description: Updated customer information in: body name: customer required: true schema: $ref: '#/definitions/customer.UpdateCustomerForm' produces: - application/json responses: "200": description: Customer updated successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/customer.CustomerResponse' type: object "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' security: - BearerAuth: [] summary: Update customer information tags: - Admin-Customers /admin/v1/customers/{id}/activate: post: consumes: - application/json description: Activate a suspended customer account parameters: - description: Customer ID in: path name: id required: true type: string produces: - application/json responses: "200": description: Customer activated 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' security: - BearerAuth: [] summary: Activate customer tags: - Admin-Customers /admin/v1/customers/{id}/companies/assign: post: consumes: - application/json description: Assign one or more companies to a specific customer. parameters: - description: Customer ID in: path name: id required: true type: string - description: List of company IDs to assign in: body name: companies required: true schema: $ref: '#/definitions/customer.AssignCompaniesForm' produces: - application/json responses: "200": description: Companies assigned 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' security: - BearerAuth: [] summary: Assign companies to a customer tags: - Admin-Customers /admin/v1/customers/{id}/companies/remove: post: consumes: - application/json description: Remove one or more companies from a specific customer. parameters: - description: Customer ID in: path name: id required: true type: string - description: List of company IDs to remove in: body name: companies required: true schema: $ref: '#/definitions/customer.RemoveCompaniesForm' produces: - application/json responses: "200": description: Companies removed 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' security: - BearerAuth: [] summary: Remove companies from a customer tags: - Admin-Customers /admin/v1/customers/{id}/status: patch: consumes: - application/json description: Update customer account status (active, inactive, suspended, pending) parameters: - description: Customer ID in: path name: id required: true type: string - description: New customer status in: body name: status required: true schema: $ref: '#/definitions/customer.UpdateCustomerStatusForm' produces: - application/json 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' security: - BearerAuth: [] summary: Update customer status tags: - Admin-Customers /admin/v1/customers/{id}/suspend: post: consumes: - application/json description: Suspend a customer account with optional reason parameters: - description: Customer ID in: path name: id required: true type: string - description: Suspension information in: body name: suspension required: true schema: $ref: '#/definitions/customer.SuspendCustomerForm' produces: - application/json responses: "200": description: Customer suspended 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' security: - BearerAuth: [] summary: Suspend customer tags: - Admin-Customers /admin/v1/customers/{id}/verification: patch: consumes: - application/json description: Update customer verification and compliance status parameters: - description: Customer ID in: path name: id required: true type: string - description: Verification status update in: body name: verification required: true schema: $ref: '#/definitions/customer.UpdateCustomerVerificationForm' produces: - application/json responses: "200": description: Customer verification 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' security: - BearerAuth: [] summary: Update customer verification status tags: - Admin-Customers /admin/v1/customers/{id}/verify: post: consumes: - application/json description: Mark a customer as verified parameters: - description: Customer ID in: path name: id required: true type: string produces: - application/json responses: "200": description: Customer verified 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' security: - BearerAuth: [] summary: Verify customer tags: - Admin-Customers /admin/v1/customers/company/{companyId}: get: consumes: - application/json description: Retrieve all customers associated with a specific company parameters: - description: Company ID in: path name: companyId required: true type: string - description: 'Number of customers to return (default: 10, max: 100)' in: query name: limit type: integer - description: 'Number of customers to skip (default: 0)' in: query name: offset type: integer produces: - application/json responses: "200": description: Customers retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: items: $ref: '#/definitions/customer.CustomerResponse' type: array type: object "400": description: Bad request - Invalid company ID schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get customers by company ID tags: - Admin-Customers /admin/v1/customers/status/{status}: get: consumes: - application/json description: Retrieve customers filtered by their account status (active, inactive, suspended, or pending). Useful for administrative monitoring and management. parameters: - description: Customer status enum: - active - inactive - suspended - pending in: path name: status required: true type: string - default: 20 description: Number of customers per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of customers to skip for pagination in: query minimum: 0 name: offset type: integer produces: - application/json responses: "200": description: Customers retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: items: $ref: '#/definitions/customer.CustomerResponse' type: array meta: $ref: '#/definitions/response.Meta' type: object "400": description: Bad request - Invalid customer status schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get customers by status tags: - Admin-Customers /admin/v1/customers/type/{type}: get: consumes: - application/json description: Retrieve customers filtered by their type (individual, company, or government). Useful for administrative reporting and management. parameters: - description: Customer type enum: - individual - company - government in: path name: type required: true type: string - default: 20 description: Number of customers per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of customers to skip for pagination in: query minimum: 0 name: offset type: integer produces: - application/json responses: "200": description: Customers retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: items: $ref: '#/definitions/customer.CustomerResponse' type: array meta: $ref: '#/definitions/response.Meta' type: object "400": description: Bad request - Invalid customer type schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get customers by type tags: - Admin-Customers /admin/v1/feedback: get: consumes: - application/json description: Retrieve paginated list of feedback with optional filtering by various criteria. This endpoint is for administrative use and provides comprehensive filtering options. parameters: - description: Filter by tender ID (MongoDB ObjectID format) in: query name: tender_id type: string - description: Filter by customer ID (MongoDB ObjectID format) in: query name: customer_id type: string - description: Filter by company ID (MongoDB ObjectID format) in: query name: company_id type: string - description: Filter by feedback type enum: - like - dislike in: query name: feedback_type type: string - description: Filter by creation date from (Unix timestamp in seconds) format: int64 in: query name: date_from type: integer - description: Filter by creation date to (Unix timestamp in seconds) format: int64 in: query name: date_to type: integer - description: 'Number of items per page (default: 20, max: 100)' in: query maximum: 100 minimum: 1 name: limit type: integer - description: 'Number of items to skip for pagination (default: 0)' in: query minimum: 0 name: offset type: integer produces: - application/json responses: "200": description: Feedback list retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/feedback.FeedbackListResponse' type: object "400": description: Bad request - Invalid query parameters schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "422": description: Validation error - Invalid filter criteria schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "500": description: Internal server error schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object security: - BearerAuth: [] summary: List feedback with filters tags: - Admin-Feedback /admin/v1/feedback/{id}: delete: consumes: - application/json 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. parameters: - description: Feedback ID (MongoDB ObjectID format) in: path maxLength: 24 minLength: 24 name: id required: true type: string produces: - application/json responses: "200": description: Feedback soft deleted successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: message: type: string type: object "400": description: Bad request - Invalid feedback ID format schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "401": description: Unauthorized - User not authenticated schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "403": description: Forbidden - User not authorized to delete this feedback schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "404": description: Not found - Feedback not found schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "500": description: Internal server error schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object security: - BearerAuth: [] summary: Soft delete feedback tags: - Admin-Feedback get: consumes: - application/json 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. parameters: - description: Feedback ID (MongoDB ObjectID format) in: path maxLength: 24 minLength: 24 name: id required: true type: string produces: - application/json responses: "200": description: feedback retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/feedback.FeedbackResponse' type: object "400": description: Bad request - Invalid feedback ID format schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "404": description: Feedback not found schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "500": description: Internal server error schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object security: - BearerAuth: [] summary: Get feedback by ID tags: - Admin-Feedback /admin/v1/health: get: consumes: - application/json 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. produces: - application/json responses: "200": description: System is healthy and operational schema: $ref: '#/definitions/main.HealthResponse' "503": description: System is unhealthy or experiencing issues schema: $ref: '#/definitions/main.HealthResponse' summary: Health check endpoint tags: - Admin-Health /admin/v1/profile: get: consumes: - application/json 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. produces: - application/json responses: "200": description: Profile retrieved successfully with user details schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/user.UserResponse' type: object "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' security: - BearerAuth: [] summary: Get authenticated user profile tags: - Admin-Users put: consumes: - application/json 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. parameters: - description: Profile update data including name, email, phone, and other personal information in: body name: profile required: true schema: $ref: '#/definitions/user.UpdateUserForm' produces: - application/json responses: "200": description: Profile updated successfully with updated user details schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/user.UserResponse' type: object "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' security: - BearerAuth: [] summary: Update authenticated user profile tags: - Admin-Users /admin/v1/profile/change-password: put: consumes: - application/json 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. parameters: - description: Password change data including current password and new password in: body name: password required: true schema: $ref: '#/definitions/user.ChangePasswordForm' produces: - application/json 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' security: - BearerAuth: [] summary: Change user password tags: - Admin-Users /admin/v1/profile/login: post: consumes: - application/json 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. parameters: - description: User login credentials including username/email and password in: body name: login required: true schema: $ref: '#/definitions/user.LoginForm' produces: - application/json responses: "200": description: Login successful with access and refresh tokens schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/user.AuthResponse' type: object "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' summary: Authenticate user login tags: - Admin-Authorization /admin/v1/profile/logout: delete: consumes: - application/json 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. produces: - application/json 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' security: - BearerAuth: [] summary: Logout authenticated user tags: - Admin-Authorization /admin/v1/profile/refresh-token: post: consumes: - application/json 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. parameters: - description: Refresh token for generating new access token in: body name: refresh required: true schema: $ref: '#/definitions/user.RefreshTokenForm' produces: - application/json responses: "200": description: Token refreshed successfully with new access token schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/user.AuthResponse' type: object "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' summary: Refresh access token tags: - Admin-Authorization /admin/v1/profile/reset-password: post: consumes: - application/json 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. parameters: - description: Email address for password reset request in: body name: reset required: true schema: $ref: '#/definitions/user.ResetPasswordForm' produces: - application/json 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' summary: Initiate password reset process tags: - Admin-Authorization /admin/v1/tender-approvals: get: consumes: - application/json description: Retrieve a paginated list of tender approvals with filtering options parameters: - description: Filter by tender ID in: query name: tender_id type: string - description: Filter by company ID in: query name: company_id type: string - description: Filter by status in: query name: status type: array - description: Filter by submission mode in: query name: submission_mode type: array - description: Filter by creation date from (Unix timestamp) in: query name: created_at_from type: integer - description: Filter by creation date to (Unix timestamp) in: query name: created_at_to type: integer - default: 20 description: Number of approvals per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of approvals to skip for pagination in: query minimum: 0 name: offset type: integer - default: created_at description: Field to sort by enum: - created_at - updated_at - status - submission_mode in: query name: sort_by type: string - default: desc description: Sort order enum: - asc - desc in: query name: sort_order type: string produces: - application/json responses: "200": description: Tender approvals retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/tender_approval.TenderApprovalListResponse' type: object "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' security: - BearerAuth: [] summary: List tender approvals with filters and pagination tags: - Admin-TenderApprovals /admin/v1/tender-approvals/{id}: get: consumes: - application/json description: Retrieve detailed tender approval information by ID parameters: - description: Tender Approval ID in: path name: id required: true type: string produces: - application/json responses: "200": description: Tender approval retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/tender_approval.TenderApprovalResponse' type: object "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' security: - BearerAuth: [] summary: Get tender approval by ID tags: - Admin-TenderApprovals /admin/v1/tender-approvals/stats: get: consumes: - application/json description: Get comprehensive tender approval statistics for dashboard produces: - application/json responses: "200": description: Tender approval statistics retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/tender_approval.TenderApprovalStatsResponse' type: object "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get tender approval statistics tags: - Admin-TenderApprovals /admin/v1/tender-approvals/status/{status}: get: consumes: - application/json description: Retrieve tender approvals filtered by their status (approved, rejected) parameters: - description: Tender approval status enum: - approved - rejected in: path name: status required: true type: string - default: 20 description: Number of approvals per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of approvals to skip for pagination in: query minimum: 0 name: offset type: integer produces: - application/json responses: "200": description: Tender approvals retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: items: $ref: '#/definitions/tender_approval.TenderApprovalResponse' type: array meta: $ref: '#/definitions/response.Meta' type: object "400": description: Bad request - Invalid tender approval status schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get tender approvals by status tags: - Admin-TenderApprovals /admin/v1/tender-approvals/submission-mode/{submission_mode}: get: consumes: - application/json description: Retrieve tender approvals filtered by their submission mode (self-apply, partnership) parameters: - description: Tender approval submission mode enum: - self-apply - partnership in: path name: submission_mode required: true type: string - default: 20 description: Number of approvals per page (1-100) in: query maximum: 100 minimum: 1 name: limit type: integer - default: 0 description: Number of approvals to skip for pagination in: query minimum: 0 name: offset type: integer produces: - application/json responses: "200": description: Tender approvals retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: items: $ref: '#/definitions/tender_approval.TenderApprovalResponse' type: array meta: $ref: '#/definitions/response.Meta' type: object "400": description: Bad request - Invalid tender approval submission mode schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get tender approvals by submission mode tags: - Admin-TenderApprovals /admin/v1/users: get: consumes: - application/json description: List users with search and filters (admin only) parameters: - description: Search term in: query name: search type: string - description: User status filter in: query name: status type: string - description: User role filter in: query name: role type: string - description: Company ID filter in: query name: company_id type: string - description: Limit results in: query name: limit type: integer - description: Offset results in: query name: offset type: integer - description: Sort field in: query name: sort_by type: string - description: Sort order in: query name: sort_order type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/user.UserListResponse' type: object "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' security: - BearerAuth: [] summary: List users tags: - Admin-Users post: consumes: - application/json 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. parameters: - description: User creation data including username, email, password, role, and profile information in: body name: user required: true schema: $ref: '#/definitions/user.CreateUserForm' produces: - application/json responses: "201": description: User created successfully with assigned role and permissions schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/user.UserResponse' type: object "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' security: - BearerAuth: [] summary: Create new user account tags: - Admin-Users /admin/v1/users/{id}: delete: consumes: - application/json description: Delete a user (admin only) parameters: - description: User ID in: path name: id required: true type: string produces: - application/json 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' security: - BearerAuth: [] summary: Delete user tags: - Admin-Users get: consumes: - application/json description: Get user details by ID (admin only) parameters: - description: User ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/user.UserResponse' type: object "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' security: - BearerAuth: [] summary: Get user by ID tags: - Admin-Users put: consumes: - application/json description: Update user information (admin only) parameters: - description: User ID in: path name: id required: true type: string - description: User update data in: body name: user required: true schema: $ref: '#/definitions/user.UpdateUserForm' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/user.UserResponse' type: object "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' security: - BearerAuth: [] summary: Update user tags: - Admin-Users /admin/v1/users/{id}/role: put: consumes: - application/json description: Update user role (admin only) parameters: - description: User ID in: path name: id required: true type: string - description: Role update data in: body name: role required: true schema: $ref: '#/definitions/user.UpdateUserRoleForm' produces: - application/json 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' security: - BearerAuth: [] summary: Update user role tags: - Admin-Users /admin/v1/users/{id}/status: put: consumes: - application/json description: Update user account status (admin only) parameters: - description: User ID in: path name: id required: true type: string - description: Status update data in: body name: status required: true schema: $ref: '#/definitions/user.UpdateUserStatusForm' produces: - application/json 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' security: - BearerAuth: [] summary: Update user status tags: - Admin-Users /admin/v1/users/company/{company_id}: get: consumes: - application/json description: Get users belonging to a specific company (admin only) parameters: - description: Company ID in: path name: company_id required: true type: string - description: Limit results in: query name: limit type: integer - description: Offset results in: query name: offset type: integer produces: - application/json responses: "200": description: Users with pagination metadata schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: additionalProperties: true type: object type: object "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' security: - BearerAuth: [] summary: Get users by company ID tags: - Admin-Users /admin/v1/users/role/{role}: get: consumes: - application/json description: Get users with a specific role (admin only) parameters: - description: User role in: path name: role required: true type: string - description: Limit results in: query name: limit type: integer - description: Offset results in: query name: offset type: integer produces: - application/json responses: "200": description: Users with pagination metadata schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: additionalProperties: true type: object type: object "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' security: - BearerAuth: [] summary: Get users by role tags: - Admin-Users /api/v1/companies: get: consumes: - application/json description: Retrieve the profile of the company associated with the authenticated user produces: - application/json responses: "200": description: Company retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/company.CompanyProfileResponse' type: object "401": description: Unauthorized - User not authenticated schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get my company profile tags: - Company /api/v1/feedback: get: consumes: - application/json 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. parameters: - description: Filter by tender ID (MongoDB ObjectID format) in: query name: tender_id type: string - description: Filter by customer ID (MongoDB ObjectID format) in: query name: customer_id type: string - description: Filter by company ID (MongoDB ObjectID format) in: query name: company_id type: string - description: Filter by feedback type enum: - like - dislike in: query name: feedback_type type: string - description: Filter by creation date from (Unix timestamp in seconds) format: int64 in: query minimum: 0 name: date_from type: integer - description: Filter by creation date to (Unix timestamp in seconds) format: int64 in: query minimum: 0 name: date_to type: integer - description: 'Number of items per page (default: 20, max: 100)' in: query maximum: 100 minimum: 1 name: limit type: integer - description: 'Number of items to skip for pagination (default: 0)' in: query minimum: 0 name: offset type: integer produces: - application/json responses: "200": description: Feedback list retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/feedback.FeedbackListResponse' type: object "400": description: Bad request - Invalid query parameters or missing company association schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "422": description: Validation error - Invalid filter criteria schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "500": description: Internal server error schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object security: - BearerAuth: [] summary: List feedback with filters tags: - Feedback post: consumes: - application/json 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. parameters: - description: Feedback toggle request containing tender ID in: body name: feedback required: true schema: $ref: '#/definitions/feedback.ToggleFeedbackForm' produces: - application/json responses: "200": description: Feedback toggled successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/feedback.FeedbackResponse' type: object "400": description: Bad request - Invalid input data or missing customer/company association schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "401": description: Unauthorized - User not authenticated schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "422": description: Validation error - Invalid request data format schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "500": description: Internal server error schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object security: - BearerAuth: [] summary: Toggle feedback for a tender tags: - Feedback /api/v1/feedback/{id}: get: consumes: - application/json description: Retrieve feedback details by its unique identifier. This endpoint provides basic feedback information for public users. parameters: - description: Feedback ID (MongoDB ObjectID format) in: path maxLength: 24 minLength: 24 name: id required: true type: string produces: - application/json responses: "200": description: Feedback retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/feedback.FeedbackResponse' type: object "400": description: Bad request - Invalid feedback ID format schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "404": description: Feedback not found schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "500": description: Internal server error schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object security: - BearerAuth: [] summary: Get feedback by ID tags: - Feedback /api/v1/feedback/tender/{tender_id}: get: consumes: - application/json description: Retrieve feedback details by tender ID. This endpoint provides basic feedback information for public users. parameters: - description: Tender ID (MongoDB ObjectID format) in: path maxLength: 24 minLength: 24 name: tender_id required: true type: string produces: - application/json responses: "200": description: Feedback retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/feedback.FeedbackResponse' type: object "400": description: Bad request - Invalid tender ID format schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "404": description: Feedback not found schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object "500": description: Internal server error schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: error: type: string message: type: string type: object security: - BearerAuth: [] summary: Get feedback by tender ID tags: - Feedback /api/v1/profile: get: consumes: - application/json description: Retrieve current customer profile information produces: - application/json responses: "200": description: Profile retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/customer.CustomerResponse' type: object "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' security: - BearerAuth: [] summary: Get customer profile tags: - Authorization /api/v1/profile/login: post: consumes: - application/json description: Authenticate customer with username (email) and password. Returns access token, refresh token, and customer information upon successful authentication. parameters: - description: Login credentials (username/email and password) in: body name: login required: true schema: $ref: '#/definitions/customer.LoginForm' produces: - application/json responses: "200": description: Login successful schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/customer.AuthResponse' type: object "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' summary: Customer login tags: - Authorization /api/v1/profile/logout: delete: consumes: - application/json description: Logout customer and invalidate access token produces: - application/json 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' security: - BearerAuth: [] summary: Customer logout tags: - Authorization /api/v1/profile/refresh-token: post: consumes: - application/json description: Refresh access token using a valid refresh token. This allows customers to maintain their session without re-authentication. parameters: - description: Refresh token for generating new access token in: body name: refresh required: true schema: $ref: '#/definitions/customer.RefreshTokenForm' produces: - application/json responses: "200": description: Token refreshed successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/customer.AuthResponse' type: object "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' summary: Refresh customer access token tags: - Authorization /api/v1/tender-approvals: get: consumes: - application/json description: Retrieve all tender approvals for a specific company with optional filtering parameters: - description: Filter by submission mode Enums(self-apply, partnership) enum: - self-apply - partnership in: query name: submission_mode type: string - description: Filter by status Enums(approved, rejected) enum: - approved - rejected in: query name: status type: string produces: - application/json responses: "200": description: Tender approvals retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: items: $ref: '#/definitions/tender_approval.TenderApprovalWithTenderResponse' type: array type: object "400": description: Bad request - Invalid company ID schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get tender approvals by company ID tags: - TenderApprovals post: consumes: - application/json description: Create a new tender approval for a company to approve or reject a tender parameters: - description: Tender approval information in: body name: tender_approval required: true schema: $ref: '#/definitions/tender_approval.CreateTenderApprovalForm' produces: - application/json responses: "201": description: Tender approval created successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/tender_approval.TenderApprovalResponse' type: object "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' security: - BearerAuth: [] summary: Create a new tender approval tags: - TenderApprovals /api/v1/tender-approvals/{id}: get: consumes: - application/json description: Retrieve detailed tender approval information by ID parameters: - description: Tender Approval ID in: path name: id required: true type: string produces: - application/json responses: "200": description: Tender approval retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/tender_approval.TenderApprovalResponse' type: object "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' security: - BearerAuth: [] summary: Get tender approval by ID tags: - TenderApprovals /api/v1/tender-approvals/stats: get: consumes: - application/json description: Get comprehensive tender approval statistics for a specific company produces: - application/json responses: "200": description: Company tender approval statistics retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/tender_approval.CompanyTenderApprovalStatsResponse' type: object "400": description: Bad request - Invalid company ID schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get company tender approval statistics tags: - TenderApprovals /api/v1/tender-approvals/tender/{tender_id}: get: consumes: - application/json description: Retrieve tender approval information for a specific tender and company combination parameters: - description: Tender ID in: path name: tender_id required: true type: string produces: - application/json responses: "200": description: Tender approval retrieved successfully schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: $ref: '#/definitions/tender_approval.TenderApprovalResponse' type: object "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' security: - BearerAuth: [] summary: Get tender approval by tender and company tags: - TenderApprovals /api/v1/tenders: get: description: Retrieve active tenders for mobile application users with automatic company-based matching from customer profile parameters: - description: 'Number of items per page (default: 20, max: 50)' in: query name: limit type: integer - description: 'Number of items to skip (default: 0)' in: query name: offset type: integer - description: Filter by country code in: query name: country_code type: string - description: Minimum estimated value in: query name: min_estimated_value type: number - description: Maximum estimated value in: query name: max_estimated_value type: number produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: additionalProperties: true type: object type: object "400": description: Bad Request schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal Server Error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get public tenders tags: - Tenders /api/v1/tenders/details/{id}: get: description: Retrieve detailed information about a specific tender for mobile application users parameters: - description: Tender ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: additionalProperties: true type: object type: object "404": description: Not Found schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal Server Error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get public tender details tags: - Tenders /api/v1/tenders/recommend: get: description: Retrieve active tenders for mobile application users with automatic company-based matching from customer profile parameters: - description: 'Number of items per page (default: 20, max: 50)' in: query name: limit type: integer - description: 'Number of items to skip (default: 0)' in: query name: offset type: integer - description: Filter by country code in: query name: country_code type: string - description: Minimum estimated value in: query name: min_estimated_value type: number - description: Maximum estimated value in: query name: max_estimated_value type: number produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/response.APIResponse' - properties: data: additionalProperties: true type: object type: object "400": description: Bad Request schema: $ref: '#/definitions/response.APIResponse' "500": description: Internal Server Error schema: $ref: '#/definitions/response.APIResponse' security: - BearerAuth: [] summary: Get public tenders tags: - Tenders securityDefinitions: BearerAuth: description: 'Type "Bearer" followed by a space and JWT token. Example: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."' in: header name: Authorization type: apiKey swagger: "2.0" 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 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: 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