Gift Moments: Approfondimento sulle Funzionalità

Oltre all'architettura di base, Gift Moments include diversi moduli specializzati che migliorano l'esperienza utente.

Pagamenti Estensibili

Il sistema di pagamento utilizza un modello a provider, consentendo l'integrazione di nuovi gateway senza riscrivere la logica principale. Questa estensibilità è cruciale per supportare metodi di pagamento regionali accanto ai provider standard.

Il backend definisce un contratto chiaro per i gateway di pagamento tramite l'interfaccia IPaymentGateway:

// tc-be/src/common/interfaces/models.interface.ts

export interface IPaymentGateway extends IBase {    
    gatewayCode: string; // es. 'stripe', 'paypal'
    gatewayName: string;
    isActive: boolean;
    apiKeyPublic?: string; // Chiave API pubblica
    apiKeySecret?: string; // Chiave API segreta (crittografata)
    webhookSecret?: string; // Segreto Webhook
    webhookUrl?: string; // URL Webhook 
}

Ricchezza Multimediale

L'applicazione colma il divario tra contenuti locali e remoti.

Risorse Esterne

Il supporto nativo per il collegamento di contenuti multimediali da piattaforme come Vimeo e YouTube è gestito tramite provider specifici. Ad esempio, il Provider YouTube estrae automaticamente i metadati e gestisce l'incorporamento:

// tc-app/src/app/Services/common/external-providers/youtube-provider.service.ts

@Injectable({
  providedIn: 'root'
})
export class YouTubeProviderService extends BaseProviderService {
  
  readonly providerName = 'YouTube';
  readonly supportedDomains = ['youtube.com', 'youtu.be'];

  /**
   * Estrae i metadati dall'URL di YouTube
   */
  extractMetadata(url: string): Observable {
    const videoId = this.extractContentId(url);
    
    const metadata: IRemoteContent = {
      // ... logica di estrazione metadati
      thumbnailUrl: videoId ? `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg` : undefined,
      metadata: {
        videoId: videoId,
        embedUrl: this.getEmbedUrl(url),
        provider: 'youtube'
      },
      // ...
    };

    return of(metadata);
  }
}

Visualizzatore Multimediale

Un visualizzatore personalizzato garantisce un'esperienza di riproduzione coerente per diversi tipi di contenuti multimediali, siano essi caricamenti locali o streaming esterni.

Screenshot del Visualizzatore Multimediale

Caccia al Tesoro

Forse la funzionalità più unica è la Caccia al Tesoro. Questa sfrutta la Geolocalizzazione per bloccare i contenuti a specifiche coordinate fisiche.

Utilizziamo Leaflet per fornire una mappa interattiva per impostare queste posizioni:

// tc-app/src/app/Features/map-location/map-location-picker.component.ts

private initMap(): void {
  // Crea la mappa con controlli di zoom
  this.map = L.map('map', {
    zoomControl: true,
    touchZoom: true,
    dragging: true,
    tapHold: true,
    zoomSnap: 0.5,
  }).setView([location.lat, location.lng], 13);
  
  // Aggiungi il livello di tile OpenStreetMap
  L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '© OpenStreetMap contributors'
  }).addTo(this.map);

  // Aggiungi un marker alla posizione iniziale con popup
  this.marker = L.marker([location.lat, location.lng], {
    draggable: true
  })
    .addTo(this.map)
    .bindPopup(this.capsuleLocationText)
    .openPopup();
}

Interfaccia Mappa Caccia al Tesoro

Gli utenti devono fisicamente recarsi a queste coordinate per "sbloccare" il regalo, trasformando il dono digitale in un'avventura nel mondo reale.