Add functionality to manage external links for companies
continuous-integration/drone/push Build is passing

- Introduced the ability to append external links to company profiles through a new API endpoint.
- Enhanced the `Company` entity to include a `Links` field for storing external resource links.
- Created `AddLinksForm` for validating incoming link data and implemented corresponding logic in the service layer.
- Added error handling for link validation, ensuring only valid URLs are accepted and limiting the number of links to 20.
- Implemented unit tests for link management functions, including sanitization and merging of links.
- Updated relevant API documentation to reflect the new functionality.

This update significantly enhances the company management capabilities by allowing the addition of external links, improving the overall user experience and data richness in company profiles.
This commit is contained in:
Mazyar
2026-07-06 00:05:48 +03:30
parent 3aeb8630e3
commit 89faa08b1c
10 changed files with 362 additions and 14 deletions
+24 -1
View File
@@ -36,6 +36,9 @@ type Service interface {
// UploadDocuments uploads files and attaches them to a company
UploadDocuments(ctx context.Context, companyID, uploadedBy string, files []*multipart.FileHeader) (*UploadDocumentsResponse, error)
// AddLinks appends external URLs to a company
AddLinks(ctx context.Context, companyID string, form *AddLinksForm) (*AddLinksResponse, error)
// DetachDocumentFileID removes a file ID from companies when the file is deleted
DetachDocumentFileID(ctx context.Context, fileID string) error
@@ -118,6 +121,14 @@ func (s *companyService) Create(ctx context.Context, form *CompanyForm) (*Compan
}
}
links, err := sanitizeCompanyLinks(convertCompanyLinkForms(form.Links))
if err != nil {
return nil, err
}
if len(links) > maxCompanyLinks {
return nil, errors.New("too many links provided")
}
// Create company
company := &Company{
Name: form.Name,
@@ -135,6 +146,7 @@ func (s *companyService) Create(ctx context.Context, form *CompanyForm) (*Compan
Phone: form.Phone,
Email: form.Email,
DocumentFileIDs: s.sanitizeDocumentFileIDs(form.DocumentFileIDs),
Links: links,
Tags: s.convertCompanyTagsForm(form.Tags),
IsVerified: false,
IsCompliant: false,
@@ -144,7 +156,7 @@ func (s *companyService) Create(ctx context.Context, form *CompanyForm) (*Compan
}
// Save to database
err := s.repository.Create(ctx, company)
err = s.repository.Create(ctx, company)
if err != nil {
s.logger.Error("Failed to create company", map[string]interface{}{
"error": err.Error(),
@@ -304,6 +316,17 @@ func (s *companyService) Update(ctx context.Context, id string, form *CompanyFor
company.DocumentFileIDs = s.sanitizeDocumentFileIDs(form.DocumentFileIDs)
}
if form.Links != nil {
links, linkErr := sanitizeCompanyLinks(convertCompanyLinkForms(form.Links))
if linkErr != nil {
return nil, linkErr
}
if len(links) > maxCompanyLinks {
return nil, errors.New("too many links provided")
}
company.Links = links
}
if form.Tags != nil {
company.Tags = s.convertCompanyTagsForm(form.Tags)
}