Skip to main content

Overview

The Genero interface represents a book genre or category in the virtual library system. Each book belongs to exactly one genre.

Interface Definition

export interface Genero {
  id: number;
  nombre: string;
}

Properties

id
number
required
Unique identifier for the genre. Auto-generated by the backend.
nombre
string
required
The genre name (e.g., “Ficción”, “No Ficción”, “Ciencia Ficción”, “Romance”, “Misterio”).

Usage Examples

Fetching All Genres

import { GeneroService } from './core/services/genero';
import { Genero } from './core/models/genero';

this.generoService.getAll().subscribe({
  next: (generos: Genero[]) => {
    generos.forEach(genero => {
      console.log(`${genero.nombre} (ID: ${genero.id})`);
    });
  },
  error: (err) => console.error('Error fetching genres:', err)
});

Creating a New Genre

const nuevoGenero: Genero = {
  id: 0, // Will be assigned by backend
  nombre: 'Ciencia Ficción'
};

this.generoService.create(nuevoGenero).subscribe({
  next: (genero: Genero) => {
    console.log('Genre created with ID:', genero.id);
  },
  error: (err) => console.error('Error creating genre:', err)
});

Updating a Genre

this.generoService.getById(1).subscribe({
  next: (genero: Genero) => {
    const generoActualizado: Genero = {
      ...genero,
      nombre: 'Ciencia Ficción y Fantasía'
    };
    
    this.generoService.update(genero.id, generoActualizado).subscribe({
      next: (updated) => console.log('Genre updated:', updated),
      error: (err) => console.error('Update failed:', err)
    });
  }
});

Deleting a Genre

this.generoService.delete(generoId).subscribe({
  next: (response) => {
    console.log('Genre deleted:', response);
  },
  error: (err) => {
    console.error('Delete failed:', err);
    // Note: May fail if genre is associated with existing books
  }
});

Using Genres in Book Management

import { Libro } from './core/models/libro';

// Load genres for a dropdown selector
generos: Genero[] = [];
selectedGenero: Genero | null = null;

ngOnInit() {
  this.loadGeneros();
}

loadGeneros() {
  this.generoService.getAll().subscribe({
    next: (data) => {
      this.generos = data;
    },
    error: (err) => {
      console.error('Error loading genres:', err);
    }
  });
}

createBook() {
  if (!this.selectedGenero) {
    console.error('Please select a genre');
    return;
  }
  
  const nuevoLibro = {
    titulo: 'El nombre del viento',
    genero: this.selectedGenero,
    autores: [/* ... */],
    disponible: true
  };
  
  this.libroService.create(nuevoLibro).subscribe({
    next: (libro) => console.log('Book created:', libro),
    error: (err) => console.error('Error:', err)
  });
}

Filtering Books by Genre

getBooksByGenre(generoId: number) {
  this.libroService.getAll().subscribe({
    next: (libros: Libro[]) => {
      const librosPorGenero = libros.filter(
        libro => libro.genero.id === generoId
      );
      console.log(`Found ${librosPorGenero.length} books in this genre`);
    }
  });
}

Template Usage

<!-- Genre selector dropdown -->
<select [(ngModel)]="selectedGenero">
  <option [ngValue]="null">Seleccione un género</option>
  <option *ngFor="let genero of generos" [ngValue]="genero">
    {{ genero.nombre }}
  </option>
</select>

<!-- Display book genre -->
<div *ngIf="libro" class="book-info">
  <h2>{{ libro.titulo }}</h2>
  <p class="genre-badge">{{ libro.genero.nombre }}</p>
</div>

<!-- Genre management list -->
<ul class="genre-list">
  <li *ngFor="let genero of generos">
    {{ genero.nombre }}
    <button (click)="editGenero(genero)">Editar</button>
    <button (click)="deleteGenero(genero.id)">Eliminar</button>
  </li>
</ul>

Genre Statistics

getGenreStats() {
  this.libroService.getAll().subscribe({
    next: (libros: Libro[]) => {
      const stats = new Map<string, number>();
      
      libros.forEach(libro => {
        const generoNombre = libro.genero.nombre;
        stats.set(generoNombre, (stats.get(generoNombre) || 0) + 1);
      });
      
      stats.forEach((count, genero) => {
        console.log(`${genero}: ${count} books`);
      });
    }
  });
}
  • Libro - Book interface that references Genero

Common Genres

Here are some common genre examples you might use:
  • Ficción
  • No Ficción
  • Ciencia Ficción
  • Fantasía
  • Romance
  • Misterio
  • Thriller
  • Historia
  • Biografía
  • Poesía
  • Drama
  • Terror
  • Aventura
  • Realismo Mágico

Notes

Deleting a genre that is associated with existing books may fail due to foreign key constraints. Ensure no books reference the genre before deletion.
Consider implementing a cascading update strategy so that when a genre is updated, all associated books reflect the change.
Genre names should be unique to avoid confusion. Consider adding validation on the backend to enforce this.