Add Company Category Management Functionality and Update API Documentation

- Introduced a new company category management feature, including CRUD operations for categories in both admin and public API endpoints.
- Implemented category entity, service, repository, and handler layers following clean architecture principles.
- Added new API routes for searching, retrieving, updating, deleting, and toggling publish status of categories, enhancing the overall functionality of the system.
- Updated Swagger and YAML documentation to include detailed descriptions and examples for the new category endpoints, ensuring clarity for API consumers.
- Enhanced error handling for duplicate categories and validation, improving the robustness of the category management process.
- Updated existing routes to integrate category handling, ensuring a seamless user experience across the application.
This commit is contained in:
n.nakhostin
2025-09-08 12:31:49 +03:30
parent 617547def8
commit 991771ee19
10 changed files with 2156 additions and 7 deletions
+509
View File
@@ -904,6 +904,454 @@ const docTemplate = `{
}
}
},
"/admin/v1/company-categories": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Search categories with filtering capabilities",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Search categories",
"parameters": [
{
"type": "string",
"description": "Search query",
"name": "q",
"in": "query"
},
{
"type": "boolean",
"description": "Published status filter",
"name": "published",
"in": "query"
},
{
"type": "integer",
"default": 20,
"description": "Limit",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"default": 0,
"description": "Offset",
"name": "offset",
"in": "query"
},
{
"enum": [
"name",
"created_at",
"updated_at",
"published_at"
],
"type": "string",
"description": "Sort by field",
"name": "sort_by",
"in": "query"
},
{
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort order",
"name": "sort_order",
"in": "query"
}
],
"responses": {
"200": {
"description": "Categories search completed",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company_category.CategoryListResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid query parameters",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "Create a new category with name, description, and thumbnail",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Create a new category",
"parameters": [
{
"description": "Category information",
"name": "category",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/company_category.CategoryForm"
}
}
],
"responses": {
"201": {
"description": "Category created successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company_category.CategoryResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Category with this name already exists",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/company-categories/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Retrieve detailed category information by category ID",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Get category by ID",
"parameters": [
{
"type": "string",
"description": "Category ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Category retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company_category.CategoryResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid category ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Category not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Update category information including name, description, and thumbnail",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Update category information",
"parameters": [
{
"type": "string",
"description": "Category ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Category update information",
"name": "category",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/company_category.CategoryForm"
}
}
],
"responses": {
"200": {
"description": "Category updated successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/company_category.CategoryResponse"
}
}
}
]
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Category not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"409": {
"description": "Conflict - Category with this name already exists",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Delete a category permanently",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Delete category",
"parameters": [
{
"type": "string",
"description": "Category ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Category deleted successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid category ID",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Category not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/company-categories/{id}/publish": {
"patch": {
"security": [
{
"BearerAuth": []
}
],
"description": "Toggle category publish/unpublish status",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Admin-Company-Categories"
],
"summary": "Toggle category publish status",
"parameters": [
{
"type": "string",
"description": "Category ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Category publish status updated successfully",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"400": {
"description": "Bad request - Invalid input data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"404": {
"description": "Not found - Category not found",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"422": {
"description": "Validation error - Invalid request data",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
},
"500": {
"description": "Internal server error",
"schema": {
"$ref": "#/definitions/response.APIResponse"
}
}
}
}
},
"/admin/v1/customers": {
"get": {
"security": [
@@ -5487,6 +5935,63 @@ const docTemplate = `{
}
}
},
"company_category.CategoryForm": {
"type": "object",
"properties": {
"description": {
"type": "string",
"example": "Technology related companies"
},
"name": {
"type": "string",
"example": "Technology"
},
"thumbnail": {
"type": "string",
"example": "https://example.com/thumbnail.jpg"
}
}
},
"company_category.CategoryListResponse": {
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"$ref": "#/definitions/company_category.CategoryResponse"
}
}
}
},
"company_category.CategoryResponse": {
"type": "object",
"properties": {
"created_at": {
"type": "integer"
},
"description": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"published": {
"type": "boolean"
},
"published_at": {
"type": "integer"
},
"thumbnail": {
"type": "string"
},
"updated_at": {
"type": "integer"
}
}
},
"customer.AuthResponse": {
"type": "object",
"properties": {
@@ -6552,6 +7057,10 @@ const docTemplate = `{
"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"