chore(release): snapshot 1.4.2
This commit is contained in:
@@ -17,12 +17,14 @@ var (
|
||||
// TenantService handles tenant business logic
|
||||
type TenantService struct {
|
||||
tenantRepo *repository.TenantRepository
|
||||
db *sql.DB
|
||||
}
|
||||
|
||||
// NewTenantService creates a new tenant service
|
||||
func NewTenantService(tenantRepo *repository.TenantRepository) *TenantService {
|
||||
func NewTenantService(tenantRepo *repository.TenantRepository, db *sql.DB) *TenantService {
|
||||
return &TenantService{
|
||||
tenantRepo: tenantRepo,
|
||||
db: db,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,6 +81,84 @@ func (s *TenantService) ListAll() ([]*domain.Tenant, error) {
|
||||
return s.tenantRepo.FindAll()
|
||||
}
|
||||
|
||||
// ListAllWithDetails retrieves all tenants with their plan and solutions information
|
||||
func (s *TenantService) ListAllWithDetails() ([]map[string]interface{}, error) {
|
||||
tenants, err := s.tenantRepo.FindAll()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var result []map[string]interface{}
|
||||
for _, tenant := range tenants {
|
||||
tenantData := map[string]interface{}{
|
||||
"id": tenant.ID,
|
||||
"name": tenant.Name,
|
||||
"subdomain": tenant.Subdomain,
|
||||
"domain": tenant.Domain,
|
||||
"email": tenant.Email,
|
||||
"phone": tenant.Phone,
|
||||
"cnpj": tenant.CNPJ,
|
||||
"is_active": tenant.IsActive,
|
||||
"created_at": tenant.CreatedAt,
|
||||
"logo_url": tenant.LogoURL,
|
||||
"logo_horizontal_url": tenant.LogoHorizontalURL,
|
||||
"primary_color": tenant.PrimaryColor,
|
||||
"secondary_color": tenant.SecondaryColor,
|
||||
}
|
||||
|
||||
// Buscar subscription e soluções
|
||||
var planName sql.NullString
|
||||
var planID string
|
||||
query := `
|
||||
SELECT
|
||||
s.plan_id,
|
||||
p.name as plan_name
|
||||
FROM agency_subscriptions s
|
||||
JOIN plans p ON s.plan_id = p.id
|
||||
WHERE s.agency_id = $1 AND s.status = 'active'
|
||||
LIMIT 1
|
||||
`
|
||||
err = s.db.QueryRow(query, tenant.ID).Scan(&planID, &planName)
|
||||
if err == nil && planName.Valid {
|
||||
tenantData["plan_name"] = planName.String
|
||||
|
||||
// Buscar soluções do plano
|
||||
solutionsQuery := `
|
||||
SELECT sol.id, sol.name, sol.slug, sol.icon
|
||||
FROM solutions sol
|
||||
JOIN plan_solutions ps ON sol.id = ps.solution_id
|
||||
WHERE ps.plan_id = $1
|
||||
ORDER BY sol.name
|
||||
`
|
||||
rows, err := s.db.Query(solutionsQuery, planID)
|
||||
if err == nil {
|
||||
defer rows.Close()
|
||||
var solutions []map[string]interface{}
|
||||
for rows.Next() {
|
||||
var id, name, slug string
|
||||
var icon sql.NullString
|
||||
if err := rows.Scan(&id, &name, &slug, &icon); err == nil {
|
||||
solution := map[string]interface{}{
|
||||
"id": id,
|
||||
"name": name,
|
||||
"slug": slug,
|
||||
}
|
||||
if icon.Valid {
|
||||
solution["icon"] = icon.String
|
||||
}
|
||||
solutions = append(solutions, solution)
|
||||
}
|
||||
}
|
||||
tenantData["solutions"] = solutions
|
||||
}
|
||||
}
|
||||
|
||||
result = append(result, tenantData)
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// Delete removes a tenant by ID
|
||||
func (s *TenantService) Delete(id uuid.UUID) error {
|
||||
if err := s.tenantRepo.Delete(id); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user