a342da193e
- Updated feedback repository and service methods to use a consistent naming convention, changing `NewTenderRepository` and similar methods to `NewRepository`. - Refactored feedback handler methods to improve clarity by renaming methods such as `ListFeedback` to `Search` and `GetFeedback` to `Get`. - Enhanced feedback response structures to include detailed company and tender information, improving the clarity of feedback data returned to API consumers. - Updated Swagger documentation to reflect changes in feedback response structures and endpoint paths, ensuring accurate representation of the API for consumers.
5739 lines
161 KiB
YAML
5739 lines
161 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.Address:
|
|
properties:
|
|
city:
|
|
type: string
|
|
country:
|
|
type: string
|
|
postal_code:
|
|
type: string
|
|
state:
|
|
type: string
|
|
street:
|
|
type: string
|
|
type: object
|
|
company.AddressForm:
|
|
properties:
|
|
city:
|
|
example: New York
|
|
type: string
|
|
country:
|
|
example: US
|
|
type: string
|
|
postal_code:
|
|
example: "10001"
|
|
type: string
|
|
state:
|
|
example: NY
|
|
type: string
|
|
street:
|
|
example: 123 Main St
|
|
type: string
|
|
type: object
|
|
company.CategoryResponse:
|
|
properties:
|
|
id:
|
|
type: string
|
|
name:
|
|
type: string
|
|
type: object
|
|
company.CompanyForm:
|
|
properties:
|
|
address:
|
|
allOf:
|
|
- $ref: '#/definitions/company.AddressForm'
|
|
description: Address information
|
|
annual_revenue:
|
|
example: 1000000
|
|
type: number
|
|
currency:
|
|
example: USD
|
|
type: string
|
|
description:
|
|
example: Opplens is a technology company
|
|
type: string
|
|
email:
|
|
example: info@opplens.com
|
|
type: string
|
|
employee_count:
|
|
description: Business information
|
|
example: 100
|
|
type: integer
|
|
founded_year:
|
|
example: 2020
|
|
type: integer
|
|
industry:
|
|
example: Technology
|
|
type: string
|
|
language:
|
|
description: Settings
|
|
example: en
|
|
type: string
|
|
name:
|
|
example: Opplens
|
|
type: string
|
|
phone:
|
|
description: Contact information
|
|
example: "+1234567890"
|
|
type: string
|
|
registration_number:
|
|
example: "1234567890"
|
|
type: string
|
|
tags:
|
|
allOf:
|
|
- $ref: '#/definitions/company.CompanyTagsForm'
|
|
description: Tags for categorization and search
|
|
tax_id:
|
|
example: "1234567890"
|
|
type: string
|
|
timezone:
|
|
example: UTC
|
|
type: string
|
|
type:
|
|
example: private
|
|
type: string
|
|
website:
|
|
example: https://opplens.com
|
|
type: string
|
|
type: object
|
|
company.CompanyListResponse:
|
|
properties:
|
|
companies:
|
|
items:
|
|
$ref: '#/definitions/company.CompanyResponse'
|
|
type: array
|
|
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
|
|
created_at:
|
|
type: integer
|
|
currency:
|
|
type: string
|
|
description:
|
|
type: string
|
|
email:
|
|
type: string
|
|
employee_count:
|
|
type: integer
|
|
founded_year:
|
|
type: integer
|
|
id:
|
|
type: string
|
|
industry:
|
|
type: string
|
|
is_compliant:
|
|
type: boolean
|
|
is_verified:
|
|
type: boolean
|
|
language:
|
|
type: string
|
|
name:
|
|
type: string
|
|
phone:
|
|
type: string
|
|
registration_number:
|
|
type: string
|
|
status:
|
|
type: string
|
|
tags:
|
|
$ref: '#/definitions/company.CompanyTagsResponse'
|
|
tax_id:
|
|
type: string
|
|
timezone:
|
|
type: string
|
|
type:
|
|
type: string
|
|
updated_at:
|
|
type: integer
|
|
website:
|
|
type: string
|
|
type: object
|
|
company.CompanyTagsForm:
|
|
properties:
|
|
categories:
|
|
example:
|
|
- Technology
|
|
items:
|
|
type: string
|
|
type: array
|
|
certifications:
|
|
example:
|
|
- Opplens
|
|
items:
|
|
type: string
|
|
type: array
|
|
cpv_codes:
|
|
example:
|
|
- "1234567890"
|
|
items:
|
|
type: string
|
|
type: array
|
|
keywords:
|
|
example:
|
|
- Opplens
|
|
items:
|
|
type: string
|
|
type: array
|
|
specializations:
|
|
example:
|
|
- Opplens
|
|
items:
|
|
type: string
|
|
type: array
|
|
type: object
|
|
company.CompanyTagsResponse:
|
|
properties:
|
|
categories:
|
|
items:
|
|
$ref: '#/definitions/company.CategoryResponse'
|
|
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.StatusForm:
|
|
properties:
|
|
reason:
|
|
type: string
|
|
status:
|
|
type: string
|
|
type: object
|
|
company.VerificationForm:
|
|
properties:
|
|
compliance_notes:
|
|
type: string
|
|
is_compliant:
|
|
type: boolean
|
|
is_verified:
|
|
type: boolean
|
|
type: object
|
|
company_category.CategoryForm:
|
|
properties:
|
|
description:
|
|
example: Technology related companies
|
|
type: string
|
|
name:
|
|
example: Technology
|
|
type: string
|
|
thumbnail:
|
|
example: https://example.com/thumbnail.jpg
|
|
type: string
|
|
type: object
|
|
company_category.CategoryListResponse:
|
|
properties:
|
|
categories:
|
|
items:
|
|
$ref: '#/definitions/company_category.CategoryResponse'
|
|
type: array
|
|
type: object
|
|
company_category.CategoryResponse:
|
|
properties:
|
|
created_at:
|
|
type: integer
|
|
description:
|
|
type: string
|
|
id:
|
|
type: string
|
|
name:
|
|
type: string
|
|
published:
|
|
type: boolean
|
|
published_at:
|
|
type: integer
|
|
thumbnail:
|
|
type: string
|
|
updated_at:
|
|
type: integer
|
|
type: object
|
|
customer.AssignCompaniesForm:
|
|
properties:
|
|
companies:
|
|
items:
|
|
type: string
|
|
type: array
|
|
type: object
|
|
customer.AssignRoleForm:
|
|
properties:
|
|
role:
|
|
example: analyst
|
|
type: string
|
|
type: object
|
|
customer.AssignRoleResponse:
|
|
properties:
|
|
message:
|
|
example: Role assigned successfully
|
|
type: string
|
|
success:
|
|
example: true
|
|
type: boolean
|
|
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.CreateCustomerForm:
|
|
properties:
|
|
companies:
|
|
items:
|
|
type: string
|
|
type: array
|
|
email:
|
|
example: user@opplens.com
|
|
type: string
|
|
full_name:
|
|
example: User
|
|
type: string
|
|
password:
|
|
example: User!1234
|
|
type: string
|
|
phone:
|
|
example: "+1234567890"
|
|
type: string
|
|
role:
|
|
example: analyst
|
|
type: string
|
|
type:
|
|
example: individual
|
|
type: string
|
|
username:
|
|
example: user
|
|
type: string
|
|
type: object
|
|
customer.CustomerListResponse:
|
|
properties:
|
|
customers:
|
|
items:
|
|
$ref: '#/definitions/customer.CustomerResponse'
|
|
type: array
|
|
type: object
|
|
customer.CustomerResponse:
|
|
properties:
|
|
companies:
|
|
items:
|
|
$ref: '#/definitions/customer.CompanySummary'
|
|
type: array
|
|
created_at:
|
|
type: integer
|
|
email:
|
|
type: string
|
|
full_name:
|
|
type: string
|
|
id:
|
|
type: string
|
|
last_login_at:
|
|
type: integer
|
|
phone:
|
|
type: string
|
|
role:
|
|
type: string
|
|
status:
|
|
type: string
|
|
type:
|
|
type: string
|
|
updated_at:
|
|
type: integer
|
|
username:
|
|
type: string
|
|
type: object
|
|
customer.LoginForm:
|
|
properties:
|
|
device_token:
|
|
example: device_token
|
|
type: string
|
|
password:
|
|
example: App!1234
|
|
type: string
|
|
username:
|
|
example: app
|
|
type: string
|
|
type: object
|
|
customer.RefreshTokenForm:
|
|
properties:
|
|
refresh_token:
|
|
type: string
|
|
type: object
|
|
customer.RequestResetPasswordForm:
|
|
properties:
|
|
email:
|
|
example: app@opplens.com
|
|
type: string
|
|
type: object
|
|
customer.RequestResetPasswordResponse:
|
|
properties:
|
|
message:
|
|
example: Password reset code sent to your email
|
|
type: string
|
|
success:
|
|
example: true
|
|
type: boolean
|
|
type: object
|
|
customer.ResetPasswordForm:
|
|
properties:
|
|
new_password:
|
|
example: NewPass!123
|
|
type: string
|
|
token:
|
|
example: reset_token_here
|
|
type: string
|
|
type: object
|
|
customer.ResetPasswordResponse:
|
|
properties:
|
|
message:
|
|
example: Password reset successfully
|
|
type: string
|
|
success:
|
|
example: true
|
|
type: boolean
|
|
type: object
|
|
customer.UpdateCustomerForm:
|
|
properties:
|
|
companies:
|
|
items:
|
|
type: string
|
|
type: array
|
|
email:
|
|
example: user@opplens.com
|
|
type: string
|
|
full_name:
|
|
example: User
|
|
type: string
|
|
phone:
|
|
example: "+1234567890"
|
|
type: string
|
|
role:
|
|
example: analyst
|
|
type: string
|
|
type:
|
|
example: individual
|
|
type: string
|
|
username:
|
|
example: user
|
|
type: string
|
|
type: object
|
|
customer.UpdateStatusForm:
|
|
properties:
|
|
reason:
|
|
example: Customer is active
|
|
type: string
|
|
status:
|
|
example: active
|
|
type: string
|
|
type: object
|
|
customer.VerifyOTPForm:
|
|
properties:
|
|
code:
|
|
example: "123456"
|
|
type: string
|
|
email:
|
|
example: app@opplens.com
|
|
type: string
|
|
type: object
|
|
customer.VerifyOTPResponse:
|
|
properties:
|
|
message:
|
|
example: OTP verified successfully
|
|
type: string
|
|
success:
|
|
example: true
|
|
type: boolean
|
|
token:
|
|
example: reset_token_here
|
|
type: string
|
|
type: object
|
|
feedback.FeedbackListResponse:
|
|
properties:
|
|
feedback:
|
|
items:
|
|
$ref: '#/definitions/feedback.FeedbackResponse'
|
|
type: array
|
|
meta:
|
|
$ref: '#/definitions/response.Meta'
|
|
type: object
|
|
feedback.FeedbackResponse:
|
|
properties:
|
|
company:
|
|
$ref: '#/definitions/feedback.companyResponse'
|
|
company_id:
|
|
type: string
|
|
created_at:
|
|
type: integer
|
|
customer_id:
|
|
type: string
|
|
feedback_type:
|
|
$ref: '#/definitions/feedback.FeedbackType'
|
|
id:
|
|
type: string
|
|
tender:
|
|
$ref: '#/definitions/feedback.tenderResponse'
|
|
tender_id:
|
|
type: string
|
|
updated_at:
|
|
type: integer
|
|
type: object
|
|
feedback.FeedbackType:
|
|
enum:
|
|
- like
|
|
- dislike
|
|
type: string
|
|
x-enum-varnames:
|
|
- FeedbackTypeLike
|
|
- FeedbackTypeDislike
|
|
feedback.StatsResponse:
|
|
properties:
|
|
company:
|
|
$ref: '#/definitions/feedback.companyResponse'
|
|
company_id:
|
|
type: string
|
|
last_updated:
|
|
type: integer
|
|
total_dislikes:
|
|
type: integer
|
|
total_feedback:
|
|
type: integer
|
|
total_likes:
|
|
type: integer
|
|
type: object
|
|
feedback.ToggleFeedbackForm:
|
|
properties:
|
|
feedback_type:
|
|
allOf:
|
|
- $ref: '#/definitions/feedback.FeedbackType'
|
|
enum:
|
|
- like
|
|
- dislike
|
|
tender_id:
|
|
type: string
|
|
required:
|
|
- feedback_type
|
|
- tender_id
|
|
type: object
|
|
feedback.companyResponse:
|
|
properties:
|
|
id:
|
|
type: string
|
|
name:
|
|
type: string
|
|
type: object
|
|
feedback.organizationResponse:
|
|
properties:
|
|
name:
|
|
type: string
|
|
type: object
|
|
feedback.tenderResponse:
|
|
properties:
|
|
buyer_organization:
|
|
$ref: '#/definitions/feedback.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
|
|
inquiry.CreateInquiryForm:
|
|
properties:
|
|
company_name:
|
|
description: Company name
|
|
example: Opplens
|
|
type: string
|
|
full_name:
|
|
description: Full name of the inquirer
|
|
example: John Doe
|
|
type: string
|
|
phone_number:
|
|
description: Phone number
|
|
example: "+1234567890"
|
|
type: string
|
|
work_email:
|
|
description: Work email address
|
|
example: info@opplens.com
|
|
type: string
|
|
type: object
|
|
inquiry.InquiryListResponse:
|
|
properties:
|
|
inquiries:
|
|
items:
|
|
$ref: '#/definitions/inquiry.InquiryResponse'
|
|
type: array
|
|
meta:
|
|
$ref: '#/definitions/response.Meta'
|
|
type: object
|
|
inquiry.InquiryResponse:
|
|
properties:
|
|
company_name:
|
|
type: string
|
|
created_at:
|
|
type: integer
|
|
full_name:
|
|
type: string
|
|
id:
|
|
type: string
|
|
phone_number:
|
|
type: string
|
|
status:
|
|
type: string
|
|
status_history:
|
|
items:
|
|
$ref: '#/definitions/inquiry.StatusHistoryResponse'
|
|
type: array
|
|
updated_at:
|
|
type: integer
|
|
work_email:
|
|
type: string
|
|
type: object
|
|
inquiry.StatusHistoryResponse:
|
|
properties:
|
|
changed_at:
|
|
type: integer
|
|
description:
|
|
type: string
|
|
reason:
|
|
type: string
|
|
status:
|
|
type: string
|
|
type: object
|
|
inquiry.UpdateInquiryStatusForm:
|
|
properties:
|
|
description:
|
|
description: Optional description
|
|
example: Additional notes about the review
|
|
type: string
|
|
reason:
|
|
description: Reason for status change
|
|
example: Initial review completed
|
|
type: string
|
|
status:
|
|
description: New status
|
|
example: reviewed
|
|
type: string
|
|
type: object
|
|
internal_notification.NotificationListResponse:
|
|
properties:
|
|
meta:
|
|
$ref: '#/definitions/response.Meta'
|
|
notifications:
|
|
items:
|
|
$ref: '#/definitions/internal_notification.NotificationResponse'
|
|
type: array
|
|
type: object
|
|
internal_notification.NotificationRequest:
|
|
properties:
|
|
channels:
|
|
items:
|
|
$ref: '#/definitions/notification.DeliveryChannel'
|
|
type: array
|
|
description:
|
|
type: string
|
|
link:
|
|
type: string
|
|
priority:
|
|
$ref: '#/definitions/notification.NotificationPriority'
|
|
recipient:
|
|
items:
|
|
type: string
|
|
type: array
|
|
schedule_at:
|
|
type: integer
|
|
target:
|
|
$ref: '#/definitions/notification.TargetAudienceType'
|
|
tender:
|
|
type: string
|
|
title:
|
|
type: string
|
|
type:
|
|
$ref: '#/definitions/notification.NotificationType'
|
|
type: object
|
|
internal_notification.NotificationResponse:
|
|
properties:
|
|
created_at:
|
|
type: string
|
|
event_type:
|
|
type: string
|
|
id:
|
|
type: string
|
|
image:
|
|
type: string
|
|
is_scheduled:
|
|
type: boolean
|
|
link:
|
|
type: string
|
|
message:
|
|
type: string
|
|
metadata:
|
|
additionalProperties: {}
|
|
type: object
|
|
methods:
|
|
additionalProperties:
|
|
type: string
|
|
type: object
|
|
priority:
|
|
type: string
|
|
schedule_at:
|
|
type: integer
|
|
scheduled_at:
|
|
type: integer
|
|
seen:
|
|
type: boolean
|
|
seen_at:
|
|
type: integer
|
|
status:
|
|
type: string
|
|
title:
|
|
type: string
|
|
type:
|
|
type: string
|
|
updated_at:
|
|
type: string
|
|
user_id:
|
|
type: string
|
|
type: object
|
|
notification.DeliveryChannel:
|
|
enum:
|
|
- push
|
|
- email
|
|
type: string
|
|
x-enum-varnames:
|
|
- DeliveryChannelPush
|
|
- DeliveryChannelEmail
|
|
notification.DetailedNotificationResponse:
|
|
properties:
|
|
data:
|
|
properties:
|
|
created_at:
|
|
type: string
|
|
event_type:
|
|
type: string
|
|
id:
|
|
type: string
|
|
image:
|
|
type: string
|
|
is_scheduled:
|
|
type: boolean
|
|
link:
|
|
type: string
|
|
message:
|
|
type: string
|
|
metadata:
|
|
additionalProperties: {}
|
|
type: object
|
|
methods:
|
|
additionalProperties:
|
|
type: string
|
|
type: object
|
|
priority:
|
|
description: low, medium, important
|
|
type: string
|
|
scheduled_at:
|
|
type: integer
|
|
seen:
|
|
type: boolean
|
|
seen_at:
|
|
type: integer
|
|
status:
|
|
description: pending, sent, failed
|
|
type: string
|
|
title:
|
|
type: string
|
|
type:
|
|
description: info, warning, alert, reject
|
|
type: string
|
|
updated_at:
|
|
type: string
|
|
user_id:
|
|
type: string
|
|
type: object
|
|
type: object
|
|
notification.NotificationPriority:
|
|
enum:
|
|
- low
|
|
- medium
|
|
- important
|
|
type: string
|
|
x-enum-varnames:
|
|
- NotificationPriorityLow
|
|
- NotificationPriorityMedium
|
|
- NotificationPriorityImportant
|
|
notification.NotificationType:
|
|
enum:
|
|
- info
|
|
- warning
|
|
- alert
|
|
- reject
|
|
type: string
|
|
x-enum-varnames:
|
|
- NotificationTypeInfo
|
|
- NotificationTypeWarning
|
|
- NotificationTypeAlert
|
|
- NotificationTypeReject
|
|
notification.TargetAudienceType:
|
|
enum:
|
|
- all_users
|
|
- specific_users
|
|
- all_role
|
|
- specific_role
|
|
- all_companies
|
|
- specific_company
|
|
- all_customers
|
|
- specific_customer
|
|
type: string
|
|
x-enum-varnames:
|
|
- TargetAudienceAllUsers
|
|
- TargetAudienceSpecificUsers
|
|
- TargetAudienceAllRole
|
|
- TargetAudienceSpecificRole
|
|
- TargetAudienceAllCompanies
|
|
- TargetAudienceSpecificCompany
|
|
- TargetAudienceAllCustomers
|
|
- TargetAudienceSpecificCustomer
|
|
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.SearchResponse:
|
|
properties:
|
|
tenders:
|
|
items:
|
|
$ref: '#/definitions/tender.TenderResponse'
|
|
type: array
|
|
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.TenderApprovalWithTenderListResponse:
|
|
properties:
|
|
metadata:
|
|
$ref: '#/definitions/response.Meta'
|
|
tenders:
|
|
items:
|
|
$ref: '#/definitions/tender_approval.TenderApprovalWithTenderResponse'
|
|
type: array
|
|
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: NewAdmin!1234
|
|
type: string
|
|
old_password:
|
|
description: Current password for verification
|
|
example: Admin!1234
|
|
type: string
|
|
type: object
|
|
user.CreateUserForm:
|
|
properties:
|
|
department:
|
|
description: Optional department name
|
|
example: Information Technology
|
|
type: string
|
|
email:
|
|
description: Valid email address
|
|
example: admin@opplens.com
|
|
type: string
|
|
full_name:
|
|
description: Full name of the user
|
|
example: Admin User
|
|
type: string
|
|
password:
|
|
description: Password (minimum 8 characters)
|
|
example: Admin!1234
|
|
type: string
|
|
phone:
|
|
description: Optional phone number
|
|
example: "+18289784438"
|
|
type: string
|
|
position:
|
|
description: Optional job position
|
|
example: Lead
|
|
type: string
|
|
profile_image:
|
|
description: Optional profile image URL
|
|
example: ""
|
|
type: string
|
|
role:
|
|
description: User role (admin, manager, operator, viewer)
|
|
example: admin
|
|
type: string
|
|
username:
|
|
description: Unique username (alphanumeric only)
|
|
example: admin
|
|
type: string
|
|
type: object
|
|
user.LoginForm:
|
|
properties:
|
|
device_token:
|
|
description: Device token
|
|
example: device_token
|
|
type: string
|
|
password:
|
|
description: User password
|
|
example: Admin!1234
|
|
type: string
|
|
username:
|
|
description: Username or email address
|
|
example: admin
|
|
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: admin@opplens.com
|
|
type: string
|
|
type: object
|
|
user.UpdateUserForm:
|
|
properties:
|
|
department:
|
|
description: Updated department
|
|
example: Information Technology
|
|
type: string
|
|
email:
|
|
description: Updated email address
|
|
example: admin@opplens.com
|
|
type: string
|
|
full_name:
|
|
description: Updated full name
|
|
example: Admin User
|
|
type: string
|
|
phone:
|
|
description: Updated phone number
|
|
example: "+18289784438"
|
|
type: string
|
|
position:
|
|
description: Updated position
|
|
example: Lead
|
|
type: string
|
|
profile_image:
|
|
description: Updated profile image URL
|
|
example: ""
|
|
type: string
|
|
role:
|
|
description: Updated user role
|
|
example: admin
|
|
type: string
|
|
username:
|
|
description: Updated username
|
|
example: admin
|
|
type: string
|
|
type: object
|
|
user.UpdateUserStatusForm:
|
|
properties:
|
|
status:
|
|
type: string
|
|
type: object
|
|
user.UserListResponse:
|
|
properties:
|
|
users:
|
|
items:
|
|
$ref: '#/definitions/user.UserResponse'
|
|
type: array
|
|
type: object
|
|
user.UserResponse:
|
|
properties:
|
|
created_at:
|
|
type: integer
|
|
department:
|
|
type: string
|
|
email:
|
|
type: string
|
|
full_name:
|
|
type: string
|
|
id:
|
|
type: string
|
|
is_verified:
|
|
type: boolean
|
|
last_login_at:
|
|
type: integer
|
|
phone:
|
|
type: string
|
|
position:
|
|
type: string
|
|
profile_image:
|
|
type: string
|
|
role:
|
|
type: string
|
|
status:
|
|
type: string
|
|
updated_at:
|
|
type: integer
|
|
username:
|
|
type: string
|
|
type: object
|
|
host: localhost:8082
|
|
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/v1/companies:
|
|
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
|
|
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.CompanyForm'
|
|
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.CompanyForm'
|
|
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}/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.StatusForm'
|
|
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}/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.VerificationForm'
|
|
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/company-categories:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Search categories with filtering capabilities
|
|
parameters:
|
|
- description: Search query
|
|
in: query
|
|
name: q
|
|
type: string
|
|
- description: Published status filter
|
|
in: query
|
|
name: published
|
|
type: boolean
|
|
- default: 20
|
|
description: Limit
|
|
in: query
|
|
name: limit
|
|
type: integer
|
|
- default: 0
|
|
description: Offset
|
|
in: query
|
|
name: offset
|
|
type: integer
|
|
- description: Sort by field
|
|
enum:
|
|
- name
|
|
- created_at
|
|
- updated_at
|
|
- published_at
|
|
in: query
|
|
name: sort_by
|
|
type: string
|
|
- description: Sort order
|
|
enum:
|
|
- asc
|
|
- desc
|
|
in: query
|
|
name: sort_order
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Categories search completed
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/company_category.CategoryListResponse'
|
|
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: Search categories
|
|
tags:
|
|
- Admin-Company-Categories
|
|
post:
|
|
consumes:
|
|
- application/json
|
|
description: Create a new category with name, description, and thumbnail
|
|
parameters:
|
|
- description: Category information
|
|
in: body
|
|
name: category
|
|
required: true
|
|
schema:
|
|
$ref: '#/definitions/company_category.CategoryForm'
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"201":
|
|
description: Category created successfully
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/company_category.CategoryResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid input data
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"409":
|
|
description: Conflict - Category with this name already exists
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"422":
|
|
description: Validation error - Invalid request data
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Create a new category
|
|
tags:
|
|
- Admin-Company-Categories
|
|
/admin/v1/company-categories/{id}:
|
|
delete:
|
|
consumes:
|
|
- application/json
|
|
description: Delete a category permanently
|
|
parameters:
|
|
- description: Category ID
|
|
in: path
|
|
name: id
|
|
required: true
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Category deleted successfully
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"400":
|
|
description: Bad request - Invalid category ID
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"404":
|
|
description: Not found - Category not found
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Delete category
|
|
tags:
|
|
- Admin-Company-Categories
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Retrieve detailed category information by category ID
|
|
parameters:
|
|
- description: Category ID
|
|
in: path
|
|
name: id
|
|
required: true
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Category retrieved successfully
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/company_category.CategoryResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid category ID
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"404":
|
|
description: Not found - Category not found
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Get category by ID
|
|
tags:
|
|
- Admin-Company-Categories
|
|
put:
|
|
consumes:
|
|
- application/json
|
|
description: Update category information including name, description, and thumbnail
|
|
parameters:
|
|
- description: Category ID
|
|
in: path
|
|
name: id
|
|
required: true
|
|
type: string
|
|
- description: Category update information
|
|
in: body
|
|
name: category
|
|
required: true
|
|
schema:
|
|
$ref: '#/definitions/company_category.CategoryForm'
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Category updated successfully
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/company_category.CategoryResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid input data
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"404":
|
|
description: Not found - Category not found
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"409":
|
|
description: Conflict - Category with this name already exists
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"422":
|
|
description: Validation error - Invalid request data
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Update category information
|
|
tags:
|
|
- Admin-Company-Categories
|
|
/admin/v1/company-categories/{id}/publish:
|
|
patch:
|
|
consumes:
|
|
- application/json
|
|
description: Toggle category publish/unpublish status
|
|
parameters:
|
|
- description: Category ID
|
|
in: path
|
|
name: id
|
|
required: true
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Category publish status updated successfully
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"400":
|
|
description: Bad request - Invalid input data
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"404":
|
|
description: Not found - Category not found
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"422":
|
|
description: Validation error - Invalid request data
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Toggle category publish status
|
|
tags:
|
|
- Admin-Company-Categories
|
|
/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
|
|
- 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}/companies:
|
|
patch:
|
|
consumes:
|
|
- application/json
|
|
description: Assign companies to a customer
|
|
parameters:
|
|
- description: Customer ID
|
|
in: path
|
|
name: id
|
|
required: true
|
|
type: string
|
|
- description: Companies 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'
|
|
"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}/role:
|
|
patch:
|
|
consumes:
|
|
- application/json
|
|
description: Assign a role (admin or analyst) to a customer
|
|
parameters:
|
|
- description: Customer ID
|
|
in: path
|
|
name: id
|
|
required: true
|
|
type: string
|
|
- description: Role assignment information
|
|
in: body
|
|
name: role
|
|
required: true
|
|
schema:
|
|
$ref: '#/definitions/customer.AssignRoleForm'
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Role assigned successfully
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/customer.AssignRoleResponse'
|
|
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'
|
|
"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 role to 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.UpdateStatusForm'
|
|
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/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/flags/{country_code}:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Retrieve a country flag by its 3-letter country code for admin
|
|
panel
|
|
parameters:
|
|
- description: 3-letter country code (e.g., POL, GRC)
|
|
in: path
|
|
name: country_code
|
|
required: true
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: SVG content
|
|
schema:
|
|
type: string
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Get flag by country code (Admin)
|
|
tags:
|
|
- Admin-Flags
|
|
/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/inquiries:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Search and filter inquiries with pagination support. This endpoint
|
|
allows administrators to find inquiries based on various criteria including
|
|
name, company, email, status, and other filters.
|
|
parameters:
|
|
- description: Search term for full name, company name, or email
|
|
in: query
|
|
name: q
|
|
type: string
|
|
- description: Filter by status (pending, reviewed, approved, rejected)
|
|
in: query
|
|
name: status
|
|
type: string
|
|
- description: Limit results (1-100)
|
|
in: query
|
|
name: limit
|
|
type: integer
|
|
- description: Offset results
|
|
in: query
|
|
name: offset
|
|
type: integer
|
|
- description: Sort field (full_name, company_name, work_email, status, created_at)
|
|
in: query
|
|
name: sort_by
|
|
type: string
|
|
- description: Sort order (asc, desc)
|
|
in: query
|
|
name: sort_order
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Inquiries retrieved successfully with pagination metadata
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/inquiry.InquiryListResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid query parameters
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"422":
|
|
description: Validation error - Invalid parameter values
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
summary: Search inquiries
|
|
tags:
|
|
- Admin-Inquiries
|
|
/admin/v1/inquiries/{id}:
|
|
delete:
|
|
consumes:
|
|
- application/json
|
|
description: Delete an inquiry permanently from the system. This action cannot
|
|
be undone and will remove all inquiry data including contact information,
|
|
status history, and timestamps.
|
|
parameters:
|
|
- description: Inquiry ID
|
|
in: path
|
|
name: id
|
|
required: true
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Inquiry deleted successfully
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"400":
|
|
description: Bad request - Invalid inquiry ID format
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"404":
|
|
description: Not found - Inquiry with specified ID not found
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
summary: Delete inquiry
|
|
tags:
|
|
- Admin-Inquiries
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Retrieve detailed information about a specific inquiry by its unique
|
|
identifier. This endpoint provides complete inquiry details including contact
|
|
information, status, and status history.
|
|
parameters:
|
|
- description: Inquiry ID
|
|
in: path
|
|
name: id
|
|
required: true
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Inquiry retrieved successfully with complete details
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/inquiry.InquiryResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid inquiry ID format
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"404":
|
|
description: Not found - Inquiry with specified ID not found
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
summary: Get inquiry by ID
|
|
tags:
|
|
- Admin-Inquiries
|
|
/admin/v1/inquiries/{id}/status:
|
|
put:
|
|
consumes:
|
|
- application/json
|
|
description: 'Update the status of an inquiry with reason and optional description.
|
|
This endpoint allows administrators to change inquiry status following the
|
|
defined workflow: pending -> reviewed -> approved/rejected.'
|
|
parameters:
|
|
- description: Inquiry ID
|
|
in: path
|
|
name: id
|
|
required: true
|
|
type: string
|
|
- description: Status update information including new status, reason, and optional
|
|
description
|
|
in: body
|
|
name: status
|
|
required: true
|
|
schema:
|
|
$ref: '#/definitions/inquiry.UpdateInquiryStatusForm'
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Inquiry status updated successfully with updated details
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/inquiry.InquiryResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid inquiry ID format or invalid status transition
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"404":
|
|
description: Not found - Inquiry with specified ID not found
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"422":
|
|
description: Validation error - Invalid data format or validation rules
|
|
not met
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
summary: Update inquiry status
|
|
tags:
|
|
- Admin-Inquiries
|
|
/admin/v1/notifications:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Get notifications
|
|
parameters:
|
|
- description: Status filter
|
|
in: query
|
|
name: status
|
|
type: string
|
|
- description: Method filter
|
|
in: query
|
|
name: method
|
|
type: string
|
|
- description: Event type filter
|
|
in: query
|
|
name: event_type
|
|
type: string
|
|
- description: Type filter
|
|
in: query
|
|
name: type
|
|
type: string
|
|
- description: Recipient filter
|
|
in: query
|
|
name: recipient
|
|
type: string
|
|
- description: Seen filter
|
|
in: query
|
|
name: seen
|
|
type: boolean
|
|
- description: Priority filter
|
|
in: query
|
|
name: priority
|
|
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/internal_notification.NotificationListResponse'
|
|
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 notifications
|
|
tags:
|
|
- Admin-Notification
|
|
post:
|
|
consumes:
|
|
- application/json
|
|
description: Create a new notification with the provided information
|
|
parameters:
|
|
- description: Notification information
|
|
in: body
|
|
name: notification
|
|
required: true
|
|
schema:
|
|
$ref: '#/definitions/internal_notification.NotificationRequest'
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"201":
|
|
description: Notification created successfully
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"400":
|
|
description: Bad Request
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal Server Error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Create a new notification
|
|
tags:
|
|
- Admin-Notification
|
|
/admin/v1/notifications/mark-seen/{id}:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Mark a notification as seen
|
|
parameters:
|
|
- description: Notification 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'
|
|
"500":
|
|
description: Internal Server Error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Mark a notification as seen
|
|
tags:
|
|
- Admin-Notification
|
|
/admin/v1/notifications/my:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Get notifications for the admin
|
|
parameters:
|
|
- description: Status filter
|
|
in: query
|
|
name: status
|
|
type: string
|
|
- description: Method filter
|
|
in: query
|
|
name: method
|
|
type: string
|
|
- description: Event type filter
|
|
in: query
|
|
name: event_type
|
|
type: string
|
|
- description: Type filter
|
|
in: query
|
|
name: type
|
|
type: string
|
|
- description: Recipient filter
|
|
in: query
|
|
name: recipient
|
|
type: string
|
|
- description: Seen filter
|
|
in: query
|
|
name: seen
|
|
type: boolean
|
|
- description: Priority filter
|
|
in: query
|
|
name: priority
|
|
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/internal_notification.NotificationListResponse'
|
|
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 notifications for the admin
|
|
tags:
|
|
- Admin-Notification
|
|
/admin/v1/notifications/view/{id}:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Get detailed information about a specific notification
|
|
parameters:
|
|
- description: Notification 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/internal_notification.NotificationResponse'
|
|
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: Get notification details
|
|
tags:
|
|
- Admin-Notification
|
|
/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-Authorization
|
|
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-Authorization
|
|
/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-Authorization
|
|
/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/tenders:
|
|
get:
|
|
description: Retrieve tenders with pagination, filtering, and search capabilities
|
|
with optional company-based matching
|
|
parameters:
|
|
- 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: q
|
|
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
|
|
- description: Deadline from
|
|
in: query
|
|
name: deadline_from
|
|
type: number
|
|
- description: Deadline to
|
|
in: query
|
|
name: deadline_to
|
|
type: number
|
|
- description: Publication date from
|
|
in: query
|
|
name: publication_date_from
|
|
type: number
|
|
- description: Publication date to
|
|
in: query
|
|
name: publication_date_to
|
|
type: number
|
|
- collectionFormat: csv
|
|
description: Filter by languages (comma-separated)
|
|
in: query
|
|
items:
|
|
type: string
|
|
name: languages
|
|
type: array
|
|
- description: Filter by buyer organization ID
|
|
in: query
|
|
name: buyer_organization_id
|
|
type: string
|
|
- 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: Sort by field
|
|
in: query
|
|
name: sort_by
|
|
type: string
|
|
- description: Sort order (asc or desc)
|
|
in: query
|
|
name: sort_order
|
|
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/v1/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/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: 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}/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
|
|
/api/v1//{country_code}:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Retrieve only the SVG content of a country flag by its 3-letter
|
|
country code
|
|
parameters:
|
|
- description: 3-letter country code (e.g., POL, GRC)
|
|
in: path
|
|
name: country_code
|
|
required: true
|
|
type: string
|
|
produces:
|
|
- image/svg+xml
|
|
responses:
|
|
"200":
|
|
description: SVG content
|
|
schema:
|
|
type: string
|
|
summary: Get flag SVG
|
|
tags:
|
|
- Flags
|
|
/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.StatsResponse'
|
|
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/inquiries:
|
|
post:
|
|
consumes:
|
|
- application/json
|
|
description: Create a new inquiry with contact information for potential business
|
|
opportunities. This endpoint allows external users to submit inquiries about
|
|
services or partnerships. Duplicate submissions are prevented based on email
|
|
and phone number.
|
|
parameters:
|
|
- description: Inquiry information including contact details and company information
|
|
in: body
|
|
name: inquiry
|
|
required: true
|
|
schema:
|
|
$ref: '#/definitions/inquiry.CreateInquiryForm'
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"201":
|
|
description: Inquiry created successfully with assigned ID and timestamps
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/inquiry.InquiryResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid input data or missing required fields
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"409":
|
|
description: Conflict - Duplicate inquiry already exists with same email
|
|
or phone number
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"422":
|
|
description: Validation error - Invalid data format or validation rules
|
|
not met
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"500":
|
|
description: Internal server error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
summary: Create new inquiry
|
|
tags:
|
|
- Inquiries
|
|
/api/v1/notifications:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Get notifications for the user
|
|
parameters:
|
|
- description: Status filter
|
|
in: query
|
|
name: status
|
|
type: string
|
|
- description: Method filter
|
|
in: query
|
|
name: method
|
|
type: string
|
|
- description: Event type filter
|
|
in: query
|
|
name: event_type
|
|
type: string
|
|
- description: Type filter
|
|
in: query
|
|
name: type
|
|
type: string
|
|
- description: Recipient filter
|
|
in: query
|
|
name: recipient
|
|
type: string
|
|
- description: Seen filter
|
|
in: query
|
|
name: seen
|
|
type: boolean
|
|
- description: Priority filter
|
|
in: query
|
|
name: priority
|
|
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/internal_notification.NotificationListResponse'
|
|
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 notifications for the user
|
|
tags:
|
|
- Notification
|
|
/api/v1/notifications/mark:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Mark all notifications as seen for a user
|
|
parameters:
|
|
- description: User ID
|
|
in: path
|
|
name: user_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'
|
|
"500":
|
|
description: Internal Server Error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Mark all notifications as seen for a user
|
|
tags:
|
|
- Notification
|
|
/api/v1/notifications/mark/{id}:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Mark a notification as seen
|
|
parameters:
|
|
- description: Notification 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'
|
|
"500":
|
|
description: Internal Server Error
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
security:
|
|
- BearerAuth: []
|
|
summary: Mark a notification as seen
|
|
tags:
|
|
- Notification
|
|
/api/v1/notifications/view/{id}:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Get detailed information about a specific notification
|
|
parameters:
|
|
- description: Notification 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/notification.DetailedNotificationResponse'
|
|
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: Get notification details
|
|
tags:
|
|
- Notification
|
|
/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/forgot-password:
|
|
post:
|
|
consumes:
|
|
- application/json
|
|
description: Send a password reset OTP code to the customer's email address
|
|
parameters:
|
|
- description: Email address for password reset
|
|
in: body
|
|
name: request
|
|
required: true
|
|
schema:
|
|
$ref: '#/definitions/customer.RequestResetPasswordForm'
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Password reset code sent successfully
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/customer.RequestResetPasswordResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid input data
|
|
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: Request password reset
|
|
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/profile/reset-password:
|
|
post:
|
|
consumes:
|
|
- application/json
|
|
description: Reset the customer's password using the reset token
|
|
parameters:
|
|
- description: Email, reset token, and new password
|
|
in: body
|
|
name: request
|
|
required: true
|
|
schema:
|
|
$ref: '#/definitions/customer.ResetPasswordForm'
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: Password reset successfully
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/customer.ResetPasswordResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid input data
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"401":
|
|
description: Unauthorized - Invalid or expired reset 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: Reset password
|
|
tags:
|
|
- Authorization
|
|
/api/v1/profile/verify-otp:
|
|
post:
|
|
consumes:
|
|
- application/json
|
|
description: Verify the OTP code received via email and get a reset token
|
|
parameters:
|
|
- description: Email and OTP code for verification
|
|
in: body
|
|
name: request
|
|
required: true
|
|
schema:
|
|
$ref: '#/definitions/customer.VerifyOTPForm'
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: OTP verified successfully
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/customer.VerifyOTPResponse'
|
|
type: object
|
|
"400":
|
|
description: Bad request - Invalid input data
|
|
schema:
|
|
$ref: '#/definitions/response.APIResponse'
|
|
"401":
|
|
description: Unauthorized - Invalid or expired OTP
|
|
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: Verify OTP code
|
|
tags:
|
|
- Authorization
|
|
/api/v1/tender-approvals:
|
|
get:
|
|
consumes:
|
|
- application/json
|
|
description: Retrieve all tender approvals for a specific company with optional
|
|
filtering
|
|
parameters:
|
|
- 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
|
|
- 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:
|
|
$ref: '#/definitions/tender_approval.TenderApprovalWithTenderListResponse'
|
|
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: Search query for title and description
|
|
in: query
|
|
name: q
|
|
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
|
|
- description: Deadline from
|
|
in: query
|
|
name: deadline_from
|
|
type: number
|
|
- description: Deadline to
|
|
in: query
|
|
name: deadline_to
|
|
type: number
|
|
- description: Publication date from
|
|
in: query
|
|
name: publication_date_from
|
|
type: number
|
|
- description: Publication date to
|
|
in: query
|
|
name: publication_date_to
|
|
type: number
|
|
- collectionFormat: csv
|
|
description: Filter by languages (comma-separated)
|
|
in: query
|
|
items:
|
|
type: string
|
|
name: languages
|
|
type: array
|
|
- description: Filter by buyer organization ID
|
|
in: query
|
|
name: buyer_organization_id
|
|
type: string
|
|
- 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: Sort by field
|
|
in: query
|
|
name: sort_by
|
|
type: string
|
|
- description: Sort order (asc or desc)
|
|
in: query
|
|
name: sort_order
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/tender.SearchResponse'
|
|
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: Search query for title and description
|
|
in: query
|
|
name: q
|
|
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
|
|
- description: Deadline from
|
|
in: query
|
|
name: deadline_from
|
|
type: number
|
|
- description: Deadline to
|
|
in: query
|
|
name: deadline_to
|
|
type: number
|
|
- description: Publication date from
|
|
in: query
|
|
name: publication_date_from
|
|
type: number
|
|
- description: Publication date to
|
|
in: query
|
|
name: publication_date_to
|
|
type: number
|
|
- collectionFormat: csv
|
|
description: Filter by languages (comma-separated)
|
|
in: query
|
|
items:
|
|
type: string
|
|
name: languages
|
|
type: array
|
|
- description: Filter by buyer organization ID
|
|
in: query
|
|
name: buyer_organization_id
|
|
type: string
|
|
- 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: Sort by field
|
|
in: query
|
|
name: sort_by
|
|
type: string
|
|
- description: Sort order (asc or desc)
|
|
in: query
|
|
name: sort_order
|
|
type: string
|
|
produces:
|
|
- application/json
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
schema:
|
|
allOf:
|
|
- $ref: '#/definitions/response.APIResponse'
|
|
- properties:
|
|
data:
|
|
$ref: '#/definitions/tender.SearchResponse'
|
|
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 company category management operations for web panel
|
|
including CRUD operations, publish/unpublish status, and comprehensive filtering
|
|
with pagination
|
|
name: Admin-Company-Categories
|
|
- description: Administrative tender management operations for web panel including
|
|
CRUD operations, search, statistics, and comprehensive filtering with pagination
|
|
name: Admin-Tenders
|
|
- description: Administrative feedback management operations for web panel including
|
|
CRUD operations, search, statistics, and comprehensive filtering with pagination
|
|
name: Admin-Feedback
|
|
- description: Administrative tender approval management operations for web panel
|
|
including CRUD operations, search, statistics, and comprehensive filtering with
|
|
pagination
|
|
name: Admin-TenderApprovals
|
|
- description: Administrative inquiry management operations for web panel including
|
|
CRUD operations, search, statistics, and comprehensive filtering with pagination
|
|
name: Admin-Inquiries
|
|
- description: Administrative flag management operations for web panel including flag
|
|
listing and retrieval
|
|
name: Admin-Flags
|
|
- description: Administrative notification management operations for web panel including
|
|
CRUD operations, bulk notifications, queue management, and comprehensive filtering
|
|
with pagination
|
|
name: Admin-Notification
|
|
- description: Customer authentication and authorization operations for mobile application
|
|
including login, logout, token refresh, and profile access
|
|
name: Authorization
|
|
- description: Company information access for mobile application including company
|
|
profile and company tenders
|
|
name: Company
|
|
- description: Public tender information access for mobile application including active
|
|
tender listings and detailed tender information
|
|
name: Tenders
|
|
- description: Public feedback management operations for mobile application including
|
|
like, dislike, and comment on tenders
|
|
name: Feedback
|
|
- description: Public tender approval management operations for mobile application
|
|
including tender approval listing and detailed tender approval information
|
|
name: TenderApprovals
|
|
- description: Public inquiry management operations for mobile application including
|
|
inquiry submission and inquiry listing
|
|
name: Inquiries
|
|
- description: Public flag management operations for mobile application including
|
|
flag retrieval and listing
|
|
name: Flags
|