MIF_E31222379_BE/internal/services/company_profile_service.go

164 lines
5.4 KiB
Go

package services
import (
"fmt"
"rijig/dto"
"rijig/internal/repositories"
"rijig/model"
"rijig/utils"
)
type CompanyProfileService interface {
CreateCompanyProfile(userID string, request *dto.RequestCompanyProfileDTO) (*dto.ResponseCompanyProfileDTO, error)
GetCompanyProfileByID(id string) (*dto.ResponseCompanyProfileDTO, error)
GetCompanyProfilesByUserID(userID string) ([]dto.ResponseCompanyProfileDTO, error)
UpdateCompanyProfile(id string, request *dto.RequestCompanyProfileDTO) (*dto.ResponseCompanyProfileDTO, error)
DeleteCompanyProfile(id string) error
}
type companyProfileService struct {
companyProfileRepo repositories.CompanyProfileRepository
}
func NewCompanyProfileService(companyProfileRepo repositories.CompanyProfileRepository) CompanyProfileService {
return &companyProfileService{
companyProfileRepo: companyProfileRepo,
}
}
func FormatResponseCompanyProfile(companyProfile *model.CompanyProfile) (*dto.ResponseCompanyProfileDTO, error) {
createdAt, _ := utils.FormatDateToIndonesianFormat(companyProfile.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(companyProfile.UpdatedAt)
responseDTO := &dto.ResponseCompanyProfileDTO{
ID: companyProfile.ID,
UserID: companyProfile.UserID,
CompanyName: companyProfile.CompanyName,
CompanyAddress: companyProfile.CompanyAddress,
CompanyPhone: companyProfile.CompanyPhone,
CompanyEmail: companyProfile.CompanyEmail,
CompanyLogo: companyProfile.CompanyLogo,
CompanyWebsite: companyProfile.CompanyWebsite,
TaxID: companyProfile.TaxID,
FoundedDate: companyProfile.FoundedDate,
CompanyType: companyProfile.CompanyType,
CompanyDescription: companyProfile.CompanyDescription,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
}
return responseDTO, nil
}
func (s *companyProfileService) CreateCompanyProfile(userID string, request *dto.RequestCompanyProfileDTO) (*dto.ResponseCompanyProfileDTO, error) {
errors, valid := request.ValidateCompanyProfileInput()
if !valid {
return nil, fmt.Errorf("validation failed: %v", errors)
}
companyProfile := &model.CompanyProfile{
UserID: userID,
CompanyName: request.CompanyName,
CompanyAddress: request.CompanyAddress,
CompanyPhone: request.CompanyPhone,
CompanyEmail: request.CompanyEmail,
CompanyLogo: request.CompanyLogo,
CompanyWebsite: request.CompanyWebsite,
TaxID: request.TaxID,
FoundedDate: request.FoundedDate,
CompanyType: request.CompanyType,
CompanyDescription: request.CompanyDescription,
}
createdCompanyProfile, err := s.companyProfileRepo.CreateCompanyProfile(companyProfile)
if err != nil {
return nil, fmt.Errorf("failed to create company profile: %v", err)
}
responseDTO, err := FormatResponseCompanyProfile(createdCompanyProfile)
if err != nil {
return nil, fmt.Errorf("failed to format company profile response: %v", err)
}
return responseDTO, nil
}
func (s *companyProfileService) GetCompanyProfileByID(id string) (*dto.ResponseCompanyProfileDTO, error) {
companyProfile, err := s.companyProfileRepo.GetCompanyProfileByID(id)
if err != nil {
return nil, fmt.Errorf("error retrieving company profile by ID: %v", err)
}
responseDTO, err := FormatResponseCompanyProfile(companyProfile)
if err != nil {
return nil, fmt.Errorf("error formatting company profile response: %v", err)
}
return responseDTO, nil
}
func (s *companyProfileService) GetCompanyProfilesByUserID(userID string) ([]dto.ResponseCompanyProfileDTO, error) {
companyProfiles, err := s.companyProfileRepo.GetCompanyProfilesByUserID(userID)
if err != nil {
return nil, fmt.Errorf("error retrieving company profiles by userID: %v", err)
}
var responseDTOs []dto.ResponseCompanyProfileDTO
for _, companyProfile := range companyProfiles {
responseDTO, err := FormatResponseCompanyProfile(&companyProfile)
if err != nil {
return nil, fmt.Errorf("error formatting company profile response: %v", err)
}
responseDTOs = append(responseDTOs, *responseDTO)
}
return responseDTOs, nil
}
func (s *companyProfileService) UpdateCompanyProfile(id string, request *dto.RequestCompanyProfileDTO) (*dto.ResponseCompanyProfileDTO, error) {
errors, valid := request.ValidateCompanyProfileInput()
if !valid {
return nil, fmt.Errorf("validation failed: %v", errors)
}
companyProfile := &model.CompanyProfile{
CompanyName: request.CompanyName,
CompanyAddress: request.CompanyAddress,
CompanyPhone: request.CompanyPhone,
CompanyEmail: request.CompanyEmail,
CompanyLogo: request.CompanyLogo,
CompanyWebsite: request.CompanyWebsite,
TaxID: request.TaxID,
FoundedDate: request.FoundedDate,
CompanyType: request.CompanyType,
CompanyDescription: request.CompanyDescription,
}
updatedCompanyProfile, err := s.companyProfileRepo.UpdateCompanyProfile(id, companyProfile)
if err != nil {
return nil, fmt.Errorf("failed to update company profile: %v", err)
}
responseDTO, err := FormatResponseCompanyProfile(updatedCompanyProfile)
if err != nil {
return nil, fmt.Errorf("failed to format company profile response: %v", err)
}
return responseDTO, nil
}
func (s *companyProfileService) DeleteCompanyProfile(id string) error {
err := s.companyProfileRepo.DeleteCompanyProfile(id)
if err != nil {
return fmt.Errorf("failed to delete company profile: %v", err)
}
return nil
}