61a217cf09
- Added new query parameters `created_from` and `created_to` to the tender approval endpoints for filtering by creation date using Unix timestamps. - Updated the `GetByCompanyID` method in the repository and service layers to support the new filtering options. - Modified the handler methods to parse and pass the new parameters, improving the flexibility of tender approval retrieval. - Updated API documentation to reflect the new query parameters, ensuring clarity for API consumers.
5475 lines
152 KiB
YAML
5475 lines
152 KiB
YAML
basePath: /
|
|
definitions:
|
|
bootstrap.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
|
|
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:
|
|
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.CompanyFeedbackStatsResponse:
|
|
properties:
|
|
company_id:
|
|
type: string
|
|
last_updated:
|
|
description: Unix timestamp
|
|
type: integer
|
|
total_dislikes:
|
|
type: integer
|
|
total_feedback:
|
|
type: integer
|
|
total_likes:
|
|
type: integer
|
|
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
|
|
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:
|
|
application_deadline:
|
|
type: integer
|
|
buyer_organization:
|
|
$ref: '#/definitions/tender.OrganizationResponse'
|
|
country_code:
|
|
type: string
|
|
currency:
|
|
type: string
|
|
description:
|
|
type: string
|
|
duration:
|
|
type: string
|
|
duration_unit:
|
|
type: string
|
|
estimated_value:
|
|
type: number
|
|
id:
|
|
type: string
|
|
notice_publication_id:
|
|
type: string
|
|
procedure_code:
|
|
type: string
|
|
procurement_type_code:
|
|
type: string
|
|
publication_date:
|
|
type: integer
|
|
status:
|
|
$ref: '#/definitions/tender.TenderStatus'
|
|
submission_deadline:
|
|
type: integer
|
|
submission_url:
|
|
type: string
|
|
tender_deadline:
|
|
type: integer
|
|
tender_id:
|
|
type: string
|
|
title:
|
|
type: string
|
|
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:
|
|
- submitted
|
|
- rejected
|
|
type: string
|
|
x-enum-comments:
|
|
ApprovalStatusRejected: Company rejected the tender
|
|
ApprovalStatusSubmitted: Company submitted the tender
|
|
x-enum-descriptions:
|
|
- Company submitted the tender
|
|
- Company rejected the tender
|
|
x-enum-varnames:
|
|
- ApprovalStatusSubmitted
|
|
- ApprovalStatusRejected
|
|
tender_approval.CompanyTenderApprovalStatsResponse:
|
|
properties:
|
|
company_id:
|
|
type: string
|
|
last_updated:
|
|
type: integer
|
|
partnership_count:
|
|
type: integer
|
|
rejected_tenders:
|
|
type: integer
|
|
self_apply_count:
|
|
type: integer
|
|
submitted_tenders:
|
|
type: integer
|
|
total_approvals:
|
|
type: integer
|
|
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:
|
|
last_updated:
|
|
type: integer
|
|
rejected_tenders:
|
|
type: integer
|
|
submitted_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/bootstrap.HealthResponse'
|
|
"503":
|
|
description: System is unhealthy or experiencing issues
|
|
schema:
|
|
$ref: '#/definitions/bootstrap.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 (submitted,
|
|
rejected)
|
|
parameters:
|
|
- description: Tender approval status
|
|
enum:
|
|
- submitted
|
|
- 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/stats/company:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Retrieve comprehensive feedback statistics for the authenticated
|
|
user's company including total likes, dislikes, and percentage calculations.
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Company feedback statistics retrieved successfully
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/feedback.CompanyFeedbackStatsResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Missing 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
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
error:
|
|
type: string
|
|
message:
|
|
type: string
|
|
type: object
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Get company feedback statistics
|
|
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(submitted, rejected)
|
|
enum:
|
|
- submitted
|
|
- rejected
|
|
in: query
|
|
name: status
|
|
type: string
|
|
- description: Filter by created date from (Unix timestamp)
|
|
in: query
|
|
name: created_from
|
|
type: integer
|
|
- description: Filter by created date to (Unix timestamp)
|
|
in: query
|
|
name: created_to
|
|
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.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
|
|
- description: Publication from
|
|
in: query
|
|
name: publication_from
|
|
type: number
|
|
- description: Publication to
|
|
in: query
|
|
name: publication_to
|
|
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
|
|
- description: Publication from
|
|
in: query
|
|
name: publication_from
|
|
type: number
|
|
- description: Publication to
|
|
in: query
|
|
name: publication_to
|
|
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
|