137 lines
4.7 KiB
Go
137 lines
4.7 KiB
Go
package company
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"rijig/model"
|
|
"rijig/utils"
|
|
)
|
|
|
|
type CompanyProfileService interface {
|
|
CreateCompanyProfile(ctx context.Context, userID string, request *RequestCompanyProfileDTO) (*ResponseCompanyProfileDTO, error)
|
|
GetCompanyProfileByID(ctx context.Context, id string) (*ResponseCompanyProfileDTO, error)
|
|
GetCompanyProfilesByUserID(ctx context.Context, userID string) ([]ResponseCompanyProfileDTO, error)
|
|
UpdateCompanyProfile(ctx context.Context, userID string, request *RequestCompanyProfileDTO) (*ResponseCompanyProfileDTO, error)
|
|
DeleteCompanyProfile(ctx context.Context, userID string) error
|
|
}
|
|
|
|
type companyProfileService struct {
|
|
companyRepo CompanyProfileRepository
|
|
}
|
|
|
|
func NewCompanyProfileService(companyRepo CompanyProfileRepository) CompanyProfileService {
|
|
return &companyProfileService{
|
|
companyRepo: companyRepo,
|
|
}
|
|
}
|
|
|
|
func FormatResponseCompanyProfile(companyProfile *model.CompanyProfile) (*ResponseCompanyProfileDTO, error) {
|
|
createdAt, _ := utils.FormatDateToIndonesianFormat(companyProfile.CreatedAt)
|
|
updatedAt, _ := utils.FormatDateToIndonesianFormat(companyProfile.UpdatedAt)
|
|
|
|
return &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,
|
|
}, nil
|
|
}
|
|
|
|
func (s *companyProfileService) CreateCompanyProfile(ctx context.Context, userID string, request *RequestCompanyProfileDTO) (*ResponseCompanyProfileDTO, error) {
|
|
if errors, valid := request.ValidateCompanyProfileInput(); !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,
|
|
}
|
|
|
|
created, err := s.companyRepo.CreateCompanyProfile(ctx, companyProfile)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return FormatResponseCompanyProfile(created)
|
|
}
|
|
|
|
func (s *companyProfileService) GetCompanyProfileByID(ctx context.Context, id string) (*ResponseCompanyProfileDTO, error) {
|
|
profile, err := s.companyRepo.GetCompanyProfileByID(ctx, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return FormatResponseCompanyProfile(profile)
|
|
}
|
|
|
|
func (s *companyProfileService) GetCompanyProfilesByUserID(ctx context.Context, userID string) ([]ResponseCompanyProfileDTO, error) {
|
|
profiles, err := s.companyRepo.GetCompanyProfilesByUserID(ctx, userID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var responses []ResponseCompanyProfileDTO
|
|
for _, p := range profiles {
|
|
dto, err := FormatResponseCompanyProfile(&p)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
responses = append(responses, *dto)
|
|
}
|
|
|
|
return responses, nil
|
|
}
|
|
|
|
func (s *companyProfileService) UpdateCompanyProfile(ctx context.Context, userID string, request *RequestCompanyProfileDTO) (*ResponseCompanyProfileDTO, error) {
|
|
if errors, valid := request.ValidateCompanyProfileInput(); !valid {
|
|
return nil, fmt.Errorf("validation failed: %v", errors)
|
|
}
|
|
|
|
company := &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,
|
|
}
|
|
|
|
if err := s.companyRepo.UpdateCompanyProfile(ctx, company); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
updated, err := s.companyRepo.GetCompanyProfilesByUserID(ctx, userID)
|
|
if err != nil || len(updated) == 0 {
|
|
return nil, fmt.Errorf("failed to retrieve updated company profile")
|
|
}
|
|
|
|
return FormatResponseCompanyProfile(&updated[0])
|
|
}
|
|
|
|
func (s *companyProfileService) DeleteCompanyProfile(ctx context.Context, userID string) error {
|
|
return s.companyRepo.DeleteCompanyProfileByUserID(ctx, userID)
|
|
}
|