Remove obsolete customer endpoint and update related documentation

- Deleted the `/admin/v1/customers/{id}/with-companies` endpoint from the API documentation and Swagger files to streamline the API structure.
- Updated the router to remove the corresponding route registration for the deprecated endpoint.
- Enhanced the company repository and service to support batch retrieval of companies by IDs, improving efficiency in data handling.
- Adjusted customer service methods to utilize the new batch retrieval functionality for loading companies associated with customers.
- Improved logging practices to provide better traceability for company retrieval operations.
This commit is contained in:
n.nakhostin
2025-08-11 19:12:31 +03:30
parent a1db2a9790
commit e3ee3d64ce
8 changed files with 100 additions and 219 deletions
+1 -28
View File
@@ -84,33 +84,6 @@ func (h *Handler) CreateCustomer(c echo.Context) error {
func (h *Handler) GetCustomerByID(c echo.Context) error {
idStr := c.Param("id")
customer, err := h.service.GetCustomerByID(c.Request().Context(), idStr)
if err != nil {
if err.Error() == "customer not found" {
return response.NotFound(c, "Customer not found")
}
return response.InternalServerError(c, "Failed to get customer")
}
return response.Success(c, customer.ToResponse(), "Customer retrieved successfully")
}
// GetCustomerByIDWithCompanies retrieves a customer by ID with companies (Web Panel)
// @Summary Get customer by ID with companies
// @Description Retrieve detailed customer information by customer ID including assigned companies
// @Tags Admin-Customers
// @Accept json
// @Produce json
// @Param id path string true "Customer ID"
// @Success 200 {object} response.APIResponse{data=CustomerResponse} "Customer retrieved successfully"
// @Failure 400 {object} response.APIResponse "Bad request - Invalid customer ID"
// @Failure 404 {object} response.APIResponse "Not found - Customer not found"
// @Failure 500 {object} response.APIResponse "Internal server error"
// @Security BearerAuth
// @Router /admin/v1/customers/{id}/with-companies [get]
func (h *Handler) GetCustomerByIDWithCompanies(c echo.Context) error {
idStr := c.Param("id")
customer, err := h.service.GetCustomerByIDWithCompanies(c.Request().Context(), idStr)
if err != nil {
if err.Error() == "customer not found" {
@@ -234,7 +207,7 @@ func (h *Handler) ListCustomers(c echo.Context) error {
return response.ValidationError(c, "Invalid request data", err.Error())
}
result, err := h.service.ListCustomers(c.Request().Context(), form)
result, err := h.service.ListCustomersWithCompanies(c.Request().Context(), form)
if err != nil {
return response.InternalServerError(c, "Failed to list customers")
}
+25 -14
View File
@@ -1280,24 +1280,35 @@ func (s *customerService) getDefaultTimezone(timezone *string) string {
// loadCompaniesForCustomer loads company summaries for a customer
func (s *customerService) loadCompaniesForCustomer(ctx context.Context, customer *Customer) ([]*CompanySummary, error) {
var companies []*CompanySummary
if len(customer.CompanyIDs) == 0 {
return []*CompanySummary{}, nil
}
// Load companies from CompanyIDs
for _, companyID := range customer.CompanyIDs {
company, err := s.companyService.GetCompanyByID(ctx, companyID)
if err != nil {
s.logger.Warn("Failed to load company for customer", map[string]interface{}{
"error": err.Error(),
"customer_id": customer.ID,
"company_id": companyID,
})
continue // Skip companies that can't be loaded
}
companies = append(companies, &CompanySummary{
// Load companies in batch using the new GetCompaniesByIDs method
companies, err := s.companyService.GetCompaniesByIDs(ctx, customer.CompanyIDs)
if err != nil {
s.logger.Error("Failed to load companies for customer", map[string]interface{}{
"error": err.Error(),
"customer_id": customer.ID,
"company_ids": customer.CompanyIDs,
})
return []*CompanySummary{}, err
}
// Convert to CompanySummary format
var companySummaries []*CompanySummary
for _, company := range companies {
companySummaries = append(companySummaries, &CompanySummary{
ID: company.ID.Hex(),
Name: company.Name,
})
}
return companies, nil
s.logger.Info("Companies loaded for customer", map[string]interface{}{
"customer_id": customer.ID,
"requested_count": len(customer.CompanyIDs),
"loaded_count": len(companySummaries),
})
return companySummaries, nil
}