import { Component, OnInit, inject, signal } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterLink } from '@angular/router'; import { ApiService } from '../../core/services/api.service'; import { ToastService } from '../../core/services/toast.service'; interface DomainView { domain: { id: number; domain: string; dnsProvider: 'cloudflare' | 'manual' | null; isObsolete: boolean; defaultWildcard: boolean; }; serviceCount: number; certificateStatus: 'valid' | 'expiring-soon' | 'expired' | 'pending' | 'none'; daysRemaining: number | null; certificates: any[]; requirements: any[]; } @Component({ selector: 'app-domains', standalone: true, imports: [CommonModule, RouterLink], template: `

Domains

@if (loading()) {

Loading domains...

} @else if (domains().length > 0) {
@for (domainView of domains(); track domainView.domain.id) { }
Domain Provider Services Certificate Expiry Actions
{{ domainView.domain.domain }}
@if (domainView.domain.isObsolete) { Obsolete }
@if (domainView.domain.dnsProvider === 'cloudflare') { Cloudflare } @else if (domainView.domain.dnsProvider === 'manual') { Manual } @else { None } {{ domainView.serviceCount }} @switch (domainView.certificateStatus) { @case ('valid') { Valid } @case ('expiring-soon') { Expiring Soon } @case ('expired') { Expired } @case ('pending') { Pending } @default { None } } @if (domainView.daysRemaining !== null) { {{ domainView.daysRemaining }} days } @else { } View Details
Total Domains
{{ domains().length }}
Valid Certificates
{{ getStatusCount('valid') }}
Expiring Soon
{{ getStatusCount('expiring-soon') }}
Expired/Pending
{{ getStatusCount('expired') + getStatusCount('pending') }}
} @else {

No domains found

Sync your Cloudflare zones or manually add domains to get started

}
`, }) export class DomainsComponent implements OnInit { private apiService = inject(ApiService); private toastService = inject(ToastService); domains = signal([]); loading = signal(true); syncing = signal(false); ngOnInit(): void { this.loadDomains(); } loadDomains(): void { this.loading.set(true); this.apiService.getDomains().subscribe({ next: (response) => { if (response.success && response.data) { this.domains.set(response.data); } this.loading.set(false); }, error: () => { this.loading.set(false); }, }); } syncDomains(): void { this.syncing.set(true); this.apiService.syncCloudflareDomains().subscribe({ next: (response) => { if (response.success) { this.toastService.success('Cloudflare domains synced successfully'); this.loadDomains(); } this.syncing.set(false); }, error: (error) => { this.toastService.error('Failed to sync Cloudflare domains: ' + (error.error?.error || error.message)); this.syncing.set(false); }, }); } getStatusCount(status: string): number { return this.domains().filter(d => d.certificateStatus === status).length; } }